diff options
author | Gerhard Sittig <gsi@denx.de> | 2013-07-22 08:14:40 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2013-08-27 20:50:38 -0400 |
commit | aa514ce34b65e3dc01f95a0b470b39bbb7e09998 (patch) | |
tree | 6d83d3f8e7560e5cd46fafe39960cd78cdfdc815 | |
parent | 29f79cb713c5173457b80602adab357403f22c48 (diff) |
clk: wrap I/O access for improved portability
the common clock drivers were motivated/initiated by ARM development
and apparently assume little endian peripherals
wrap register/peripherals access in the common code (div, gate, mux)
in preparation of adding COMMON_CLK support for other platforms
Signed-off-by: Gerhard Sittig <gsi@denx.de>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/clk-divider.c | 6 | ||||
-rw-r--r-- | drivers/clk/clk-gate.c | 6 | ||||
-rw-r--r-- | drivers/clk/clk-mux.c | 6 | ||||
-rw-r--r-- | include/linux/clk-provider.h | 17 |
4 files changed, 26 insertions, 9 deletions
diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c index 749372f87ec4..8d3009e44fba 100644 --- a/drivers/clk/clk-divider.c +++ b/drivers/clk/clk-divider.c | |||
@@ -104,7 +104,7 @@ static unsigned long clk_divider_recalc_rate(struct clk_hw *hw, | |||
104 | struct clk_divider *divider = to_clk_divider(hw); | 104 | struct clk_divider *divider = to_clk_divider(hw); |
105 | unsigned int div, val; | 105 | unsigned int div, val; |
106 | 106 | ||
107 | val = readl(divider->reg) >> divider->shift; | 107 | val = clk_readl(divider->reg) >> divider->shift; |
108 | val &= div_mask(divider); | 108 | val &= div_mask(divider); |
109 | 109 | ||
110 | div = _get_div(divider, val); | 110 | div = _get_div(divider, val); |
@@ -230,11 +230,11 @@ static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate, | |||
230 | if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { | 230 | if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { |
231 | val = div_mask(divider) << (divider->shift + 16); | 231 | val = div_mask(divider) << (divider->shift + 16); |
232 | } else { | 232 | } else { |
233 | val = readl(divider->reg); | 233 | val = clk_readl(divider->reg); |
234 | val &= ~(div_mask(divider) << divider->shift); | 234 | val &= ~(div_mask(divider) << divider->shift); |
235 | } | 235 | } |
236 | val |= value << divider->shift; | 236 | val |= value << divider->shift; |
237 | writel(val, divider->reg); | 237 | clk_writel(val, divider->reg); |
238 | 238 | ||
239 | if (divider->lock) | 239 | if (divider->lock) |
240 | spin_unlock_irqrestore(divider->lock, flags); | 240 | spin_unlock_irqrestore(divider->lock, flags); |
diff --git a/drivers/clk/clk-gate.c b/drivers/clk/clk-gate.c index 2b28a004c19e..4a58c55255bd 100644 --- a/drivers/clk/clk-gate.c +++ b/drivers/clk/clk-gate.c | |||
@@ -58,7 +58,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable) | |||
58 | if (set) | 58 | if (set) |
59 | reg |= BIT(gate->bit_idx); | 59 | reg |= BIT(gate->bit_idx); |
60 | } else { | 60 | } else { |
61 | reg = readl(gate->reg); | 61 | reg = clk_readl(gate->reg); |
62 | 62 | ||
63 | if (set) | 63 | if (set) |
64 | reg |= BIT(gate->bit_idx); | 64 | reg |= BIT(gate->bit_idx); |
@@ -66,7 +66,7 @@ static void clk_gate_endisable(struct clk_hw *hw, int enable) | |||
66 | reg &= ~BIT(gate->bit_idx); | 66 | reg &= ~BIT(gate->bit_idx); |
67 | } | 67 | } |
68 | 68 | ||
69 | writel(reg, gate->reg); | 69 | clk_writel(reg, gate->reg); |
70 | 70 | ||
71 | if (gate->lock) | 71 | if (gate->lock) |
72 | spin_unlock_irqrestore(gate->lock, flags); | 72 | spin_unlock_irqrestore(gate->lock, flags); |
@@ -89,7 +89,7 @@ static int clk_gate_is_enabled(struct clk_hw *hw) | |||
89 | u32 reg; | 89 | u32 reg; |
90 | struct clk_gate *gate = to_clk_gate(hw); | 90 | struct clk_gate *gate = to_clk_gate(hw); |
91 | 91 | ||
92 | reg = readl(gate->reg); | 92 | reg = clk_readl(gate->reg); |
93 | 93 | ||
94 | /* if a set bit disables this clk, flip it before masking */ | 94 | /* if a set bit disables this clk, flip it before masking */ |
95 | if (gate->flags & CLK_GATE_SET_TO_DISABLE) | 95 | if (gate->flags & CLK_GATE_SET_TO_DISABLE) |
diff --git a/drivers/clk/clk-mux.c b/drivers/clk/clk-mux.c index 0811633fcc4d..4f96ff3ba728 100644 --- a/drivers/clk/clk-mux.c +++ b/drivers/clk/clk-mux.c | |||
@@ -42,7 +42,7 @@ static u8 clk_mux_get_parent(struct clk_hw *hw) | |||
42 | * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so | 42 | * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so |
43 | * val = 0x4 really means "bit 2, index starts at bit 0" | 43 | * val = 0x4 really means "bit 2, index starts at bit 0" |
44 | */ | 44 | */ |
45 | val = readl(mux->reg) >> mux->shift; | 45 | val = clk_readl(mux->reg) >> mux->shift; |
46 | val &= mux->mask; | 46 | val &= mux->mask; |
47 | 47 | ||
48 | if (mux->table) { | 48 | if (mux->table) { |
@@ -89,11 +89,11 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index) | |||
89 | if (mux->flags & CLK_MUX_HIWORD_MASK) { | 89 | if (mux->flags & CLK_MUX_HIWORD_MASK) { |
90 | val = mux->mask << (mux->shift + 16); | 90 | val = mux->mask << (mux->shift + 16); |
91 | } else { | 91 | } else { |
92 | val = readl(mux->reg); | 92 | val = clk_readl(mux->reg); |
93 | val &= ~(mux->mask << mux->shift); | 93 | val &= ~(mux->mask << mux->shift); |
94 | } | 94 | } |
95 | val |= index << mux->shift; | 95 | val |= index << mux->shift; |
96 | writel(val, mux->reg); | 96 | clk_writel(val, mux->reg); |
97 | 97 | ||
98 | if (mux->lock) | 98 | if (mux->lock) |
99 | spin_unlock_irqrestore(mux->lock, flags); | 99 | spin_unlock_irqrestore(mux->lock, flags); |
diff --git a/include/linux/clk-provider.h b/include/linux/clk-provider.h index 1f0285b2f422..73bdb69f0c08 100644 --- a/include/linux/clk-provider.h +++ b/include/linux/clk-provider.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define __LINUX_CLK_PROVIDER_H | 12 | #define __LINUX_CLK_PROVIDER_H |
13 | 13 | ||
14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/io.h> | ||
15 | 16 | ||
16 | #ifdef CONFIG_COMMON_CLK | 17 | #ifdef CONFIG_COMMON_CLK |
17 | 18 | ||
@@ -504,5 +505,21 @@ static inline const char *of_clk_get_parent_name(struct device_node *np, | |||
504 | #define of_clk_init(matches) \ | 505 | #define of_clk_init(matches) \ |
505 | { while (0); } | 506 | { while (0); } |
506 | #endif /* CONFIG_OF */ | 507 | #endif /* CONFIG_OF */ |
508 | |||
509 | /* | ||
510 | * wrap access to peripherals in accessor routines | ||
511 | * for improved portability across platforms | ||
512 | */ | ||
513 | |||
514 | static inline u32 clk_readl(u32 __iomem *reg) | ||
515 | { | ||
516 | return readl(reg); | ||
517 | } | ||
518 | |||
519 | static inline void clk_writel(u32 val, u32 __iomem *reg) | ||
520 | { | ||
521 | writel(val, reg); | ||
522 | } | ||
523 | |||
507 | #endif /* CONFIG_COMMON_CLK */ | 524 | #endif /* CONFIG_COMMON_CLK */ |
508 | #endif /* CLK_PROVIDER_H */ | 525 | #endif /* CLK_PROVIDER_H */ |