Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 123820
b: refs/heads/master
c: 82fd8e6
h: refs/heads/master
v: v3
  • Loading branch information
Ben Dooks committed Dec 15, 2008
1 parent 8b75fe9 commit 2a4edda
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f2edc7565a14aa82231c847abf33d02314cac9f9
refs/heads/master: 82fd8e681d60a195ce6e9fc783d0ebe7a81b1ead
51 changes: 47 additions & 4 deletions trunk/arch/arm/plat-s3c/pwm-clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
* 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);

Expand All @@ -87,18 +87,61 @@ static unsigned long clk_pwm_scaler_getrate(struct clk *clk)
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[] = {
[0] = {
.name = "pwm-scaler0",
.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] = {
.name = "pwm-scaler1",
.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,
},
};

Expand Down

0 comments on commit 2a4edda

Please sign in to comment.