Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 77487
b: refs/heads/master
c: bdbea34
h: refs/heads/master
i:
  77485: fdf12bb
  77483: 08d0656
  77479: a9aa020
  77471: b962165
v: v3
  • Loading branch information
Ben Dooks authored and Russell King committed Jan 28, 2008
1 parent 8d1fa53 commit 8a4f0d6
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 57c1b0f8dbfffaa00a242b171429e56489caef15
refs/heads/master: bdbea34ddd2e52dc73f03e7ef7197d4c0da400d6
50 changes: 50 additions & 0 deletions trunk/arch/arm/mach-s3c2412/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,45 @@ static struct clk clk_msysclk = {
.set_parent = s3c2412_setparent_msysclk,
};

static int s3c2412_setparent_armclk(struct clk *clk, struct clk *parent)
{
unsigned long flags;
unsigned long clkdiv;
unsigned long dvs;

/* Note, we current equate fclk andf msysclk for S3C2412 */

if (parent == &clk_msysclk || parent == &clk_f)
dvs = 0;
else if (parent == &clk_h)
dvs = S3C2412_CLKDIVN_DVSEN;
else
return -EINVAL;

clk->parent = parent;

/* update this under irq lockdown, clkdivn is not protected
* by the clock system. */

local_irq_save(flags);

clkdiv = __raw_readl(S3C2410_CLKDIVN);
clkdiv &= ~S3C2412_CLKDIVN_DVSEN;
clkdiv |= dvs;
__raw_writel(clkdiv, S3C2410_CLKDIVN);

local_irq_restore(flags);

return 0;
}

static struct clk clk_armclk = {
.name = "armclk",
.id = -1,
.parent = &clk_msysclk,
.set_parent = s3c2412_setparent_armclk,
};

/* these next clocks have an divider immediately after them,
* so we can register them with their divider and leave out the
* intermediate clock stage
Expand Down Expand Up @@ -630,11 +669,13 @@ static struct clk *clks[] __initdata = {
&clk_erefclk,
&clk_urefclk,
&clk_mrefclk,
&clk_armclk,
};

int __init s3c2412_baseclk_add(void)
{
unsigned long clkcon = __raw_readl(S3C2410_CLKCON);
unsigned int dvs;
struct clk *clkp;
int ret;
int ptr;
Expand All @@ -655,6 +696,15 @@ int __init s3c2412_baseclk_add(void)
}
}

/* set the dvs state according to what we got at boot time */

dvs = __raw_readl(S3C2410_CLKDIVN) & S3C2412_CLKDIVN_DVSEN;

if (dvs)
clk_armclk.parent = &clk_h;

printk(KERN_INFO "S3C2412: DVS is %s\n", dvs ? "on" : "off");

/* ensure usb bus clock is within correct rate of 48MHz */

if (clk_get_rate(&clk_usb_bus) != (48 * 1000 * 1000)) {
Expand Down

0 comments on commit 8a4f0d6

Please sign in to comment.