aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch')
-rw-r--r--recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch b/recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch
new file mode 100644
index 0000000..b14727e
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto-3.17/collie/arm-sa1100-add-cpu-clock.patch
@@ -0,0 +1,95 @@
+From 6abd8c6c642b7f5da4a8065fa6b29c4c90df308d Mon Sep 17 00:00:00 2001
+From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+Date: Mon, 11 Nov 2013 22:53:36 +0400
+Subject: [PATCH] arm: sa1100: add cpu clock
+
+Both SA1100 framebuffer and PCMCIA drivers require knowledge of cpu
+frequency to correctly program timings. Currently they receive timing
+information by calling cpufreq_get(0). However if cpu frequency driver
+is not enabled (e.g. due to unsupported DRAM chip/board on sa1110)
+cpufreq_get(0) returns 0, causing incorrect timings to be programmed.
+
+Add cpu clock returning cpu frequency, to be used by sa11x0 fb and
+pcmcia drivers.
+
+Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+---
+ arch/arm/mach-sa1100/clock.c | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+diff --git a/arch/arm/mach-sa1100/clock.c b/arch/arm/mach-sa1100/clock.c
+index 172ebd0..abf1dc1 100644
+--- a/arch/arm/mach-sa1100/clock.c
++++ b/arch/arm/mach-sa1100/clock.c
+@@ -15,10 +15,12 @@
+ #include <linux/clkdev.h>
+
+ #include <mach/hardware.h>
++#include <mach/generic.h>
+
+ struct clkops {
+ void (*enable)(struct clk *);
+ void (*disable)(struct clk *);
++ unsigned long (*get_rate)(struct clk *);
+ };
+
+ struct clk {
+@@ -51,6 +53,19 @@ static void clk_gpio27_disable(struct clk *clk)
+ GAFR &= ~GPIO_32_768kHz;
+ }
+
++static void clk_cpu_enable(struct clk *clk)
++{
++}
++
++static void clk_cpu_disable(struct clk *clk)
++{
++}
++
++static unsigned long clk_cpu_get_rate(struct clk *clk)
++{
++ return sa11x0_getspeed(0) * 1000;
++}
++
+ int clk_enable(struct clk *clk)
+ {
+ unsigned long flags;
+@@ -80,16 +95,35 @@ void clk_disable(struct clk *clk)
+ }
+ EXPORT_SYMBOL(clk_disable);
+
++unsigned long clk_get_rate(struct clk *clk)
++{
++ if (clk && clk->ops && clk->ops->get_rate)
++ return clk->ops->get_rate(clk);
++ else
++ return 0;
++}
++EXPORT_SYMBOL(clk_get_rate);
++
+ const struct clkops clk_gpio27_ops = {
+ .enable = clk_gpio27_enable,
+ .disable = clk_gpio27_disable,
+ };
+
++const struct clkops clk_cpu_ops = {
++ .enable = clk_cpu_enable,
++ .disable = clk_cpu_disable,
++ .get_rate = clk_cpu_get_rate,
++};
++
+ static DEFINE_CLK(gpio27, &clk_gpio27_ops);
+
++static DEFINE_CLK(cpu, &clk_cpu_ops);
++
+ static struct clk_lookup sa11xx_clkregs[] = {
+ CLKDEV_INIT("sa1111.0", NULL, &clk_gpio27),
+ CLKDEV_INIT("sa1100-rtc", NULL, NULL),
++ CLKDEV_INIT("sa11x0-fb", NULL, &clk_cpu),
++ CLKDEV_INIT("sa11x0-pcmcia", NULL, &clk_cpu),
+ };
+
+ static int __init sa11xx_clk_init(void)
+--
+1.8.4.2
+