From patchwork Wed Jul 31 07:01:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1139531 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="Aa+7sJyg"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 45z49z0TtWz9sDQ for ; Wed, 31 Jul 2019 17:02:30 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 7BCCBC21E0B; Wed, 31 Jul 2019 07:01:51 +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 375B0C21E39; Wed, 31 Jul 2019 07:01:42 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 91A5FC21E16; Wed, 31 Jul 2019 07:01:33 +0000 (UTC) Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20045.outbound.protection.outlook.com [40.107.2.45]) by lists.denx.de (Postfix) with ESMTPS id 5C610C21E16 for ; Wed, 31 Jul 2019 07:01:30 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hTdIsjN8y7am4bc/kuyPshCvgl99Sj8C9rXkvgMDfMFv0uXNYN4dFCbZ571hvvZP47zxR8nNacs+ExLep8v6lt/sBp0KjHVxRsVF/XnTUH3Vbl2BYZmMYRoNdBwDz28HDL58XLD0f+Tchss2Wmgsyqj3zqnTOMmpfRmwOjynI5FFdx5oNCpSfBJRB0EJtCkkLzIjrZNu9NM6rEkkZmFmUtJwIJMv/2aPB8d5jw05IXWx4SCLFyCLutlKHdPinL8of1xYjXOMx2FN/TBTNxPHxTlq0ZJV2C3IIY2mzVOrWjQw7h3fNYiZ1k/YsPGx9NRNDjzzjgXAWSIZ+Tjh3PMZcg== 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=x4S/YwD35cNGTgC0sf4k9rN13VLi1XidjA1QR63xkc4=; b=kB4xDBoOlLyRagJg07U46e2C6W1bKGYvJ/7j3bBzGYxLbaCv5516E0HlM7X84/SSfcT6zXIp2/1VO8CuFAka+9d8zyCLOoEgHImt+/uHxNECEb+s3YJ+POoOrC5G/7RR+TEnVYdMtPJoZfCVWmJf9Gxk17Zr+f1j4iyHxw7s9FmEt8sM29zHwW84d9TcTM82CCkGdk7hNL7PAdGnGXLTXQeEapI/iVi/A9TMcMvPlojr7AuWwaiQKaxnkqRZyodxeIAgnpTgPaDL3MyUt8h9JajPLvY4Q3+JftnvqKV7GC/Noj3PyPYD014P2HvLPAu2d+pPt/8l1gvv9qpz1K8V9g== 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=x4S/YwD35cNGTgC0sf4k9rN13VLi1XidjA1QR63xkc4=; b=Aa+7sJygZj8yeLS1m1CKkKQzhsg71dvBU4o2Ck0UN6dY15ttFwVhOK5sUbUTqy2TjMS64AreA0y27u46J7Ug76IkQURgYSTHMbiAgcabstgxD1YcgBflwH78WbNRls4u1OLAK6eAqaBOYA8iuS890ADyI7J44Eveo1xiHUaPwc8= Received: from AM0PR04MB4481.eurprd04.prod.outlook.com (52.135.147.15) by AM0PR04MB4193.eurprd04.prod.outlook.com (52.134.91.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2115.15; Wed, 31 Jul 2019 07:01:29 +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:29 +0000 From: Peng Fan To: "lukma@denx.de" Thread-Topic: [PATCH V3 03/16] clk: mux: add set parent support Thread-Index: AQHVR23Gx5LQtWyVKEm4CISkepGEaQ== Date: Wed, 31 Jul 2019 07:01:28 +0000 Message-ID: <20190731071654.9970-3-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: 55ac36c5-253e-425e-8629-08d71584e92f x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600148)(711020)(4605104)(1401327)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7193020); SRVR:AM0PR04MB4193; x-ms-traffictypediagnostic: AM0PR04MB4193: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3513; x-forefront-prvs: 011579F31F x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(4636009)(136003)(376002)(346002)(39860400002)(396003)(366004)(199004)(189003)(1076003)(25786009)(5660300002)(66476007)(6916009)(66946007)(66446008)(64756008)(66556008)(26005)(99286004)(52116002)(11346002)(446003)(186003)(66066001)(2906002)(4326008)(102836004)(316002)(386003)(6506007)(7736002)(8676002)(53936002)(8936002)(81166006)(68736007)(86362001)(5640700003)(71190400001)(6486002)(2501003)(478600001)(305945005)(6512007)(81156014)(1730700003)(71200400001)(36756003)(476003)(44832011)(54906003)(2351001)(76176011)(486006)(6436002)(256004)(2616005)(3846002)(14454004)(50226002)(6116002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB4193; 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: +Bv+O23F1Cc0AmdmoEijCtsOOpUM0JLovw+ay6FxGJRNaBn8KY6SY+PkJ/gmCtIxPyaGlFCkpemCU9MP5cr5wjcgs6/75bmLJSGdHyShhLtsacmpWVuCO8nr2k0LTK8JHhPUVokVID6s5NtejUJFPVllvcIvm+ZeVtjn3PQf4l3OYaCjSNZ9WIBltkQ6nCfNporfp9rCP+6UVTgNaUJ86eNBomnfNYNmeVVaPIFA221sQtX9CHoPaUJHhPS0NkosyLrdsyvSdJInaSPh0x9bGL1p+J+uhLEv+XZLpkqxWELvRAEooNUqj29Lti6LXDCKRy3lCtKjL+qMYXi0xnhlhXmMC63ppnsVKMvn61v3kbnBousUBYH9vAnF0MyYpnV4CSiPvfZorVICsIZPcL7XGZ7zyiSsv6yPHKQPbhxx0Z4= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 55ac36c5-253e-425e-8629-08d71584e92f X-MS-Exchange-CrossTenant-originalarrivaltime: 31 Jul 2019 07:01:28.9635 (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: AM0PR04MB4193 Cc: "u-boot@lists.denx.de" , dl-uboot-imx Subject: [U-Boot] [PATCH V3 03/16] clk: mux: add set parent support 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" Add set parent support for clk mux Signed-off-by: Peng Fan --- V3: None V2: Rebase drivers/clk/clk-mux.c | 70 ++++++++++++++++++++++++++++++++++++++++++-- include/linux/clk-provider.h | 2 ++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 81d1e7ebee..5acc0b8cbd 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c @@ -60,7 +60,24 @@ int clk_mux_val_to_index(struct clk *clk, u32 *table, unsigned int flags, return val; } -static u8 clk_mux_get_parent(struct clk *clk) +unsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index) +{ + unsigned int val = index; + + if (table) { + val = table[index]; + } else { + if (flags & CLK_MUX_INDEX_BIT) + val = 1 << index; + + if (flags & CLK_MUX_INDEX_ONE) + val++; + } + + return val; +} + +u8 clk_mux_get_parent(struct clk *clk) { struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ? dev_get_clk_ptr(clk->dev) : clk); @@ -77,8 +94,57 @@ static u8 clk_mux_get_parent(struct clk *clk) return clk_mux_val_to_index(clk, mux->table, mux->flags, val); } +static int clk_fetch_parent_index(struct clk *clk, + struct clk *parent) +{ + struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ? + dev_get_clk_ptr(clk->dev) : clk); + + int i; + + if (!parent) + return -EINVAL; + + for (i = 0; i < mux->num_parents; i++) { + if (!strcmp(parent->dev->name, mux->parent_names[i])) + return i; + } + + return -EINVAL; +} + +static int clk_mux_set_parent(struct clk *clk, struct clk *parent) +{ + struct clk_mux *mux = to_clk_mux(clk_dev_binded(clk) ? + dev_get_clk_ptr(clk->dev) : clk); + int index; + u32 val; + u32 reg; + + index = clk_fetch_parent_index(clk, parent); + if (index < 0) { + printf("Could not fetch index\n"); + return index; + } + + val = clk_mux_index_to_val(mux->table, mux->flags, index); + + if (mux->flags & CLK_MUX_HIWORD_MASK) { + reg = mux->mask << (mux->shift + 16); + } else { + reg = readl(mux->reg); + reg &= ~(mux->mask << mux->shift); + } + val = val << mux->shift; + reg |= val; + writel(reg, mux->reg); + + return 0; +} + const struct clk_ops clk_mux_ops = { - .get_rate = clk_generic_get_rate, + .get_rate = clk_generic_get_rate, + .set_parent = clk_mux_set_parent, }; struct clk *clk_hw_register_mux_table(struct device *dev, const char *name, diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 43a25e9c6a..7e44045c16 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -66,6 +66,8 @@ struct clk_mux { }; #define to_clk_mux(_clk) container_of(_clk, struct clk_mux, clk) +extern const struct clk_ops clk_mux_ops; +u8 clk_mux_get_parent(struct clk *clk); struct clk_div_table { unsigned int val;