|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/sh_clk.h>
|
|
|
#include <linux/clkdev.h>
|
|
|
+#include <asm/processor.h>
|
|
|
#include <mach/common.h>
|
|
|
|
|
|
#define FRQCRA IOMEM(0xe6150000)
|
|
@@ -234,14 +235,24 @@ static struct clk *main_clks[] = {
|
|
|
&sh73a0_extalr_clk,
|
|
|
};
|
|
|
|
|
|
-static void div4_kick(struct clk *clk)
|
|
|
+static int frqcr_kick(void)
|
|
|
{
|
|
|
- unsigned long value;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /* set KICK bit in FRQCRB to update hardware setting, check success */
|
|
|
+ __raw_writel(__raw_readl(FRQCRB) | (1 << 31), FRQCRB);
|
|
|
+ for (i = 1000; i; i--)
|
|
|
+ if (__raw_readl(FRQCRB) & (1 << 31))
|
|
|
+ cpu_relax();
|
|
|
+ else
|
|
|
+ return i;
|
|
|
+
|
|
|
+ return -ETIMEDOUT;
|
|
|
+}
|
|
|
|
|
|
- /* set KICK bit in FRQCRB to update hardware setting */
|
|
|
- value = __raw_readl(FRQCRB);
|
|
|
- value |= (1 << 31);
|
|
|
- __raw_writel(value, FRQCRB);
|
|
|
+static void div4_kick(struct clk *clk)
|
|
|
+{
|
|
|
+ frqcr_kick();
|
|
|
}
|
|
|
|
|
|
static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
|