Commit bdb08cb2 authored by Russell King's avatar Russell King Committed by Russell King

[ARM] pxa: allow clk aliases

We need to support more than one name+device for a struct clk for a
small number of peripherals.  We do this by re-using struct clk alias
to another struct clk - IOW, if we find that the entry we're using is
an alias, we return the aliased entry not the one we found.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 5e329d1c
...@@ -47,6 +47,9 @@ struct clk *clk_get(struct device *dev, const char *id) ...@@ -47,6 +47,9 @@ struct clk *clk_get(struct device *dev, const char *id)
clk = p; clk = p;
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
if (!IS_ERR(clk) && clk->ops == NULL)
clk = clk->other;
return clk; return clk;
} }
EXPORT_SYMBOL(clk_get); EXPORT_SYMBOL(clk_get);
......
...@@ -15,6 +15,7 @@ struct clk { ...@@ -15,6 +15,7 @@ struct clk {
unsigned int cken; unsigned int cken;
unsigned int delay; unsigned int delay;
unsigned int enabled; unsigned int enabled;
struct clk *other;
}; };
#define INIT_CKEN(_name, _cken, _rate, _delay, _dev) \ #define INIT_CKEN(_name, _cken, _rate, _delay, _dev) \
...@@ -35,6 +36,17 @@ struct clk { ...@@ -35,6 +36,17 @@ struct clk {
.cken = CKEN_##_cken, \ .cken = CKEN_##_cken, \
} }
/*
* This is a placeholder to alias one clock device+name pair
* to another struct clk.
*/
#define INIT_CKOTHER(_name, _other, _dev) \
{ \
.name = _name, \
.dev = _dev, \
.other = _other, \
}
extern const struct clkops clk_cken_ops; extern const struct clkops clk_cken_ops;
void clk_cken_enable(struct clk *clk); void clk_cken_enable(struct clk *clk);
......
...@@ -117,6 +117,10 @@ static struct clk pxa25x_hwuart_clk = ...@@ -117,6 +117,10 @@ static struct clk pxa25x_hwuart_clk =
INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev) INIT_CKEN("UARTCLK", HWUART, 14745600, 1, &pxa_device_hwuart.dev)
; ;
/*
* PXA 2xx clock declarations. Order is important (see aliases below)
* Please be careful not to disrupt the ordering.
*/
static struct clk pxa25x_clks[] = { static struct clk pxa25x_clks[] = {
INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev),
INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev), INIT_CKEN("UARTCLK", FFUART, 14745600, 1, &pxa_device_ffuart.dev),
...@@ -140,6 +144,8 @@ static struct clk pxa25x_clks[] = { ...@@ -140,6 +144,8 @@ static struct clk pxa25x_clks[] = {
INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL),
}; };
static struct clk gpio7_clk = INIT_CKOTHER("GPIO7_CK", &pxa25x_clks[4], NULL);
#ifdef CONFIG_PM #ifdef CONFIG_PM
#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
...@@ -311,6 +317,8 @@ static int __init pxa25x_init(void) ...@@ -311,6 +317,8 @@ static int __init pxa25x_init(void)
if (cpu_is_pxa25x()) if (cpu_is_pxa25x())
ret = platform_device_register(&pxa_device_hwuart); ret = platform_device_register(&pxa_device_hwuart);
clks_register(&gpio7_clk, 1);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment