aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/mux.c
diff options
context:
space:
mode:
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}