Re: [PATCH v2 1/9] clk: sunxi: Give sunxi_factors_register a registers parameter

2014-11-26 Thread Maxime Ripard
On Sun, Nov 23, 2014 at 02:38:07PM +0100, Hans de Goede wrote:
 Before this commit sunxi_factors_register uses of_iomap(node, 0) to get
 the clk registers. The sun6i prcm has factor clocks, for which we want to
 use sunxi_factors_register, but of_iomap(node, 0) does not work for the prcm
 factor clocks, because the prcm uses the mfd framework, so the registers
 are not part of the dt-node, instead they are added to the platform_device,
 as platform_device resources.
 
 This commit makes getting the registers the callers duty, so that
 sunxi_factors_register can be used with mfd instantiated platform device too.
 
 While at it also add error checking to the of_iomap calls.
 
 This commit also drops the __init function from sunxi_factors_register since
 platform driver probe functions are not __init.
 
 Signed-off-by: Hans de Goede hdego...@redhat.com

Queued for 3.20, thanks!

Maxime

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com


signature.asc
Description: Digital signature


[PATCH v2 1/9] clk: sunxi: Give sunxi_factors_register a registers parameter

2014-11-23 Thread Hans de Goede
Before this commit sunxi_factors_register uses of_iomap(node, 0) to get
the clk registers. The sun6i prcm has factor clocks, for which we want to
use sunxi_factors_register, but of_iomap(node, 0) does not work for the prcm
factor clocks, because the prcm uses the mfd framework, so the registers
are not part of the dt-node, instead they are added to the platform_device,
as platform_device resources.

This commit makes getting the registers the callers duty, so that
sunxi_factors_register can be used with mfd instantiated platform device too.

While at it also add error checking to the of_iomap calls.

This commit also drops the __init function from sunxi_factors_register since
platform driver probe functions are not __init.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/clk/sunxi/clk-factors.c| 10 --
 drivers/clk/sunxi/clk-factors.h|  7 ---
 drivers/clk/sunxi/clk-mod0.c   | 24 ++--
 drivers/clk/sunxi/clk-sun8i-mbus.c | 13 +++--
 drivers/clk/sunxi/clk-sunxi.c  | 11 ++-
 5 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/drivers/clk/sunxi/clk-factors.c b/drivers/clk/sunxi/clk-factors.c
index f83ba09..fc4f4b5 100644
--- a/drivers/clk/sunxi/clk-factors.c
+++ b/drivers/clk/sunxi/clk-factors.c
@@ -156,9 +156,10 @@ static const struct clk_ops clk_factors_ops = {
.set_rate = clk_factors_set_rate,
 };
 
-struct clk * __init sunxi_factors_register(struct device_node *node,
-  const struct factors_data *data,
-  spinlock_t *lock)
+struct clk *sunxi_factors_register(struct device_node *node,
+  const struct factors_data *data,
+  spinlock_t *lock,
+  void __iomem *reg)
 {
struct clk *clk;
struct clk_factors *factors;
@@ -168,11 +169,8 @@ struct clk * __init sunxi_factors_register(struct 
device_node *node,
struct clk_hw *mux_hw = NULL;
const char *clk_name = node-name;
const char *parents[FACTORS_MAX_PARENTS];
-   void __iomem *reg;
int i = 0;
 
-   reg = of_iomap(node, 0);
-
/* if we have a mux, we will have 1 parents */
while (i  FACTORS_MAX_PARENTS 
   (parents[i] = of_clk_get_parent_name(node, i)) != NULL)
diff --git a/drivers/clk/sunxi/clk-factors.h b/drivers/clk/sunxi/clk-factors.h
index 9913840..1f5526d 100644
--- a/drivers/clk/sunxi/clk-factors.h
+++ b/drivers/clk/sunxi/clk-factors.h
@@ -37,8 +37,9 @@ struct clk_factors {
spinlock_t *lock;
 };
 
-struct clk * __init sunxi_factors_register(struct device_node *node,
-  const struct factors_data *data,
-  spinlock_t *lock);
+struct clk *sunxi_factors_register(struct device_node *node,
+  const struct factors_data *data,
+  spinlock_t *lock,
+  void __iomem *reg);
 
 #endif
diff --git a/drivers/clk/sunxi/clk-mod0.c b/drivers/clk/sunxi/clk-mod0.c
index 4a56385..5fb1f7e 100644
--- a/drivers/clk/sunxi/clk-mod0.c
+++ b/drivers/clk/sunxi/clk-mod0.c
@@ -78,7 +78,17 @@ static DEFINE_SPINLOCK(sun4i_a10_mod0_lock);
 
 static void __init sun4i_a10_mod0_setup(struct device_node *node)
 {
-   sunxi_factors_register(node, sun4i_a10_mod0_data, 
sun4i_a10_mod0_lock);
+   void __iomem *reg;
+
+   reg = of_iomap(node, 0);
+   if (!reg) {
+   pr_err(Could not get registers for mod0-clk: %s\n,
+  node-name);
+   return;
+   }
+
+   sunxi_factors_register(node, sun4i_a10_mod0_data,
+  sun4i_a10_mod0_lock, reg);
 }
 CLK_OF_DECLARE(sun4i_a10_mod0, allwinner,sun4i-a10-mod0-clk, 
sun4i_a10_mod0_setup);
 
@@ -86,7 +96,17 @@ static DEFINE_SPINLOCK(sun5i_a13_mbus_lock);
 
 static void __init sun5i_a13_mbus_setup(struct device_node *node)
 {
-   struct clk *mbus = sunxi_factors_register(node, sun4i_a10_mod0_data, 
sun5i_a13_mbus_lock);
+   struct clk *mbus;
+   void __iomem *reg;
+
+   reg = of_iomap(node, 0);
+   if (!reg) {
+   pr_err(Could not get registers for a13-mbus-clk\n);
+   return;
+   }
+
+   mbus = sunxi_factors_register(node, sun4i_a10_mod0_data,
+ sun5i_a13_mbus_lock, reg);
 
/* The MBUS clocks needs to be always enabled */
__clk_get(mbus);
diff --git a/drivers/clk/sunxi/clk-sun8i-mbus.c 
b/drivers/clk/sunxi/clk-sun8i-mbus.c
index 8e49b44..c0629ff 100644
--- a/drivers/clk/sunxi/clk-sun8i-mbus.c
+++ b/drivers/clk/sunxi/clk-sun8i-mbus.c
@@ -68,8 +68,17 @@ static DEFINE_SPINLOCK(sun8i_a23_mbus_lock);
 
 static void __init sun8i_a23_mbus_setup(struct device_node *node)
 {
-   struct clk *mbus = sunxi_factors_register(node, sun8i_a23_mbus_data,
-