aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/mux.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2008-01-24 20:24:15 -0500
committerTony Lindgren <tony@atomide.com>2008-04-14 12:57:13 -0400
commit9330899e0f878ff3b7a23b856de8bbb52c9c04fd (patch)
tree7ea8c0362e6320dfbd7c6dd124e34a0b6ef7c6b1 /arch/arm/mach-omap2/mux.c
parentf7337a199acffa9f12fa9d88253d33bfb56ef14a (diff)
ARM: OMAP2: Clean-up mux code
Misc clean-up for the mux code and remove some unnecessary ifdefs. Patch changes debug function so it can be used on both 24xx and 34xx. Changes are mostly for omap2, but patch also cleans up some omap1 and common mux code. Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/mach-omap2/mux.c')
-rw-r--r--arch/arm/mach-omap2/mux.c69
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
39struct pin_config __initdata_or_module omap24xx_pins[] = { 40#ifdef CONFIG_ARCH_OMAP24XX
41static 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)
209MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1) 211MUX_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)
227void __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
219int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg) 248int __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
250int __init omap2_mux_init(void) 270int __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}