Skip to content

Commit

Permalink
ARM: shmobile: sh73a0: wait for completion when kicking the clock
Browse files Browse the repository at this point in the history
To reconfigure clocks, controlled by FRQCRA and FRQCRB, a kick bit has to
be set and to make sure the setting has taken effect, it has to be read
back repeatedly until it is cleared by the hardware. This patch adds the
waiting part, that was missing until now.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Magnus Damm <damm@opensource.se
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
  • Loading branch information
Guennadi Liakhovetski authored and Simon Horman committed Apr 2, 2013
1 parent d313d06 commit 7653c31
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions arch/arm/mach-shmobile/clock-sh73a0.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 7653c31

Please sign in to comment.