aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ep93xx/clock.c
diff options
context:
space:
mode:
authorHartley Sweeten <hartleys@visionengravers.com>2009-07-07 21:00:49 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-07-09 11:10:51 -0400
commit02239f0a4264608686cc0015d906c7b2dead89df (patch)
tree85e23dd5af1b1d9a00466af408827e384049c239 /arch/arm/mach-ep93xx/clock.c
parentf04989bbf4a40077dc7ddcc3dccde11a5f3e91f2 (diff)
[ARM] 5577/2: ep93xx: syscon locked register functions
Add core functions to handle writes to the ep93xx software locked registers. There are a number of registers in the EP93xx System Controller that require a write to the software lock register before they can be updated. This patch adds a number of exported functions to the ep93xx core that handle this access. The software locked clock divider registers, VidClkDiv, MIRClkDiv, I2SClkDiv and KeyTchClkDiv would typically involve writing a specific value to the register. To support this the ep93xx_syscon_swlocked_write() function is provided. For the DeviceCfg register it's more typical to only need to set or clear a single bit. A generic ep93xx_devcfg_set_clear() function is provided to handle both operations. Two inline functions, ep93xx_devcfg_set_bits() and ep93xx_devcfg_clear_bits() are also provided to improve code readability. In addition, the remaining bits in the System Controller Device Config Register have been documented and the previously defined names shortened. All code paths that use this functionality have been updated except for arch/arm/kernel/crunch.c. That code is in a context switch path, which is not reentrant, so it is safe against itself. Cc: Lennert Buytenhek <buytenh@wantstofly.org> Cc: Matthias Kaehlcke <matthias@kaehlcke.net> Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Acked-by: Ryan Mallon <ryan@bluewatersys.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-ep93xx/clock.c')
-rw-r--r--arch/arm/mach-ep93xx/clock.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/arch/arm/mach-ep93xx/clock.c b/arch/arm/mach-ep93xx/clock.c
index 6c4c1633ed12..c7642acfd022 100644
--- a/arch/arm/mach-ep93xx/clock.c
+++ b/arch/arm/mach-ep93xx/clock.c
@@ -50,20 +50,20 @@ static unsigned long get_uart_rate(struct clk *clk);
50 50
51static struct clk clk_uart1 = { 51static struct clk clk_uart1 = {
52 .sw_locked = 1, 52 .sw_locked = 1,
53 .enable_reg = EP93XX_SYSCON_DEVICE_CONFIG, 53 .enable_reg = EP93XX_SYSCON_DEVCFG,
54 .enable_mask = EP93XX_SYSCON_DEVICE_CONFIG_U1EN, 54 .enable_mask = EP93XX_SYSCON_DEVCFG_U1EN,
55 .get_rate = get_uart_rate, 55 .get_rate = get_uart_rate,
56}; 56};
57static struct clk clk_uart2 = { 57static struct clk clk_uart2 = {
58 .sw_locked = 1, 58 .sw_locked = 1,
59 .enable_reg = EP93XX_SYSCON_DEVICE_CONFIG, 59 .enable_reg = EP93XX_SYSCON_DEVCFG,
60 .enable_mask = EP93XX_SYSCON_DEVICE_CONFIG_U2EN, 60 .enable_mask = EP93XX_SYSCON_DEVCFG_U2EN,
61 .get_rate = get_uart_rate, 61 .get_rate = get_uart_rate,
62}; 62};
63static struct clk clk_uart3 = { 63static struct clk clk_uart3 = {
64 .sw_locked = 1, 64 .sw_locked = 1,
65 .enable_reg = EP93XX_SYSCON_DEVICE_CONFIG, 65 .enable_reg = EP93XX_SYSCON_DEVCFG,
66 .enable_mask = EP93XX_SYSCON_DEVICE_CONFIG_U3EN, 66 .enable_mask = EP93XX_SYSCON_DEVCFG_U3EN,
67 .get_rate = get_uart_rate, 67 .get_rate = get_uart_rate,
68}; 68};
69static struct clk clk_pll1; 69static struct clk clk_pll1;
@@ -160,9 +160,11 @@ int clk_enable(struct clk *clk)
160 u32 value; 160 u32 value;
161 161
162 value = __raw_readl(clk->enable_reg); 162 value = __raw_readl(clk->enable_reg);
163 value |= clk->enable_mask;
163 if (clk->sw_locked) 164 if (clk->sw_locked)
164 __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); 165 ep93xx_syscon_swlocked_write(value, clk->enable_reg);
165 __raw_writel(value | clk->enable_mask, clk->enable_reg); 166 else
167 __raw_writel(value, clk->enable_reg);
166 } 168 }
167 169
168 return 0; 170 return 0;
@@ -175,9 +177,11 @@ void clk_disable(struct clk *clk)
175 u32 value; 177 u32 value;
176 178
177 value = __raw_readl(clk->enable_reg); 179 value = __raw_readl(clk->enable_reg);
180 value &= ~clk->enable_mask;
178 if (clk->sw_locked) 181 if (clk->sw_locked)
179 __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK); 182 ep93xx_syscon_swlocked_write(value, clk->enable_reg);
180 __raw_writel(value & ~clk->enable_mask, clk->enable_reg); 183 else
184 __raw_writel(value, clk->enable_reg);
181 } 185 }
182} 186}
183EXPORT_SYMBOL(clk_disable); 187EXPORT_SYMBOL(clk_disable);