blob: d9684331e0807d4661b5511bd0b0273d0f454b28 [file] [log] [blame]
Tony Lindgren1dbae812005-11-10 14:26:51 +00001/*
2 * linux/arch/arm/mach-omap2/mux.c
3 *
Vikram Pandita23518722008-10-06 15:49:16 +03004 * OMAP2 and OMAP3 pin multiplexing configurations
Tony Lindgren1dbae812005-11-10 14:26:51 +00005 *
Tony Lindgren93308992008-01-24 17:24:15 -08006 * Copyright (C) 2004 - 2008 Texas Instruments Inc.
7 * Copyright (C) 2003 - 2008 Nokia Corporation
Tony Lindgren1dbae812005-11-10 14:26:51 +00008 *
Tony Lindgren93308992008-01-24 17:24:15 -08009 * Written by Tony Lindgren
Tony Lindgren1dbae812005-11-10 14:26:51 +000010 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25 */
Tony Lindgren1dbae812005-11-10 14:26:51 +000026#include <linux/module.h>
27#include <linux/init.h>
Russell Kingfced80c2008-09-06 12:10:45 +010028#include <linux/io.h>
Tony Lindgren1dbae812005-11-10 14:26:51 +000029#include <linux/spinlock.h>
Tony Lindgren15ac7af2009-12-11 16:16:32 -080030#include <linux/list.h>
Tony Lindgren4b715ef2009-12-11 16:16:32 -080031#include <linux/ctype.h>
32#include <linux/debugfs.h>
33#include <linux/seq_file.h>
34#include <linux/uaccess.h>
Tony Lindgren1dbae812005-11-10 14:26:51 +000035
Russell Kingfced80c2008-09-06 12:10:45 +010036#include <asm/system.h>
37
Tony Lindgrence491cf2009-10-20 09:40:47 -070038#include <plat/control.h>
39#include <plat/mux.h>
Tony Lindgren1dbae812005-11-10 14:26:51 +000040
Tony Lindgren15ac7af2009-12-11 16:16:32 -080041#include "mux.h"
Tony Lindgren1dbae812005-11-10 14:26:51 +000042
Mike Rapoport92c9f502009-12-11 16:16:31 -080043#define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
44#define OMAP_MUX_BASE_SZ 0x5ca
45
Tony Lindgren15ac7af2009-12-11 16:16:32 -080046struct omap_mux_entry {
47 struct omap_mux mux;
48 struct list_head node;
49};
50
Tony Lindgren4b715ef2009-12-11 16:16:32 -080051static unsigned long mux_phys;
Mike Rapoport92c9f502009-12-11 16:16:31 -080052static void __iomem *mux_base;
53
54static inline u16 omap_mux_read(u16 reg)
55{
56 if (cpu_is_omap24xx())
57 return __raw_readb(mux_base + reg);
58 else
59 return __raw_readw(mux_base + reg);
60}
61
62static inline void omap_mux_write(u16 val, u16 reg)
63{
64 if (cpu_is_omap24xx())
65 __raw_writeb(val, mux_base + reg);
66 else
67 __raw_writew(val, mux_base + reg);
68}
Tony Lindgren7d7f6652008-01-25 00:42:48 -080069
Tony Lindgren15ac7af2009-12-11 16:16:32 -080070#ifdef CONFIG_OMAP_MUX
71
72static struct omap_mux_cfg arch_mux_cfg;
73
Tony Lindgren1dbae812005-11-10 14:26:51 +000074/* NOTE: See mux.h for the enumeration */
75
Tony Lindgren93308992008-01-24 17:24:15 -080076#ifdef CONFIG_ARCH_OMAP24XX
77static struct pin_config __initdata_or_module omap24xx_pins[] = {
Tony Lindgren1dbae812005-11-10 14:26:51 +000078/*
79 * description mux mux pull pull debug
80 * offset mode ena type
81 */
82
83/* 24xx I2C */
84MUX_CFG_24XX("M19_24XX_I2C1_SCL", 0x111, 0, 0, 0, 1)
85MUX_CFG_24XX("L15_24XX_I2C1_SDA", 0x112, 0, 0, 0, 1)
Kyungmin Park7bbb3cc2006-12-06 17:13:54 -080086MUX_CFG_24XX("J15_24XX_I2C2_SCL", 0x113, 0, 0, 1, 1)
Tony Lindgren1dbae812005-11-10 14:26:51 +000087MUX_CFG_24XX("H19_24XX_I2C2_SDA", 0x114, 0, 0, 0, 1)
88
89/* Menelaus interrupt */
90MUX_CFG_24XX("W19_24XX_SYS_NIRQ", 0x12c, 0, 1, 1, 1)
91
Tony Lindgren8d7f9f52006-04-02 17:46:22 +010092/* 24xx clocks */
93MUX_CFG_24XX("W14_24XX_SYS_CLKOUT", 0x137, 0, 1, 1, 1)
94
Kyungmin Park7bbb3cc2006-12-06 17:13:54 -080095/* 24xx GPMC chipselects, wait pin monitoring */
Tony Lindgren7d34f3b2006-12-07 14:01:29 -080096MUX_CFG_24XX("E2_GPMC_NCS2", 0x08e, 0, 1, 1, 1)
97MUX_CFG_24XX("L2_GPMC_NCS7", 0x093, 0, 1, 1, 1)
Tony Lindgren3cbc9602006-06-26 16:16:25 -070098MUX_CFG_24XX("L3_GPMC_WAIT0", 0x09a, 0, 1, 1, 1)
99MUX_CFG_24XX("N7_GPMC_WAIT1", 0x09b, 0, 1, 1, 1)
100MUX_CFG_24XX("M1_GPMC_WAIT2", 0x09c, 0, 1, 1, 1)
101MUX_CFG_24XX("P1_GPMC_WAIT3", 0x09d, 0, 1, 1, 1)
102
Tony Lindgren8d7f9f52006-04-02 17:46:22 +0100103/* 24xx McBSP */
104MUX_CFG_24XX("Y15_24XX_MCBSP2_CLKX", 0x124, 1, 1, 0, 1)
105MUX_CFG_24XX("R14_24XX_MCBSP2_FSX", 0x125, 1, 1, 0, 1)
106MUX_CFG_24XX("W15_24XX_MCBSP2_DR", 0x126, 1, 1, 0, 1)
107MUX_CFG_24XX("V15_24XX_MCBSP2_DX", 0x127, 1, 1, 0, 1)
108
Tony Lindgren1dbae812005-11-10 14:26:51 +0000109/* 24xx GPIO */
Tony Lindgren7d34f3b2006-12-07 14:01:29 -0800110MUX_CFG_24XX("M21_242X_GPIO11", 0x0c9, 3, 1, 1, 1)
111MUX_CFG_24XX("P21_242X_GPIO12", 0x0ca, 3, 0, 0, 1)
112MUX_CFG_24XX("AA10_242X_GPIO13", 0x0e5, 3, 0, 0, 1)
113MUX_CFG_24XX("AA6_242X_GPIO14", 0x0e6, 3, 0, 0, 1)
114MUX_CFG_24XX("AA4_242X_GPIO15", 0x0e7, 3, 0, 0, 1)
115MUX_CFG_24XX("Y11_242X_GPIO16", 0x0e8, 3, 0, 0, 1)
116MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1)
117MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1)
Tony Lindgren1dbae812005-11-10 14:26:51 +0000118MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1)
Tony Lindgren7d34f3b2006-12-07 14:01:29 -0800119MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1)
Tony Lindgrenf7337a12008-03-20 16:56:26 +0200120MUX_CFG_24XX("N15_24XX_GPIO85", 0x103, 3, 0, 0, 1)
Tony Lindgren1dbae812005-11-10 14:26:51 +0000121MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1)
Tony Lindgrenf7337a12008-03-20 16:56:26 +0200122MUX_CFG_24XX("P20_24XX_GPIO93", 0x10b, 3, 0, 0, 1)
123MUX_CFG_24XX("P18_24XX_GPIO95", 0x10d, 3, 0, 0, 1)
124MUX_CFG_24XX("M18_24XX_GPIO96", 0x10e, 3, 0, 0, 1)
125MUX_CFG_24XX("L14_24XX_GPIO97", 0x10f, 3, 0, 0, 1)
Tony Lindgren7d34f3b2006-12-07 14:01:29 -0800126MUX_CFG_24XX("J15_24XX_GPIO99", 0x113, 3, 1, 1, 1)
Tony Lindgren8d7f9f52006-04-02 17:46:22 +0100127MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1)
Kyungmin Park7bbb3cc2006-12-06 17:13:54 -0800128MUX_CFG_24XX("P14_24XX_GPIO125", 0x140, 3, 1, 1, 1)
Tony Lindgren8d7f9f52006-04-02 17:46:22 +0100129
Tony Lindgren5ac42152006-06-26 16:16:20 -0700130/* 242x DBG GPIO */
131MUX_CFG_24XX("V4_242X_GPIO49", 0xd3, 3, 0, 0, 1)
132MUX_CFG_24XX("W2_242X_GPIO50", 0xd4, 3, 0, 0, 1)
133MUX_CFG_24XX("U4_242X_GPIO51", 0xd5, 3, 0, 0, 1)
134MUX_CFG_24XX("V3_242X_GPIO52", 0xd6, 3, 0, 0, 1)
135MUX_CFG_24XX("V2_242X_GPIO53", 0xd7, 3, 0, 0, 1)
136MUX_CFG_24XX("V6_242X_GPIO53", 0xcf, 3, 0, 0, 1)
137MUX_CFG_24XX("T4_242X_GPIO54", 0xd8, 3, 0, 0, 1)
138MUX_CFG_24XX("Y4_242X_GPIO54", 0xd0, 3, 0, 0, 1)
139MUX_CFG_24XX("T3_242X_GPIO55", 0xd9, 3, 0, 0, 1)
140MUX_CFG_24XX("U2_242X_GPIO56", 0xda, 3, 0, 0, 1)
141
142/* 24xx external DMA requests */
Tony Lindgren7d34f3b2006-12-07 14:01:29 -0800143MUX_CFG_24XX("AA10_242X_DMAREQ0", 0x0e5, 2, 0, 0, 1)
144MUX_CFG_24XX("AA6_242X_DMAREQ1", 0x0e6, 2, 0, 0, 1)
145MUX_CFG_24XX("E4_242X_DMAREQ2", 0x074, 2, 0, 0, 1)
146MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1)
147MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1)
148MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1)
Tony Lindgren5ac42152006-06-26 16:16:20 -0700149
Tony Lindgren7d34f3b2006-12-07 14:01:29 -0800150/* UART3 */
Tony Lindgren8d7f9f52006-04-02 17:46:22 +0100151MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1)
152MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1)
153
Kyungmin Parkabc45e12006-09-25 12:41:25 +0300154/* MMC/SDIO */
155MUX_CFG_24XX("G19_24XX_MMC_CLKO", 0x0f3, 0, 0, 0, 1)
156MUX_CFG_24XX("H18_24XX_MMC_CMD", 0x0f4, 0, 0, 0, 1)
157MUX_CFG_24XX("F20_24XX_MMC_DAT0", 0x0f5, 0, 0, 0, 1)
158MUX_CFG_24XX("H14_24XX_MMC_DAT1", 0x0f6, 0, 0, 0, 1)
159MUX_CFG_24XX("E19_24XX_MMC_DAT2", 0x0f7, 0, 0, 0, 1)
160MUX_CFG_24XX("D19_24XX_MMC_DAT3", 0x0f8, 0, 0, 0, 1)
161MUX_CFG_24XX("F19_24XX_MMC_DAT_DIR0", 0x0f9, 0, 0, 0, 1)
162MUX_CFG_24XX("E20_24XX_MMC_DAT_DIR1", 0x0fa, 0, 0, 0, 1)
163MUX_CFG_24XX("F18_24XX_MMC_DAT_DIR2", 0x0fb, 0, 0, 0, 1)
164MUX_CFG_24XX("E18_24XX_MMC_DAT_DIR3", 0x0fc, 0, 0, 0, 1)
165MUX_CFG_24XX("G18_24XX_MMC_CMD_DIR", 0x0fd, 0, 0, 0, 1)
166MUX_CFG_24XX("H15_24XX_MMC_CLKI", 0x0fe, 0, 0, 0, 1)
167
Kyungmin Park7bbb3cc2006-12-06 17:13:54 -0800168/* Full speed USB */
169MUX_CFG_24XX("J20_24XX_USB0_PUEN", 0x11d, 0, 0, 0, 1)
170MUX_CFG_24XX("J19_24XX_USB0_VP", 0x11e, 0, 0, 0, 1)
171MUX_CFG_24XX("K20_24XX_USB0_VM", 0x11f, 0, 0, 0, 1)
172MUX_CFG_24XX("J18_24XX_USB0_RCV", 0x120, 0, 0, 0, 1)
173MUX_CFG_24XX("K19_24XX_USB0_TXEN", 0x121, 0, 0, 0, 1)
174MUX_CFG_24XX("J14_24XX_USB0_SE0", 0x122, 0, 0, 0, 1)
175MUX_CFG_24XX("K18_24XX_USB0_DAT", 0x123, 0, 0, 0, 1)
176
177MUX_CFG_24XX("N14_24XX_USB1_SE0", 0x0ed, 2, 0, 0, 1)
178MUX_CFG_24XX("W12_24XX_USB1_SE0", 0x0dd, 3, 0, 0, 1)
179MUX_CFG_24XX("P15_24XX_USB1_DAT", 0x0ee, 2, 0, 0, 1)
180MUX_CFG_24XX("R13_24XX_USB1_DAT", 0x0e0, 3, 0, 0, 1)
181MUX_CFG_24XX("W20_24XX_USB1_TXEN", 0x0ec, 2, 0, 0, 1)
182MUX_CFG_24XX("P13_24XX_USB1_TXEN", 0x0df, 3, 0, 0, 1)
183MUX_CFG_24XX("V19_24XX_USB1_RCV", 0x0eb, 2, 0, 0, 1)
184MUX_CFG_24XX("V12_24XX_USB1_RCV", 0x0de, 3, 0, 0, 1)
185
186MUX_CFG_24XX("AA10_24XX_USB2_SE0", 0x0e5, 2, 0, 0, 1)
187MUX_CFG_24XX("Y11_24XX_USB2_DAT", 0x0e8, 2, 0, 0, 1)
188MUX_CFG_24XX("AA12_24XX_USB2_TXEN", 0x0e9, 2, 0, 0, 1)
189MUX_CFG_24XX("AA6_24XX_USB2_RCV", 0x0e6, 2, 0, 0, 1)
190MUX_CFG_24XX("AA4_24XX_USB2_TLLSE0", 0x0e7, 2, 0, 0, 1)
191
Tony Lindgren8d7f9f52006-04-02 17:46:22 +0100192/* Keypad GPIO*/
193MUX_CFG_24XX("T19_24XX_KBR0", 0x106, 3, 1, 1, 1)
194MUX_CFG_24XX("R19_24XX_KBR1", 0x107, 3, 1, 1, 1)
195MUX_CFG_24XX("V18_24XX_KBR2", 0x139, 3, 1, 1, 1)
196MUX_CFG_24XX("M21_24XX_KBR3", 0xc9, 3, 1, 1, 1)
197MUX_CFG_24XX("E5__24XX_KBR4", 0x138, 3, 1, 1, 1)
198MUX_CFG_24XX("M18_24XX_KBR5", 0x10e, 3, 1, 1, 1)
199MUX_CFG_24XX("R20_24XX_KBC0", 0x108, 3, 0, 0, 1)
200MUX_CFG_24XX("M14_24XX_KBC1", 0x109, 3, 0, 0, 1)
201MUX_CFG_24XX("H19_24XX_KBC2", 0x114, 3, 0, 0, 1)
202MUX_CFG_24XX("V17_24XX_KBC3", 0x135, 3, 0, 0, 1)
203MUX_CFG_24XX("P21_24XX_KBC4", 0xca, 3, 0, 0, 1)
204MUX_CFG_24XX("L14_24XX_KBC5", 0x10f, 3, 0, 0, 1)
205MUX_CFG_24XX("N19_24XX_KBC6", 0x110, 3, 0, 0, 1)
206
207/* 24xx Menelaus Keypad GPIO */
208MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1)
209MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1)
210MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1)
Tony Lindgren1dbae812005-11-10 14:26:51 +0000211
Tony Lindgrenf7337a12008-03-20 16:56:26 +0200212/* 2430 USB */
213MUX_CFG_24XX("AD9_2430_USB0_PUEN", 0x133, 4, 0, 0, 1)
214MUX_CFG_24XX("Y11_2430_USB0_VP", 0x134, 4, 0, 0, 1)
215MUX_CFG_24XX("AD7_2430_USB0_VM", 0x135, 4, 0, 0, 1)
216MUX_CFG_24XX("AE7_2430_USB0_RCV", 0x136, 4, 0, 0, 1)
217MUX_CFG_24XX("AD4_2430_USB0_TXEN", 0x137, 4, 0, 0, 1)
218MUX_CFG_24XX("AF9_2430_USB0_SE0", 0x138, 4, 0, 0, 1)
219MUX_CFG_24XX("AE6_2430_USB0_DAT", 0x139, 4, 0, 0, 1)
220MUX_CFG_24XX("AD24_2430_USB1_SE0", 0x107, 2, 0, 0, 1)
221MUX_CFG_24XX("AB24_2430_USB1_RCV", 0x108, 2, 0, 0, 1)
222MUX_CFG_24XX("Y25_2430_USB1_TXEN", 0x109, 2, 0, 0, 1)
223MUX_CFG_24XX("AA26_2430_USB1_DAT", 0x10A, 2, 0, 0, 1)
224
225/* 2430 HS-USB */
226MUX_CFG_24XX("AD9_2430_USB0HS_DATA3", 0x133, 0, 0, 0, 1)
227MUX_CFG_24XX("Y11_2430_USB0HS_DATA4", 0x134, 0, 0, 0, 1)
228MUX_CFG_24XX("AD7_2430_USB0HS_DATA5", 0x135, 0, 0, 0, 1)
229MUX_CFG_24XX("AE7_2430_USB0HS_DATA6", 0x136, 0, 0, 0, 1)
230MUX_CFG_24XX("AD4_2430_USB0HS_DATA2", 0x137, 0, 0, 0, 1)
231MUX_CFG_24XX("AF9_2430_USB0HS_DATA0", 0x138, 0, 0, 0, 1)
232MUX_CFG_24XX("AE6_2430_USB0HS_DATA1", 0x139, 0, 0, 0, 1)
233MUX_CFG_24XX("AE8_2430_USB0HS_CLK", 0x13A, 0, 0, 0, 1)
234MUX_CFG_24XX("AD8_2430_USB0HS_DIR", 0x13B, 0, 0, 0, 1)
235MUX_CFG_24XX("AE5_2430_USB0HS_STP", 0x13c, 0, 1, 1, 1)
236MUX_CFG_24XX("AE9_2430_USB0HS_NXT", 0x13D, 0, 0, 0, 1)
237MUX_CFG_24XX("AC7_2430_USB0HS_DATA7", 0x13E, 0, 0, 0, 1)
238
239/* 2430 McBSP */
Arun KS2619bc32008-12-10 17:36:54 -0800240MUX_CFG_24XX("AD6_2430_MCBSP_CLKS", 0x011E, 0, 0, 0, 1)
241
242MUX_CFG_24XX("AB2_2430_MCBSP1_CLKR", 0x011A, 0, 0, 0, 1)
243MUX_CFG_24XX("AD5_2430_MCBSP1_FSR", 0x011B, 0, 0, 0, 1)
244MUX_CFG_24XX("AA1_2430_MCBSP1_DX", 0x011C, 0, 0, 0, 1)
245MUX_CFG_24XX("AF3_2430_MCBSP1_DR", 0x011D, 0, 0, 0, 1)
246MUX_CFG_24XX("AB3_2430_MCBSP1_FSX", 0x011F, 0, 0, 0, 1)
247MUX_CFG_24XX("Y9_2430_MCBSP1_CLKX", 0x0120, 0, 0, 0, 1)
248
Tony Lindgrenf7337a12008-03-20 16:56:26 +0200249MUX_CFG_24XX("AC10_2430_MCBSP2_FSX", 0x012E, 1, 0, 0, 1)
250MUX_CFG_24XX("AD16_2430_MCBSP2_CLX", 0x012F, 1, 0, 0, 1)
251MUX_CFG_24XX("AE13_2430_MCBSP2_DX", 0x0130, 1, 0, 0, 1)
252MUX_CFG_24XX("AD13_2430_MCBSP2_DR", 0x0131, 1, 0, 0, 1)
253MUX_CFG_24XX("AC10_2430_MCBSP2_FSX_OFF",0x012E, 0, 0, 0, 1)
254MUX_CFG_24XX("AD16_2430_MCBSP2_CLX_OFF",0x012F, 0, 0, 0, 1)
255MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1)
256MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1)
Arun KS2619bc32008-12-10 17:36:54 -0800257
258MUX_CFG_24XX("AC9_2430_MCBSP3_CLKX", 0x0103, 0, 0, 0, 1)
259MUX_CFG_24XX("AE4_2430_MCBSP3_FSX", 0x0104, 0, 0, 0, 1)
260MUX_CFG_24XX("AE2_2430_MCBSP3_DR", 0x0105, 0, 0, 0, 1)
261MUX_CFG_24XX("AF4_2430_MCBSP3_DX", 0x0106, 0, 0, 0, 1)
262
263MUX_CFG_24XX("N3_2430_MCBSP4_CLKX", 0x010B, 1, 0, 0, 1)
264MUX_CFG_24XX("AD23_2430_MCBSP4_DR", 0x010C, 1, 0, 0, 1)
265MUX_CFG_24XX("AB25_2430_MCBSP4_DX", 0x010D, 1, 0, 0, 1)
266MUX_CFG_24XX("AC25_2430_MCBSP4_FSX", 0x010E, 1, 0, 0, 1)
267
268MUX_CFG_24XX("AE16_2430_MCBSP5_CLKX", 0x00ED, 1, 0, 0, 1)
269MUX_CFG_24XX("AF12_2430_MCBSP5_FSX", 0x00ED, 1, 0, 0, 1)
270MUX_CFG_24XX("K7_2430_MCBSP5_DX", 0x00EF, 1, 0, 0, 1)
271MUX_CFG_24XX("M1_2430_MCBSP5_DR", 0x00F0, 1, 0, 0, 1)
272
273/* 2430 MCSPI1 */
274MUX_CFG_24XX("Y18_2430_MCSPI1_CLK", 0x010F, 0, 0, 0, 1)
275MUX_CFG_24XX("AD15_2430_MCSPI1_SIMO", 0x0110, 0, 0, 0, 1)
276MUX_CFG_24XX("AE17_2430_MCSPI1_SOMI", 0x0111, 0, 0, 0, 1)
277MUX_CFG_24XX("U1_2430_MCSPI1_CS0", 0x0112, 0, 0, 0, 1)
278
279/* Touchscreen GPIO */
280MUX_CFG_24XX("AF19_2430_GPIO_85", 0x0113, 3, 0, 0, 1)
281
Tony Lindgren1dbae812005-11-10 14:26:51 +0000282};
283
Tony Lindgren93308992008-01-24 17:24:15 -0800284#define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
285
286#else
287#define omap24xx_pins NULL
288#define OMAP24XX_PINS_SZ 0
289#endif /* CONFIG_ARCH_OMAP24XX */
Tony Lindgren225dfda2008-01-25 00:42:48 -0800290
Vikram Pandita23518722008-10-06 15:49:16 +0300291#ifdef CONFIG_ARCH_OMAP34XX
292static struct pin_config __initdata_or_module omap34xx_pins[] = {
293/*
294 * Name, reg-offset,
295 * mux-mode | [active-mode | off-mode]
296 */
297
298/* 34xx I2C */
299MUX_CFG_34XX("K21_34XX_I2C1_SCL", 0x1ba,
300 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
301MUX_CFG_34XX("J21_34XX_I2C1_SDA", 0x1bc,
302 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
303MUX_CFG_34XX("AF15_34XX_I2C2_SCL", 0x1be,
304 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
305MUX_CFG_34XX("AE15_34XX_I2C2_SDA", 0x1c0,
306 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
307MUX_CFG_34XX("AF14_34XX_I2C3_SCL", 0x1c2,
308 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
309MUX_CFG_34XX("AG14_34XX_I2C3_SDA", 0x1c4,
310 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
311MUX_CFG_34XX("AD26_34XX_I2C4_SCL", 0xa00,
312 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
313MUX_CFG_34XX("AE26_34XX_I2C4_SDA", 0xa02,
314 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
315
316/* PHY - HSUSB: 12-pin ULPI PHY: Port 1*/
317MUX_CFG_34XX("Y8_3430_USB1HS_PHY_CLK", 0x5da,
318 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
319MUX_CFG_34XX("Y9_3430_USB1HS_PHY_STP", 0x5d8,
320 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
321MUX_CFG_34XX("AA14_3430_USB1HS_PHY_DIR", 0x5ec,
322 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
323MUX_CFG_34XX("AA11_3430_USB1HS_PHY_NXT", 0x5ee,
324 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
325MUX_CFG_34XX("W13_3430_USB1HS_PHY_D0", 0x5dc,
326 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
327MUX_CFG_34XX("W12_3430_USB1HS_PHY_D1", 0x5de,
328 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
329MUX_CFG_34XX("W11_3430_USB1HS_PHY_D2", 0x5e0,
330 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
331MUX_CFG_34XX("Y11_3430_USB1HS_PHY_D3", 0x5ea,
332 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
333MUX_CFG_34XX("W9_3430_USB1HS_PHY_D4", 0x5e4,
334 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
335MUX_CFG_34XX("Y12_3430_USB1HS_PHY_D5", 0x5e6,
336 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
337MUX_CFG_34XX("W8_3430_USB1HS_PHY_D6", 0x5e8,
338 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
339MUX_CFG_34XX("Y13_3430_USB1HS_PHY_D7", 0x5e2,
340 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
341
342/* PHY - HSUSB: 12-pin ULPI PHY: Port 2*/
343MUX_CFG_34XX("AA8_3430_USB2HS_PHY_CLK", 0x5f0,
344 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
345MUX_CFG_34XX("AA10_3430_USB2HS_PHY_STP", 0x5f2,
346 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
347MUX_CFG_34XX("AA9_3430_USB2HS_PHY_DIR", 0x5f4,
348 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
349MUX_CFG_34XX("AB11_3430_USB2HS_PHY_NXT", 0x5f6,
350 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
351MUX_CFG_34XX("AB10_3430_USB2HS_PHY_D0", 0x5f8,
352 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
353MUX_CFG_34XX("AB9_3430_USB2HS_PHY_D1", 0x5fa,
354 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
355MUX_CFG_34XX("W3_3430_USB2HS_PHY_D2", 0x1d4,
356 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
357MUX_CFG_34XX("T4_3430_USB2HS_PHY_D3", 0x1de,
358 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
359MUX_CFG_34XX("T3_3430_USB2HS_PHY_D4", 0x1d8,
360 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
361MUX_CFG_34XX("R3_3430_USB2HS_PHY_D5", 0x1da,
362 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
363MUX_CFG_34XX("R4_3430_USB2HS_PHY_D6", 0x1dc,
364 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
365MUX_CFG_34XX("T2_3430_USB2HS_PHY_D7", 0x1d6,
366 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
367
368/* TLL - HSUSB: 12-pin TLL Port 1*/
369MUX_CFG_34XX("Y8_3430_USB1HS_TLL_CLK", 0x5da,
Vikram Pandita23518722008-10-06 15:49:16 +0300370 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300371MUX_CFG_34XX("Y9_3430_USB1HS_TLL_STP", 0x5d8,
372 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
Vikram Pandita23518722008-10-06 15:49:16 +0300373MUX_CFG_34XX("AA14_3430_USB1HS_TLL_DIR", 0x5ec,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300374 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300375MUX_CFG_34XX("AA11_3430_USB1HS_TLL_NXT", 0x5ee,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300376 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300377MUX_CFG_34XX("W13_3430_USB1HS_TLL_D0", 0x5dc,
378 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
379MUX_CFG_34XX("W12_3430_USB1HS_TLL_D1", 0x5de,
380 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
381MUX_CFG_34XX("W11_3430_USB1HS_TLL_D2", 0x5e0,
382 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
383MUX_CFG_34XX("Y11_3430_USB1HS_TLL_D3", 0x5ea,
384 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
385MUX_CFG_34XX("W9_3430_USB1HS_TLL_D4", 0x5e4,
386 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
387MUX_CFG_34XX("Y12_3430_USB1HS_TLL_D5", 0x5e6,
388 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
389MUX_CFG_34XX("W8_3430_USB1HS_TLL_D6", 0x5e8,
390 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
391MUX_CFG_34XX("Y13_3430_USB1HS_TLL_D7", 0x5e2,
392 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
393
394/* TLL - HSUSB: 12-pin TLL Port 2*/
395MUX_CFG_34XX("AA8_3430_USB2HS_TLL_CLK", 0x5f0,
Vikram Pandita23518722008-10-06 15:49:16 +0300396 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300397MUX_CFG_34XX("AA10_3430_USB2HS_TLL_STP", 0x5f2,
398 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
Vikram Pandita23518722008-10-06 15:49:16 +0300399MUX_CFG_34XX("AA9_3430_USB2HS_TLL_DIR", 0x5f4,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300400 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300401MUX_CFG_34XX("AB11_3430_USB2HS_TLL_NXT", 0x5f6,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300402 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300403MUX_CFG_34XX("AB10_3430_USB2HS_TLL_D0", 0x5f8,
404 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
405MUX_CFG_34XX("AB9_3430_USB2HS_TLL_D1", 0x5fa,
406 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
407MUX_CFG_34XX("W3_3430_USB2HS_TLL_D2", 0x1d4,
408 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
409MUX_CFG_34XX("T4_3430_USB2HS_TLL_D3", 0x1de,
410 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
411MUX_CFG_34XX("T3_3430_USB2HS_TLL_D4", 0x1d8,
412 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
413MUX_CFG_34XX("R3_3430_USB2HS_TLL_D5", 0x1da,
414 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
415MUX_CFG_34XX("R4_3430_USB2HS_TLL_D6", 0x1dc,
416 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
417MUX_CFG_34XX("T2_3430_USB2HS_TLL_D7", 0x1d6,
418 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
419
420/* TLL - HSUSB: 12-pin TLL Port 3*/
421MUX_CFG_34XX("AA6_3430_USB3HS_TLL_CLK", 0x180,
Vikram Pandita23518722008-10-06 15:49:16 +0300422 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300423MUX_CFG_34XX("AB3_3430_USB3HS_TLL_STP", 0x166,
424 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLUP)
Vikram Pandita23518722008-10-06 15:49:16 +0300425MUX_CFG_34XX("AA3_3430_USB3HS_TLL_DIR", 0x168,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300426 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300427MUX_CFG_34XX("Y3_3430_USB3HS_TLL_NXT", 0x16a,
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300428 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
Vikram Pandita23518722008-10-06 15:49:16 +0300429MUX_CFG_34XX("AA5_3430_USB3HS_TLL_D0", 0x186,
430 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
431MUX_CFG_34XX("Y4_3430_USB3HS_TLL_D1", 0x184,
432 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
433MUX_CFG_34XX("Y5_3430_USB3HS_TLL_D2", 0x188,
434 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
435MUX_CFG_34XX("W5_3430_USB3HS_TLL_D3", 0x18a,
436 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
437MUX_CFG_34XX("AB12_3430_USB3HS_TLL_D4", 0x16c,
438 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
439MUX_CFG_34XX("AB13_3430_USB3HS_TLL_D5", 0x16e,
440 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
441MUX_CFG_34XX("AA13_3430_USB3HS_TLL_D6", 0x170,
442 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
443MUX_CFG_34XX("AA12_3430_USB3HS_TLL_D7", 0x172,
444 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
Syed Mohammed, Khasimcc26b3b2008-10-09 17:51:41 +0300445
446/* PHY FSUSB: FS Serial for Port 1 (multiple PHY modes supported) */
447MUX_CFG_34XX("AF10_3430_USB1FS_PHY_MM1_RXDP", 0x5d8,
448 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
449MUX_CFG_34XX("AG9_3430_USB1FS_PHY_MM1_RXDM", 0x5ee,
450 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
451MUX_CFG_34XX("W13_3430_USB1FS_PHY_MM1_RXRCV", 0x5dc,
452 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
453MUX_CFG_34XX("W12_3430_USB1FS_PHY_MM1_TXSE0", 0x5de,
454 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
455MUX_CFG_34XX("W11_3430_USB1FS_PHY_MM1_TXDAT", 0x5e0,
456 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
457MUX_CFG_34XX("Y11_3430_USB1FS_PHY_MM1_TXEN_N", 0x5ea,
458 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
459
460/* PHY FSUSB: FS Serial for Port 2 (multiple PHY modes supported) */
461MUX_CFG_34XX("AF7_3430_USB2FS_PHY_MM2_RXDP", 0x5f2,
462 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
463MUX_CFG_34XX("AH7_3430_USB2FS_PHY_MM2_RXDM", 0x5f6,
464 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
465MUX_CFG_34XX("AB10_3430_USB2FS_PHY_MM2_RXRCV", 0x5f8,
466 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
467MUX_CFG_34XX("AB9_3430_USB2FS_PHY_MM2_TXSE0", 0x5fa,
468 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
469MUX_CFG_34XX("W3_3430_USB2FS_PHY_MM2_TXDAT", 0x1d4,
470 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
471MUX_CFG_34XX("T4_3430_USB2FS_PHY_MM2_TXEN_N", 0x1de,
472 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
473
474/* PHY FSUSB: FS Serial for Port 3 (multiple PHY modes supported) */
475MUX_CFG_34XX("AH3_3430_USB3FS_PHY_MM3_RXDP", 0x166,
476 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
477MUX_CFG_34XX("AE3_3430_USB3FS_PHY_MM3_RXDM", 0x16a,
478 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
479MUX_CFG_34XX("AD1_3430_USB3FS_PHY_MM3_RXRCV", 0x186,
480 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
481MUX_CFG_34XX("AE1_3430_USB3FS_PHY_MM3_TXSE0", 0x184,
482 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
483MUX_CFG_34XX("AD2_3430_USB3FS_PHY_MM3_TXDAT", 0x188,
484 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
485MUX_CFG_34XX("AC1_3430_USB3FS_PHY_MM3_TXEN_N", 0x18a,
486 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_OUTPUT)
487
Arun KS2619bc32008-12-10 17:36:54 -0800488
489/* 34XX GPIO - bidirectional, unless the name has an "_OUT" suffix.
Tony Lindgrenb9d766c2009-03-23 18:23:46 -0700490 * (Always specify PIN_INPUT, except for names suffixed by "_OUT".)
Arun KS2619bc32008-12-10 17:36:54 -0800491 * No internal pullup/pulldown without "_UP" or "_DOWN" suffix.
492 */
Tony Lindgrenb9d766c2009-03-23 18:23:46 -0700493MUX_CFG_34XX("AF26_34XX_GPIO0", 0x1e0,
494 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
495MUX_CFG_34XX("AF22_34XX_GPIO9", 0xa18,
496 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
Jarkko Nikula44e74842009-09-24 16:23:17 -0700497MUX_CFG_34XX("AG9_34XX_GPIO23", 0x5ee,
498 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
Arun KS2619bc32008-12-10 17:36:54 -0800499MUX_CFG_34XX("AH8_34XX_GPIO29", 0x5fa,
500 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
Tony Lindgrenb9d766c2009-03-23 18:23:46 -0700501MUX_CFG_34XX("U8_34XX_GPIO54_OUT", 0x0b4,
502 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
503MUX_CFG_34XX("U8_34XX_GPIO54_DOWN", 0x0b4,
504 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLDOWN)
505MUX_CFG_34XX("L8_34XX_GPIO63", 0x0ce,
506 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
507MUX_CFG_34XX("G25_34XX_GPIO86_OUT", 0x0fc,
508 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
509MUX_CFG_34XX("AG4_34XX_GPIO134_OUT", 0x160,
510 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
Ajay Kumar Gupta41a03c52009-09-24 16:23:08 -0700511MUX_CFG_34XX("AF4_34XX_GPIO135_OUT", 0x162,
512 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
Tony Lindgrenb9d766c2009-03-23 18:23:46 -0700513MUX_CFG_34XX("AE4_34XX_GPIO136_OUT", 0x164,
514 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
515MUX_CFG_34XX("AF6_34XX_GPIO140_UP", 0x16c,
516 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
517MUX_CFG_34XX("AE6_34XX_GPIO141", 0x16e,
518 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
519MUX_CFG_34XX("AF5_34XX_GPIO142", 0x170,
520 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
521MUX_CFG_34XX("AE5_34XX_GPIO143", 0x172,
522 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
523MUX_CFG_34XX("H19_34XX_GPIO164_OUT", 0x19c,
524 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
Arun KS2619bc32008-12-10 17:36:54 -0800525MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6,
526 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
Jean Pihet9fb97412009-07-24 19:43:25 -0600527
528/* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
529MUX_CFG_34XX("H16_34XX_SDRC_CKE0", 0x262,
530 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
531MUX_CFG_34XX("H17_34XX_SDRC_CKE1", 0x264,
532 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
Vikram Pandita57b9daa2009-08-28 11:24:11 -0700533
534/* MMC1 */
535MUX_CFG_34XX("N28_3430_MMC1_CLK", 0x144,
536 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
537MUX_CFG_34XX("M27_3430_MMC1_CMD", 0x146,
538 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
539MUX_CFG_34XX("N27_3430_MMC1_DAT0", 0x148,
540 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
541MUX_CFG_34XX("N26_3430_MMC1_DAT1", 0x14a,
542 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
543MUX_CFG_34XX("N25_3430_MMC1_DAT2", 0x14c,
544 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
545MUX_CFG_34XX("P28_3430_MMC1_DAT3", 0x14e,
546 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
547MUX_CFG_34XX("P27_3430_MMC1_DAT4", 0x150,
548 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
549MUX_CFG_34XX("P26_3430_MMC1_DAT5", 0x152,
550 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
551MUX_CFG_34XX("R27_3430_MMC1_DAT6", 0x154,
552 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
553MUX_CFG_34XX("R25_3430_MMC1_DAT7", 0x156,
554 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
555
556/* MMC2 */
557MUX_CFG_34XX("AE2_3430_MMC2_CLK", 0x158,
558 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
559MUX_CFG_34XX("AG5_3430_MMC2_CMD", 0x15A,
560 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
561MUX_CFG_34XX("AH5_3430_MMC2_DAT0", 0x15c,
562 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
563MUX_CFG_34XX("AH4_3430_MMC2_DAT1", 0x15e,
564 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
565MUX_CFG_34XX("AG4_3430_MMC2_DAT2", 0x160,
566 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
567MUX_CFG_34XX("AF4_3430_MMC2_DAT3", 0x162,
568 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
Madhu46792322009-11-22 10:11:08 -0800569MUX_CFG_34XX("AE4_3430_MMC2_DAT4", 0x164,
570 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
571MUX_CFG_34XX("AH3_3430_MMC2_DAT5", 0x166,
572 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
573MUX_CFG_34XX("AF3_3430_MMC2_DAT6", 0x168,
574 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
575MUX_CFG_34XX("AE3_3430_MMC2_DAT7", 0x16A,
576 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
Vikram Pandita57b9daa2009-08-28 11:24:11 -0700577
578/* MMC3 */
579MUX_CFG_34XX("AF10_3430_MMC3_CLK", 0x5d8,
580 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
581MUX_CFG_34XX("AC3_3430_MMC3_CMD", 0x1d0,
582 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLUP)
583MUX_CFG_34XX("AE11_3430_MMC3_DAT0", 0x5e4,
584 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
585MUX_CFG_34XX("AH9_3430_MMC3_DAT1", 0x5e6,
586 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
587MUX_CFG_34XX("AF13_3430_MMC3_DAT2", 0x5e8,
588 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
589MUX_CFG_34XX("AF13_3430_MMC3_DAT3", 0x5e2,
590 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
Reddy, Teerth5110b292009-08-24 11:58:59 +0530591
592/* SYS_NIRQ T2 INT1 */
593MUX_CFG_34XX("AF26_34XX_SYS_NIRQ", 0x1E0,
594 OMAP3_WAKEUP_EN | OMAP34XX_PIN_INPUT_PULLUP |
595 OMAP34XX_MUX_MODE0)
Ajay Kumar Guptae8e51d22009-11-22 10:11:28 -0800596/* EHCI GPIO's on OMAP3EVM (Rev >= E) */
597MUX_CFG_34XX("AH14_34XX_GPIO21", 0x5ea,
598 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
599MUX_CFG_34XX("AF9_34XX_GPIO22", 0x5ec,
600 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
601MUX_CFG_34XX("U3_34XX_GPIO61", 0x0c8,
602 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
Vikram Pandita23518722008-10-06 15:49:16 +0300603};
604
605#define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins)
606
607#else
608#define omap34xx_pins NULL
609#define OMAP34XX_PINS_SZ 0
610#endif /* CONFIG_ARCH_OMAP34XX */
Tony Lindgren225dfda2008-01-25 00:42:48 -0800611
Tony Lindgren93308992008-01-24 17:24:15 -0800612#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
Vikram Pandita23518722008-10-06 15:49:16 +0300613static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 reg)
Tony Lindgren93308992008-01-24 17:24:15 -0800614{
615 u16 orig;
616 u8 warn = 0, debug = 0;
617
Mike Rapoport92c9f502009-12-11 16:16:31 -0800618 orig = omap_mux_read(cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
Tony Lindgren93308992008-01-24 17:24:15 -0800619
620#ifdef CONFIG_OMAP_MUX_DEBUG
621 debug = cfg->debug;
622#endif
623 warn = (orig != reg);
624 if (debug || warn)
625 printk(KERN_WARNING
Tony Lindgrena58caad2008-07-03 12:24:44 +0300626 "MUX: setup %s (0x%p): 0x%04x -> 0x%04x\n",
Paul Walmsley44595982008-03-18 10:04:51 +0200627 cfg->name, omap_ctrl_base_get() + cfg->mux_reg,
628 orig, reg);
Tony Lindgren93308992008-01-24 17:24:15 -0800629}
630#else
631#define omap2_cfg_debug(x, y) do {} while (0)
632#endif
633
634#ifdef CONFIG_ARCH_OMAP24XX
Arun KS2619bc32008-12-10 17:36:54 -0800635static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800636{
Tony Lindgren93308992008-01-24 17:24:15 -0800637 static DEFINE_SPINLOCK(mux_spin_lock);
638 unsigned long flags;
Tony Lindgren225dfda2008-01-25 00:42:48 -0800639 u8 reg = 0;
Tony Lindgren225dfda2008-01-25 00:42:48 -0800640
Tony Lindgren93308992008-01-24 17:24:15 -0800641 spin_lock_irqsave(&mux_spin_lock, flags);
Tony Lindgren225dfda2008-01-25 00:42:48 -0800642 reg |= cfg->mask & 0x7;
643 if (cfg->pull_val)
Vikram Pandita23518722008-10-06 15:49:16 +0300644 reg |= OMAP2_PULL_ENA;
Tony Lindgren93308992008-01-24 17:24:15 -0800645 if (cfg->pu_pd_val)
Vikram Pandita23518722008-10-06 15:49:16 +0300646 reg |= OMAP2_PULL_UP;
Tony Lindgren93308992008-01-24 17:24:15 -0800647 omap2_cfg_debug(cfg, reg);
Mike Rapoport92c9f502009-12-11 16:16:31 -0800648 omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
Tony Lindgren93308992008-01-24 17:24:15 -0800649 spin_unlock_irqrestore(&mux_spin_lock, flags);
Tony Lindgren225dfda2008-01-25 00:42:48 -0800650
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800651 return 0;
652}
Tony Lindgren93308992008-01-24 17:24:15 -0800653#else
Vikram Pandita23518722008-10-06 15:49:16 +0300654#define omap24xx_cfg_reg NULL
655#endif
656
657#ifdef CONFIG_ARCH_OMAP34XX
658static int __init_or_module omap34xx_cfg_reg(const struct pin_config *cfg)
659{
660 static DEFINE_SPINLOCK(mux_spin_lock);
661 unsigned long flags;
662 u16 reg = 0;
663
664 spin_lock_irqsave(&mux_spin_lock, flags);
665 reg |= cfg->mux_val;
666 omap2_cfg_debug(cfg, reg);
Mike Rapoport92c9f502009-12-11 16:16:31 -0800667 omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
Vikram Pandita23518722008-10-06 15:49:16 +0300668 spin_unlock_irqrestore(&mux_spin_lock, flags);
669
670 return 0;
671}
672#else
673#define omap34xx_cfg_reg NULL
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800674#endif
675
Tony Lindgren1dbae812005-11-10 14:26:51 +0000676int __init omap2_mux_init(void)
677{
Mike Rapoport92c9f502009-12-11 16:16:31 -0800678 u32 mux_pbase;
679
680 if (cpu_is_omap2420())
681 mux_pbase = OMAP2420_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
682 else if (cpu_is_omap2430())
683 mux_pbase = OMAP243X_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
Tony Lindgren15ac7af2009-12-11 16:16:32 -0800684 else
685 return -ENODEV;
Mike Rapoport92c9f502009-12-11 16:16:31 -0800686
687 mux_base = ioremap(mux_pbase, OMAP_MUX_BASE_SZ);
688 if (!mux_base) {
689 printk(KERN_ERR "mux: Could not ioremap\n");
690 return -ENODEV;
691 }
692
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800693 if (cpu_is_omap24xx()) {
694 arch_mux_cfg.pins = omap24xx_pins;
Tony Lindgren93308992008-01-24 17:24:15 -0800695 arch_mux_cfg.size = OMAP24XX_PINS_SZ;
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800696 arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
Vikram Pandita23518722008-10-06 15:49:16 +0300697 } else if (cpu_is_omap34xx()) {
698 arch_mux_cfg.pins = omap34xx_pins;
699 arch_mux_cfg.size = OMAP34XX_PINS_SZ;
700 arch_mux_cfg.cfg_reg = omap34xx_cfg_reg;
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800701 }
Tony Lindgren7d7f6652008-01-25 00:42:48 -0800702
703 return omap_mux_register(&arch_mux_cfg);
Tony Lindgren1dbae812005-11-10 14:26:51 +0000704}
705
Tony Lindgren15ac7af2009-12-11 16:16:32 -0800706#endif /* CONFIG_OMAP_MUX */
707
708/*----------------------------------------------------------------------------*/
709
710#ifdef CONFIG_ARCH_OMAP34XX
711
712static LIST_HEAD(muxmodes);
713static DEFINE_MUTEX(muxmode_mutex);
714
715#ifdef CONFIG_OMAP_MUX
716
717static char *omap_mux_options;
718
719int __init omap_mux_init_gpio(int gpio, int val)
720{
721 struct omap_mux_entry *e;
722 int found = 0;
723
724 if (!gpio)
725 return -EINVAL;
726
727 list_for_each_entry(e, &muxmodes, node) {
728 struct omap_mux *m = &e->mux;
729 if (gpio == m->gpio) {
730 u16 old_mode;
731 u16 mux_mode;
732
733 old_mode = omap_mux_read(m->reg_offset);
734 mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
735 mux_mode |= OMAP_MUX_MODE4;
736 printk(KERN_DEBUG "mux: Setting signal "
737 "%s.gpio%i 0x%04x -> 0x%04x\n",
738 m->muxnames[0], gpio, old_mode, mux_mode);
739 omap_mux_write(mux_mode, m->reg_offset);
740 found++;
741 }
742 }
743
744 if (found == 1)
745 return 0;
746
747 if (found > 1) {
748 printk(KERN_ERR "mux: Multiple gpio paths for gpio%i\n", gpio);
749 return -EINVAL;
750 }
751
752 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
753
754 return -ENODEV;
755}
756
757int __init omap_mux_init_signal(char *muxname, int val)
758{
759 struct omap_mux_entry *e;
760 char *m0_name = NULL, *mode_name = NULL;
761 int found = 0;
762
763 mode_name = strchr(muxname, '.');
764 if (mode_name) {
765 *mode_name = '\0';
766 mode_name++;
767 m0_name = muxname;
768 } else {
769 mode_name = muxname;
770 }
771
772 list_for_each_entry(e, &muxmodes, node) {
773 struct omap_mux *m = &e->mux;
774 char *m0_entry = m->muxnames[0];
775 int i;
776
777 if (m0_name && strcmp(m0_name, m0_entry))
778 continue;
779
780 for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
781 char *mode_cur = m->muxnames[i];
782
783 if (!mode_cur)
784 continue;
785
786 if (!strcmp(mode_name, mode_cur)) {
787 u16 old_mode;
788 u16 mux_mode;
789
790 old_mode = omap_mux_read(m->reg_offset);
791 mux_mode = val | i;
792 printk(KERN_DEBUG "mux: Setting signal "
793 "%s.%s 0x%04x -> 0x%04x\n",
794 m0_entry, muxname, old_mode, mux_mode);
795 omap_mux_write(mux_mode, m->reg_offset);
796 found++;
797 }
798 }
799 }
800
801 if (found == 1)
802 return 0;
803
804 if (found > 1) {
805 printk(KERN_ERR "mux: Multiple signal paths (%i) for %s\n",
806 found, muxname);
807 return -EINVAL;
808 }
809
810 printk(KERN_ERR "mux: Could not set signal %s\n", muxname);
811
812 return -ENODEV;
813}
814
Tony Lindgren4b715ef2009-12-11 16:16:32 -0800815#ifdef CONFIG_DEBUG_FS
816
817#define OMAP_MUX_MAX_NR_FLAGS 10
818#define OMAP_MUX_TEST_FLAG(val, mask) \
819 if (((val) & (mask)) == (mask)) { \
820 i++; \
821 flags[i] = #mask; \
822 }
823
824/* REVISIT: Add checking for non-optimal mux settings */
825static inline void omap_mux_decode(struct seq_file *s, u16 val)
826{
827 char *flags[OMAP_MUX_MAX_NR_FLAGS];
828 char mode[14];
829 int i = -1;
830
831 sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
832 i++;
833 flags[i] = mode;
834
835 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_OFF_WAKEUPENABLE);
836 if (val & OMAP_OFF_EN) {
837 if (!(val & OMAP_OFFOUT_EN)) {
838 if (!(val & OMAP_OFF_PULL_UP)) {
839 OMAP_MUX_TEST_FLAG(val,
840 OMAP_PIN_OFF_INPUT_PULLDOWN);
841 } else {
842 OMAP_MUX_TEST_FLAG(val,
843 OMAP_PIN_OFF_INPUT_PULLUP);
844 }
845 } else {
846 if (!(val & OMAP_OFFOUT_VAL)) {
847 OMAP_MUX_TEST_FLAG(val,
848 OMAP_PIN_OFF_OUTPUT_LOW);
849 } else {
850 OMAP_MUX_TEST_FLAG(val,
851 OMAP_PIN_OFF_OUTPUT_HIGH);
852 }
853 }
854 }
855
856 if (val & OMAP_INPUT_EN) {
857 if (val & OMAP_PULL_ENA) {
858 if (!(val & OMAP_PULL_UP)) {
859 OMAP_MUX_TEST_FLAG(val,
860 OMAP_PIN_INPUT_PULLDOWN);
861 } else {
862 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT_PULLUP);
863 }
864 } else {
865 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT);
866 }
867 } else {
868 i++;
869 flags[i] = "OMAP_PIN_OUTPUT";
870 }
871
872 do {
873 seq_printf(s, "%s", flags[i]);
874 if (i > 0)
875 seq_printf(s, " | ");
876 } while (i-- > 0);
877}
878
879#define OMAP_MUX_DEFNAME_LEN 16
880
881static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
882{
883 struct omap_mux_entry *e;
884
885 list_for_each_entry(e, &muxmodes, node) {
886 struct omap_mux *m = &e->mux;
887 char m0_def[OMAP_MUX_DEFNAME_LEN];
888 char *m0_name = m->muxnames[0];
889 u16 val;
890 int i, mode;
891
892 if (!m0_name)
893 continue;
894
895 for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
896 if (m0_name[i] == '\0') {
897 m0_def[i] = m0_name[i];
898 break;
899 }
900 m0_def[i] = toupper(m0_name[i]);
901 }
902 val = omap_mux_read(m->reg_offset);
903 mode = val & OMAP_MUX_MODE7;
904
905 seq_printf(s, "OMAP%i_MUX(%s, ",
906 cpu_is_omap34xx() ? 3 : 0, m0_def);
907 omap_mux_decode(s, val);
908 seq_printf(s, "),\n");
909 }
910
911 return 0;
912}
913
914static int omap_mux_dbg_board_open(struct inode *inode, struct file *file)
915{
916 return single_open(file, omap_mux_dbg_board_show, &inode->i_private);
917}
918
919static const struct file_operations omap_mux_dbg_board_fops = {
920 .open = omap_mux_dbg_board_open,
921 .read = seq_read,
922 .llseek = seq_lseek,
923 .release = single_release,
924};
925
926static int omap_mux_dbg_signal_show(struct seq_file *s, void *unused)
927{
928 struct omap_mux *m = s->private;
929 const char *none = "NA";
930 u16 val;
931 int mode;
932
933 val = omap_mux_read(m->reg_offset);
934 mode = val & OMAP_MUX_MODE7;
935
936 seq_printf(s, "name: %s.%s (0x%08lx/0x%03x = 0x%04x), b %s, t %s\n",
937 m->muxnames[0], m->muxnames[mode],
938 mux_phys + m->reg_offset, m->reg_offset, val,
939 m->balls[0] ? m->balls[0] : none,
940 m->balls[1] ? m->balls[1] : none);
941 seq_printf(s, "mode: ");
942 omap_mux_decode(s, val);
943 seq_printf(s, "\n");
944 seq_printf(s, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
945 m->muxnames[0] ? m->muxnames[0] : none,
946 m->muxnames[1] ? m->muxnames[1] : none,
947 m->muxnames[2] ? m->muxnames[2] : none,
948 m->muxnames[3] ? m->muxnames[3] : none,
949 m->muxnames[4] ? m->muxnames[4] : none,
950 m->muxnames[5] ? m->muxnames[5] : none,
951 m->muxnames[6] ? m->muxnames[6] : none,
952 m->muxnames[7] ? m->muxnames[7] : none);
953
954 return 0;
955}
956
957#define OMAP_MUX_MAX_ARG_CHAR 7
958
959static ssize_t omap_mux_dbg_signal_write(struct file *file,
960 const char __user *user_buf,
961 size_t count, loff_t *ppos)
962{
963 char buf[OMAP_MUX_MAX_ARG_CHAR];
964 struct seq_file *seqf;
965 struct omap_mux *m;
966 unsigned long val;
967 int buf_size, ret;
968
969 if (count > OMAP_MUX_MAX_ARG_CHAR)
970 return -EINVAL;
971
972 memset(buf, 0, sizeof(buf));
973 buf_size = min(count, sizeof(buf) - 1);
974
975 if (copy_from_user(buf, user_buf, buf_size))
976 return -EFAULT;
977
978 ret = strict_strtoul(buf, 0x10, &val);
979 if (ret < 0)
980 return ret;
981
982 if (val > 0xffff)
983 return -EINVAL;
984
985 seqf = file->private_data;
986 m = seqf->private;
987
988 omap_mux_write((u16)val, m->reg_offset);
989 *ppos += count;
990
991 return count;
992}
993
994static int omap_mux_dbg_signal_open(struct inode *inode, struct file *file)
995{
996 return single_open(file, omap_mux_dbg_signal_show, inode->i_private);
997}
998
999static const struct file_operations omap_mux_dbg_signal_fops = {
1000 .open = omap_mux_dbg_signal_open,
1001 .read = seq_read,
1002 .write = omap_mux_dbg_signal_write,
1003 .llseek = seq_lseek,
1004 .release = single_release,
1005};
1006
1007static struct dentry *mux_dbg_dir;
1008
1009static void __init omap_mux_dbg_init(void)
1010{
1011 struct omap_mux_entry *e;
1012
1013 mux_dbg_dir = debugfs_create_dir("omap_mux", NULL);
1014 if (!mux_dbg_dir)
1015 return;
1016
1017 (void)debugfs_create_file("board", S_IRUGO, mux_dbg_dir,
1018 NULL, &omap_mux_dbg_board_fops);
1019
1020 list_for_each_entry(e, &muxmodes, node) {
1021 struct omap_mux *m = &e->mux;
1022
1023 (void)debugfs_create_file(m->muxnames[0], S_IWUGO, mux_dbg_dir,
1024 m, &omap_mux_dbg_signal_fops);
1025 }
1026}
1027
1028#else
1029static inline void omap_mux_dbg_init(void)
1030{
1031}
1032#endif /* CONFIG_DEBUG_FS */
1033
Tony Lindgren15ac7af2009-12-11 16:16:32 -08001034static void __init omap_mux_free_names(struct omap_mux *m)
1035{
1036 int i;
1037
1038 for (i = 0; i < OMAP_MUX_NR_MODES; i++)
1039 kfree(m->muxnames[i]);
1040
1041#ifdef CONFIG_DEBUG_FS
1042 for (i = 0; i < OMAP_MUX_NR_SIDES; i++)
1043 kfree(m->balls[i]);
Tony Lindgren1dbae812005-11-10 14:26:51 +00001044#endif
Tony Lindgren15ac7af2009-12-11 16:16:32 -08001045
1046}
1047
1048/* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
1049static int __init omap_mux_late_init(void)
1050{
1051 struct omap_mux_entry *e, *tmp;
1052
1053 list_for_each_entry_safe(e, tmp, &muxmodes, node) {
1054 struct omap_mux *m = &e->mux;
1055 u16 mode = omap_mux_read(m->reg_offset);
1056
1057 if (OMAP_MODE_GPIO(mode))
1058 continue;
1059
1060#ifndef CONFIG_DEBUG_FS
1061 mutex_lock(&muxmode_mutex);
1062 list_del(&e->node);
1063 mutex_unlock(&muxmode_mutex);
1064 omap_mux_free_names(m);
1065 kfree(m);
1066#endif
1067
1068 }
1069
Tony Lindgren4b715ef2009-12-11 16:16:32 -08001070 omap_mux_dbg_init();
1071
Tony Lindgren15ac7af2009-12-11 16:16:32 -08001072 return 0;
1073}
1074late_initcall(omap_mux_late_init);
1075
1076static void __init omap_mux_package_fixup(struct omap_mux *p,
1077 struct omap_mux *superset)
1078{
1079 while (p->reg_offset != OMAP_MUX_TERMINATOR) {
1080 struct omap_mux *s = superset;
1081 int found = 0;
1082
1083 while (s->reg_offset != OMAP_MUX_TERMINATOR) {
1084 if (s->reg_offset == p->reg_offset) {
1085 *s = *p;
1086 found++;
1087 break;
1088 }
1089 s++;
1090 }
1091 if (!found)
1092 printk(KERN_ERR "mux: Unknown entry offset 0x%x\n",
1093 p->reg_offset);
1094 p++;
1095 }
1096}
1097
1098#ifdef CONFIG_DEBUG_FS
1099
1100static void __init omap_mux_package_init_balls(struct omap_ball *b,
1101 struct omap_mux *superset)
1102{
1103 while (b->reg_offset != OMAP_MUX_TERMINATOR) {
1104 struct omap_mux *s = superset;
1105 int found = 0;
1106
1107 while (s->reg_offset != OMAP_MUX_TERMINATOR) {
1108 if (s->reg_offset == b->reg_offset) {
1109 s->balls[0] = b->balls[0];
1110 s->balls[1] = b->balls[1];
1111 found++;
1112 break;
1113 }
1114 s++;
1115 }
1116 if (!found)
1117 printk(KERN_ERR "mux: Unknown ball offset 0x%x\n",
1118 b->reg_offset);
1119 b++;
1120 }
1121}
1122
1123#else /* CONFIG_DEBUG_FS */
1124
1125static inline void omap_mux_package_init_balls(struct omap_ball *b,
1126 struct omap_mux *superset)
1127{
1128}
1129
1130#endif /* CONFIG_DEBUG_FS */
1131
1132static int __init omap_mux_setup(char *options)
1133{
1134 if (!options)
1135 return 0;
1136
1137 omap_mux_options = options;
1138
1139 return 1;
1140}
1141__setup("omap_mux=", omap_mux_setup);
1142
1143/*
1144 * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
1145 * cmdline options only override the bootloader values.
1146 * During development, please enable CONFIG_DEBUG_FS, and use the
1147 * signal specific entries under debugfs.
1148 */
1149static void __init omap_mux_set_cmdline_signals(void)
1150{
1151 char *options, *next_opt, *token;
1152
1153 if (!omap_mux_options)
1154 return;
1155
1156 options = kmalloc(strlen(omap_mux_options) + 1, GFP_KERNEL);
1157 if (!options)
1158 return;
1159
1160 strcpy(options, omap_mux_options);
1161 next_opt = options;
1162
1163 while ((token = strsep(&next_opt, ",")) != NULL) {
1164 char *keyval, *name;
1165 unsigned long val;
1166
1167 keyval = token;
1168 name = strsep(&keyval, "=");
1169 if (name) {
1170 int res;
1171
1172 res = strict_strtoul(keyval, 0x10, &val);
1173 if (res < 0)
1174 continue;
1175
1176 omap_mux_init_signal(name, (u16)val);
1177 }
1178 }
1179
1180 kfree(options);
1181}
1182
1183static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
1184{
1185 while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
1186 omap_mux_write(board_mux->value, board_mux->reg_offset);
1187 board_mux++;
1188 }
1189}
1190
1191static int __init omap_mux_copy_names(struct omap_mux *src,
1192 struct omap_mux *dst)
1193{
1194 int i;
1195
1196 for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
1197 if (src->muxnames[i]) {
1198 dst->muxnames[i] =
1199 kmalloc(strlen(src->muxnames[i]) + 1,
1200 GFP_KERNEL);
1201 if (!dst->muxnames[i])
1202 goto free;
1203 strcpy(dst->muxnames[i], src->muxnames[i]);
1204 }
1205 }
1206
1207#ifdef CONFIG_DEBUG_FS
1208 for (i = 0; i < OMAP_MUX_NR_SIDES; i++) {
1209 if (src->balls[i]) {
1210 dst->balls[i] =
1211 kmalloc(strlen(src->balls[i]) + 1,
1212 GFP_KERNEL);
1213 if (!dst->balls[i])
1214 goto free;
1215 strcpy(dst->balls[i], src->balls[i]);
1216 }
1217 }
1218#endif
1219
1220 return 0;
1221
1222free:
1223 omap_mux_free_names(dst);
1224 return -ENOMEM;
1225
1226}
1227
1228#endif /* CONFIG_OMAP_MUX */
1229
1230static u16 omap_mux_get_by_gpio(int gpio)
1231{
1232 struct omap_mux_entry *e;
1233 u16 offset = OMAP_MUX_TERMINATOR;
1234
1235 list_for_each_entry(e, &muxmodes, node) {
1236 struct omap_mux *m = &e->mux;
1237 if (m->gpio == gpio) {
1238 offset = m->reg_offset;
1239 break;
1240 }
1241 }
1242
1243 return offset;
1244}
1245
1246/* Needed for dynamic muxing of GPIO pins for off-idle */
1247u16 omap_mux_get_gpio(int gpio)
1248{
1249 u16 offset;
1250
1251 offset = omap_mux_get_by_gpio(gpio);
1252 if (offset == OMAP_MUX_TERMINATOR) {
1253 printk(KERN_ERR "mux: Could not get gpio%i\n", gpio);
1254 return offset;
1255 }
1256
1257 return omap_mux_read(offset);
1258}
1259
1260/* Needed for dynamic muxing of GPIO pins for off-idle */
1261void omap_mux_set_gpio(u16 val, int gpio)
1262{
1263 u16 offset;
1264
1265 offset = omap_mux_get_by_gpio(gpio);
1266 if (offset == OMAP_MUX_TERMINATOR) {
1267 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
1268 return;
1269 }
1270
1271 omap_mux_write(val, offset);
1272}
1273
1274static struct omap_mux * __init omap_mux_list_add(struct omap_mux *src)
1275{
1276 struct omap_mux_entry *entry;
1277 struct omap_mux *m;
1278
1279 entry = kzalloc(sizeof(struct omap_mux_entry), GFP_KERNEL);
1280 if (!entry)
1281 return NULL;
1282
1283 m = &entry->mux;
1284 memcpy(m, src, sizeof(struct omap_mux_entry));
1285
1286#ifdef CONFIG_OMAP_MUX
1287 if (omap_mux_copy_names(src, m)) {
1288 kfree(entry);
1289 return NULL;
1290 }
1291#endif
1292
1293 mutex_lock(&muxmode_mutex);
1294 list_add_tail(&entry->node, &muxmodes);
1295 mutex_unlock(&muxmode_mutex);
1296
1297 return m;
1298}
1299
1300/*
1301 * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
1302 * the GPIO to mux offset mapping that is needed for dynamic muxing
1303 * of GPIO pins for off-idle.
1304 */
1305static void __init omap_mux_init_list(struct omap_mux *superset)
1306{
1307 while (superset->reg_offset != OMAP_MUX_TERMINATOR) {
1308 struct omap_mux *entry;
1309
1310#ifndef CONFIG_OMAP_MUX
1311 /* Skip pins that are not muxed as GPIO by bootloader */
1312 if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) {
1313 superset++;
1314 continue;
1315 }
1316#endif
1317
1318 entry = omap_mux_list_add(superset);
1319 if (!entry) {
1320 printk(KERN_ERR "mux: Could not add entry\n");
1321 return;
1322 }
1323 superset++;
1324 }
1325}
1326
1327int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
1328 struct omap_mux *superset,
1329 struct omap_mux *package_subset,
1330 struct omap_board_mux *board_mux,
1331 struct omap_ball *package_balls)
1332{
1333 if (mux_base)
1334 return -EBUSY;
1335
Tony Lindgren4b715ef2009-12-11 16:16:32 -08001336 mux_phys = mux_pbase;
Tony Lindgren15ac7af2009-12-11 16:16:32 -08001337 mux_base = ioremap(mux_pbase, mux_size);
1338 if (!mux_base) {
1339 printk(KERN_ERR "mux: Could not ioremap\n");
1340 return -ENODEV;
1341 }
1342
1343#ifdef CONFIG_OMAP_MUX
1344 omap_mux_package_fixup(package_subset, superset);
1345 omap_mux_package_init_balls(package_balls, superset);
1346 omap_mux_set_cmdline_signals();
1347 omap_mux_set_board_signals(board_mux);
1348#endif
1349
1350 omap_mux_init_list(superset);
1351
1352 return 0;
1353}
1354
1355#endif /* CONFIG_ARCH_OMAP34XX */