[ARM] S3C: Add set_rate/round_rate methods for pwm-scaler clock
Add the set_rate and round_rate methods for the pwm-scaler clock for use with the time code. Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
parent
f2edc7565a
commit
82fd8e681d
@ -73,7 +73,7 @@
|
|||||||
* tclk -------------------------/
|
* tclk -------------------------/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static unsigned long clk_pwm_scaler_getrate(struct clk *clk)
|
static unsigned long clk_pwm_scaler_get_rate(struct clk *clk)
|
||||||
{
|
{
|
||||||
unsigned long tcfg0 = __raw_readl(S3C2410_TCFG0);
|
unsigned long tcfg0 = __raw_readl(S3C2410_TCFG0);
|
||||||
|
|
||||||
@ -87,18 +87,61 @@ static unsigned long clk_pwm_scaler_getrate(struct clk *clk)
|
|||||||
return clk_get_rate(clk->parent) / (tcfg0 + 1);
|
return clk_get_rate(clk->parent) / (tcfg0 + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO - add set rate calls. */
|
static unsigned long clk_pwm_scaler_round_rate(struct clk *clk,
|
||||||
|
unsigned long rate)
|
||||||
|
{
|
||||||
|
unsigned long parent_rate = clk_get_rate(clk->parent);
|
||||||
|
unsigned long divisor = parent_rate / rate;
|
||||||
|
|
||||||
|
if (divisor > 256)
|
||||||
|
divisor = 256;
|
||||||
|
else if (divisor < 2)
|
||||||
|
divisor = 2;
|
||||||
|
|
||||||
|
return parent_rate / divisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int clk_pwm_scaler_set_rate(struct clk *clk, unsigned long rate)
|
||||||
|
{
|
||||||
|
unsigned long round = clk_pwm_scaler_round_rate(clk, rate);
|
||||||
|
unsigned long tcfg0;
|
||||||
|
unsigned long divisor;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
divisor = clk_get_rate(clk->parent) / round;
|
||||||
|
divisor--;
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
tcfg0 = __raw_readl(S3C2410_TCFG0);
|
||||||
|
|
||||||
|
if (clk->id == 1) {
|
||||||
|
tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
|
||||||
|
tcfg0 |= divisor << S3C2410_TCFG_PRESCALER1_SHIFT;
|
||||||
|
} else {
|
||||||
|
tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
|
||||||
|
tcfg0 |= divisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
__raw_writel(tcfg0, S3C2410_TCFG0);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct clk clk_timer_scaler[] = {
|
static struct clk clk_timer_scaler[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.name = "pwm-scaler0",
|
.name = "pwm-scaler0",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.get_rate = clk_pwm_scaler_getrate,
|
.get_rate = clk_pwm_scaler_get_rate,
|
||||||
|
.set_rate = clk_pwm_scaler_set_rate,
|
||||||
|
.round_rate = clk_pwm_scaler_round_rate,
|
||||||
},
|
},
|
||||||
[1] = {
|
[1] = {
|
||||||
.name = "pwm-scaler1",
|
.name = "pwm-scaler1",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.get_rate = clk_pwm_scaler_getrate,
|
.get_rate = clk_pwm_scaler_get_rate,
|
||||||
|
.set_rate = clk_pwm_scaler_set_rate,
|
||||||
|
.round_rate = clk_pwm_scaler_round_rate,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user