diff options
Diffstat (limited to 'arch/arm/mach-omap2/mux.c')
-rw-r--r-- | arch/arm/mach-omap2/mux.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index 5cba3a2a2392..0cf7562ff88f 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
@@ -1,11 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-omap2/mux.c | 2 | * linux/arch/arm/mach-omap2/mux.c |
3 | * | 3 | * |
4 | * OMAP1 pin multiplexing configurations | 4 | * OMAP2 pin multiplexing configurations |
5 | * | 5 | * |
6 | * Copyright (C) 2003 - 2005 Nokia Corporation | 6 | * Copyright (C) 2004 - 2008 Texas Instruments Inc. |
7 | * Copyright (C) 2003 - 2008 Nokia Corporation | ||
7 | * | 8 | * |
8 | * Written by Tony Lindgren <tony.lindgren@nokia.com> | 9 | * Written by Tony Lindgren |
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -36,7 +37,8 @@ static struct omap_mux_cfg arch_mux_cfg; | |||
36 | 37 | ||
37 | /* NOTE: See mux.h for the enumeration */ | 38 | /* NOTE: See mux.h for the enumeration */ |
38 | 39 | ||
39 | struct pin_config __initdata_or_module omap24xx_pins[] = { | 40 | #ifdef CONFIG_ARCH_OMAP24XX |
41 | static struct pin_config __initdata_or_module omap24xx_pins[] = { | ||
40 | /* | 42 | /* |
41 | * description mux mux pull pull debug | 43 | * description mux mux pull pull debug |
42 | * offset mode ena type | 44 | * offset mode ena type |
@@ -209,54 +211,69 @@ MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1) | |||
209 | MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1) | 211 | MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1) |
210 | }; | 212 | }; |
211 | 213 | ||
212 | #ifdef CONFIG_ARCH_OMAP24XX | 214 | #define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins) |
215 | |||
216 | #else | ||
217 | #define omap24xx_pins NULL | ||
218 | #define OMAP24XX_PINS_SZ 0 | ||
219 | #endif /* CONFIG_ARCH_OMAP24XX */ | ||
213 | 220 | ||
214 | #define OMAP24XX_L4_BASE 0x48000000 | 221 | #define OMAP24XX_L4_BASE 0x48000000 |
215 | #define OMAP24XX_PULL_ENA (1 << 3) | 222 | #define OMAP24XX_PULL_ENA (1 << 3) |
216 | #define OMAP24XX_PULL_UP (1 << 4) | 223 | #define OMAP24XX_PULL_UP (1 << 4) |
217 | 224 | ||
218 | /* REVISIT: Convert this code to use ctrl_{read,write}_reg */ | 225 | /* REVISIT: Convert this code to use ctrl_{read,write}_reg */ |
226 | #if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS) | ||
227 | void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u8 reg) | ||
228 | { | ||
229 | u16 orig; | ||
230 | u8 warn = 0, debug = 0; | ||
231 | |||
232 | orig = omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg); | ||
233 | |||
234 | #ifdef CONFIG_OMAP_MUX_DEBUG | ||
235 | debug = cfg->debug; | ||
236 | #endif | ||
237 | warn = (orig != reg); | ||
238 | if (debug || warn) | ||
239 | printk(KERN_WARNING | ||
240 | "MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n", | ||
241 | cfg->name, omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg)); | ||
242 | } | ||
243 | #else | ||
244 | #define omap2_cfg_debug(x, y) do {} while (0) | ||
245 | #endif | ||
246 | |||
247 | #ifdef CONFIG_ARCH_OMAP24XX | ||
219 | int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg) | 248 | int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg) |
220 | { | 249 | { |
250 | static DEFINE_SPINLOCK(mux_spin_lock); | ||
251 | unsigned long flags; | ||
221 | u8 reg = 0; | 252 | u8 reg = 0; |
222 | unsigned int warn = 0; | ||
223 | 253 | ||
254 | spin_lock_irqsave(&mux_spin_lock, flags); | ||
224 | reg |= cfg->mask & 0x7; | 255 | reg |= cfg->mask & 0x7; |
225 | if (cfg->pull_val) | 256 | if (cfg->pull_val) |
226 | reg |= OMAP24XX_PULL_ENA; | 257 | reg |= OMAP24XX_PULL_ENA; |
227 | if(cfg->pu_pd_val) | 258 | if (cfg->pu_pd_val) |
228 | reg |= OMAP24XX_PULL_UP; | 259 | reg |= OMAP24XX_PULL_UP; |
229 | #if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS) | 260 | omap2_cfg_debug(cfg, reg); |
230 | { | ||
231 | u8 orig = omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg); | ||
232 | u8 debug = 0; | ||
233 | |||
234 | #ifdef CONFIG_OMAP_MUX_DEBUG | ||
235 | debug = cfg->debug; | ||
236 | #endif | ||
237 | warn = (orig != reg); | ||
238 | if (debug || warn) | ||
239 | printk("MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n", | ||
240 | cfg->name, OMAP24XX_L4_BASE + cfg->mux_reg, | ||
241 | orig, reg); | ||
242 | } | ||
243 | #endif | ||
244 | omap_writeb(reg, OMAP24XX_L4_BASE + cfg->mux_reg); | 261 | omap_writeb(reg, OMAP24XX_L4_BASE + cfg->mux_reg); |
262 | spin_unlock_irqrestore(&mux_spin_lock, flags); | ||
245 | 263 | ||
246 | return 0; | 264 | return 0; |
247 | } | 265 | } |
266 | #else | ||
267 | #define omap24xx_cfg_reg 0 | ||
248 | #endif | 268 | #endif |
249 | 269 | ||
250 | int __init omap2_mux_init(void) | 270 | int __init omap2_mux_init(void) |
251 | { | 271 | { |
252 | |||
253 | #ifdef CONFIG_ARCH_OMAP24XX | ||
254 | if (cpu_is_omap24xx()) { | 272 | if (cpu_is_omap24xx()) { |
255 | arch_mux_cfg.pins = omap24xx_pins; | 273 | arch_mux_cfg.pins = omap24xx_pins; |
256 | arch_mux_cfg.size = ARRAY_SIZE(omap24xx_pins); | 274 | arch_mux_cfg.size = OMAP24XX_PINS_SZ; |
257 | arch_mux_cfg.cfg_reg = omap24xx_cfg_reg; | 275 | arch_mux_cfg.cfg_reg = omap24xx_cfg_reg; |
258 | } | 276 | } |
259 | #endif | ||
260 | 277 | ||
261 | return omap_mux_register(&arch_mux_cfg); | 278 | return omap_mux_register(&arch_mux_cfg); |
262 | } | 279 | } |