Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751496AbdHaLoT (ORCPT ); Thu, 31 Aug 2017 07:44:19 -0400 Received: from mail-co1nam03on0059.outbound.protection.outlook.com ([104.47.40.59]:13167 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751074AbdHaLoO (ORCPT ); Thu, 31 Aug 2017 07:44:14 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; From: Dong Aisheng To: CC: , , , , , , Dong Aisheng , Viresh Kumar , Anson Huang , Leonard Crestez Subject: [PATCH RESEND 1/1] cpufreq: imx6q: switch to Use clk_bulk_get to refine clk operations Date: Thu, 31 Aug 2017 19:43:57 +0800 Message-ID: <1504179837-18842-1-git-send-email-aisheng.dong@nxp.com> X-Mailer: git-send-email 2.7.4 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131486534525832731;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(336005)(39380400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(4326008)(50986999)(50466002)(48376002)(53936002)(47776003)(86362001)(5660300001)(110136004)(966005)(36756003)(105606002)(356003)(575784001)(2906002)(77096006)(305945005)(6306002)(54906002)(33646002)(106466001)(2351001)(97736004)(8676002)(8936002)(85426001)(498600001)(5003940100001)(189998001)(6916009)(81156014)(81166006)(68736007)(626005)(104016004)(8656003)(50226002)(7416002)(32563001)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN3PR03MB2260;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD017;1:IGtR4eHjlIgL73dbqRn7hzcaf85h4MqMhksfmyFX5LYEZUqFj4R/0msFxr+RuL50jRfvqkMzoUzkvBCPvAQncSgARiPrXxPAUk5gbyGz1m+pPyfgip+5tk9CDdslEGZS MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d2782eed-9109-4a24-6cba-08d4f065999d X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(2017052603199)(201703131430075)(201703131517081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:BN3PR03MB2260; X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB2260;3:VL0sxP0YfUzBTIBWIYEkOKecBLfCdlrbn4IuOY5g0X/2yX1sgauNP1If+PH+vnUuSFUx4nlLB/Fbvx0KWQk+akisTYI0F1gm+QpLYJYUxj2PQb6AtByFRpuN3iQ4IA2Vn99XdIY+Jfm3XtDM1U6SuqaTdTfEKafxiz4P1pmPr6hiWyCyvJwwczWYwDqY3TqCqtdZXQK90cgdufG2svsZAYq6z2T49AKy/Pe8wQ2CnHhNjc/5/rEvUoxPz+q6VEqVAbwoXGc2TuYrp6cxPHPQ7Oq/cx0OSomRv88SKbajgHSFI/FuYvoCWmas3G4dcq0atdihIIP76u8qiEV/BFEnUx5FUuwWv+N/DR/ysId/47I=;25:rOr6olcRmTL2CU5JNUssEF5u6PeWTNhh4XMZM59pGr/EQJhEPuOrbxnAh4boWPo4yTe8JJWCwrNSFuq13zqnyLDXUrEo6C/OgnedOj3vPnZr/dGsDfZXRsJyuL0z2gHT48C3nvGsMoD2YIL/q8N4a8AoY86Sq0gfGP+yblOari6ay2Y3TC/nTf1atEogb1mES951zHz2hONTlx8qzWC+8J9I8MNvevcJTxEGJTT6Nl2t84V1BnzL5aRLTB0FC9aiA4BPgYu3x3LeCIGnkz+ASRttshzAmzt2q9ER8M+x/KwHQXuOnao8jMenoalK0+tyjFJEHhISp29gHBEdzjgc9g== X-MS-TrafficTypeDiagnostic: BN3PR03MB2260: X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB2260;31:E5V2LmzkjaNZXFzGDjTp5ZNSwQf5iyj+5aZT0H03bY8R8m8+S17uCMJkyqnssXOOquXj1wAkYiKNEc71sNQ1mDgINh4GBuR6XVRh6PeU4nByVXi4UiXNIzneKGoMPYUqwFP88UkvILM3FvoORKg2yTMytiY1HRTBGZRlv1i9tEatc+B7pp8eJCO8qVO0yKsQKquR50wB85QSM7aDRp8pFZwiaELG1f8EJMYCdM5ntUc=;4:Ig7iC8aTGWkXykALU5YazCkaCLrgAE2GsAsEn4+CQ/WADFR8LoIodoRrv9qWELIwLrpYcGZ/AZknvTBm/trUbLnfkiUPJYddeg1LhRrYmzSZwmC2IpqR0bfkyCCjtQkibVg5ZaZNMnTurvAw0IGOFR5b0KwXijkdsC6eRFAOjGSavcfNVt1/OItPs8PD7ltbXLeN6NbAA6KvI4La3WMEBYqjqaIg4S1Q39gT8eRvbzJH9ysyVM7/+S49LKyiAgV+bUdcRA1r6HZpMvKUnZD9MDu1/LsxqELuykI9qGinu2Q= X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(601004)(2401047)(5005006)(13016025)(13018025)(8121501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(10201501046)(6055026)(6096035)(201703131430075)(201703131433075)(201703131441075)(201703131448075)(201703161259150)(20161123563025)(20161123565025)(20161123556025)(20161123559100)(20161123561025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:BN3PR03MB2260;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:BN3PR03MB2260; X-Forefront-PRVS: 04163EF38A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN3PR03MB2260;23:eWRZFJTRoyaM2//DHzxJSfyc5AKWjrmNikXB4QWlw?= =?us-ascii?Q?o51gE+xLyJvWhprpBM1KP22Rhv83qM78Dt/2sGey37vMDxjHojNCm7aKG+pD?= =?us-ascii?Q?U7In32QHhN5dtengwuVuLtIDJ6hlhvQBWkc9a/YkA5TeivA18+yfXL3FIZlC?= =?us-ascii?Q?PHdX6tZylGbvVYyxGvnpjyT/HoPVrFFlgjpH8/uIqML/9GyEtc3VjcKSyjNh?= =?us-ascii?Q?R3Ijf4kK7+XzTSs645XsoM5TtbB+xFnFlmLS3t4QbEZGs4Yl1gTLFuAgmdvR?= =?us-ascii?Q?ltzrmusXLtjLileklMX6CJ8qob/XZ7A73khp/5X+NmUjzLbMhXPXquUDzBAS?= =?us-ascii?Q?J5BTcU7jpSMFTvUziQRODecQ9L4CikENVFE9NNr41M3J/uUl0SyI/caZpTSZ?= =?us-ascii?Q?AY7iv6+jwBZ5bUy/TZI3fOwrp8F2yX6N2if+HouiYTe8+GYfqjVQKLz7NFWv?= =?us-ascii?Q?6QD6jIWqrXdyWvDuIMWsjKG/FZI77t7x+JhZwwuz6yC25gPslvC10TzW0y2v?= =?us-ascii?Q?t7ELZSRGCx1AL5qkeLRsde6DxqHfoaEkA3nWy7lEam9YQ2qDLzlKJ2Zwqvyb?= =?us-ascii?Q?eP4dBBCACKwecnoNuoBQWNZFBwRCfxPyCG+Q4ATLx+epZwAbC/v29qI2reZm?= =?us-ascii?Q?AnNAjw7Z4ISrN+K8y3h9Z+xRQPoMPUrbjrKvKbYXB91pDAK3YQ3LGLjHeMFJ?= =?us-ascii?Q?c0mpANekutiOAkiqoABBqdH4R/l3uNTbypoZTuccPMoAIXEQr7qKGHgjH9i1?= =?us-ascii?Q?J2EXAamCjgDEC4Qu+e/ilPsHzzK30GN7yOsNn32KzAcuhWu1SL3Ou091n9QJ?= =?us-ascii?Q?s0owa9Hgd2mCmwnC2CYZgLUc/VlJON8PnubTZpprLVOx8xA5t2TjzDIzo/BY?= =?us-ascii?Q?XOJwRijtKNUCw1MMTScuetGlB7+EKztftSMhYpYNWWc0fpD/AyQu9J7s7eqn?= =?us-ascii?Q?6bqIzH1wztr2nzVM11bIrhKQSffQ8es+4/njdFCzau4Sflf3l+4y2Rk0dj+r?= =?us-ascii?Q?DKNYlXfMA5yl0WemJrI34NUMY8doE9a47eDiWUMijGG4SkPDoE1W+pYBO0Yq?= =?us-ascii?Q?wKb735zbHSZLYEYKOcNBsjoB/aUhmVBtT/qXKCF+JRp2X7MA5uuK+U07seJ1?= =?us-ascii?Q?kcK765k88zxL7mo6naZDCYSBK1c30ZcFokZzS9jwQ0D314E3XcaY9dZpSTr8?= =?us-ascii?Q?Hlp5oFaICZQWTw=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN3PR03MB2260;6:wGJxpMh9h7d47uxF3Z7ECgMMHFby7ohskuUxieu+5ynAjk8M6xSNiXlvEZ3zqyut+8bFQI2dcN3RdzSqMnWKf/qXEAF1BRPwfTSunYzj4fOmX4OfXIfNeJG/Y3+0UkdNvajU6xMYMgo9W7+fxdNV2rmWkrObQ1ngDH4PJQPlPr9OwIli9T2isFL+eelgGtiY2Te5wZnfuxPrFYzf7mjnMGDPI09WYn70+V3N8nbbdGdC53ad+NXp5SIX9wVf4wdpeViUgMQV3PfsYiueTseOOQOz1No/+dYSs5o5SXSNgjriJCGHfSy0O14W0cccHb2TdtDuJSyzJjjnuRtc9sqn3g==;5:lc6EX6NU0j6UIizrTuPV3vcklYqrjcv5ViD9tfCDITljQgDzqj12U0y2AHz115wnXUdPaVM1HRiLjJlc2zy3zbWWVsJMLdQ7Ggr1iIXkdme5+M+1ubpzTcKo6/QUOE/hoB7/tyqc9LyeOa8l26D8tA==;24:65pl8yYGlyUB9bp+By84epiuFkw6n9sZ7cYli/IAEtTx99GNZ6X04RvCrMOvwZngeRVgf5HYif+EhMZlVlXw06pV25c3mww+/AIMVNOSujs=;7:tlYoAvBg7y76VNFEt74dZUoVwkkMbbvtpKS2P1ndi0gtTv2Oo4jQbvb4t8VsUfQFiLuyeYLQmydSOjW/HEOtYb0FmgjYlQ7hmfNdvH7cwoc60ieQlAM7E4JwCSwsX5FK3KoQ5MxQnk6nUvDPOvbxPMcc0PLJCHmTvoyhXEOW+99R2KNhqY/zAB6A2mo3Vqw4bO29yfsI3AE13bCezORBXYn8K0twhE7A4pxYo9BY/mM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2017 11:44:03.4884 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB2260 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 7028 Lines: 215 Use clk_bulk_get to ease the driver clocks handling. Cc: "Rafael J. Wysocki" Cc: Viresh Kumar Cc: Shawn Guo Cc: Anson Huang Cc: Leonard Crestez Signed-off-by: Dong Aisheng -- The original one is here which depends on clk_bulk APIs. https://patchwork.kernel.org/patch/9737337/ Now the clk_bulk APIs are already in kernel, so resend the patch. (Patch title changed a bit to be more specific.) --- drivers/cpufreq/imx6q-cpufreq.c | 125 ++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 69 deletions(-) diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c index 14466a9..c5c0af3 100644 --- a/drivers/cpufreq/imx6q-cpufreq.c +++ b/drivers/cpufreq/imx6q-cpufreq.c @@ -24,15 +24,29 @@ static struct regulator *arm_reg; static struct regulator *pu_reg; static struct regulator *soc_reg; -static struct clk *arm_clk; -static struct clk *pll1_sys_clk; -static struct clk *pll1_sw_clk; -static struct clk *step_clk; -static struct clk *pll2_pfd2_396m_clk; - -/* clk used by i.MX6UL */ -static struct clk *pll2_bus_clk; -static struct clk *secondary_sel_clk; +enum IMX6_CPUFREQ_CLKS { + ARM, + PLL1_SYS, + STEP, + PLL1_SW, + PLL2_PFD2_396M, + /* MX6UL requires two more clks */ + PLL2_BUS, + SECONDARY_SEL, +}; +#define IMX6Q_CPUFREQ_CLK_NUM 5 +#define IMX6UL_CPUFREQ_CLK_NUM 7 + +static int num_clks; +static struct clk_bulk_data clks[] = { + { .id = "arm" }, + { .id = "pll1_sys" }, + { .id = "step" }, + { .id = "pll1_sw" }, + { .id = "pll2_pfd2_396m" }, + { .id = "pll2_bus" }, + { .id = "secondary_sel" }, +}; static struct device *cpu_dev; static bool free_opp; @@ -52,7 +66,7 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) new_freq = freq_table[index].frequency; freq_hz = new_freq * 1000; - old_freq = clk_get_rate(arm_clk) / 1000; + old_freq = clk_get_rate(clks[ARM].clk) / 1000; opp = dev_pm_opp_find_freq_ceil(cpu_dev, &freq_hz); if (IS_ERR(opp)) { @@ -111,29 +125,31 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) * voltage of 528MHz, so lower the CPU frequency to one * half before changing CPU frequency. */ - clk_set_rate(arm_clk, (old_freq >> 1) * 1000); - clk_set_parent(pll1_sw_clk, pll1_sys_clk); - if (freq_hz > clk_get_rate(pll2_pfd2_396m_clk)) - clk_set_parent(secondary_sel_clk, pll2_bus_clk); + clk_set_rate(clks[ARM].clk, (old_freq >> 1) * 1000); + clk_set_parent(clks[PLL1_SW].clk, clks[PLL1_SYS].clk); + if (freq_hz > clk_get_rate(clks[PLL2_PFD2_396M].clk)) + clk_set_parent(clks[SECONDARY_SEL].clk, + clks[PLL2_BUS].clk); else - clk_set_parent(secondary_sel_clk, pll2_pfd2_396m_clk); - clk_set_parent(step_clk, secondary_sel_clk); - clk_set_parent(pll1_sw_clk, step_clk); + clk_set_parent(clks[SECONDARY_SEL].clk, + clks[PLL2_PFD2_396M].clk); + clk_set_parent(clks[STEP].clk, clks[SECONDARY_SEL].clk); + clk_set_parent(clks[PLL1_SW].clk, clks[STEP].clk); } else { - clk_set_parent(step_clk, pll2_pfd2_396m_clk); - clk_set_parent(pll1_sw_clk, step_clk); - if (freq_hz > clk_get_rate(pll2_pfd2_396m_clk)) { - clk_set_rate(pll1_sys_clk, new_freq * 1000); - clk_set_parent(pll1_sw_clk, pll1_sys_clk); + clk_set_parent(clks[STEP].clk, clks[PLL2_PFD2_396M].clk); + clk_set_parent(clks[PLL1_SW].clk, clks[STEP].clk); + if (freq_hz > clk_get_rate(clks[PLL2_PFD2_396M].clk)) { + clk_set_rate(clks[PLL1_SYS].clk, new_freq * 1000); + clk_set_parent(clks[PLL1_SW].clk, clks[PLL1_SYS].clk); } else { /* pll1_sys needs to be enabled for divider rate change to work. */ pll1_sys_temp_enabled = true; - clk_prepare_enable(pll1_sys_clk); + clk_prepare_enable(clks[PLL1_SYS].clk); } } /* Ensure the arm clock divider is what we expect */ - ret = clk_set_rate(arm_clk, new_freq * 1000); + ret = clk_set_rate(clks[ARM].clk, new_freq * 1000); if (ret) { dev_err(cpu_dev, "failed to set clock rate: %d\n", ret); regulator_set_voltage_tol(arm_reg, volt_old, 0); @@ -142,7 +158,7 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index) /* PLL1 is only needed until after ARM-PODF is set. */ if (pll1_sys_temp_enabled) - clk_disable_unprepare(pll1_sys_clk); + clk_disable_unprepare(clks[PLL1_SYS].clk); /* scaling down? scale voltage after frequency */ if (new_freq < old_freq) { @@ -173,7 +189,7 @@ static int imx6q_cpufreq_init(struct cpufreq_policy *policy) { int ret; - policy->clk = arm_clk; + policy->clk = clks[ARM].clk; ret = cpufreq_generic_init(policy, freq_table, transition_latency); policy->suspend_freq = policy->max; @@ -213,28 +229,15 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev) return -ENOENT; } - arm_clk = clk_get(cpu_dev, "arm"); - pll1_sys_clk = clk_get(cpu_dev, "pll1_sys"); - pll1_sw_clk = clk_get(cpu_dev, "pll1_sw"); - step_clk = clk_get(cpu_dev, "step"); - pll2_pfd2_396m_clk = clk_get(cpu_dev, "pll2_pfd2_396m"); - if (IS_ERR(arm_clk) || IS_ERR(pll1_sys_clk) || IS_ERR(pll1_sw_clk) || - IS_ERR(step_clk) || IS_ERR(pll2_pfd2_396m_clk)) { - dev_err(cpu_dev, "failed to get clocks\n"); - ret = -ENOENT; - goto put_clk; - } - if (of_machine_is_compatible("fsl,imx6ul") || - of_machine_is_compatible("fsl,imx6ull")) { - pll2_bus_clk = clk_get(cpu_dev, "pll2_bus"); - secondary_sel_clk = clk_get(cpu_dev, "secondary_sel"); - if (IS_ERR(pll2_bus_clk) || IS_ERR(secondary_sel_clk)) { - dev_err(cpu_dev, "failed to get clocks specific to imx6ul\n"); - ret = -ENOENT; - goto put_clk; - } - } + of_machine_is_compatible("fsl,imx6ull")) + num_clks = IMX6UL_CPUFREQ_CLK_NUM; + else + num_clks = IMX6Q_CPUFREQ_CLK_NUM; + + ret = clk_bulk_get(cpu_dev, num_clks, clks); + if (ret) + goto put_node; arm_reg = regulator_get(cpu_dev, "arm"); pu_reg = regulator_get_optional(cpu_dev, "pu"); @@ -378,22 +381,11 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev) regulator_put(pu_reg); if (!IS_ERR(soc_reg)) regulator_put(soc_reg); -put_clk: - if (!IS_ERR(arm_clk)) - clk_put(arm_clk); - if (!IS_ERR(pll1_sys_clk)) - clk_put(pll1_sys_clk); - if (!IS_ERR(pll1_sw_clk)) - clk_put(pll1_sw_clk); - if (!IS_ERR(step_clk)) - clk_put(step_clk); - if (!IS_ERR(pll2_pfd2_396m_clk)) - clk_put(pll2_pfd2_396m_clk); - if (!IS_ERR(pll2_bus_clk)) - clk_put(pll2_bus_clk); - if (!IS_ERR(secondary_sel_clk)) - clk_put(secondary_sel_clk); + + clk_bulk_put(num_clks, clks); +put_node: of_node_put(np); + return ret; } @@ -407,13 +399,8 @@ static int imx6q_cpufreq_remove(struct platform_device *pdev) if (!IS_ERR(pu_reg)) regulator_put(pu_reg); regulator_put(soc_reg); - clk_put(arm_clk); - clk_put(pll1_sys_clk); - clk_put(pll1_sw_clk); - clk_put(step_clk); - clk_put(pll2_pfd2_396m_clk); - clk_put(pll2_bus_clk); - clk_put(secondary_sel_clk); + + clk_bulk_put(num_clks, clks); return 0; } -- 2.7.4