From patchwork Wed Feb 14 13:43:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128350 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp625953ljc; Wed, 14 Feb 2018 05:48:26 -0800 (PST) X-Google-Smtp-Source: AH8x2240kBZSlMiLdQmWgUB+NScyEmWg8ccJpetRLrcmKB+dIY0jFjdU0CHIstSHIK0EJ3zSyRoA X-Received: by 2002:a17:902:8f86:: with SMTP id z6-v6mr4570391plo.352.1518616106075; Wed, 14 Feb 2018 05:48:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518616106; cv=none; d=google.com; s=arc-20160816; b=QmaJHGeme5UP/5Pvs0DT/aS9n3pbhsaReAZUQK14EFBHqbGD/PfNTdqva/ztZ5FYEc 7jzniUeLeCMg2zFN39cmPRg9zI0BYoGV894mykdmxex7OZ3pKnLH3fR8h0juI/quWZXb K36BSItodAOPaxXM6F7G2ldp30AkeSr3ebj+5gV8vlgoEXyUqAzc0AkBLug4CTUPfFAc LrrRLiyYY+AL8ZbbacQCD2ALE4lj/g82uxLqoqFNVTE0Ps2P4OM9kdmgeGa/4WrGK8pO BAeoYutK8WCxqFEqQaBuXvPRxBTfmDJKfhwkqoKF54CwHN1bS0IQ0MC2+j49EtGKnwfM KcJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=blC1VwQdaVr/4deMW4rI29x2chj1BXiX6xYvvmEtHUE=; b=Iw5odwxnIhmjQMMA99cUIMuUQ6n68irWByo9JSLSOW4IQb+vYbQvaSNM8LOPq7XWQV 5o0HZKvGVm4TVSlBHVmoXlf5FppirFE7Dhin4sa2xWMSn+hWTtF6uw6IQIaHbrzpK7hS hz3EwLYxWuZnxLFfVrn2nunfbR+PDOUNMXYIStcT3QhM44nR0MzUwD72mQ3vh/jSTfmo dYTpj/m7IT5IanBnXuO2opQngvVZhxhSGoejjuKK9UlbT+gqHiHyKbz+UfgP28e0KMNQ YZ+IbNyvOUruQSkPat/Jiv2TUhG5icA94HpSl4ab/UAhwP+kh8QsqEZTyHECxwvGOrfK 6RgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=ccuTV43N; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f8si7926501pgq.761.2018.02.14.05.48.25; Wed, 14 Feb 2018 05:48:26 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=ccuTV43N; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030505AbeBNNsX (ORCPT + 28 others); Wed, 14 Feb 2018 08:48:23 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:34372 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030254AbeBNNnq (ORCPT ); Wed, 14 Feb 2018 08:43:46 -0500 Received: by mail-wm0-f67.google.com with SMTP id j21so17865374wmh.1 for ; Wed, 14 Feb 2018 05:43:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=blC1VwQdaVr/4deMW4rI29x2chj1BXiX6xYvvmEtHUE=; b=ccuTV43N1uHwEljJrKQsIhAHLSmNps7qtCBGDavW3F9eQOw93v09G3qwj7BJnZMaAZ IDvYaK+BfT1TNCtPEW437OZdjS17TrixfYH+0ZKV0PDyLqwyhP25TkAQfkkrDWtSddOJ KjEXpMM8tbN58wzMJZZeKUOBWpM6TOjG0x14fONEGPHSX9bnfPj9qbwooxQN27y1LTsr 4UwRpmQY1JfZD+L7HK17rXzoGye7Yi7aHUtXD0EyOx8u6JDhWXV/VTQGI/bXvT+pERsq KpXHOrueOp+y2/X1aBsIRzUuId0G+tt1Z59rmMBFMFXuzY9gEeGinAOY90gYxfQ9+EmC F6Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=blC1VwQdaVr/4deMW4rI29x2chj1BXiX6xYvvmEtHUE=; b=nRANNfoFwemXw2616XgaoF5UCM0LG8E6kHJKx2j5k2w3nQJyqfyQvobT8fLZcrg8g9 AUGgPYpnIdz7uHUqrvCd5XBMm8IRzs49QV/hUkobfWq1OHaKiChUUr1exfxGNysim+zc DUd/AJVKtmFws/ReaBflvAQ56k169zKu1nTu54Dr/vCgK4kgo3At1wmyli31WMJazmmY HNGP+xFbjFUa6bQtnj0bnd/n18AhLP9DrM/4iU6/S7SsEJwErxEuL4LlQ20ti7vtmpg6 SrsXQ9ShBDmFIeBg2rewnCl7psSBv7+exvcuM9ZTcIyZHadpVz43tNlZOfpt6MBWg00J 4o6Q== X-Gm-Message-State: APf1xPAT1E0z0DXAsjqixaUzRAH6A667rp3Ix8wAcV1SKxf2C/agLbG7 lO95RapkdhaOxD7TGpur4TCFgA== X-Received: by 10.28.138.85 with SMTP id m82mr4425733wmd.56.1518615825472; Wed, 14 Feb 2018 05:43:45 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:44 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/8] clk: divider: export clk_div_mask() helper Date: Wed, 14 Feb 2018 14:43:33 +0100 Message-Id: <20180214134340.17242-2-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Export clk_div_mask() in clk-provider header so every clock providers derived from the generic clock divider may share the definition instead of redefining it. Signed-off-by: Jerome Brunet --- I have 's/div_mask/clk_div_mask' to avoid the conflict with tegra's divider, which also defines the macro div_mask() but does not actually derives from the generic divider. drivers/clk/clk-divider.c | 24 +++++++++++------------- include/linux/clk-provider.h | 1 + 2 files changed, 12 insertions(+), 13 deletions(-) -- 2.14.3 diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index b49942b9fe50..3c98d2650fa3 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c @@ -28,12 +28,10 @@ * parent - fixed parent. No clk_set_parent support */ -#define div_mask(width) ((1 << (width)) - 1) - static unsigned int _get_table_maxdiv(const struct clk_div_table *table, u8 width) { - unsigned int maxdiv = 0, mask = div_mask(width); + unsigned int maxdiv = 0, mask = clk_div_mask(width); const struct clk_div_table *clkt; for (clkt = table; clkt->div; clkt++) @@ -57,12 +55,12 @@ static unsigned int _get_maxdiv(const struct clk_div_table *table, u8 width, unsigned long flags) { if (flags & CLK_DIVIDER_ONE_BASED) - return div_mask(width); + return clk_div_mask(width); if (flags & CLK_DIVIDER_POWER_OF_TWO) - return 1 << div_mask(width); + return 1 << clk_div_mask(width); if (table) return _get_table_maxdiv(table, width); - return div_mask(width) + 1; + return clk_div_mask(width) + 1; } static unsigned int _get_table_div(const struct clk_div_table *table, @@ -84,7 +82,7 @@ static unsigned int _get_div(const struct clk_div_table *table, if (flags & CLK_DIVIDER_POWER_OF_TWO) return 1 << val; if (flags & CLK_DIVIDER_MAX_AT_ZERO) - return val ? val : div_mask(width) + 1; + return val ? val : clk_div_mask(width) + 1; if (table) return _get_table_div(table, val); return val + 1; @@ -109,7 +107,7 @@ static unsigned int _get_val(const struct clk_div_table *table, if (flags & CLK_DIVIDER_POWER_OF_TWO) return __ffs(div); if (flags & CLK_DIVIDER_MAX_AT_ZERO) - return (div == div_mask(width) + 1) ? 0 : div; + return (div == clk_div_mask(width) + 1) ? 0 : div; if (table) return _get_table_val(table, div); return div - 1; @@ -141,7 +139,7 @@ static unsigned long clk_divider_recalc_rate(struct clk_hw *hw, unsigned int val; val = clk_readl(divider->reg) >> divider->shift; - val &= div_mask(divider->width); + val &= clk_div_mask(divider->width); return divider_recalc_rate(hw, parent_rate, val, divider->table, divider->flags, divider->width); @@ -353,7 +351,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate, /* if read only, just return current value */ if (divider->flags & CLK_DIVIDER_READ_ONLY) { bestdiv = clk_readl(divider->reg) >> divider->shift; - bestdiv &= div_mask(divider->width); + bestdiv &= clk_div_mask(divider->width); bestdiv = _get_div(divider->table, bestdiv, divider->flags, divider->width); return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); @@ -376,7 +374,7 @@ int divider_get_val(unsigned long rate, unsigned long parent_rate, value = _get_val(table, div, flags, width); - return min_t(unsigned int, value, div_mask(width)); + return min_t(unsigned int, value, clk_div_mask(width)); } EXPORT_SYMBOL_GPL(divider_get_val); @@ -399,10 +397,10 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate, __acquire(divider->lock); if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { - val = div_mask(divider->width) << (divider->shift + 16); + val = clk_div_mask(divider->width) << (divider->shift + 16); } else { val = clk_readl(divider->reg); - val &= ~(div_mask(divider->width) << divider->shift); + val &= ~(clk_div_mask(divider->width) << divider->shift); } val |= (u32)value << divider->shift; clk_writel(val, divider->reg); diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index f711be6e8c44..d8ba26d03332 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -399,6 +399,7 @@ struct clk_divider { spinlock_t *lock; }; +#define clk_div_mask(width) ((1 << (width)) - 1) #define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) #define CLK_DIVIDER_ONE_BASED BIT(0) From patchwork Wed Feb 14 13:43:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128343 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp622149ljc; Wed, 14 Feb 2018 05:43:57 -0800 (PST) X-Google-Smtp-Source: AH8x226JTaPVS72Dk0WccUQm+YrNkC0Xjzuuuyuoiz7QZzU49jeZviDbX/y8P3naZnkfNcP3azJV X-Received: by 10.101.86.1 with SMTP id l1mr3183698pgs.140.1518615836975; Wed, 14 Feb 2018 05:43:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518615836; cv=none; d=google.com; s=arc-20160816; b=UTScZxFbp6xG/NnK944yK02u1mhw9PNGmASz1YNXGVf1etJD/zVmyqPI5CqME/FPRJ UkxeMc1DLQbdSjRYVOs6GR4aCxn0AepJnJYnt1GF/gmyAonxINL4TthtsyJ9cQ65MElT 7mnFPsARYKgEXcInyDtovVC3uTBnr9lLTqcWo/I7DzSjAwGoxh0lVOtIJgofFLNoiJms WO0BAnM6re0/uhQdidnvZE6GE5pg9S0jSGFWzLhO9dYShDt1T231ELTOrEgMfXFnutdL n3iYDDcJiSP2ieqocipNLX8nQOXfbySbP2iSOnkQhZ+yAsIBrbVyRb6250p4Mc5aR0Ix DkTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=khIZOpGmG2HxeeBspaK1a22MkjUU3vUn32g7U5HJaSw=; b=bu26hGQXTQNVPueGqLTudmjCq0NhWvCKPQrYZ3TCefuvUi8JHXB8jfGUsMkZJa9d9i T1fs3OvBxCPSpuYmVMk19WQPaoBsu9X0MwA+hd/mhzvthSZ5u3Nt5/Y58wZNIipKiLRI uAhLHKnTbrB/HW7Hhaagn0gPs8roYec58bhO6B+YziA5F3wspyv3bSdhFNvU26GPO4kF v/srXoYJc85Cc9/oQiWW6zjYSynt4hM+qFlr5NZZrhA+sNTxuVrRAsYsN4ARAWVe1NDz VLIyxmRnksoHUIOKnBI9RRmaNPpTpEUeBrkwf0cShKCu/1lbdJ1KSF51I/ChsCIzbN+p bKTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=pcHeISXu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c23si1478660pfe.336.2018.02.14.05.43.56; Wed, 14 Feb 2018 05:43:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=pcHeISXu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030392AbeBNNnu (ORCPT + 28 others); Wed, 14 Feb 2018 08:43:50 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:37055 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030362AbeBNNns (ORCPT ); Wed, 14 Feb 2018 08:43:48 -0500 Received: by mail-wm0-f65.google.com with SMTP id v71so22111060wmv.2 for ; Wed, 14 Feb 2018 05:43:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=khIZOpGmG2HxeeBspaK1a22MkjUU3vUn32g7U5HJaSw=; b=pcHeISXu+WU03b/i4PR+v2tyg+ptViQ0I9LpX4Iy18KQREHwaLaPAALaRRwNRuhEfq 8wuz6ysumOys/pC0wfiCGxVE47pm6ANxQk07kCdVJ4eoxVSQmOD9Npqy1knl6omLAxFp xM9dfaHN8UfNlqeF3tDe4TPa6UzYUXpBlAzwnwz3boSTib0qnNF1bjqZSEsXpjuguK21 zVUZ3I81BknY1tqK59v1TmjAI105zyZ6DNlP1K44lBSRLOs+g+IgbvKIJIpbQcSTHlQN viEdjOGjvdBY5WgRcwqOUrcn7lVyG5MdbqJ1jp/En80sAu71xlT5FOzcg3jIwKsnV+b4 BgzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=khIZOpGmG2HxeeBspaK1a22MkjUU3vUn32g7U5HJaSw=; b=exWGtfTFGNpz8NZqVdu78S38OxYwIfgWJt46KIxwk+KcGQ/OqxdWCl6LNVQWVFsBAW 441ERKLHjBV21zrLa8A4g60GKgOAgWa6iSp0fCA1LJHD79P+fIvsv7wQvT1P5S8YikDu 6d/RhC1005RjfMsuyOd8B44yT1hq8bsawzAEQwJdh9urvEKFDy8bnTeooLKrXzfJkTeQ zvG/rtJsyhoGvH1491oFsI2xtXiQxPAijuEN5tBwZfClMTGExUsOaZXlC5K4a6NlWCRU H35zoVM9wZOcu2VeYzsT+OvyPuavgVpP7vRGxB8lp2SZOEXjzOhS5DGy/tVKPzeTOrpY YiNA== X-Gm-Message-State: APf1xPAGRAFi/YUV92C/Ps1awWFDeqZ5P4capSgESoJq6QTNJ1ugOEcu IfLK95t8CbAB3G91jN+o/a8Uv63X X-Received: by 10.28.25.67 with SMTP id 64mr3956499wmz.86.1518615826934; Wed, 14 Feb 2018 05:43:46 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.45 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:46 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/8] clk: mux: add helper function for index/value translation Date: Wed, 14 Feb 2018 14:43:34 +0100 Message-Id: <20180214134340.17242-3-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add helper functions for the translation between parent index and register value in the generic multiplexer function. The purpose of this change is avoid duplicating the code in other clock providers, using the same generic logic. Signed-off-by: Jerome Brunet --- drivers/clk/clk-mux.c | 75 +++++++++++++++++++++++++------------------- include/linux/clk-provider.h | 4 +++ 2 files changed, 47 insertions(+), 32 deletions(-) -- 2.14.3 diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 39cabe157163..ac4a042f8658 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c @@ -26,35 +26,24 @@ * parent - parent is adjustable through clk_set_parent */ -static u8 clk_mux_get_parent(struct clk_hw *hw) +int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags, + unsigned int val) { - struct clk_mux *mux = to_clk_mux(hw); int num_parents = clk_hw_get_num_parents(hw); - u32 val; - /* - * FIXME need a mux-specific flag to determine if val is bitwise or numeric - * e.g. sys_clkin_ck's clksel field is 3 bits wide, but ranges from 0x1 - * to 0x7 (index starts at one) - * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so - * val = 0x4 really means "bit 2, index starts at bit 0" - */ - val = clk_readl(mux->reg) >> mux->shift; - val &= mux->mask; - - if (mux->table) { + if (table) { int i; for (i = 0; i < num_parents; i++) - if (mux->table[i] == val) + if (table[i] == val) return i; return -EINVAL; } - if (val && (mux->flags & CLK_MUX_INDEX_BIT)) + if (val && (flags & CLK_MUX_INDEX_BIT)) val = ffs(val) - 1; - if (val && (mux->flags & CLK_MUX_INDEX_ONE)) + if (val && (flags & CLK_MUX_INDEX_ONE)) val--; if (val >= num_parents) @@ -62,36 +51,58 @@ static u8 clk_mux_get_parent(struct clk_hw *hw) return val; } +EXPORT_SYMBOL_GPL(clk_mux_val_to_index); -static int clk_mux_set_parent(struct clk_hw *hw, u8 index) +unsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index) { - struct clk_mux *mux = to_clk_mux(hw); - u32 val; - unsigned long flags = 0; + unsigned int val = index; - if (mux->table) { - index = mux->table[index]; + if (table) { + val = table[index]; } else { - if (mux->flags & CLK_MUX_INDEX_BIT) - index = 1 << index; + if (flags & CLK_MUX_INDEX_BIT) + val = 1 << index; - if (mux->flags & CLK_MUX_INDEX_ONE) - index++; + if (flags & CLK_MUX_INDEX_ONE) + val++; } + return val; +} +EXPORT_SYMBOL_GPL(clk_mux_index_to_val); + +static u8 clk_mux_get_parent(struct clk_hw *hw) +{ + struct clk_mux *mux = to_clk_mux(hw); + u32 val; + + val = clk_readl(mux->reg) >> mux->shift; + val &= mux->mask; + + return clk_mux_val_to_index(hw, mux->table, mux->flags, val); +} + +static int clk_mux_set_parent(struct clk_hw *hw, u8 index) +{ + struct clk_mux *mux = to_clk_mux(hw); + u32 val = clk_mux_index_to_val(mux->table, mux->flags, index); + unsigned long flags = 0; + u32 reg; + if (mux->lock) spin_lock_irqsave(mux->lock, flags); else __acquire(mux->lock); if (mux->flags & CLK_MUX_HIWORD_MASK) { - val = mux->mask << (mux->shift + 16); + reg = mux->mask << (mux->shift + 16); } else { - val = clk_readl(mux->reg); - val &= ~(mux->mask << mux->shift); + reg = clk_readl(mux->reg); + reg &= ~(mux->mask << mux->shift); } - val |= index << mux->shift; - clk_writel(val, mux->reg); + val = val << mux->shift; + reg |= val; + clk_writel(reg, mux->reg); if (mux->lock) spin_unlock_irqrestore(mux->lock, flags); diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index d8ba26d03332..fe720d679c31 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -511,6 +511,10 @@ struct clk_hw *clk_hw_register_mux_table(struct device *dev, const char *name, void __iomem *reg, u8 shift, u32 mask, u8 clk_mux_flags, u32 *table, spinlock_t *lock); +int clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags, + unsigned int val); +unsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index); + void clk_unregister_mux(struct clk *clk); void clk_hw_unregister_mux(struct clk_hw *hw); From patchwork Wed Feb 14 13:43:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128349 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp625708ljc; Wed, 14 Feb 2018 05:48:07 -0800 (PST) X-Google-Smtp-Source: AH8x224OUy23cxxV0hC9wjfWwJkLfy+WFOeXGKyFiiqYbJyclW3zxc1tefuh42D5CqpOQEkv77EM X-Received: by 10.98.201.89 with SMTP id k86mr4827489pfg.105.1518616087525; Wed, 14 Feb 2018 05:48:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518616087; cv=none; d=google.com; s=arc-20160816; b=uDoX2rAS+fJzvLy20h1K9CFYU0YN8XbO9ZaphrAWiyfcV9hGvEqQ3DZJ3Qwzqo7IOS ac+POb5WIMXudSQgXrAmXM22XgkIr0pyESZTJD7bVFM9JSfxCMZPxxBuPYqPZEZjG3bg ERgrYh0xN8nkpI8Oo0Rrs4gB4xI95M8y5PV0KZGDCfdX/flzL1m3rqniwF4a9FP/ndN+ yNIYskwijF6i89uGOM7kHYGICaUY5tB+35ejDAvJvTpHwTDvb6D1M3mXkepPW6v92yki zPxdopx73BDboRag8QDXc5sQJXN6pAIlpugacLpdmdZkNuWQuWEujMuIq4AXyEz43x1I gSsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=sx8n2q0ivN7mVA6n3yyaj8Jh74CEu0575DPKFiZAaxI=; b=mm9ADtDI3sBXMTIJgmTGS43nZhvLbB8R7vvCPpO/n1VevfCkSlsdWCsbsjwstiACf7 QRqp/7/Q2fJGCouWaOulKVS/4WRHwwLL7flZv5bumGLHaJ1WmFZhqcmQ0TUR+O/Oj3XQ TadKW9f7kX6aZnUYy6U1KRvybmmJnson5o9IxkIrK4eAf2PObg0x0Oxi4TgkXtlYGoC7 2KT1jVF8BO3D2LdEzr83FYX65eqR9vsulV+HATSpx+8GR+iVJ8UVjAYoYKmUIm8Ul7C7 HOkdnjMocYLrzWvRC/bQcd9LTRsPeQpeI+SLzPPT/IyoTdZsMgaOvIUlel4Pl5D56Qd2 6iFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=HcCvjGFe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j75si1714007pfk.372.2018.02.14.05.48.07; Wed, 14 Feb 2018 05:48:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=HcCvjGFe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030493AbeBNNsD (ORCPT + 28 others); Wed, 14 Feb 2018 08:48:03 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:37143 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030301AbeBNNnt (ORCPT ); Wed, 14 Feb 2018 08:43:49 -0500 Received: by mail-wr0-f194.google.com with SMTP id k32so15704619wrk.4 for ; Wed, 14 Feb 2018 05:43:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sx8n2q0ivN7mVA6n3yyaj8Jh74CEu0575DPKFiZAaxI=; b=HcCvjGFefsF3M1+WbqcaMXjtpQXLQvNnBs2AKxRtMy8s2MtFYO/c0DPIOmME33klUe HLWQTwZNaEP/AcATXbS7leT+CliYiJcKA0R9JEwvoizmrrobZJ2I4eKYqvEqZk1P3eQ6 wWmmJ4A1CQ7A54S4OTiDlLexTtReSlqoeTsn8u+EmI/smX3eFNOe9jVitJ9/DpcOt3Jv 2T1qPTkW/B6MUlS52FdtyhiMC7SdcMNvY0fTQpgDF1Me3p6wjQpFMJGCopNTSP1d+Oln EiqY+v2kTJgVoZhsJAxKRhCpjJFEl0myyS/HaintCZI2b1mf9B4DEGJfFY3BAYxZIY31 aX3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sx8n2q0ivN7mVA6n3yyaj8Jh74CEu0575DPKFiZAaxI=; b=Pesc75keB82msdI+rtGLHUoWovIAVqfez3v/Oy5J6W9gwN/7+5kApaAHkbJ7tbWM58 ozNaIstcbLQvLpWmWOTtinjSpVnwWymVFQKJOuYeheOYhYEVBOBH8wsXe4ziTlORKLGI GwZScgri/x4O9DDVo4ehVg0oi5uUb0rmayCreRCd0iXgb+zrDhjFbxUzP/inPmou6Wrq sLYzdUQnTKovniUmD/TOMmKzCPMYgs3EakP89MB1RzHK6EUrwVGkRlvHdYOcL9qTC7jk x+NUuPQqGQel/vsviP7tzneG3Jcjf/DIbpmV2XeRkHmzqzfFUkOmnJy59bfwgu9qur8C vIlw== X-Gm-Message-State: APf1xPDe2h4yove8ivLMwwZZ2kbCcuYa9IFPoFaAmqOetvU+kNVnPEZJ go5NCsPjm5sy5ek0/2XCL0vt0w== X-Received: by 10.223.130.166 with SMTP id 35mr4857537wrc.251.1518615828006; Wed, 14 Feb 2018 05:43:48 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.46 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:47 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/8] clk: fix determine rate error with pass-through clock Date: Wed, 14 Feb 2018 14:43:35 +0100 Message-Id: <20180214134340.17242-4-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If we try to determine the rate of a pass-through clock (a clock which does not implement .round_rate() nor .determine_rate()), clk_core_round_rate_nolock() will directly forward the call to the parent clock. In the particular case where the pass-through actually does not have a parent, clk_core_round_rate_nolock() will directly return 0 with the requested rate still set to the initial request structure. This is interpreted as if the rate could be exactly achieved while it actually cannot be adjusted. This become a real problem when this particular pass-through clock is the parent of a mux with the flag CLK_SET_RATE_PARENT set. The pass-through clock will always report an exact match, get picked and finally error when the rate is actually getting set. This is fixed by setting the rate inside the req to 0 when core is NULL in clk_core_round_rate_nolock() (same as in __clk_determine_rate() when hw is NULL) Fixes: 0f6cc2b8e94d ("clk: rework calls to round and determine rate callbacks") Signed-off-by: Jerome Brunet --- drivers/clk/clk.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) -- 2.14.3 diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 0f686a9dac3e..a4b4e4d6df5e 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1125,8 +1125,10 @@ static int clk_core_round_rate_nolock(struct clk_core *core, { lockdep_assert_held(&prepare_lock); - if (!core) + if (!core) { + req->rate = 0; return 0; + } clk_core_init_rate_req(core, req); From patchwork Wed Feb 14 13:43:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128344 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp622239ljc; Wed, 14 Feb 2018 05:44:02 -0800 (PST) X-Google-Smtp-Source: AH8x224R183d9IkS7ZZxgQ7XLivBznvf+4PAaSxtIJPIiG/ry/gUx6mxzfXAH7dT/WrsZhTc8LHA X-Received: by 10.99.189.82 with SMTP id d18mr3976703pgp.172.1518615842558; Wed, 14 Feb 2018 05:44:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518615842; cv=none; d=google.com; s=arc-20160816; b=Vg/5qlASF92cSwyL6iwd3RuCzCOYlgZoUxlZ6cXyCWJk3h5vTSKn7SVkBujAByrlxH iwXuiFvHSQDEnKGl3gPivwhl97HN2CC5TY99HREKNdAgZ12VYrodpDpBWIhvRw92vGHi zMeArVkcjaEgiSJTvu8hk02SIVejOgYW1a5NjeuWiUoGo4TYHIg1gQuNUCn9ICmLQ/hD K3pbalNytd2keaaSXC/3tujLOaPboWqxMqG2q9Fmxi8AGavMXI1chFaEhO83LN0Am2LQ rBukbhrlKvExBlaDh6HSOd+Dg2cCcLdQft17w9qDKjNx7WjSFj6v4QWb4Z4raZagYSMp BWdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=RjVrLiphTPM+bT6FXKwuW21cyg+7H6uho37k+GLzpRo=; b=vnPF8r8bl3qnCyQOrxXSDdZyQaRjH7O23H/vWiu6hR1iACiyf73dkJqnszOuVtaC/s SNgXC7ASR2Soc6PKt1/hKnOA5WFRBE26fZcLu0kCjyd48smziMmFwx5gAsiBsJFF1u34 SeXR62jFqa4qDo+pdgiOzeDIUDcFCtfkWHG6qR0vJvBP5BqL1TSKPBj/GTL+vy7QHqEq 5QFO5p4kXELphMptspWuGTd1TcEVrQy76NeS5N9a5tpIZYeOhDj6gpqxAf9TT250u/9t rUYbzopT/M/Y1BuwRQZM8asuh+W7/V0Drao4ZM/4Jbf88weswsCshSm21qZi+h3bYVT9 H06w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=0aWZ23TT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t5si1091316pgf.93.2018.02.14.05.44.02; Wed, 14 Feb 2018 05:44:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=0aWZ23TT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030416AbeBNNn4 (ORCPT + 28 others); Wed, 14 Feb 2018 08:43:56 -0500 Received: from mail-wr0-f193.google.com ([209.85.128.193]:36522 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030372AbeBNNnu (ORCPT ); Wed, 14 Feb 2018 08:43:50 -0500 Received: by mail-wr0-f193.google.com with SMTP id u15so643196wrg.3 for ; Wed, 14 Feb 2018 05:43:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RjVrLiphTPM+bT6FXKwuW21cyg+7H6uho37k+GLzpRo=; b=0aWZ23TTZZm88XH8UqvN0hL/Dgam9nDl2nIu5RBQsIwU9Vr/VdWlE0Kul03f2OMdjy mBZqguBG2Kh8w5kDrKFfplOJmmShp9HJYI+3thcmBd6cHQ9f5eXfI6IZPdwFdNxX6Eg+ 9RP3mXe+J98I5Mol2Nnf1SYmGXU9qYRJqXoK14Xzz8/vlfyv3tswGd0DWOAVrDQx7llf eXWl/1eVHoE6lnq0fkVUq0CDNldXOrYutJZZH1Jh9YoGcPc8w996NgbzVYtKimleSmdT CE8er3P1wwpf8gTdcd2QY3k8+A+0KkTI+05J/E38PD8tsdtw4dE0fkdzEwUtapv7XSTf MfEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RjVrLiphTPM+bT6FXKwuW21cyg+7H6uho37k+GLzpRo=; b=htje6hO67GT8r4AGdExKG0FGR4udLyHkKF1NIdy2mTeHvQzO7xd+mdedgoSOlVcXuT WyHT4irsI3jcLr065sViUEFBVH4MMwqsJ9DQ34BCD2fhLqyLXDYyqaCgRW8/KhvOmUr9 b1nI7AyOr1VsOrG9uBmvb6llgt7MvSuOjScVKkBGfCDPWN6MVsMxEf/AXoHST+vyz7Ev kKg6s+Ld3vNUz9F3AuKjP2IKRfwlb2PtWT48Xzo657GIsnUW5GeoJqo4j/GvoJo77mhF ydrQD9DbhI5EY7wuGOrgJa2WCv5WhQxTINEGRGVG0qsjkuGORXo0RsNStWU15AOQNleM D1hA== X-Gm-Message-State: APf1xPAJD7J2M2aic6O/M2vxammiPY/NZeoabfpeQW8vHCs9CzdSGgeo Zwu7pSxcZaWFQ1qEjcn2UCtAuA== X-Received: by 10.223.186.83 with SMTP id t19mr4382315wrg.252.1518615829316; Wed, 14 Feb 2018 05:43:49 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:48 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, Stephen Boyd , Shawn Guo , Dong Aisheng Subject: [PATCH v2 4/8] clk: migrate the count of orphaned clocks at init Date: Wed, 14 Feb 2018 14:43:36 +0100 Message-Id: <20180214134340.17242-5-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The orphan clocks reparents should migrate any existing count from the orphan clock to its new acestor clocks, otherwise we may have inconsistent counts in the tree and end-up with gated critical clocks Assuming we have two clocks, A and B. * Clock A has CLK_IS_CRITICAL flag set. * Clock B is an ancestor of A which can gate. Clock B gate is left enabled by the bootloader. Step 1: Clock A is registered. Since it is a critical clock, it is enabled. The clock being still an orphan, no parent are enabled. Step 2: Clock B is registered and reparented to clock A (potentially through several other clocks). We are now in situation where the enable count of clock A is 1 while the enable count of its ancestors is 0, which is not good. Step 3: in lateinit, clk_disable_unused() is called, the enable_count of clock B being 0, clock B is gated and and critical clock A actually gets disabled. This situation was found while adding fdiv_clk gates to the meson8b platform. These clocks parent clk81 critical clock, which is the mother of all peripheral clocks in this system. Because of the issue described here, the system is crashing when clk_disable_unused() is called. The situation is solved by reverting commit f8f8f1d04494 ("clk: Don't touch hardware when reparenting during registration"). To avoid breaking again the situation described in this commit description, enabling critical clock should be done before walking the orphan list. This way, a parent critical clock may not be accidentally disabled due to the CLK_OPS_PARENT_ENABLE mechanism. Fixes: f8f8f1d04494 ("clk: Don't touch hardware when reparenting during registration") Cc: Stephen Boyd Cc: Shawn Guo Cc: Dong Aisheng Signed-off-by: Jerome Brunet --- drivers/clk/clk.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) -- 2.14.3 Tested-by: Marek Szyprowski Tested-by: Heiko Stuebner diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index a4b4e4d6df5e..cca05ea2c058 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2969,23 +2969,38 @@ static int __clk_core_init(struct clk_core *core) rate = 0; core->rate = core->req_rate = rate; + /* + * Enable CLK_IS_CRITICAL clocks so newly added critical clocks + * don't get accidentally disabled when walking the orphan tree and + * reparenting clocks + */ + if (core->flags & CLK_IS_CRITICAL) { + unsigned long flags; + + clk_core_prepare(core); + + flags = clk_enable_lock(); + clk_core_enable(core); + clk_enable_unlock(flags); + } + /* * walk the list of orphan clocks and reparent any that newly finds a * parent. */ hlist_for_each_entry_safe(orphan, tmp2, &clk_orphan_list, child_node) { struct clk_core *parent = __clk_init_parent(orphan); - unsigned long flags; /* - * we could call __clk_set_parent, but that would result in a - * redundant call to the .set_rate op, if it exists + * We need to use __clk_set_parent_before() and _after() to + * to properly migrate any prepare/enable count of the orphan + * clock. This is important for CLK_IS_CRITICAL clocks, which + * are enabled during init but might not have a parent yet. */ if (parent) { /* update the clk tree topology */ - flags = clk_enable_lock(); - clk_reparent(orphan, parent); - clk_enable_unlock(flags); + __clk_set_parent_before(orphan, parent); + __clk_set_parent_after(orphan, parent, NULL); __clk_recalc_accuracies(orphan); __clk_recalc_rates(orphan, 0); } @@ -3002,16 +3017,6 @@ static int __clk_core_init(struct clk_core *core) if (core->ops->init) core->ops->init(core->hw); - if (core->flags & CLK_IS_CRITICAL) { - unsigned long flags; - - clk_core_prepare(core); - - flags = clk_enable_lock(); - clk_core_enable(core); - clk_enable_unlock(flags); - } - kref_init(&core->ref); out: clk_pm_runtime_put(core); From patchwork Wed Feb 14 13:43:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128348 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp625396ljc; Wed, 14 Feb 2018 05:47:45 -0800 (PST) X-Google-Smtp-Source: AH8x2267fxH9QH+VoiYnzGFp+1wsy0hh5fX0XbCIWz0IWt+x7uD6ybO0psv6+G3e94mbVcEQOVWa X-Received: by 2002:a17:902:32a2:: with SMTP id z31-v6mr4659831plb.32.1518616065101; Wed, 14 Feb 2018 05:47:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518616065; cv=none; d=google.com; s=arc-20160816; b=SrYVZvVA4tSRdVM7xYGdR4xBxaga7iwtN9oqgNIekl0EJ7/Cu2oxpN5QwdWfingl3f tSTFGyTCgFIh01xcVoCk47ZN+wHyW4uCWs91cj84ljvNiFqY8a96rfOdu/UwvCwBIVCc ea7FoscbAClz753LjYbDtMsg7eswGL4cK1TxZ2lZ26YWLgJXlwqH504a7A/gG1Wdbetg 4Zjx8NKkHnSrdUZO1KX9ItxdxUis828dHnMhiNmepOXqRlKgN1AFCywSEgCsbO0yYen9 +6jVs4rQZMEDyU5GYHRI8LzFfplZqasQHbTxTP87/N9oBG7+5cjwu+4RSkTfpAnYvGPx lGeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=xvmHmSrapQovZQJzIEqIpaecKemQ2ijAcfwElQXzau4=; b=zUhSavON1usUWvFTnScuFYPhlqmc6fM+sdqNHXKKk7UeaO3CTHqm1nRakRTv1FqcBf QsUzuhRNfOpYwagamKGXGaTKuu7jfsI7jwB6OYg03P9QsgXLVZz88LtObZ4aEMBMAvR9 7/fPgFs/MdsOJ2Y9XGBMofTiyAX/ZFXciCT2DZg7CtRczH+Z4Mm2GZQ+SzAn2IfkIQmQ 05nZzrPBP7CCyU2LSxpwscE2w47nXyjaaXhiiFnAImpVobWcLGoU1Gck+MvpwByVuBKR 85hn3UkzaPacZM0PN1xnmaWcW0RwMSAV4HaSGr7VuDF+BmEn7ll1ThXd2iNl/Ef9YUMz sxXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=ABxgKet5; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y38-v6si1619230plh.448.2018.02.14.05.47.44; Wed, 14 Feb 2018 05:47:45 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=ABxgKet5; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030452AbeBNNrj (ORCPT + 28 others); Wed, 14 Feb 2018 08:47:39 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:44877 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030393AbeBNNnv (ORCPT ); Wed, 14 Feb 2018 08:43:51 -0500 Received: by mail-wr0-f194.google.com with SMTP id v65so15403116wrc.11 for ; Wed, 14 Feb 2018 05:43:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xvmHmSrapQovZQJzIEqIpaecKemQ2ijAcfwElQXzau4=; b=ABxgKet5nBv2/vg7rp8LvTcff4QNqml63fBDzyx5svMZ2YRJZkDOUHiI8hewy0OwM2 rFfsB1niIj6rB19dXUK6v3aCvxpoe9KQrX7xNVISnL9f8vyj/7uEwdvp8bu2ld5MdFNB 263KSfwv07thCGbWjP6nzzTlMr+00YWAA1nidIyhNnXThh5UoJq5bI/YIrbTrvt+Klw1 zku0Z2kS3r7b9eqi5ixsL4ZMj7OM/fIGbmCtAwyvoPc1geNa+erISee1qut0i9Cs4p2S wesGtZi/56mcDnKgEi1/8NpRhjVnmTOMnx4tc8rVYunn33TKKbwWsBahtOSKfz8NyT4j zaXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xvmHmSrapQovZQJzIEqIpaecKemQ2ijAcfwElQXzau4=; b=WlroQt4F/cryweFq8urc2vWu11xWJiG9fT9/cG1nrjsYSfsZNa9Wg6ILAkLtUghsgi KWmVr1BUyjyhVqXg/PQiBLiGLlWhKNUaKkcuqvusmXS2CVJlRuCXRFJAF/jPkjEdjs6t zuLz/wajn92yunQ9T8v35SZVSyB26wfvkd24sb0QFJvBYhhJ+gOahivSx3SEs98Hnq3m z6J6XjrT4Wg8OOktQDFzmQ24sg9UMWT44yPVJIZYkHUWayKS+++dnc1JbjXgaAN2aaTb UIIairFEYtnKiCq2J8dshKMjeMz9kM3vZf9iIzI2bqB/SpFl3BqHjCvisockaQCGZLqL q/vw== X-Gm-Message-State: APf1xPAGMOodzAPBhzJTbU0j4YxV2B7wIsXnN4dLuuLfJckeAEReAmFT SeUbB8uTK2AvsjqhW00JJAhvcA== X-Received: by 10.223.209.3 with SMTP id a3mr4363219wri.27.1518615830357; Wed, 14 Feb 2018 05:43:50 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.49 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:49 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/8] clk: call the clock init() callback before any other ops callback Date: Wed, 14 Feb 2018 14:43:37 +0100 Message-Id: <20180214134340.17242-6-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some clocks may need to initialize things, whatever it is, before being able to properly operate. Move the .init() call before any other callback, such recalc_rate() or get_phase(), so the clock is properly setup before being used. Signed-off-by: Jerome Brunet --- Stephen, Mike, This change is addressing a problem I have with clock driver I'm working on. This driver needs the .init() callback to run first is order to answer correctly .get_phase(). It does not address an existing issue, not one that I'm aware of at least. This is why I did not put a Fixes tag. In any case, it makes sense to run init before running anything else. drivers/clk/clk.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) -- 2.14.3 diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index cca05ea2c058..9d56be6ead39 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -2929,6 +2929,17 @@ static int __clk_core_init(struct clk_core *core) core->orphan = true; } + /* + * optional platform-specific magic + * + * The .init callback is not used by any of the basic clock types, but + * exists for weird hardware that must perform initialization magic. + * Please consider other ways of solving initialization problems before + * using this callback, as its use is discouraged. + */ + if (core->ops->init) + core->ops->init(core->hw); + /* * Set clk's accuracy. The preferred method is to use * .recalc_accuracy. For simple clocks and lazy developers the default @@ -3006,17 +3017,6 @@ static int __clk_core_init(struct clk_core *core) } } - /* - * optional platform-specific magic - * - * The .init callback is not used by any of the basic clock types, but - * exists for weird hardware that must perform initialization magic. - * Please consider other ways of solving initialization problems before - * using this callback, as its use is discouraged. - */ - if (core->ops->init) - core->ops->init(core->hw); - kref_init(&core->ref); out: clk_pm_runtime_put(core); From patchwork Wed Feb 14 13:43:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128346 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp622616ljc; Wed, 14 Feb 2018 05:44:28 -0800 (PST) X-Google-Smtp-Source: AH8x225XOObwhbrVqYnIkiMjsHp/5KGTwr5GjJBHfeH6DxTOVnBhVLfjRcsfa3IdNoK/5zpNbVz9 X-Received: by 2002:a17:902:a984:: with SMTP id bh4-v6mr4478330plb.95.1518615868519; Wed, 14 Feb 2018 05:44:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518615868; cv=none; d=google.com; s=arc-20160816; b=iRkbz9FUArxI18bKgJrR/0VBawdsDDNb6kjbJXi3ghg4LFTzKCXkApsyriLit89RpG rxurDuz1B4zN6KMHcOxx83W98fBQ95RK73uP37jp90ng6EjlC7IU52eEZ75xfl6/4sjJ OLhdzofTafSf2kf4x1WlUptVPfhC3LtV/qccjR8/48i59/6dqKvtyLWj32XTOvp9r/HQ l/Mpa2nHb+BPzxqHEusPlnbC9umxCwGyF2NIN6JXOyT9QvlBM9cMrH5fxR5vGCRHZcFh uV0CBn28XJWsAnBr8l9cvVyvVeQogOUdNtjluIp38Boy0i4Vzg55jEpV3xomWov5ZTMz mtbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=lcVG5lGfn7OnzNygJWB1Z5rJ5OoOQy/M+v8O8bDngvM=; b=VI4Ni+OGkzMDZmukOFePRXLv8pC13h02D7AuCNdGFAt5EGYTrtpZYWNUO+fJB+Qq6U nC1fO+zbvAdwQoQ+D5HDIZwKOLsqZtFYRv2tTDOEwshzz+8dIQHr4grH7am92GBT3xjo vRxQgEL/mizzI0NdO+iL4J2w1bcS3M12Z8a4fgUBqstC9wqFAaLRNI4E8yk/TnZhwX44 qraQENiQYiat/Qo62Ikpyv/+6yv5Gy+4+nqdriRK/AzW1lA6iZiBBmWArr7R4C/nAvR9 M/kgIP6DWgnURMEQrHSE+kyGfpH1sSWo6OVmU0IvencdQtowWXjBlJRQ/uqX0ZDD60x0 IQgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=d/9Wmi6K; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n11si2763430pgq.230.2018.02.14.05.44.28; Wed, 14 Feb 2018 05:44:28 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=d/9Wmi6K; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030454AbeBNNoY (ORCPT + 28 others); Wed, 14 Feb 2018 08:44:24 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:44880 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030395AbeBNNnx (ORCPT ); Wed, 14 Feb 2018 08:43:53 -0500 Received: by mail-wr0-f195.google.com with SMTP id v65so15403168wrc.11 for ; Wed, 14 Feb 2018 05:43:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lcVG5lGfn7OnzNygJWB1Z5rJ5OoOQy/M+v8O8bDngvM=; b=d/9Wmi6Kv9sywHNSlLITTznVjKjlXa28B/M26dsuPWqlwfm3qybO+U2opMLJeFeK11 Nk8HlDpw9dHso2o12qZAaiI5Rx+qEqZ1YwxffTxFDZ/ZU+yAFWr8jIIzm/VRDKhjv2Xl 6Sjz/BAUF4AhZsSJ0TfY9UUpl9d54siskwG48gN11vbbelssaQzi65bEiZhIDntmcikp GCCwX83noVY83xR8tlTs2LToba/Wdz6q7c+svVZr2USkEa1mNnIKEnECFmvHtFz7n17N txFixdT/00A8Zwo35OtWb+C3umwtUwxb+1B9do9B6ZeWD+BRZdpjM/p09id3+5Js0hKL qVxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lcVG5lGfn7OnzNygJWB1Z5rJ5OoOQy/M+v8O8bDngvM=; b=jQ81ElrRn/JAPpXtKaByc/qqdHjxGyKu9wjRa/se2N1+vEfbdpFXzXwqhzVoX13bIY E++GXyKp8zMDWuq7MWar+UbnjUpazFPEgDwoW1kLzr8IzKRp+wy2A01ye0bGnEYq3QVS Lcp9fUOkFDmckTPiBGCYAJal7RowPUjFVvMYDmSDd/1DYr4y7kawN9B29HrCDC8CHSR2 aZs2W5aciaaSZjhLh9yWzLe/SV15VXcfK206sVbAFvSZO31bwuBvlb8W3ZHmk5reexYZ h3D5WzW/HnddlBdZ+qd971Y3UHNF5+IP7UfP3d5IUIJU3yvXu39reTWl0B+Q6VoxjdUF 1RYw== X-Gm-Message-State: APf1xPBxB6x5PJe0abC0GkWBkTWEgTLCAZmGgjqcYv5zBb39VtSAlrks ARj7vNZmev49vzqxny5D6e6BnQ== X-Received: by 10.223.150.65 with SMTP id c1mr4686676wra.167.1518615831374; Wed, 14 Feb 2018 05:43:51 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.50 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:50 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 6/8] clk: fix mux clock documentation Date: Wed, 14 Feb 2018 14:43:38 +0100 Message-Id: <20180214134340.17242-7-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The mux documentation mentions the non-existing parameter width instead of mask, so just sed this. The table field is missing in the documentation of clk_mux. Add a small blurb explaining what it is Fixes: 9d9f78ed9af0 ("clk: basic clock hardware types") Signed-off-by: Jerome Brunet --- include/linux/clk-provider.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -- 2.14.3 diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index fe720d679c31..cb18526d69cb 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -450,8 +450,9 @@ void clk_hw_unregister_divider(struct clk_hw *hw); * * @hw: handle between common and hardware-specific interfaces * @reg: register controlling multiplexer + * @table: array of register values corresponding to the parent index * @shift: shift to multiplexer bit field - * @width: width of mutliplexer bit field + * @mask: mask of mutliplexer bit field * @flags: hardware-specific flags * @lock: register lock * From patchwork Wed Feb 14 13:43:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128347 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp622740ljc; Wed, 14 Feb 2018 05:44:39 -0800 (PST) X-Google-Smtp-Source: AH8x225ruOy67C75hh8E3LuUCLsvIbnnjOvdoQ9G1ZIPAxTikdjMWw79agg/s/2UXRBN0NGNq4b7 X-Received: by 10.98.202.2 with SMTP id n2mr4807094pfg.13.1518615879058; Wed, 14 Feb 2018 05:44:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518615879; cv=none; d=google.com; s=arc-20160816; b=Pzs7xQeIC1JkQlZOeXHqyXIpLBb9M460UN0OVgk1epRzbRHJlSFQ/th3fHIU4p2doq qCOIaI0qsu0ZBZT9UBMdo/PCHzpVq7lPTCTxaUY8D7blxK3r3RbuMnM29T9u9wK0hn6W hk232klGuveantjU7GvMz2xANC0JelaRQ7t/9F5tIC3TwLWYQhl6jAxFxmgysC72Dn4H ZJMzQ3kXBsequA7CiSN/caCIodRAh8rVAOsS8AhjYdsgLBpdulNTkl8life0l868eWoC Si6hjj7r42S9tVDbCwxDUvrBtYJX4hBERRgw5HSiQPU4PONTjaWBeZRWBUnfPK7rHhjW EMhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=xpoPJpSjmefP/eaP3ikiVrqO/x/qS2dsetdWYBOL7/A=; b=GVgh0o+AAhdlJ5Fa5zUwp5g9B+Eof19G/yq2kYTdu7oPj0rONvXF1pj/j6n2JDoj9D ZcdFh/gIk5tx1f7FWyvJTaUj8rvfsyVa30jlRv3+quQGm25qSwYZzqholFEM9PUwE0u7 PyoxNo9Up+I1GP7JN4FShh+xZVANKGZ9oVBrt4rjTIT3Ub65WTmES8me3VcOBO4rb2cj nfPc2PqZWoWNrudrycLRGj6t3yeK16Mz2wBgos2V0sB8WOIhHoG/DyRD/J/4kgco2LKp 67AAVqVb14FgGfh/VfQ40PJ0ZxQ1lcEA+p0xca/5EfuuxXrZG7ciVFzvMftG/T0ug95O E3wQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Woyjf2hy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n11si2763430pgq.230.2018.02.14.05.44.38; Wed, 14 Feb 2018 05:44:39 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Woyjf2hy; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030441AbeBNNoW (ORCPT + 28 others); Wed, 14 Feb 2018 08:44:22 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:46788 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030398AbeBNNnx (ORCPT ); Wed, 14 Feb 2018 08:43:53 -0500 Received: by mail-wr0-f194.google.com with SMTP id 34so11930126wre.13 for ; Wed, 14 Feb 2018 05:43:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xpoPJpSjmefP/eaP3ikiVrqO/x/qS2dsetdWYBOL7/A=; b=Woyjf2hyrBLeryTnWdKQH1XPJNksSZtGntWrSwKEbI4oplGxntR9R/6iSAz1z6rcEH eQPtpWRE05libxYLfRqrqE5oSyOF44dQasmD9agj9JSux/cONYnbuBZIr9kv+z+Gnn71 UYt25cOENH6xn8on3ZCUHOEdmBasrKunZ93z0MeqW1yknZiuhjRiFtSPOshHcSTSziHv bz2bs/qtMv+leTrgBaM454iJD46qPkuLJXvtghXhqJfRra2dUGsIk1ObydLfTnRXSs21 qbQgPOlRAtr/HQubh8Fmw30sSRPOMABXNtf/mC6WseqJlzjR3pgeJd6BB9TolV7I35mO 49KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xpoPJpSjmefP/eaP3ikiVrqO/x/qS2dsetdWYBOL7/A=; b=LADTOYSLnGKuJMcBRVhPXs3DTY3aTxmbiwIg3n435pzKBCzMMDClG0+E+9YD4feltX +8ZPgiDuu5ZbEehv0M/3E+LJclc04SGmFaG7S8/K9WWqXQ16qnB9k51yXY4Yy57k9ycQ 44DeN7mK/NnmH0bMj4UFkNNwh8nrI/6NDem197QOeSI/4mmlEm1m6/jkHU2DS5Gig2iZ MrIj8DoLE5N3OlmgDBTo1h+wzax91b7mgkM4aDUq7lz034pgmlyHSmjnNWb6RoHYapdH ptAS5GgppHSL733rX/PI+YjrcWmg8PsZynGlxHz8Y/n0V84XGQ4TB1ndEnDYnOld2eeW 1dyA== X-Gm-Message-State: APf1xPDKIPVKIiBDGiu0XG06vb/+WvGJF7QsQ/h5tY4svludUaz7t2QY 6eMZAvnQP0jO2h4nOdf3xmpasg== X-Received: by 10.223.159.77 with SMTP id f13mr4521216wrg.196.1518615832402; Wed, 14 Feb 2018 05:43:52 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.51 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:51 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 7/8] clk: divider: read-only divider can propagate rate change Date: Wed, 14 Feb 2018 14:43:39 +0100 Message-Id: <20180214134340.17242-8-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When a divider clock has CLK_DIVIDER_READ_ONLY set, it means that the register shall be left un-touched, but it does not mean the clock should stop rate propagation if CLK_SET_RATE_PARENT is set This is properly handled in qcom clk-regmap-divider but it was not in the generic divider To fix this situation, introduce a new helper function divider_ro_round_rate, on the same model as divider_round_rate. Fixes: e6d5e7d90be9 ("clk-divider: Fix READ_ONLY when divider > 1") Signed-off-by: Jerome Brunet --- drivers/clk/clk-divider.c | 36 ++++++++++++++++++++++++++++++------ include/linux/clk-provider.h | 15 +++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) -- 2.14.3 Tested-By: David Lechner diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 3c98d2650fa3..b6234a5da12d 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c @@ -342,19 +342,43 @@ long divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, } EXPORT_SYMBOL_GPL(divider_round_rate_parent); +long divider_ro_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, + unsigned long rate, unsigned long *prate, + const struct clk_div_table *table, u8 width, + unsigned long flags, unsigned int val) +{ + int div; + + div = _get_div(table, val, flags, width); + + /* Even a read-only clock can propagate a rate change */ + if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) { + if (!parent) + return -EINVAL; + + *prate = clk_hw_round_rate(parent, rate * div); + } + + return DIV_ROUND_UP_ULL((u64)*prate, div); +} +EXPORT_SYMBOL_GPL(divider_ro_round_rate_parent); + + static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate) { struct clk_divider *divider = to_clk_divider(hw); - int bestdiv; /* if read only, just return current value */ if (divider->flags & CLK_DIVIDER_READ_ONLY) { - bestdiv = clk_readl(divider->reg) >> divider->shift; - bestdiv &= clk_div_mask(divider->width); - bestdiv = _get_div(divider->table, bestdiv, divider->flags, - divider->width); - return DIV_ROUND_UP_ULL((u64)*prate, bestdiv); + u32 val; + + val = clk_readl(divider->reg) >> divider->shift; + val &= clk_div_mask(divider->width); + + return divider_ro_round_rate(hw, rate, prate, divider->table, + divider->width, divider->flags, + val); } return divider_round_rate(hw, rate, prate, divider->table, diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index cb18526d69cb..210a890008f9 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h @@ -420,6 +420,10 @@ long divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, unsigned long rate, unsigned long *prate, const struct clk_div_table *table, u8 width, unsigned long flags); +long divider_ro_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, + unsigned long rate, unsigned long *prate, + const struct clk_div_table *table, u8 width, + unsigned long flags, unsigned int val); int divider_get_val(unsigned long rate, unsigned long parent_rate, const struct clk_div_table *table, u8 width, unsigned long flags); @@ -780,6 +784,17 @@ static inline long divider_round_rate(struct clk_hw *hw, unsigned long rate, rate, prate, table, width, flags); } +static inline long divider_ro_round_rate(struct clk_hw *hw, unsigned long rate, + unsigned long *prate, + const struct clk_div_table *table, + u8 width, unsigned long flags, + unsigned int val) +{ + return divider_ro_round_rate_parent(hw, clk_hw_get_parent(hw), + rate, prate, table, width, flags, + val); +} + /* * FIXME clock api without lock protection */ From patchwork Wed Feb 14 13:43:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 128345 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp622348ljc; Wed, 14 Feb 2018 05:44:10 -0800 (PST) X-Google-Smtp-Source: AH8x225tnzsu3p9dS3Is78lMNdBvK2KF6Eu7DOvngY22MFmbzzr3+BKvp1Ze1hqjuwnFzAulirgM X-Received: by 2002:a17:902:aa46:: with SMTP id c6-v6mr4556829plr.357.1518615849871; Wed, 14 Feb 2018 05:44:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518615849; cv=none; d=google.com; s=arc-20160816; b=U8sfsbonuCxmwL0wQwQfYC2RlIQ5dNPw9vmFSt/FxRTeGcAw/yauuq8gGFk6oqwGg9 EGBuoZgYfVMRrRc3UPHLxpRmxYeqZ1Av0prDhy7eSWTvptE3bF7qoZXy0AaPdkDsn7Vy hGUkmpgz/kcm5GHC2jZewPzSBeWL/6H2xtBNBy0ugrTeiosr8i07caZKqCxtthdztsm1 d1SJ7YvGfFP7sYY7fXAqNLzRR2S6ehAX7bLs0ql4R+7ad7E6ZJiDs7Ay5W2TpY9mH5zw XeXChglvDBx6TOoDcPgO+4KoHjHXs7dG1psop+A1Lu7eGsz3Phi9vwW1kuslARe5cM+l QBZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=bDLLco5S7iNPdRidSWRUB29Devrk8i84t9g+zhPMvLY=; b=oooG8LGnb8m9I6u1/TnNL++RDuJn5KBpFefwV2pTbepbdmZq9l3DAVeUA4CwL6BLmW 7y5vzAt4OzdERaqON0wdvDbh9dRYR8N9RhUCiOEDyCDYaRKrkBDwAtw20hKvc5wpTNAJ G4bM5zAz18B5uTrXOcwhY+Y0Nq8nluty0weNsTAMBd6ZeetIuulp8ebbN5e09QJHclJN oJ8eaJiXyZbMh3zlK9mc6mYLaz/ZpZ+ctq7eN0S0/zJSx0wQTl2OE9f/QjrugUcitA0Y 2tcN1aKI6jwsXtCjCVz4v2aSJ2qPDBksGV+JyZQsMLjye4+WfpmTk+rBDu6TrxXlryiZ Q5Pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=pr2o+INe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v35-v6si1453710plg.724.2018.02.14.05.44.09; Wed, 14 Feb 2018 05:44:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=pr2o+INe; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030426AbeBNNoH (ORCPT + 28 others); Wed, 14 Feb 2018 08:44:07 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:33680 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030406AbeBNNny (ORCPT ); Wed, 14 Feb 2018 08:43:54 -0500 Received: by mail-wm0-f65.google.com with SMTP id x4so17839148wmc.0 for ; Wed, 14 Feb 2018 05:43:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bDLLco5S7iNPdRidSWRUB29Devrk8i84t9g+zhPMvLY=; b=pr2o+INelgXpqL6Bk3gT/HIgRHt/I6xw4pGAzkYIFizF1N6QwH4pO2+a4mpeoXL5Cw rlgQ+ecsIfe8f2yxXn+snhAI26HvdLGIcEXqMUbRnqS0YKrAJyyqQ7QCuEH8CPpw+qwW OHZEm60cAyyk8xfQ7wIaEeyz/l9+6ItXtAGpWXI6+alEm/9GxDH4P9odcvtoiNfrXpps nZB/xowk8q7TDeW3S9xvT1VIAOXOGo7RMYkZxE+JzTx9ElNA78lCewgXTH39hsZ0ivIs ahXEnfhQKizQ5VzLWWfgDgvbneH5aja6QsBUSwIE/qt0i2xiICJD5RE01fDul2gx/oE5 dwgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bDLLco5S7iNPdRidSWRUB29Devrk8i84t9g+zhPMvLY=; b=t4b2ZgeaYs6sxKf8txMc68cpfAzx2TdnSrW6zjHL8Bcky7paeiVNRLby1dMHqb3zXD y/nTCad8chjWn4uDWi0+a5hBzSO8Q8QIkE3ZW3Q6RC7bFxj/zhvVHX8qXBNn9bGE61j+ ndmK4+N8tvHJyK05wSwnSYFxDSQw+OMNT/sd9PVv0kToZ331rlNmgM/08+6dX4r13X2H 5D9tZabnh5ho6937ooH+/leIUgQe8sUjbjS/qaXghQMh1b3klcIBqYgjunC61P+0Lhvm PXi4PFchJqt7EG5hws5roAac+nSnsRZmrhV+nML4JAT81IWpXj5mFemxS3na0CjBa7G1 mIJA== X-Gm-Message-State: APf1xPCMG0rueDkI0PQD/Bdbe+MIRZZl68Y6ilRVDdB0uMNkyEFelh5v mMCEEk8Qm1FPeIHXV7PE4ESH0A== X-Received: by 10.28.206.6 with SMTP id e6mr2000200wmg.160.1518615833469; Wed, 14 Feb 2018 05:43:53 -0800 (PST) Received: from boomer.lan (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id k5sm6337694wmg.47.2018.02.14.05.43.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 05:43:53 -0800 (PST) From: Jerome Brunet To: Michael Turquette , Stephen Boyd Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 8/8] clk: qcom: use divider_ro_round_rate helper Date: Wed, 14 Feb 2018 14:43:40 +0100 Message-Id: <20180214134340.17242-9-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180214134340.17242-1-jbrunet@baylibre.com> References: <20180214134340.17242-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There is now an helper function to round the rate when the divider is read-only. Let's use it Signed-off-by: Jerome Brunet --- drivers/clk/qcom/clk-regmap-divider.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) -- 2.14.3 diff --git a/drivers/clk/qcom/clk-regmap-divider.c b/drivers/clk/qcom/clk-regmap-divider.c index 4e9b8c2c8980..1ee75a5e93f4 100644 --- a/drivers/clk/qcom/clk-regmap-divider.c +++ b/drivers/clk/qcom/clk-regmap-divider.c @@ -28,22 +28,14 @@ static long div_round_ro_rate(struct clk_hw *hw, unsigned long rate, { struct clk_regmap_div *divider = to_clk_regmap_div(hw); struct clk_regmap *clkr = ÷r->clkr; - u32 div; - struct clk_hw *hw_parent = clk_hw_get_parent(hw); - - regmap_read(clkr->regmap, divider->reg, &div); - div >>= divider->shift; - div &= BIT(divider->width) - 1; - div += 1; - - if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) { - if (!hw_parent) - return -EINVAL; + u32 val; - *prate = clk_hw_round_rate(hw_parent, rate * div); - } + regmap_read(clkr->regmap, divider->reg, &val); + val >>= divider->shift; + val &= BIT(divider->width) - 1; - return DIV_ROUND_UP_ULL((u64)*prate, div); + return divider_ro_round_rate(hw, rate, prate, NULL, divider->width, + CLK_DIVIDER_ROUND_CLOSEST, val); } static long div_round_rate(struct clk_hw *hw, unsigned long rate,