summaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorAhmad Fatoum <ahmad@a3f.at>2020-04-15 11:11:42 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2020-04-15 11:19:08 +0200
commitf4d3f554bc9214d9d1ac1e3bf16529996896cfd3 (patch)
treed632c3c3606224f81ac345b87ec706fab4df8b28 /drivers/mfd
parent96b0fd028deda9c4b2516c808234a5b1edfe34ef (diff)
downloadbarebox-f4d3f554bc9214d9d1ac1e3bf16529996896cfd3.tar.gz
barebox-f4d3f554bc9214d9d1ac1e3bf16529996896cfd3.tar.xz
mfd: syscon: enable specified clocks on syscon_base_lookup_by_phandle
Since commit b36b7b72 ("mfd: syscon: clock peripheral if specified in device tree"), we now clock syscons during access if the device tree nodes indicate a clocks property. We haven't been doing this for syscon_base_lookup_by_phandle though, because we did this as part of the regmap access functions, but that function returns a direct pointer to the MMIO region. The best way forward is probably dropping the syscon_base API altogether and change users to the regmap API instead, but for now, make the behavior consistent by enabling it permanently. This makes use safe from breakage that results from upstream device trees moving a clock from the consumer to the syscon provider (like in [1]) I've reviewed the current driver code users of syscon_base_lookup_by_phandle and all upstream device trees that match against the drivers lack a clocks property, so this shouldn't alter behavior (for now). [1]: c9322d4fe ("net: designware: eqos: stm32: drop no longer needed syscfg-clk") Signed-off-by: Ahmad Fatoum <ahmad@a3f.at> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/syscon.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index f1e6559d71..ab458428a6 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -105,10 +105,20 @@ static struct syscon *node_to_syscon(struct device_node *np)
static void __iomem *syscon_node_to_base(struct device_node *np)
{
struct syscon *syscon = node_to_syscon(np);
+ struct clk *clk;
if (IS_ERR(syscon))
return ERR_CAST(syscon);
+ /* Returning the direct pointer here side steps the regmap
+ * and any specified clock wouldn't be enabled on access.
+ * Deal with this by enabling the clock permanently if any
+ * syscon_node_to_base users exist.
+ */
+ clk = of_clk_get(np, 0);
+ if (!IS_ERR(clk))
+ clk_enable(clk);
+
return syscon->base;
}