mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-17 07:54:54 +08:00
ARM: shmobile: sh73a0: wait for completion when kicking the clock
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>
This commit is contained in:
parent
d313d068d4
commit
7653c318b7
@ -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 int frqcr_kick(void)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
static void div4_kick(struct clk *clk)
|
||||
{
|
||||
unsigned long value;
|
||||
|
||||
/* set KICK bit in FRQCRB to update hardware setting */
|
||||
value = __raw_readl(FRQCRB);
|
||||
value |= (1 << 31);
|
||||
__raw_writel(value, FRQCRB);
|
||||
frqcr_kick();
|
||||
}
|
||||
|
||||
static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
|
||||
|
Loading…
Reference in New Issue
Block a user