From patchwork Tue Apr 30 10:17:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1093151 X-Patchwork-Delegate: sbabic@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="HuZOgwF3"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 44td0l5lb2z9s47 for ; Tue, 30 Apr 2019 20:23:51 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 1A7FDC21EEB; Tue, 30 Apr 2019 10:23:45 +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 81372C21E44; Tue, 30 Apr 2019 10:18:29 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id BCC2BC21E68; Tue, 30 Apr 2019 10:18:03 +0000 (UTC) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80049.outbound.protection.outlook.com [40.107.8.49]) by lists.denx.de (Postfix) with ESMTPS id D3E63C21E26 for ; Tue, 30 Apr 2019 10:17:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hBvaicArV5ZfvjZyMCZGH9wJoW0Si+ecXqx45cRJIVI=; b=HuZOgwF3/C4XiJYe90PgneKs1NDoGd6PDs9PnvrdKFFxG3L0FrA6dbG5aerix+gSaXJNI9DIdKxA0XtsIWmjycxxlBQkWcgPK9baGd7scEtzTYDYx3XEfuab6T/IG94qEDEFxs74278NWZy6Lie4iF1dk9zZpWGP6mWxnV65fUU= Received: from AM0PR04MB4481.eurprd04.prod.outlook.com (52.135.147.15) by AM0PR04MB5204.eurprd04.prod.outlook.com (20.176.214.85) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1835.15; Tue, 30 Apr 2019 10:17:54 +0000 Received: from AM0PR04MB4481.eurprd04.prod.outlook.com ([fe80::3173:24:d401:2378]) by AM0PR04MB4481.eurprd04.prod.outlook.com ([fe80::3173:24:d401:2378%6]) with mapi id 15.20.1835.018; Tue, 30 Apr 2019 10:17:54 +0000 From: Peng Fan To: "sbabic@denx.de" , "festevam@gmail.com" , "lukma@denx.de" Thread-Topic: [i.MX8MM+CCF 07/41] clk: mux: add set parent support Thread-Index: AQHU/z35yWVKh9nYGk+qCRtpbJOpYQ== Date: Tue, 30 Apr 2019 10:17:54 +0000 Message-ID: <20190430103056.32537-8-peng.fan@nxp.com> References: <20190430103056.32537-1-peng.fan@nxp.com> In-Reply-To: <20190430103056.32537-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: HK0PR03CA0057.apcprd03.prod.outlook.com (2603:1096:203:52::21) 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: 9ad4a127-849c-4358-f0fc-08d6cd551bd4 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600141)(711020)(4605104)(4618075)(2017052603328)(7193020); SRVR:AM0PR04MB5204; x-ms-traffictypediagnostic: AM0PR04MB5204: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3513; x-forefront-prvs: 00235A1EEF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(39860400002)(396003)(376002)(136003)(346002)(366004)(189003)(199004)(7736002)(8676002)(110136005)(305945005)(6512007)(53936002)(50226002)(81156014)(66066001)(4326008)(68736007)(25786009)(97736004)(2501003)(316002)(44832011)(54906003)(8936002)(26005)(186003)(102836004)(446003)(476003)(486006)(76176011)(66446008)(71190400001)(71200400001)(11346002)(66946007)(99286004)(81166006)(66556008)(64756008)(52116002)(66476007)(6506007)(14454004)(6486002)(2616005)(1076003)(73956011)(6436002)(2201001)(478600001)(3846002)(86362001)(5660300002)(386003)(36756003)(2906002)(6116002)(256004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR04MB5204; 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: ihFm2XiUeA0V3aSBRE1LLjZTU9uOYrD5rCQulDIvpRJCzj0DgXO6usRPwLLxa1Sw6V2WE0ZcacoHKjag8/vJf5akGLAWKS0HVMutsQMpDR9IB6dyF4JXf5AzZVUlr/yFmmvNeLdEkjWeDC9lLy8czteMewAV7T7velerVAYCh4xwx3gbkwfKPZ7zPrMwkrm2wfJHo/Fwsw30JGBrkD1TNOs8Jy2BGc2UNuzn6XsbKw2M8LB4PZkuyMnEhdJUjBOvudrLRgLBfEjOsN88CTSLaLF5rI/GvDOdq8TRMTEOWqA8ggyRKuso9sjU1IZqabYoA/2kw2yQAR+D6U8IjGQAO+CV0SX0D1+4xNgOfRcMiYZt2p8SZYjpBRdxhz90SHzQDAWFnNXJMFamFecL2p83ouFDdUdnQUJUaQapIuN7Gpg= MIME-Version: 1.0 X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9ad4a127-849c-4358-f0fc-08d6cd551bd4 X-MS-Exchange-CrossTenant-originalarrivaltime: 30 Apr 2019 10:17:54.4886 (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-Transport-CrossTenantHeadersStamped: AM0PR04MB5204 Cc: "trini@konsulko.com" , "u-boot@lists.denx.de" , dl-uboot-imx , "sr@denx.de" Subject: [U-Boot] [i.MX8MM+CCF 07/41] 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 --- 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 55fc97367a..1a937bf923 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) ? (struct clk *)dev_get_driver_data(clk->dev) : clk); @@ -72,8 +89,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) ? + (struct clk *)dev_get_driver_data(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) ? + (struct clk *)dev_get_driver_data(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 3458746a60..216095d28c 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -56,6 +56,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;