| From cd4289779ab941fc8096ac9e8980eb6197b8b310 Mon Sep 17 00:00:00 2001 |
| From: Magnus Damm <damm@opensource.se> |
| Date: Thu, 13 Mar 2014 08:36:17 +0900 |
| Subject: ARM: shmobile: Introduce shmobile_clk_workaround() |
| |
| Introduce a new clock workaround function used by DT reference |
| code on the mach-shmobile subarchitecture. The new function |
| shmobile_clk_workaround() is used to configure clkdev to |
| allow DT and platform devices to coexist. It is possible for |
| the DT reference board code to also request enabling of the clock |
| in case the driver does not implement clock control. |
| |
| Signed-off-by: Magnus Damm <damm@opensource.se> |
| [horms+renesas@verge.net.au: Removed trailing blank line] |
| Reviewed-by: Wolfram Sang <wsa@sang-engineering.com> |
| Tested-by: Wolfram Sang <wsa@sang-engineering.com> |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| |
| (cherry picked from commit 25f5550f5a4b18fd77a2e719ba63cb34931ab66a) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| arch/arm/mach-shmobile/Makefile | 2 +- |
| arch/arm/mach-shmobile/clock.c | 28 ++++++++++++++++++++++++++++ |
| arch/arm/mach-shmobile/include/mach/clock.h | 16 ++++++++++++++++ |
| 3 files changed, 45 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile |
| index 76053770aa04..9c5cd8c53a85 100644 |
| --- a/arch/arm/mach-shmobile/Makefile |
| +++ b/arch/arm/mach-shmobile/Makefile |
| @@ -21,8 +21,8 @@ obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o |
| obj-$(CONFIG_ARCH_R7S72100) += setup-r7s72100.o |
| |
| # Clock objects |
| -ifndef CONFIG_COMMON_CLK |
| obj-y += clock.o |
| +ifndef CONFIG_COMMON_CLK |
| obj-$(CONFIG_ARCH_SH7372) += clock-sh7372.o |
| obj-$(CONFIG_ARCH_SH73A0) += clock-sh73a0.o |
| obj-$(CONFIG_ARCH_R8A73A4) += clock-r8a73a4.o |
| diff --git a/arch/arm/mach-shmobile/clock.c b/arch/arm/mach-shmobile/clock.c |
| index ad7df629d995..e7232a0373b9 100644 |
| --- a/arch/arm/mach-shmobile/clock.c |
| +++ b/arch/arm/mach-shmobile/clock.c |
| @@ -21,6 +21,32 @@ |
| */ |
| #include <linux/kernel.h> |
| #include <linux/init.h> |
| + |
| +#ifdef CONFIG_COMMON_CLK |
| +#include <linux/clk.h> |
| +#include <linux/clkdev.h> |
| +#include <mach/clock.h> |
| + |
| +void __init shmobile_clk_workaround(const struct clk_name *clks, |
| + int nr_clks, bool enable) |
| +{ |
| + const struct clk_name *clkn; |
| + struct clk *clk; |
| + unsigned int i; |
| + |
| + for (i = 0; i < nr_clks; ++i) { |
| + clkn = clks + i; |
| + clk = clk_get(NULL, clkn->clk); |
| + if (!IS_ERR(clk)) { |
| + clk_register_clkdev(clk, clkn->con_id, clkn->dev_id); |
| + if (enable) |
| + clk_prepare_enable(clk); |
| + clk_put(clk); |
| + } |
| + } |
| +} |
| + |
| +#else /* CONFIG_COMMON_CLK */ |
| #include <linux/sh_clk.h> |
| #include <linux/export.h> |
| #include <mach/clock.h> |
| @@ -58,3 +84,5 @@ void __clk_put(struct clk *clk) |
| { |
| } |
| EXPORT_SYMBOL(__clk_put); |
| + |
| +#endif /* CONFIG_COMMON_CLK */ |
| diff --git a/arch/arm/mach-shmobile/include/mach/clock.h b/arch/arm/mach-shmobile/include/mach/clock.h |
| index 03e56074928c..9a93cf924b9c 100644 |
| --- a/arch/arm/mach-shmobile/include/mach/clock.h |
| +++ b/arch/arm/mach-shmobile/include/mach/clock.h |
| @@ -1,6 +1,21 @@ |
| #ifndef CLOCK_H |
| #define CLOCK_H |
| |
| +#ifdef CONFIG_COMMON_CLK |
| +/* temporary clock configuration helper for platform devices */ |
| + |
| +struct clk_name { |
| + const char *clk; |
| + const char *con_id; |
| + const char *dev_id; |
| +}; |
| + |
| +void shmobile_clk_workaround(const struct clk_name *clks, int nr_clks, |
| + bool enable); |
| + |
| +#else /* CONFIG_COMMON_CLK */ |
| +/* legacy clock implementation */ |
| + |
| unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk); |
| extern struct sh_clk_ops shmobile_fixed_ratio_clk_ops; |
| |
| @@ -36,4 +51,5 @@ do { \ |
| (p)->div = d; \ |
| } while (0) |
| |
| +#endif /* CONFIG_COMMON_CLK */ |
| #endif |
| -- |
| 2.1.2 |
| |