From patchwork Wed Jul 31 07:01:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1139537 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="V2vVmYbq"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 45z4H76zvlz9sDQ for ; Wed, 31 Jul 2019 17:06:59 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id A6A7AC21E52; Wed, 31 Jul 2019 07:04:55 +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 C6B40C21E2F; Wed, 31 Jul 2019 07:02:41 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id F30B5C21E2F; Wed, 31 Jul 2019 07:01:41 +0000 (UTC) Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00041.outbound.protection.outlook.com [40.107.0.41]) by lists.denx.de (Postfix) with ESMTPS id C2D0BC21E2F for ; Wed, 31 Jul 2019 07:01:38 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k1W8wuB0bq9/sGXRGCrQphSLoqTiNgE7DuZG6vhWVsAqjc9Ei4FQNbFp/iG8nyV2waU0t3jANZ5OXT4LxJl4Qo29qE/IMxihnoRJEObRX0UoBX+BuZqOwcAsWwCgFRKImXNMYSV1/WRcv26lFef+hkRKd5kooCbtdfRSnHqhT+YgBDSg0HyXpXoNwFmb3O3o1DlYVsoVNGwn7l1OJHAEPTogyPOdwUdN+F1l0ZR3r0u10b3r6VZeKtG7mE7b04WiDT/DC/8khhJn6tAKuJ3T+wK2aIJFIO2lezIMTaHNwG7t2DGSy5M9I8ypmiJJFcAYmqP6Ck/z4j9SP21KX/PXLQ== 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=AZBCf6IiVcAH/HEics8O4gqFaB/ktLCHpRaNwRqdAAo=; b=S8EJqlbO/ShqCL5rA2PEybN82AfKBFfDgdgfygCJYzwzZC0eDK+na3HFiTcIa0V/eDra9VoWgCvwuAPsX2oZ/Ql4OnLEyUOC4kN6Ic1++T2j548hLuYYJyE9mGqwmmHdLdWpbwFkisbvO5jApJdIVgXePbpBoHIdmY5EtEPTGGab6G7Eabvk/EWMT0Y/6As+h/O5vgpSsd78UcndCzCW3KoP3gc+VCN16D/4Y2szrctaPRUPYhePtzXOxjjeWdo9L7FTz77siO4M9ypWcYTiwosEm7n0E0AvOIe9yFQVZywEMj5Xdc4Io0a66QcmcM8KQUX0jjvKtGB396KWYaq+6Q== 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=AZBCf6IiVcAH/HEics8O4gqFaB/ktLCHpRaNwRqdAAo=; b=V2vVmYbqU1NBo538QLJpia6AcAj9UJMCWdKdyklC8qu/8qikmaJVTKWTws+YMj0+xol/yq839Xw9yoFErBjnhPpyouvbHKHp6gFdJ91hIjTrxNdlotqJh/Bbb3/GpiQcWIjjFSnNUasOoCtK6CnuWlgVvB5MHuFG93Y1U8qul84= Received: from AM0PR04MB4481.eurprd04.prod.outlook.com (52.135.147.15) by AM0PR04MB5826.eurprd04.prod.outlook.com (20.178.203.86) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2115.13; Wed, 31 Jul 2019 07:01:37 +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; Wed, 31 Jul 2019 07:01:37 +0000 From: Peng Fan To: "lukma@denx.de" Thread-Topic: [PATCH V3 06/16] clk: divider set rate supporrt Thread-Index: AQHVR23L1Qz4d7bYGE2h4qSmLsBQAQ== Date: Wed, 31 Jul 2019 07:01:37 +0000 Message-ID: <20190731071654.9970-6-peng.fan@nxp.com> References: <20190731071654.9970-1-peng.fan@nxp.com> In-Reply-To: <20190731071654.9970-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: HK0PR03CA0026.apcprd03.prod.outlook.com (2603:1096:203:2f::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: 34726f31-0cde-461c-1966-08d71584ee1f 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:AM0PR04MB5826; x-ms-traffictypediagnostic: AM0PR04MB5826: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:820; x-forefront-prvs: 011579F31F x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(4636009)(396003)(366004)(136003)(346002)(376002)(39860400002)(189003)(199004)(44832011)(102836004)(486006)(2501003)(6506007)(52116002)(386003)(11346002)(446003)(2616005)(76176011)(476003)(478600001)(54906003)(53936002)(6512007)(3846002)(6116002)(316002)(66066001)(25786009)(2351001)(186003)(99286004)(26005)(2906002)(14454004)(4326008)(256004)(6486002)(6436002)(50226002)(6916009)(305945005)(8936002)(71200400001)(71190400001)(78460400001)(86362001)(5640700003)(1076003)(36756003)(8676002)(81166006)(81156014)(1730700003)(66946007)(5660300002)(66446008)(64756008)(66556008)(66476007)(68736007)(7736002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB5826; H:AM0PR04MB4481.eurprd04.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A: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: TTMVpwowChC5lp4/TbgadTd4eMt8Z5ZKU4pbJsP/cbUeLQeFt4BuEmFU9U+yozOm5ZdIbyluZsSpGXKMCJKj3ascQN+MavTGUEPgowaOzsT06EnxgnNBgsVO6p+cp2ZPj6CNAwhT3erUCT7eTuMUFDnRDc+FmLCH6pfEiWfTOKy0N52dfbD40tMVwbFmHf7Ke0X71qn1Fi5+syNDzs4A4CQBbPwISCL1esD3WGFVNKjg8wtNygZwmma7+ye4Yj/GNtwwGzeQwOTJqRI1swVcOmGEcLKOpclRUA4gqPfdVdH+7YZJMOByHYkasiUk3+NqqGStLIpH1StpR4YBk+BD/jTbxKPxXYtBn6cE/WdLACAxY9fmLwfdvtxPdM7a9ezNGUb9m9Ag2NA5OLrD4mFBlTXQOt2QwtNImrHJ6Q4qNuE= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 34726f31-0cde-461c-1966-08d71584ee1f X-MS-Exchange-CrossTenant-originalarrivaltime: 31 Jul 2019 07:01:37.2595 (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: AM0PR04MB5826 Cc: "u-boot@lists.denx.de" , dl-uboot-imx Subject: [U-Boot] [PATCH V3 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 --- V3: None V2: Rebase 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,