[RFC 13/18] clk: versatile: Use regmap instead of custom interface

From: Pawel Moll
Date: Mon Dec 23 2013 - 11:26:31 EST


This patch makes the Versatile Express clock generators
driver use regmap interface, instead of custom vexpress
config one. This required it to become a standard platform
driver (although registered very early, at core_initcall
level), which better fits the reality (dependencies on
other devices, mainly config infrastructure bridges).

Signed-off-by: Pawel Moll <pawel.moll@xxxxxxx>
Cc: Mike Turquette <mturquette@xxxxxxxxxx>
---
drivers/clk/versatile/Kconfig | 2 +-
drivers/clk/versatile/clk-vexpress-osc.c | 70 ++++++++++++++++++--------------
include/linux/vexpress.h | 3 --
3 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/drivers/clk/versatile/Kconfig b/drivers/clk/versatile/Kconfig
index 1530c93..3c694f0 100644
--- a/drivers/clk/versatile/Kconfig
+++ b/drivers/clk/versatile/Kconfig
@@ -18,7 +18,7 @@ config CLK_SP810
config CLK_VEXPRESS_OSC
bool "Clock driver for Versatile Express OSC clock generators"
depends on COMMON_CLK_VERSATILE
- depends on VEXPRESS_CONFIG
+ depends on REGMAP
default y if ARCH_VEXPRESS
---help---
Simple regmap-based driver driving clock generators on Versatile
diff --git a/drivers/clk/versatile/clk-vexpress-osc.c b/drivers/clk/versatile/clk-vexpress-osc.c
index 2dc8b41..e668cb2 100644
--- a/drivers/clk/versatile/clk-vexpress-osc.c
+++ b/drivers/clk/versatile/clk-vexpress-osc.c
@@ -11,18 +11,17 @@
* Copyright (C) 2012 ARM Limited
*/

-#define pr_fmt(fmt) "vexpress-osc: " fmt

#include <linux/clkdev.h>
#include <linux/clk-provider.h>
#include <linux/err.h>
#include <linux/of.h>
#include <linux/platform_device.h>
+#include <linux/regmap.h>
#include <linux/slab.h>
-#include <linux/vexpress.h>

struct vexpress_osc {
- struct vexpress_config_func *func;
+ struct regmap *reg;
struct clk_hw hw;
unsigned long rate_min;
unsigned long rate_max;
@@ -36,7 +35,7 @@ static unsigned long vexpress_osc_recalc_rate(struct clk_hw *hw,
struct vexpress_osc *osc = to_vexpress_osc(hw);
u32 rate;

- vexpress_config_read(osc->func, 0, &rate);
+ regmap_read(osc->reg, 0, &rate);

return rate;
}
@@ -60,7 +59,7 @@ static int vexpress_osc_set_rate(struct clk_hw *hw, unsigned long rate,
{
struct vexpress_osc *osc = to_vexpress_osc(hw);

- return vexpress_config_write(osc->func, 0, rate);
+ return regmap_write(osc->reg, 0, rate);
}

static struct clk_ops vexpress_osc_ops = {
@@ -78,8 +77,8 @@ struct clk * __init vexpress_osc_setup(struct device *dev)
if (!osc)
return NULL;

- osc->func = vexpress_config_func_get_by_dev(dev);
- if (!osc->func) {
+ osc->reg = dev_get_regmap(dev, NULL);
+ if (!osc->reg) {
kfree(osc);
return NULL;
}
@@ -93,33 +92,31 @@ struct clk * __init vexpress_osc_setup(struct device *dev)
return clk_register(NULL, &osc->hw);
}

-void __init vexpress_osc_of_setup(struct device_node *node)
+static int vexpress_osc_probe(struct platform_device *pdev)
{
struct clk_init_data init;
struct vexpress_osc *osc;
struct clk *clk;
u32 range[2];

- osc = kzalloc(sizeof(*osc), GFP_KERNEL);
+ osc = devm_kzalloc(&pdev->dev, sizeof(*osc), GFP_KERNEL);
if (!osc)
- goto error;
+ return -ENOMEM;

- osc->func = vexpress_config_func_get_by_node(node);
- if (!osc->func) {
- pr_err("Failed to obtain config func for node '%s'!\n",
- node->full_name);
- goto error;
- }
+ osc->reg = dev_get_regmap(&pdev->dev, NULL);
+ if (!osc->reg)
+ return -ENXIO;

- if (of_property_read_u32_array(node, "freq-range", range,
+ if (of_property_read_u32_array(pdev->dev.of_node, "freq-range", range,
ARRAY_SIZE(range)) == 0) {
osc->rate_min = range[0];
osc->rate_max = range[1];
}

- of_property_read_string(node, "clock-output-names", &init.name);
+ of_property_read_string(pdev->dev.of_node, "clock-output-names",
+ &init.name);
if (!init.name)
- init.name = node->full_name;
+ init.name = dev_name(&pdev->dev);

init.ops = &vexpress_osc_ops;
init.flags = CLK_IS_ROOT;
@@ -128,20 +125,31 @@ void __init vexpress_osc_of_setup(struct device_node *node)
osc->hw.init = &init;

clk = clk_register(NULL, &osc->hw);
- if (IS_ERR(clk)) {
- pr_err("Failed to register clock '%s'!\n", init.name);
- goto error;
- }
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
+
+ of_clk_add_provider(pdev->dev.of_node, of_clk_src_simple_get, clk);
+
+ dev_dbg(&pdev->dev, "Registered clock '%s'\n", init.name);

- of_clk_add_provider(node, of_clk_src_simple_get, clk);
+ return 0;
+}

- pr_debug("Registered clock '%s'\n", init.name);
+static struct of_device_id vexpress_osc_of_match[] = {
+ { .compatible = "arm,vexpress-osc", },
+ {}
+};

- return;
+static struct platform_driver vexpress_osc_driver = {
+ .driver = {
+ .name = "vexpress-osc",
+ .of_match_table = vexpress_osc_of_match,
+ },
+ .probe = vexpress_osc_probe,
+};

-error:
- if (osc->func)
- vexpress_config_func_put(osc->func);
- kfree(osc);
+static int __init vexpress_osc_init(void)
+{
+ return platform_driver_register(&vexpress_osc_driver);
}
-CLK_OF_DECLARE(vexpress_soc, "arm,vexpress-osc", vexpress_osc_of_setup);
+core_initcall(vexpress_osc_init);
diff --git a/include/linux/vexpress.h b/include/linux/vexpress.h
index 617c01b..45037f1 100644
--- a/include/linux/vexpress.h
+++ b/include/linux/vexpress.h
@@ -119,9 +119,6 @@ void vexpress_sysreg_of_early_init(void);
/* Clocks */

struct clk *vexpress_osc_setup(struct device *dev);
-void vexpress_osc_of_setup(struct device_node *node);
-
void vexpress_clk_init(void __iomem *sp810_base);
-void vexpress_clk_of_init(void);

#endif
--
1.8.3.2


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/