aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-kirkwood
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2012-06-13 08:52:45 -0400
committerOlof Johansson <olof@lixom.net>2012-06-16 21:45:20 -0400
commit128789a8293653a4f889f2b1601eea07c00ff65e (patch)
tree6626ff151274c7b324406039e6261e1a51e7e699 /arch/arm/mach-kirkwood
parent9b0f7e399238c61f28539daeb65d72a8d7f91966 (diff)
ARM: Kirkwood: Fix clk problems modular ethernet driver
When the ethernet driver was built as a module, it would lock the machine when loaded. At boot the ethernet clks are unused, so get turned off. Later, when the module is loaded, the probe function would access the hardware before the clock was restarted, and the machine would lock. It has also been determined that when the clk is turned off, the interface forgets its MAC address, which for most systems, is set by the boot loader. When the machine setup file creates a platform device for the interface, prepare and enable the clock for the interface. This will ensure it is not turned off. However, if the setup file only instantiates one platform device, the other will have its clk disabled, thus maybe saving a little power. Report-by: Simon Baatz <gmbnomis@gmail.com> Signed-off-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Simon Baatz <gmbnomis@gmail.com> Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/mach-kirkwood')
-rw-r--r--arch/arm/mach-kirkwood/common.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
index 25fb3fd418ef..e1d2c6def5e6 100644
--- a/arch/arm/mach-kirkwood/common.c
+++ b/arch/arm/mach-kirkwood/common.c
@@ -193,9 +193,11 @@ static struct clk __init *kirkwood_register_gate_fn(const char *name,
193 bit_idx, 0, &gating_lock, fn); 193 bit_idx, 0, &gating_lock, fn);
194} 194}
195 195
196static struct clk *ge0, *ge1;
197
196void __init kirkwood_clk_init(void) 198void __init kirkwood_clk_init(void)
197{ 199{
198 struct clk *runit, *ge0, *ge1, *sata0, *sata1, *usb0, *sdio; 200 struct clk *runit, *sata0, *sata1, *usb0, *sdio;
199 struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio; 201 struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio;
200 202
201 tclk = clk_register_fixed_rate(NULL, "tclk", NULL, 203 tclk = clk_register_fixed_rate(NULL, "tclk", NULL,
@@ -257,6 +259,9 @@ void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)
257 orion_ge00_init(eth_data, 259 orion_ge00_init(eth_data,
258 GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, 260 GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM,
259 IRQ_KIRKWOOD_GE00_ERR); 261 IRQ_KIRKWOOD_GE00_ERR);
262 /* The interface forgets the MAC address assigned by u-boot if
263 the clock is turned off, so claim the clk now. */
264 clk_prepare_enable(ge0);
260} 265}
261 266
262 267
@@ -268,6 +273,7 @@ void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data)
268 orion_ge01_init(eth_data, 273 orion_ge01_init(eth_data,
269 GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, 274 GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM,
270 IRQ_KIRKWOOD_GE01_ERR); 275 IRQ_KIRKWOOD_GE01_ERR);
276 clk_prepare_enable(ge1);
271} 277}
272 278
273 279