From patchwork Tue Jul 30 07:52:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1138842 X-Patchwork-Delegate: lukma@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="b5a3SZux"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 45yTTW2qDpz9s3Z for ; Tue, 30 Jul 2019 17:58:55 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 5E885C21E74; Tue, 30 Jul 2019 07:54:01 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=SPF_HELO_PASS, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 3ED52C21E74; Tue, 30 Jul 2019 07:53:36 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id C64FBC21E70; Tue, 30 Jul 2019 07:52:47 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150053.outbound.protection.outlook.com [40.107.15.53]) by lists.denx.de (Postfix) with ESMTPS id E4E4EC21E1D for ; Tue, 30 Jul 2019 07:52:44 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OUFNR7NUAPwni6QH4xY23uAggsEy3DDwna9SKpcwTRGnsZvF17LgCCl6XacjTPQgxNHKCP+YQOYcaa5OA2Zh3bmQGBBsYcfmW7Unqm60UxtqXVNggBkYi5YUbufQNV3Hl8MNUeUPNJLhGLxnaqxrZ/EOnWhswWWpXM7GZYfR2oyeO3wGAqEp0ARCATc53BGZZpDN/nd8bKMA/dCYa7SQgZo4yZeY57+I4C90076nKYeIX2uOlROBqvobd2Iq0feL4ndg5cA/GOd6xEQup/eM6iylmFmGp2RuyizqvZ5lSBI0ErNqaLSpaXnRKLt0f90LVrIhpPb2KIELjShQumITpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sXQ7v4ImMCndi2qaaG/4zCX5h3iJBJCKoFAymAh2Dsw=; b=C1dOda9sbowBM0af3BxL2Q3mro7s+KLJCUDVHoC2uSIDADLiL8xIfJzxbZNZhkJ/lgXbZZTjw44lC4f7eNJQEjhr0RFXY5ZG593+44JAvGg+ESHR6WCx6dFfg75UYZOIqLo9x/jhGv7eiAg+JIcnPuf9InshvyfPcBKS4L32w3GC3pzHOEeCmDhAlqkix+3bPa50NGPhhfQH24ypIjyn7a2hNTPkILfZDABM5V3yXlXo7EkJYRp+Frhcels+AKH1eXrn4mgDXKuS2rlhVuPGR1SLo7YOFdmm1Wi9I6XrHxbS6MoucG1NFCSGScVvHE3OXHSzqQGb6aZVJaFqtdO+3Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1;spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com;arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sXQ7v4ImMCndi2qaaG/4zCX5h3iJBJCKoFAymAh2Dsw=; b=b5a3SZuxmKR+0DTwnh6AwanLrVSZ/jYMlHTQkytuH24ER3Bbldp3R8wD0/vmgoLo71cqD+UcBpkqCk9eZr70zl0SbdAuxE8noFS7/wH8JP1qFUIn5y3SL0Hy5Ld42KB6gPJ3+OLK2mvjWsmfUiZIr4pXW19aCaRbBBQONrRTiuE= Received: from AM0PR04MB4481.eurprd04.prod.outlook.com (52.135.147.15) by AM0PR04MB6931.eurprd04.prod.outlook.com (52.132.214.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2094.16; Tue, 30 Jul 2019 07:52:43 +0000 Received: from AM0PR04MB4481.eurprd04.prod.outlook.com ([fe80::5d98:e1f4:aa72:16b4]) by AM0PR04MB4481.eurprd04.prod.outlook.com ([fe80::5d98:e1f4:aa72:16b4%4]) with mapi id 15.20.2115.005; Tue, 30 Jul 2019 07:52:43 +0000 From: Peng Fan To: "lukma@denx.de" , "sjg@chromium.org" Thread-Topic: [PATCH V2 06/16] clk: divider set rate supporrt Thread-Index: AQHVRqvExdKaYfgjyk+DrJNYy48v3A== Date: Tue, 30 Jul 2019 07:52:43 +0000 Message-ID: <20190730080758.8484-6-peng.fan@nxp.com> References: <20190730080758.8484-1-peng.fan@nxp.com> In-Reply-To: <20190730080758.8484-1-peng.fan@nxp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.16.4 x-clientproxiedby: HK2PR0302CA0004.apcprd03.prod.outlook.com (2603:1096:202::14) To AM0PR04MB4481.eurprd04.prod.outlook.com (2603:10a6:208:70::15) authentication-results: spf=none (sender IP is ) smtp.mailfrom=peng.fan@nxp.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [119.31.174.71] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 91677051-ba44-4a7f-bef4-08d714c2e765 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020); SRVR:AM0PR04MB6931; x-ms-traffictypediagnostic: AM0PR04MB6931: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:962; x-forefront-prvs: 0114FF88F6 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(4636009)(376002)(396003)(346002)(136003)(39860400002)(366004)(199004)(189003)(2501003)(66066001)(476003)(66946007)(6436002)(76176011)(2616005)(52116002)(102836004)(316002)(478600001)(6486002)(66476007)(64756008)(256004)(86362001)(3846002)(25786009)(81166006)(186003)(8676002)(11346002)(26005)(6116002)(54906003)(2906002)(81156014)(36756003)(486006)(71200400001)(99286004)(386003)(7736002)(6512007)(14454004)(1076003)(78460400001)(110136005)(71190400001)(446003)(68736007)(50226002)(66556008)(4326008)(6506007)(5660300002)(66446008)(44832011)(305945005)(8936002)(53936002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB6931; H:AM0PR04MB4481.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: ZqbW0ws+fIMI+16MKOiMQpTAUZAbiNoq5cpbEjyGFOlMJdim7jJtVr0U8pjefAcc0DsZU/ajtgT0yqIjAEJVJFDXE+Dm7IwkZ/y7INEhxCTxiabQffk2xyHU2YMhxmuOCychIUGt/9ANK5cr/4W4HS5lob5NJa5VR1bSDiLY7zRzCWMlnjmHWRlinxUFkYfMNMGoQZpA8tRqYlLlXwlzMcrNXdsPtVig0WuxWbcCY8oBoAdqmQFMFYX4Shv1hEDNhFu+A28pNDBiJByXUKb5EEqnzrzl83iMzJ7Mxk2siZKT/piS1SV8WO0/E9gVa4JdUzyIMrGAPqaxP6dQ2CrPjmuURAHUUXRD9xhpmxQ88glZDV7EhgJYLpOhFc5bPvbLAgI7+2bI64RhMmrn7FSET/QZ/voakOb7lKwZemQ1188= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 91677051-ba44-4a7f-bef4-08d714c2e765 X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Jul 2019 07:52:43.6109 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: peng.fan@nxp.com X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6931 Cc: "u-boot@lists.denx.de" , dl-uboot-imx Subject: [U-Boot] [PATCH V2 06/16] clk: divider set rate supporrt X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Signed-off-by: Peng Fan --- V2: Rebase to master drivers/clk/clk-divider.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 2ed9ed6ab8..822e09b084 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include "clk.h" @@ -86,8 +87,95 @@ static ulong clk_divider_recalc_rate(struct clk *clk) divider->flags, divider->width); } +static bool _is_valid_table_div(const struct clk_div_table *table, + unsigned int div) +{ + const struct clk_div_table *clkt; + + for (clkt = table; clkt->div; clkt++) + if (clkt->div == div) + return true; + return false; +} + +static bool _is_valid_div(const struct clk_div_table *table, unsigned int div, + unsigned long flags) +{ + if (flags & CLK_DIVIDER_POWER_OF_TWO) + return is_power_of_2(div); + if (table) + return _is_valid_table_div(table, div); + return true; +} + +static unsigned int _get_table_val(const struct clk_div_table *table, + unsigned int div) +{ + const struct clk_div_table *clkt; + + for (clkt = table; clkt->div; clkt++) + if (clkt->div == div) + return clkt->val; + return 0; +} + +static unsigned int _get_val(const struct clk_div_table *table, + unsigned int div, unsigned long flags, u8 width) +{ + if (flags & CLK_DIVIDER_ONE_BASED) + return div; + if (flags & CLK_DIVIDER_POWER_OF_TWO) + return __ffs(div); + if (flags & CLK_DIVIDER_MAX_AT_ZERO) + return (div == clk_div_mask(width) + 1) ? 0 : div; + if (table) + return _get_table_val(table, div); + return div - 1; +} +int divider_get_val(unsigned long rate, unsigned long parent_rate, + const struct clk_div_table *table, u8 width, + unsigned long flags) +{ + unsigned int div, value; + + div = DIV_ROUND_UP_ULL((u64)parent_rate, rate); + + if (!_is_valid_div(table, div, flags)) + return -EINVAL; + + value = _get_val(table, div, flags, width); + + return min_t(unsigned int, value, clk_div_mask(width)); +} + +static ulong clk_divider_set_rate(struct clk *clk, unsigned long rate) +{ + struct clk_divider *divider = to_clk_divider(clk_dev_binded(clk) ? + dev_get_clk_ptr(clk->dev) : clk); + unsigned long parent_rate = clk_get_parent_rate(clk); + int value; + u32 val; + + value = divider_get_val(rate, parent_rate, divider->table, + divider->width, divider->flags); + if (value < 0) + return value; + + if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { + val = clk_div_mask(divider->width) << (divider->shift + 16); + } else { + val = readl(divider->reg); + val &= ~(clk_div_mask(divider->width) << divider->shift); + } + val |= (u32)value << divider->shift; + writel(val, divider->reg); + + return clk_get_rate(clk); +} + const struct clk_ops clk_divider_ops = { .get_rate = clk_divider_recalc_rate, + .set_rate = clk_divider_set_rate, }; static struct clk *_register_divider(struct device *dev, const char *name,