Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Gerhard Sittig and committed by
Mike Turquette
aa514ce3 29f79cb7

+26 -9
+3 -3
drivers/clk/clk-divider.c
··· 104 104 struct clk_divider *divider = to_clk_divider(hw); 105 105 unsigned int div, val; 106 106 107 - val = readl(divider->reg) >> divider->shift; 107 + val = clk_readl(divider->reg) >> divider->shift; 108 108 val &= div_mask(divider); 109 109 110 110 div = _get_div(divider, val); ··· 230 230 if (divider->flags & CLK_DIVIDER_HIWORD_MASK) { 231 231 val = div_mask(divider) << (divider->shift + 16); 232 232 } else { 233 - val = readl(divider->reg); 233 + val = clk_readl(divider->reg); 234 234 val &= ~(div_mask(divider) << divider->shift); 235 235 } 236 236 val |= value << divider->shift; 237 - writel(val, divider->reg); 237 + clk_writel(val, divider->reg); 238 238 239 239 if (divider->lock) 240 240 spin_unlock_irqrestore(divider->lock, flags);
+3 -3
drivers/clk/clk-gate.c
··· 58 58 if (set) 59 59 reg |= BIT(gate->bit_idx); 60 60 } else { 61 - reg = readl(gate->reg); 61 + reg = clk_readl(gate->reg); 62 62 63 63 if (set) 64 64 reg |= BIT(gate->bit_idx); ··· 66 66 reg &= ~BIT(gate->bit_idx); 67 67 } 68 68 69 - writel(reg, gate->reg); 69 + clk_writel(reg, gate->reg); 70 70 71 71 if (gate->lock) 72 72 spin_unlock_irqrestore(gate->lock, flags); ··· 89 89 u32 reg; 90 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 94 /* if a set bit disables this clk, flip it before masking */ 95 95 if (gate->flags & CLK_GATE_SET_TO_DISABLE)
+3 -3
drivers/clk/clk-mux.c
··· 42 42 * OTOH, pmd_trace_clk_mux_ck uses a separate bit for each clock, so 43 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 46 val &= mux->mask; 47 47 48 48 if (mux->table) { ··· 89 89 if (mux->flags & CLK_MUX_HIWORD_MASK) { 90 90 val = mux->mask << (mux->shift + 16); 91 91 } else { 92 - val = readl(mux->reg); 92 + val = clk_readl(mux->reg); 93 93 val &= ~(mux->mask << mux->shift); 94 94 } 95 95 val |= index << mux->shift; 96 - writel(val, mux->reg); 96 + clk_writel(val, mux->reg); 97 97 98 98 if (mux->lock) 99 99 spin_unlock_irqrestore(mux->lock, flags);
+17
include/linux/clk-provider.h
··· 12 12 #define __LINUX_CLK_PROVIDER_H 13 13 14 14 #include <linux/clk.h> 15 + #include <linux/io.h> 15 16 16 17 #ifdef CONFIG_COMMON_CLK 17 18 ··· 505 504 #define of_clk_init(matches) \ 506 505 { while (0); } 507 506 #endif /* CONFIG_OF */ 507 + 508 + /* 509 + * wrap access to peripherals in accessor routines 510 + * for improved portability across platforms 511 + */ 512 + 513 + static inline u32 clk_readl(u32 __iomem *reg) 514 + { 515 + return readl(reg); 516 + } 517 + 518 + static inline void clk_writel(u32 val, u32 __iomem *reg) 519 + { 520 + writel(val, reg); 521 + } 522 + 508 523 #endif /* CONFIG_COMMON_CLK */ 509 524 #endif /* CLK_PROVIDER_H */