mux.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051
  1. /*
  2. * linux/arch/arm/mach-omap2/mux.c
  3. *
  4. * OMAP2 and OMAP3 pin multiplexing configurations
  5. *
  6. * Copyright (C) 2004 - 2008 Texas Instruments Inc.
  7. * Copyright (C) 2003 - 2008 Nokia Corporation
  8. *
  9. * Written by Tony Lindgren
  10. *
  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. */
  26. #include <linux/module.h>
  27. #include <linux/init.h>
  28. #include <linux/io.h>
  29. #include <linux/slab.h>
  30. #include <linux/spinlock.h>
  31. #include <linux/list.h>
  32. #include <linux/ctype.h>
  33. #include <linux/debugfs.h>
  34. #include <linux/seq_file.h>
  35. #include <linux/uaccess.h>
  36. #include <asm/system.h>
  37. #include <plat/control.h>
  38. #include <plat/mux.h>
  39. #include "mux.h"
  40. #define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
  41. #define OMAP_MUX_BASE_SZ 0x5ca
  42. #define MUXABLE_GPIO_MODE3 BIT(0)
  43. struct omap_mux_entry {
  44. struct omap_mux mux;
  45. struct list_head node;
  46. };
  47. static unsigned long mux_phys;
  48. static void __iomem *mux_base;
  49. static u8 omap_mux_flags;
  50. u16 omap_mux_read(u16 reg)
  51. {
  52. if (cpu_is_omap24xx())
  53. return __raw_readb(mux_base + reg);
  54. else
  55. return __raw_readw(mux_base + reg);
  56. }
  57. void omap_mux_write(u16 val, u16 reg)
  58. {
  59. if (cpu_is_omap24xx())
  60. __raw_writeb(val, mux_base + reg);
  61. else
  62. __raw_writew(val, mux_base + reg);
  63. }
  64. void omap_mux_write_array(struct omap_board_mux *board_mux)
  65. {
  66. while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
  67. omap_mux_write(board_mux->value, board_mux->reg_offset);
  68. board_mux++;
  69. }
  70. }
  71. #if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_OMAP_MUX)
  72. static struct omap_mux_cfg arch_mux_cfg;
  73. /* NOTE: See mux.h for the enumeration */
  74. static struct pin_config __initdata_or_module omap24xx_pins[] = {
  75. /*
  76. * description mux mux pull pull debug
  77. * offset mode ena type
  78. */
  79. /* 24xx I2C */
  80. MUX_CFG_24XX("M19_24XX_I2C1_SCL", 0x111, 0, 0, 0, 1)
  81. MUX_CFG_24XX("L15_24XX_I2C1_SDA", 0x112, 0, 0, 0, 1)
  82. MUX_CFG_24XX("J15_24XX_I2C2_SCL", 0x113, 0, 0, 1, 1)
  83. MUX_CFG_24XX("H19_24XX_I2C2_SDA", 0x114, 0, 0, 0, 1)
  84. /* Menelaus interrupt */
  85. MUX_CFG_24XX("W19_24XX_SYS_NIRQ", 0x12c, 0, 1, 1, 1)
  86. /* 24xx clocks */
  87. MUX_CFG_24XX("W14_24XX_SYS_CLKOUT", 0x137, 0, 1, 1, 1)
  88. /* 24xx GPMC chipselects, wait pin monitoring */
  89. MUX_CFG_24XX("E2_GPMC_NCS2", 0x08e, 0, 1, 1, 1)
  90. MUX_CFG_24XX("L2_GPMC_NCS7", 0x093, 0, 1, 1, 1)
  91. MUX_CFG_24XX("L3_GPMC_WAIT0", 0x09a, 0, 1, 1, 1)
  92. MUX_CFG_24XX("N7_GPMC_WAIT1", 0x09b, 0, 1, 1, 1)
  93. MUX_CFG_24XX("M1_GPMC_WAIT2", 0x09c, 0, 1, 1, 1)
  94. MUX_CFG_24XX("P1_GPMC_WAIT3", 0x09d, 0, 1, 1, 1)
  95. /* 24xx McBSP */
  96. MUX_CFG_24XX("Y15_24XX_MCBSP2_CLKX", 0x124, 1, 1, 0, 1)
  97. MUX_CFG_24XX("R14_24XX_MCBSP2_FSX", 0x125, 1, 1, 0, 1)
  98. MUX_CFG_24XX("W15_24XX_MCBSP2_DR", 0x126, 1, 1, 0, 1)
  99. MUX_CFG_24XX("V15_24XX_MCBSP2_DX", 0x127, 1, 1, 0, 1)
  100. /* 24xx GPIO */
  101. MUX_CFG_24XX("M21_242X_GPIO11", 0x0c9, 3, 1, 1, 1)
  102. MUX_CFG_24XX("P21_242X_GPIO12", 0x0ca, 3, 0, 0, 1)
  103. MUX_CFG_24XX("AA10_242X_GPIO13", 0x0e5, 3, 0, 0, 1)
  104. MUX_CFG_24XX("AA6_242X_GPIO14", 0x0e6, 3, 0, 0, 1)
  105. MUX_CFG_24XX("AA4_242X_GPIO15", 0x0e7, 3, 0, 0, 1)
  106. MUX_CFG_24XX("Y11_242X_GPIO16", 0x0e8, 3, 0, 0, 1)
  107. MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1)
  108. MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1)
  109. MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1)
  110. MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1)
  111. MUX_CFG_24XX("N15_24XX_GPIO85", 0x103, 3, 0, 0, 1)
  112. MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1)
  113. MUX_CFG_24XX("P20_24XX_GPIO93", 0x10b, 3, 0, 0, 1)
  114. MUX_CFG_24XX("P18_24XX_GPIO95", 0x10d, 3, 0, 0, 1)
  115. MUX_CFG_24XX("M18_24XX_GPIO96", 0x10e, 3, 0, 0, 1)
  116. MUX_CFG_24XX("L14_24XX_GPIO97", 0x10f, 3, 0, 0, 1)
  117. MUX_CFG_24XX("J15_24XX_GPIO99", 0x113, 3, 1, 1, 1)
  118. MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1)
  119. MUX_CFG_24XX("P14_24XX_GPIO125", 0x140, 3, 1, 1, 1)
  120. /* 242x DBG GPIO */
  121. MUX_CFG_24XX("V4_242X_GPIO49", 0xd3, 3, 0, 0, 1)
  122. MUX_CFG_24XX("W2_242X_GPIO50", 0xd4, 3, 0, 0, 1)
  123. MUX_CFG_24XX("U4_242X_GPIO51", 0xd5, 3, 0, 0, 1)
  124. MUX_CFG_24XX("V3_242X_GPIO52", 0xd6, 3, 0, 0, 1)
  125. MUX_CFG_24XX("V2_242X_GPIO53", 0xd7, 3, 0, 0, 1)
  126. MUX_CFG_24XX("V6_242X_GPIO53", 0xcf, 3, 0, 0, 1)
  127. MUX_CFG_24XX("T4_242X_GPIO54", 0xd8, 3, 0, 0, 1)
  128. MUX_CFG_24XX("Y4_242X_GPIO54", 0xd0, 3, 0, 0, 1)
  129. MUX_CFG_24XX("T3_242X_GPIO55", 0xd9, 3, 0, 0, 1)
  130. MUX_CFG_24XX("U2_242X_GPIO56", 0xda, 3, 0, 0, 1)
  131. /* 24xx external DMA requests */
  132. MUX_CFG_24XX("AA10_242X_DMAREQ0", 0x0e5, 2, 0, 0, 1)
  133. MUX_CFG_24XX("AA6_242X_DMAREQ1", 0x0e6, 2, 0, 0, 1)
  134. MUX_CFG_24XX("E4_242X_DMAREQ2", 0x074, 2, 0, 0, 1)
  135. MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1)
  136. MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1)
  137. MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1)
  138. /* UART3 */
  139. MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1)
  140. MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1)
  141. /* MMC/SDIO */
  142. MUX_CFG_24XX("G19_24XX_MMC_CLKO", 0x0f3, 0, 0, 0, 1)
  143. MUX_CFG_24XX("H18_24XX_MMC_CMD", 0x0f4, 0, 0, 0, 1)
  144. MUX_CFG_24XX("F20_24XX_MMC_DAT0", 0x0f5, 0, 0, 0, 1)
  145. MUX_CFG_24XX("H14_24XX_MMC_DAT1", 0x0f6, 0, 0, 0, 1)
  146. MUX_CFG_24XX("E19_24XX_MMC_DAT2", 0x0f7, 0, 0, 0, 1)
  147. MUX_CFG_24XX("D19_24XX_MMC_DAT3", 0x0f8, 0, 0, 0, 1)
  148. MUX_CFG_24XX("F19_24XX_MMC_DAT_DIR0", 0x0f9, 0, 0, 0, 1)
  149. MUX_CFG_24XX("E20_24XX_MMC_DAT_DIR1", 0x0fa, 0, 0, 0, 1)
  150. MUX_CFG_24XX("F18_24XX_MMC_DAT_DIR2", 0x0fb, 0, 0, 0, 1)
  151. MUX_CFG_24XX("E18_24XX_MMC_DAT_DIR3", 0x0fc, 0, 0, 0, 1)
  152. MUX_CFG_24XX("G18_24XX_MMC_CMD_DIR", 0x0fd, 0, 0, 0, 1)
  153. MUX_CFG_24XX("H15_24XX_MMC_CLKI", 0x0fe, 0, 0, 0, 1)
  154. /* Full speed USB */
  155. MUX_CFG_24XX("J20_24XX_USB0_PUEN", 0x11d, 0, 0, 0, 1)
  156. MUX_CFG_24XX("J19_24XX_USB0_VP", 0x11e, 0, 0, 0, 1)
  157. MUX_CFG_24XX("K20_24XX_USB0_VM", 0x11f, 0, 0, 0, 1)
  158. MUX_CFG_24XX("J18_24XX_USB0_RCV", 0x120, 0, 0, 0, 1)
  159. MUX_CFG_24XX("K19_24XX_USB0_TXEN", 0x121, 0, 0, 0, 1)
  160. MUX_CFG_24XX("J14_24XX_USB0_SE0", 0x122, 0, 0, 0, 1)
  161. MUX_CFG_24XX("K18_24XX_USB0_DAT", 0x123, 0, 0, 0, 1)
  162. MUX_CFG_24XX("N14_24XX_USB1_SE0", 0x0ed, 2, 0, 0, 1)
  163. MUX_CFG_24XX("W12_24XX_USB1_SE0", 0x0dd, 3, 0, 0, 1)
  164. MUX_CFG_24XX("P15_24XX_USB1_DAT", 0x0ee, 2, 0, 0, 1)
  165. MUX_CFG_24XX("R13_24XX_USB1_DAT", 0x0e0, 3, 0, 0, 1)
  166. MUX_CFG_24XX("W20_24XX_USB1_TXEN", 0x0ec, 2, 0, 0, 1)
  167. MUX_CFG_24XX("P13_24XX_USB1_TXEN", 0x0df, 3, 0, 0, 1)
  168. MUX_CFG_24XX("V19_24XX_USB1_RCV", 0x0eb, 2, 0, 0, 1)
  169. MUX_CFG_24XX("V12_24XX_USB1_RCV", 0x0de, 3, 0, 0, 1)
  170. MUX_CFG_24XX("AA10_24XX_USB2_SE0", 0x0e5, 2, 0, 0, 1)
  171. MUX_CFG_24XX("Y11_24XX_USB2_DAT", 0x0e8, 2, 0, 0, 1)
  172. MUX_CFG_24XX("AA12_24XX_USB2_TXEN", 0x0e9, 2, 0, 0, 1)
  173. MUX_CFG_24XX("AA6_24XX_USB2_RCV", 0x0e6, 2, 0, 0, 1)
  174. MUX_CFG_24XX("AA4_24XX_USB2_TLLSE0", 0x0e7, 2, 0, 0, 1)
  175. /* Keypad GPIO*/
  176. MUX_CFG_24XX("T19_24XX_KBR0", 0x106, 3, 1, 1, 1)
  177. MUX_CFG_24XX("R19_24XX_KBR1", 0x107, 3, 1, 1, 1)
  178. MUX_CFG_24XX("V18_24XX_KBR2", 0x139, 3, 1, 1, 1)
  179. MUX_CFG_24XX("M21_24XX_KBR3", 0xc9, 3, 1, 1, 1)
  180. MUX_CFG_24XX("E5__24XX_KBR4", 0x138, 3, 1, 1, 1)
  181. MUX_CFG_24XX("M18_24XX_KBR5", 0x10e, 3, 1, 1, 1)
  182. MUX_CFG_24XX("R20_24XX_KBC0", 0x108, 3, 0, 0, 1)
  183. MUX_CFG_24XX("M14_24XX_KBC1", 0x109, 3, 0, 0, 1)
  184. MUX_CFG_24XX("H19_24XX_KBC2", 0x114, 3, 0, 0, 1)
  185. MUX_CFG_24XX("V17_24XX_KBC3", 0x135, 3, 0, 0, 1)
  186. MUX_CFG_24XX("P21_24XX_KBC4", 0xca, 3, 0, 0, 1)
  187. MUX_CFG_24XX("L14_24XX_KBC5", 0x10f, 3, 0, 0, 1)
  188. MUX_CFG_24XX("N19_24XX_KBC6", 0x110, 3, 0, 0, 1)
  189. /* 24xx Menelaus Keypad GPIO */
  190. MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1)
  191. MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1)
  192. MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1)
  193. /* 2430 USB */
  194. MUX_CFG_24XX("AD9_2430_USB0_PUEN", 0x133, 4, 0, 0, 1)
  195. MUX_CFG_24XX("Y11_2430_USB0_VP", 0x134, 4, 0, 0, 1)
  196. MUX_CFG_24XX("AD7_2430_USB0_VM", 0x135, 4, 0, 0, 1)
  197. MUX_CFG_24XX("AE7_2430_USB0_RCV", 0x136, 4, 0, 0, 1)
  198. MUX_CFG_24XX("AD4_2430_USB0_TXEN", 0x137, 4, 0, 0, 1)
  199. MUX_CFG_24XX("AF9_2430_USB0_SE0", 0x138, 4, 0, 0, 1)
  200. MUX_CFG_24XX("AE6_2430_USB0_DAT", 0x139, 4, 0, 0, 1)
  201. MUX_CFG_24XX("AD24_2430_USB1_SE0", 0x107, 2, 0, 0, 1)
  202. MUX_CFG_24XX("AB24_2430_USB1_RCV", 0x108, 2, 0, 0, 1)
  203. MUX_CFG_24XX("Y25_2430_USB1_TXEN", 0x109, 2, 0, 0, 1)
  204. MUX_CFG_24XX("AA26_2430_USB1_DAT", 0x10A, 2, 0, 0, 1)
  205. /* 2430 HS-USB */
  206. MUX_CFG_24XX("AD9_2430_USB0HS_DATA3", 0x133, 0, 0, 0, 1)
  207. MUX_CFG_24XX("Y11_2430_USB0HS_DATA4", 0x134, 0, 0, 0, 1)
  208. MUX_CFG_24XX("AD7_2430_USB0HS_DATA5", 0x135, 0, 0, 0, 1)
  209. MUX_CFG_24XX("AE7_2430_USB0HS_DATA6", 0x136, 0, 0, 0, 1)
  210. MUX_CFG_24XX("AD4_2430_USB0HS_DATA2", 0x137, 0, 0, 0, 1)
  211. MUX_CFG_24XX("AF9_2430_USB0HS_DATA0", 0x138, 0, 0, 0, 1)
  212. MUX_CFG_24XX("AE6_2430_USB0HS_DATA1", 0x139, 0, 0, 0, 1)
  213. MUX_CFG_24XX("AE8_2430_USB0HS_CLK", 0x13A, 0, 0, 0, 1)
  214. MUX_CFG_24XX("AD8_2430_USB0HS_DIR", 0x13B, 0, 0, 0, 1)
  215. MUX_CFG_24XX("AE5_2430_USB0HS_STP", 0x13c, 0, 1, 1, 1)
  216. MUX_CFG_24XX("AE9_2430_USB0HS_NXT", 0x13D, 0, 0, 0, 1)
  217. MUX_CFG_24XX("AC7_2430_USB0HS_DATA7", 0x13E, 0, 0, 0, 1)
  218. /* 2430 McBSP */
  219. MUX_CFG_24XX("AD6_2430_MCBSP_CLKS", 0x011E, 0, 0, 0, 1)
  220. MUX_CFG_24XX("AB2_2430_MCBSP1_CLKR", 0x011A, 0, 0, 0, 1)
  221. MUX_CFG_24XX("AD5_2430_MCBSP1_FSR", 0x011B, 0, 0, 0, 1)
  222. MUX_CFG_24XX("AA1_2430_MCBSP1_DX", 0x011C, 0, 0, 0, 1)
  223. MUX_CFG_24XX("AF3_2430_MCBSP1_DR", 0x011D, 0, 0, 0, 1)
  224. MUX_CFG_24XX("AB3_2430_MCBSP1_FSX", 0x011F, 0, 0, 0, 1)
  225. MUX_CFG_24XX("Y9_2430_MCBSP1_CLKX", 0x0120, 0, 0, 0, 1)
  226. MUX_CFG_24XX("AC10_2430_MCBSP2_FSX", 0x012E, 1, 0, 0, 1)
  227. MUX_CFG_24XX("AD16_2430_MCBSP2_CLX", 0x012F, 1, 0, 0, 1)
  228. MUX_CFG_24XX("AE13_2430_MCBSP2_DX", 0x0130, 1, 0, 0, 1)
  229. MUX_CFG_24XX("AD13_2430_MCBSP2_DR", 0x0131, 1, 0, 0, 1)
  230. MUX_CFG_24XX("AC10_2430_MCBSP2_FSX_OFF",0x012E, 0, 0, 0, 1)
  231. MUX_CFG_24XX("AD16_2430_MCBSP2_CLX_OFF",0x012F, 0, 0, 0, 1)
  232. MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1)
  233. MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1)
  234. MUX_CFG_24XX("AC9_2430_MCBSP3_CLKX", 0x0103, 0, 0, 0, 1)
  235. MUX_CFG_24XX("AE4_2430_MCBSP3_FSX", 0x0104, 0, 0, 0, 1)
  236. MUX_CFG_24XX("AE2_2430_MCBSP3_DR", 0x0105, 0, 0, 0, 1)
  237. MUX_CFG_24XX("AF4_2430_MCBSP3_DX", 0x0106, 0, 0, 0, 1)
  238. MUX_CFG_24XX("N3_2430_MCBSP4_CLKX", 0x010B, 1, 0, 0, 1)
  239. MUX_CFG_24XX("AD23_2430_MCBSP4_DR", 0x010C, 1, 0, 0, 1)
  240. MUX_CFG_24XX("AB25_2430_MCBSP4_DX", 0x010D, 1, 0, 0, 1)
  241. MUX_CFG_24XX("AC25_2430_MCBSP4_FSX", 0x010E, 1, 0, 0, 1)
  242. MUX_CFG_24XX("AE16_2430_MCBSP5_CLKX", 0x00ED, 1, 0, 0, 1)
  243. MUX_CFG_24XX("AF12_2430_MCBSP5_FSX", 0x00ED, 1, 0, 0, 1)
  244. MUX_CFG_24XX("K7_2430_MCBSP5_DX", 0x00EF, 1, 0, 0, 1)
  245. MUX_CFG_24XX("M1_2430_MCBSP5_DR", 0x00F0, 1, 0, 0, 1)
  246. /* 2430 MCSPI1 */
  247. MUX_CFG_24XX("Y18_2430_MCSPI1_CLK", 0x010F, 0, 0, 0, 1)
  248. MUX_CFG_24XX("AD15_2430_MCSPI1_SIMO", 0x0110, 0, 0, 0, 1)
  249. MUX_CFG_24XX("AE17_2430_MCSPI1_SOMI", 0x0111, 0, 0, 0, 1)
  250. MUX_CFG_24XX("U1_2430_MCSPI1_CS0", 0x0112, 0, 0, 0, 1)
  251. /* Touchscreen GPIO */
  252. MUX_CFG_24XX("AF19_2430_GPIO_85", 0x0113, 3, 0, 0, 1)
  253. };
  254. #define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
  255. #if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
  256. static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 reg)
  257. {
  258. u16 orig;
  259. u8 warn = 0, debug = 0;
  260. orig = omap_mux_read(cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
  261. #ifdef CONFIG_OMAP_MUX_DEBUG
  262. debug = cfg->debug;
  263. #endif
  264. warn = (orig != reg);
  265. if (debug || warn)
  266. printk(KERN_WARNING
  267. "MUX: setup %s (0x%p): 0x%04x -> 0x%04x\n",
  268. cfg->name, omap_ctrl_base_get() + cfg->mux_reg,
  269. orig, reg);
  270. }
  271. #else
  272. #define omap2_cfg_debug(x, y) do {} while (0)
  273. #endif
  274. static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
  275. {
  276. static DEFINE_SPINLOCK(mux_spin_lock);
  277. unsigned long flags;
  278. u8 reg = 0;
  279. spin_lock_irqsave(&mux_spin_lock, flags);
  280. reg |= cfg->mask & 0x7;
  281. if (cfg->pull_val)
  282. reg |= OMAP2_PULL_ENA;
  283. if (cfg->pu_pd_val)
  284. reg |= OMAP2_PULL_UP;
  285. omap2_cfg_debug(cfg, reg);
  286. omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
  287. spin_unlock_irqrestore(&mux_spin_lock, flags);
  288. return 0;
  289. }
  290. int __init omap2_mux_init(void)
  291. {
  292. u32 mux_pbase;
  293. if (cpu_is_omap2420())
  294. mux_pbase = OMAP2420_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
  295. else if (cpu_is_omap2430())
  296. mux_pbase = OMAP243X_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
  297. else
  298. return -ENODEV;
  299. mux_base = ioremap(mux_pbase, OMAP_MUX_BASE_SZ);
  300. if (!mux_base) {
  301. printk(KERN_ERR "mux: Could not ioremap\n");
  302. return -ENODEV;
  303. }
  304. if (cpu_is_omap24xx()) {
  305. arch_mux_cfg.pins = omap24xx_pins;
  306. arch_mux_cfg.size = OMAP24XX_PINS_SZ;
  307. arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
  308. return omap_mux_register(&arch_mux_cfg);
  309. }
  310. return 0;
  311. }
  312. #else
  313. int __init omap2_mux_init(void)
  314. {
  315. return 0;
  316. }
  317. #endif /* CONFIG_OMAP_MUX */
  318. /*----------------------------------------------------------------------------*/
  319. #ifdef CONFIG_ARCH_OMAP2PLUS
  320. static LIST_HEAD(muxmodes);
  321. static DEFINE_MUTEX(muxmode_mutex);
  322. #ifdef CONFIG_OMAP_MUX
  323. static char *omap_mux_options;
  324. int __init omap_mux_init_gpio(int gpio, int val)
  325. {
  326. struct omap_mux_entry *e;
  327. int found = 0;
  328. if (!gpio)
  329. return -EINVAL;
  330. list_for_each_entry(e, &muxmodes, node) {
  331. struct omap_mux *m = &e->mux;
  332. if (gpio == m->gpio) {
  333. u16 old_mode;
  334. u16 mux_mode;
  335. old_mode = omap_mux_read(m->reg_offset);
  336. mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
  337. if (omap_mux_flags & MUXABLE_GPIO_MODE3)
  338. mux_mode |= OMAP_MUX_MODE3;
  339. else
  340. mux_mode |= OMAP_MUX_MODE4;
  341. printk(KERN_DEBUG "mux: Setting signal "
  342. "%s.gpio%i 0x%04x -> 0x%04x\n",
  343. m->muxnames[0], gpio, old_mode, mux_mode);
  344. omap_mux_write(mux_mode, m->reg_offset);
  345. found++;
  346. }
  347. }
  348. if (found == 1)
  349. return 0;
  350. if (found > 1) {
  351. printk(KERN_ERR "mux: Multiple gpio paths for gpio%i\n", gpio);
  352. return -EINVAL;
  353. }
  354. printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
  355. return -ENODEV;
  356. }
  357. int __init omap_mux_init_signal(char *muxname, int val)
  358. {
  359. struct omap_mux_entry *e;
  360. char *m0_name = NULL, *mode_name = NULL;
  361. int found = 0;
  362. mode_name = strchr(muxname, '.');
  363. if (mode_name) {
  364. *mode_name = '\0';
  365. mode_name++;
  366. m0_name = muxname;
  367. } else {
  368. mode_name = muxname;
  369. }
  370. list_for_each_entry(e, &muxmodes, node) {
  371. struct omap_mux *m = &e->mux;
  372. char *m0_entry = m->muxnames[0];
  373. int i;
  374. if (m0_name && strcmp(m0_name, m0_entry))
  375. continue;
  376. for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
  377. char *mode_cur = m->muxnames[i];
  378. if (!mode_cur)
  379. continue;
  380. if (!strcmp(mode_name, mode_cur)) {
  381. u16 old_mode;
  382. u16 mux_mode;
  383. old_mode = omap_mux_read(m->reg_offset);
  384. mux_mode = val | i;
  385. printk(KERN_DEBUG "mux: Setting signal "
  386. "%s.%s 0x%04x -> 0x%04x\n",
  387. m0_entry, muxname, old_mode, mux_mode);
  388. omap_mux_write(mux_mode, m->reg_offset);
  389. found++;
  390. }
  391. }
  392. }
  393. if (found == 1)
  394. return 0;
  395. if (found > 1) {
  396. printk(KERN_ERR "mux: Multiple signal paths (%i) for %s\n",
  397. found, muxname);
  398. return -EINVAL;
  399. }
  400. printk(KERN_ERR "mux: Could not set signal %s\n", muxname);
  401. return -ENODEV;
  402. }
  403. #ifdef CONFIG_DEBUG_FS
  404. #define OMAP_MUX_MAX_NR_FLAGS 10
  405. #define OMAP_MUX_TEST_FLAG(val, mask) \
  406. if (((val) & (mask)) == (mask)) { \
  407. i++; \
  408. flags[i] = #mask; \
  409. }
  410. /* REVISIT: Add checking for non-optimal mux settings */
  411. static inline void omap_mux_decode(struct seq_file *s, u16 val)
  412. {
  413. char *flags[OMAP_MUX_MAX_NR_FLAGS];
  414. char mode[sizeof("OMAP_MUX_MODE") + 1];
  415. int i = -1;
  416. sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
  417. i++;
  418. flags[i] = mode;
  419. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_OFF_WAKEUPENABLE);
  420. if (val & OMAP_OFF_EN) {
  421. if (!(val & OMAP_OFFOUT_EN)) {
  422. if (!(val & OMAP_OFF_PULL_UP)) {
  423. OMAP_MUX_TEST_FLAG(val,
  424. OMAP_PIN_OFF_INPUT_PULLDOWN);
  425. } else {
  426. OMAP_MUX_TEST_FLAG(val,
  427. OMAP_PIN_OFF_INPUT_PULLUP);
  428. }
  429. } else {
  430. if (!(val & OMAP_OFFOUT_VAL)) {
  431. OMAP_MUX_TEST_FLAG(val,
  432. OMAP_PIN_OFF_OUTPUT_LOW);
  433. } else {
  434. OMAP_MUX_TEST_FLAG(val,
  435. OMAP_PIN_OFF_OUTPUT_HIGH);
  436. }
  437. }
  438. }
  439. if (val & OMAP_INPUT_EN) {
  440. if (val & OMAP_PULL_ENA) {
  441. if (!(val & OMAP_PULL_UP)) {
  442. OMAP_MUX_TEST_FLAG(val,
  443. OMAP_PIN_INPUT_PULLDOWN);
  444. } else {
  445. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT_PULLUP);
  446. }
  447. } else {
  448. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT);
  449. }
  450. } else {
  451. i++;
  452. flags[i] = "OMAP_PIN_OUTPUT";
  453. }
  454. do {
  455. seq_printf(s, "%s", flags[i]);
  456. if (i > 0)
  457. seq_printf(s, " | ");
  458. } while (i-- > 0);
  459. }
  460. #define OMAP_MUX_DEFNAME_LEN 16
  461. static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
  462. {
  463. struct omap_mux_entry *e;
  464. list_for_each_entry(e, &muxmodes, node) {
  465. struct omap_mux *m = &e->mux;
  466. char m0_def[OMAP_MUX_DEFNAME_LEN];
  467. char *m0_name = m->muxnames[0];
  468. u16 val;
  469. int i, mode;
  470. if (!m0_name)
  471. continue;
  472. /* REVISIT: Needs to be updated if mode0 names get longer */
  473. for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
  474. if (m0_name[i] == '\0') {
  475. m0_def[i] = m0_name[i];
  476. break;
  477. }
  478. m0_def[i] = toupper(m0_name[i]);
  479. }
  480. val = omap_mux_read(m->reg_offset);
  481. mode = val & OMAP_MUX_MODE7;
  482. seq_printf(s, "OMAP%i_MUX(%s, ",
  483. cpu_is_omap34xx() ? 3 : 0, m0_def);
  484. omap_mux_decode(s, val);
  485. seq_printf(s, "),\n");
  486. }
  487. return 0;
  488. }
  489. static int omap_mux_dbg_board_open(struct inode *inode, struct file *file)
  490. {
  491. return single_open(file, omap_mux_dbg_board_show, &inode->i_private);
  492. }
  493. static const struct file_operations omap_mux_dbg_board_fops = {
  494. .open = omap_mux_dbg_board_open,
  495. .read = seq_read,
  496. .llseek = seq_lseek,
  497. .release = single_release,
  498. };
  499. static int omap_mux_dbg_signal_show(struct seq_file *s, void *unused)
  500. {
  501. struct omap_mux *m = s->private;
  502. const char *none = "NA";
  503. u16 val;
  504. int mode;
  505. val = omap_mux_read(m->reg_offset);
  506. mode = val & OMAP_MUX_MODE7;
  507. seq_printf(s, "name: %s.%s (0x%08lx/0x%03x = 0x%04x), b %s, t %s\n",
  508. m->muxnames[0], m->muxnames[mode],
  509. mux_phys + m->reg_offset, m->reg_offset, val,
  510. m->balls[0] ? m->balls[0] : none,
  511. m->balls[1] ? m->balls[1] : none);
  512. seq_printf(s, "mode: ");
  513. omap_mux_decode(s, val);
  514. seq_printf(s, "\n");
  515. seq_printf(s, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
  516. m->muxnames[0] ? m->muxnames[0] : none,
  517. m->muxnames[1] ? m->muxnames[1] : none,
  518. m->muxnames[2] ? m->muxnames[2] : none,
  519. m->muxnames[3] ? m->muxnames[3] : none,
  520. m->muxnames[4] ? m->muxnames[4] : none,
  521. m->muxnames[5] ? m->muxnames[5] : none,
  522. m->muxnames[6] ? m->muxnames[6] : none,
  523. m->muxnames[7] ? m->muxnames[7] : none);
  524. return 0;
  525. }
  526. #define OMAP_MUX_MAX_ARG_CHAR 7
  527. static ssize_t omap_mux_dbg_signal_write(struct file *file,
  528. const char __user *user_buf,
  529. size_t count, loff_t *ppos)
  530. {
  531. char buf[OMAP_MUX_MAX_ARG_CHAR];
  532. struct seq_file *seqf;
  533. struct omap_mux *m;
  534. unsigned long val;
  535. int buf_size, ret;
  536. if (count > OMAP_MUX_MAX_ARG_CHAR)
  537. return -EINVAL;
  538. memset(buf, 0, sizeof(buf));
  539. buf_size = min(count, sizeof(buf) - 1);
  540. if (copy_from_user(buf, user_buf, buf_size))
  541. return -EFAULT;
  542. ret = strict_strtoul(buf, 0x10, &val);
  543. if (ret < 0)
  544. return ret;
  545. if (val > 0xffff)
  546. return -EINVAL;
  547. seqf = file->private_data;
  548. m = seqf->private;
  549. omap_mux_write((u16)val, m->reg_offset);
  550. *ppos += count;
  551. return count;
  552. }
  553. static int omap_mux_dbg_signal_open(struct inode *inode, struct file *file)
  554. {
  555. return single_open(file, omap_mux_dbg_signal_show, inode->i_private);
  556. }
  557. static const struct file_operations omap_mux_dbg_signal_fops = {
  558. .open = omap_mux_dbg_signal_open,
  559. .read = seq_read,
  560. .write = omap_mux_dbg_signal_write,
  561. .llseek = seq_lseek,
  562. .release = single_release,
  563. };
  564. static struct dentry *mux_dbg_dir;
  565. static void __init omap_mux_dbg_init(void)
  566. {
  567. struct omap_mux_entry *e;
  568. mux_dbg_dir = debugfs_create_dir("omap_mux", NULL);
  569. if (!mux_dbg_dir)
  570. return;
  571. (void)debugfs_create_file("board", S_IRUGO, mux_dbg_dir,
  572. NULL, &omap_mux_dbg_board_fops);
  573. list_for_each_entry(e, &muxmodes, node) {
  574. struct omap_mux *m = &e->mux;
  575. (void)debugfs_create_file(m->muxnames[0], S_IWUGO, mux_dbg_dir,
  576. m, &omap_mux_dbg_signal_fops);
  577. }
  578. }
  579. #else
  580. static inline void omap_mux_dbg_init(void)
  581. {
  582. }
  583. #endif /* CONFIG_DEBUG_FS */
  584. static void __init omap_mux_free_names(struct omap_mux *m)
  585. {
  586. int i;
  587. for (i = 0; i < OMAP_MUX_NR_MODES; i++)
  588. kfree(m->muxnames[i]);
  589. #ifdef CONFIG_DEBUG_FS
  590. for (i = 0; i < OMAP_MUX_NR_SIDES; i++)
  591. kfree(m->balls[i]);
  592. #endif
  593. }
  594. /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
  595. static int __init omap_mux_late_init(void)
  596. {
  597. struct omap_mux_entry *e, *tmp;
  598. list_for_each_entry_safe(e, tmp, &muxmodes, node) {
  599. struct omap_mux *m = &e->mux;
  600. u16 mode = omap_mux_read(m->reg_offset);
  601. if (OMAP_MODE_GPIO(mode))
  602. continue;
  603. #ifndef CONFIG_DEBUG_FS
  604. mutex_lock(&muxmode_mutex);
  605. list_del(&e->node);
  606. mutex_unlock(&muxmode_mutex);
  607. omap_mux_free_names(m);
  608. kfree(m);
  609. #endif
  610. }
  611. omap_mux_dbg_init();
  612. return 0;
  613. }
  614. late_initcall(omap_mux_late_init);
  615. static void __init omap_mux_package_fixup(struct omap_mux *p,
  616. struct omap_mux *superset)
  617. {
  618. while (p->reg_offset != OMAP_MUX_TERMINATOR) {
  619. struct omap_mux *s = superset;
  620. int found = 0;
  621. while (s->reg_offset != OMAP_MUX_TERMINATOR) {
  622. if (s->reg_offset == p->reg_offset) {
  623. *s = *p;
  624. found++;
  625. break;
  626. }
  627. s++;
  628. }
  629. if (!found)
  630. printk(KERN_ERR "mux: Unknown entry offset 0x%x\n",
  631. p->reg_offset);
  632. p++;
  633. }
  634. }
  635. #ifdef CONFIG_DEBUG_FS
  636. static void __init omap_mux_package_init_balls(struct omap_ball *b,
  637. struct omap_mux *superset)
  638. {
  639. while (b->reg_offset != OMAP_MUX_TERMINATOR) {
  640. struct omap_mux *s = superset;
  641. int found = 0;
  642. while (s->reg_offset != OMAP_MUX_TERMINATOR) {
  643. if (s->reg_offset == b->reg_offset) {
  644. s->balls[0] = b->balls[0];
  645. s->balls[1] = b->balls[1];
  646. found++;
  647. break;
  648. }
  649. s++;
  650. }
  651. if (!found)
  652. printk(KERN_ERR "mux: Unknown ball offset 0x%x\n",
  653. b->reg_offset);
  654. b++;
  655. }
  656. }
  657. #else /* CONFIG_DEBUG_FS */
  658. static inline void omap_mux_package_init_balls(struct omap_ball *b,
  659. struct omap_mux *superset)
  660. {
  661. }
  662. #endif /* CONFIG_DEBUG_FS */
  663. static int __init omap_mux_setup(char *options)
  664. {
  665. if (!options)
  666. return 0;
  667. omap_mux_options = options;
  668. return 1;
  669. }
  670. __setup("omap_mux=", omap_mux_setup);
  671. /*
  672. * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
  673. * cmdline options only override the bootloader values.
  674. * During development, please enable CONFIG_DEBUG_FS, and use the
  675. * signal specific entries under debugfs.
  676. */
  677. static void __init omap_mux_set_cmdline_signals(void)
  678. {
  679. char *options, *next_opt, *token;
  680. if (!omap_mux_options)
  681. return;
  682. options = kmalloc(strlen(omap_mux_options) + 1, GFP_KERNEL);
  683. if (!options)
  684. return;
  685. strcpy(options, omap_mux_options);
  686. next_opt = options;
  687. while ((token = strsep(&next_opt, ",")) != NULL) {
  688. char *keyval, *name;
  689. unsigned long val;
  690. keyval = token;
  691. name = strsep(&keyval, "=");
  692. if (name) {
  693. int res;
  694. res = strict_strtoul(keyval, 0x10, &val);
  695. if (res < 0)
  696. continue;
  697. omap_mux_init_signal(name, (u16)val);
  698. }
  699. }
  700. kfree(options);
  701. }
  702. static int __init omap_mux_copy_names(struct omap_mux *src,
  703. struct omap_mux *dst)
  704. {
  705. int i;
  706. for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
  707. if (src->muxnames[i]) {
  708. dst->muxnames[i] =
  709. kmalloc(strlen(src->muxnames[i]) + 1,
  710. GFP_KERNEL);
  711. if (!dst->muxnames[i])
  712. goto free;
  713. strcpy(dst->muxnames[i], src->muxnames[i]);
  714. }
  715. }
  716. #ifdef CONFIG_DEBUG_FS
  717. for (i = 0; i < OMAP_MUX_NR_SIDES; i++) {
  718. if (src->balls[i]) {
  719. dst->balls[i] =
  720. kmalloc(strlen(src->balls[i]) + 1,
  721. GFP_KERNEL);
  722. if (!dst->balls[i])
  723. goto free;
  724. strcpy(dst->balls[i], src->balls[i]);
  725. }
  726. }
  727. #endif
  728. return 0;
  729. free:
  730. omap_mux_free_names(dst);
  731. return -ENOMEM;
  732. }
  733. #endif /* CONFIG_OMAP_MUX */
  734. static u16 omap_mux_get_by_gpio(int gpio)
  735. {
  736. struct omap_mux_entry *e;
  737. u16 offset = OMAP_MUX_TERMINATOR;
  738. list_for_each_entry(e, &muxmodes, node) {
  739. struct omap_mux *m = &e->mux;
  740. if (m->gpio == gpio) {
  741. offset = m->reg_offset;
  742. break;
  743. }
  744. }
  745. return offset;
  746. }
  747. /* Needed for dynamic muxing of GPIO pins for off-idle */
  748. u16 omap_mux_get_gpio(int gpio)
  749. {
  750. u16 offset;
  751. offset = omap_mux_get_by_gpio(gpio);
  752. if (offset == OMAP_MUX_TERMINATOR) {
  753. printk(KERN_ERR "mux: Could not get gpio%i\n", gpio);
  754. return offset;
  755. }
  756. return omap_mux_read(offset);
  757. }
  758. /* Needed for dynamic muxing of GPIO pins for off-idle */
  759. void omap_mux_set_gpio(u16 val, int gpio)
  760. {
  761. u16 offset;
  762. offset = omap_mux_get_by_gpio(gpio);
  763. if (offset == OMAP_MUX_TERMINATOR) {
  764. printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
  765. return;
  766. }
  767. omap_mux_write(val, offset);
  768. }
  769. static struct omap_mux * __init omap_mux_list_add(struct omap_mux *src)
  770. {
  771. struct omap_mux_entry *entry;
  772. struct omap_mux *m;
  773. entry = kzalloc(sizeof(struct omap_mux_entry), GFP_KERNEL);
  774. if (!entry)
  775. return NULL;
  776. m = &entry->mux;
  777. memcpy(m, src, sizeof(struct omap_mux_entry));
  778. #ifdef CONFIG_OMAP_MUX
  779. if (omap_mux_copy_names(src, m)) {
  780. kfree(entry);
  781. return NULL;
  782. }
  783. #endif
  784. mutex_lock(&muxmode_mutex);
  785. list_add_tail(&entry->node, &muxmodes);
  786. mutex_unlock(&muxmode_mutex);
  787. return m;
  788. }
  789. /*
  790. * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
  791. * the GPIO to mux offset mapping that is needed for dynamic muxing
  792. * of GPIO pins for off-idle.
  793. */
  794. static void __init omap_mux_init_list(struct omap_mux *superset)
  795. {
  796. while (superset->reg_offset != OMAP_MUX_TERMINATOR) {
  797. struct omap_mux *entry;
  798. #ifdef CONFIG_OMAP_MUX
  799. if (!superset->muxnames || !superset->muxnames[0]) {
  800. superset++;
  801. continue;
  802. }
  803. #else
  804. /* Skip pins that are not muxed as GPIO by bootloader */
  805. if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) {
  806. superset++;
  807. continue;
  808. }
  809. #endif
  810. entry = omap_mux_list_add(superset);
  811. if (!entry) {
  812. printk(KERN_ERR "mux: Could not add entry\n");
  813. return;
  814. }
  815. superset++;
  816. }
  817. }
  818. #ifdef CONFIG_OMAP_MUX
  819. static void omap_mux_init_package(struct omap_mux *superset,
  820. struct omap_mux *package_subset,
  821. struct omap_ball *package_balls)
  822. {
  823. if (package_subset)
  824. omap_mux_package_fixup(package_subset, superset);
  825. if (package_balls)
  826. omap_mux_package_init_balls(package_balls, superset);
  827. }
  828. static void omap_mux_init_signals(struct omap_board_mux *board_mux)
  829. {
  830. omap_mux_set_cmdline_signals();
  831. omap_mux_write_array(board_mux);
  832. }
  833. #else
  834. static void omap_mux_init_package(struct omap_mux *superset,
  835. struct omap_mux *package_subset,
  836. struct omap_ball *package_balls)
  837. {
  838. }
  839. static void omap_mux_init_signals(struct omap_board_mux *board_mux)
  840. {
  841. }
  842. #endif
  843. int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
  844. struct omap_mux *superset,
  845. struct omap_mux *package_subset,
  846. struct omap_board_mux *board_mux,
  847. struct omap_ball *package_balls)
  848. {
  849. if (mux_base)
  850. return -EBUSY;
  851. mux_phys = mux_pbase;
  852. mux_base = ioremap(mux_pbase, mux_size);
  853. if (!mux_base) {
  854. printk(KERN_ERR "mux: Could not ioremap\n");
  855. return -ENODEV;
  856. }
  857. if (cpu_is_omap24xx())
  858. omap_mux_flags = MUXABLE_GPIO_MODE3;
  859. omap_mux_init_package(superset, package_subset, package_balls);
  860. omap_mux_init_list(superset);
  861. omap_mux_init_signals(board_mux);
  862. return 0;
  863. }
  864. #endif /* CONFIG_ARCH_OMAP3 */