mux.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355
  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/spinlock.h>
  30. #include <linux/list.h>
  31. #include <linux/ctype.h>
  32. #include <linux/debugfs.h>
  33. #include <linux/seq_file.h>
  34. #include <linux/uaccess.h>
  35. #include <asm/system.h>
  36. #include <plat/control.h>
  37. #include <plat/mux.h>
  38. #include "mux.h"
  39. #define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
  40. #define OMAP_MUX_BASE_SZ 0x5ca
  41. struct omap_mux_entry {
  42. struct omap_mux mux;
  43. struct list_head node;
  44. };
  45. static unsigned long mux_phys;
  46. static void __iomem *mux_base;
  47. static inline u16 omap_mux_read(u16 reg)
  48. {
  49. if (cpu_is_omap24xx())
  50. return __raw_readb(mux_base + reg);
  51. else
  52. return __raw_readw(mux_base + reg);
  53. }
  54. static inline void omap_mux_write(u16 val, u16 reg)
  55. {
  56. if (cpu_is_omap24xx())
  57. __raw_writeb(val, mux_base + reg);
  58. else
  59. __raw_writew(val, mux_base + reg);
  60. }
  61. #ifdef CONFIG_OMAP_MUX
  62. static struct omap_mux_cfg arch_mux_cfg;
  63. /* NOTE: See mux.h for the enumeration */
  64. #ifdef CONFIG_ARCH_OMAP24XX
  65. static struct pin_config __initdata_or_module omap24xx_pins[] = {
  66. /*
  67. * description mux mux pull pull debug
  68. * offset mode ena type
  69. */
  70. /* 24xx I2C */
  71. MUX_CFG_24XX("M19_24XX_I2C1_SCL", 0x111, 0, 0, 0, 1)
  72. MUX_CFG_24XX("L15_24XX_I2C1_SDA", 0x112, 0, 0, 0, 1)
  73. MUX_CFG_24XX("J15_24XX_I2C2_SCL", 0x113, 0, 0, 1, 1)
  74. MUX_CFG_24XX("H19_24XX_I2C2_SDA", 0x114, 0, 0, 0, 1)
  75. /* Menelaus interrupt */
  76. MUX_CFG_24XX("W19_24XX_SYS_NIRQ", 0x12c, 0, 1, 1, 1)
  77. /* 24xx clocks */
  78. MUX_CFG_24XX("W14_24XX_SYS_CLKOUT", 0x137, 0, 1, 1, 1)
  79. /* 24xx GPMC chipselects, wait pin monitoring */
  80. MUX_CFG_24XX("E2_GPMC_NCS2", 0x08e, 0, 1, 1, 1)
  81. MUX_CFG_24XX("L2_GPMC_NCS7", 0x093, 0, 1, 1, 1)
  82. MUX_CFG_24XX("L3_GPMC_WAIT0", 0x09a, 0, 1, 1, 1)
  83. MUX_CFG_24XX("N7_GPMC_WAIT1", 0x09b, 0, 1, 1, 1)
  84. MUX_CFG_24XX("M1_GPMC_WAIT2", 0x09c, 0, 1, 1, 1)
  85. MUX_CFG_24XX("P1_GPMC_WAIT3", 0x09d, 0, 1, 1, 1)
  86. /* 24xx McBSP */
  87. MUX_CFG_24XX("Y15_24XX_MCBSP2_CLKX", 0x124, 1, 1, 0, 1)
  88. MUX_CFG_24XX("R14_24XX_MCBSP2_FSX", 0x125, 1, 1, 0, 1)
  89. MUX_CFG_24XX("W15_24XX_MCBSP2_DR", 0x126, 1, 1, 0, 1)
  90. MUX_CFG_24XX("V15_24XX_MCBSP2_DX", 0x127, 1, 1, 0, 1)
  91. /* 24xx GPIO */
  92. MUX_CFG_24XX("M21_242X_GPIO11", 0x0c9, 3, 1, 1, 1)
  93. MUX_CFG_24XX("P21_242X_GPIO12", 0x0ca, 3, 0, 0, 1)
  94. MUX_CFG_24XX("AA10_242X_GPIO13", 0x0e5, 3, 0, 0, 1)
  95. MUX_CFG_24XX("AA6_242X_GPIO14", 0x0e6, 3, 0, 0, 1)
  96. MUX_CFG_24XX("AA4_242X_GPIO15", 0x0e7, 3, 0, 0, 1)
  97. MUX_CFG_24XX("Y11_242X_GPIO16", 0x0e8, 3, 0, 0, 1)
  98. MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1)
  99. MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1)
  100. MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1)
  101. MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1)
  102. MUX_CFG_24XX("N15_24XX_GPIO85", 0x103, 3, 0, 0, 1)
  103. MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1)
  104. MUX_CFG_24XX("P20_24XX_GPIO93", 0x10b, 3, 0, 0, 1)
  105. MUX_CFG_24XX("P18_24XX_GPIO95", 0x10d, 3, 0, 0, 1)
  106. MUX_CFG_24XX("M18_24XX_GPIO96", 0x10e, 3, 0, 0, 1)
  107. MUX_CFG_24XX("L14_24XX_GPIO97", 0x10f, 3, 0, 0, 1)
  108. MUX_CFG_24XX("J15_24XX_GPIO99", 0x113, 3, 1, 1, 1)
  109. MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1)
  110. MUX_CFG_24XX("P14_24XX_GPIO125", 0x140, 3, 1, 1, 1)
  111. /* 242x DBG GPIO */
  112. MUX_CFG_24XX("V4_242X_GPIO49", 0xd3, 3, 0, 0, 1)
  113. MUX_CFG_24XX("W2_242X_GPIO50", 0xd4, 3, 0, 0, 1)
  114. MUX_CFG_24XX("U4_242X_GPIO51", 0xd5, 3, 0, 0, 1)
  115. MUX_CFG_24XX("V3_242X_GPIO52", 0xd6, 3, 0, 0, 1)
  116. MUX_CFG_24XX("V2_242X_GPIO53", 0xd7, 3, 0, 0, 1)
  117. MUX_CFG_24XX("V6_242X_GPIO53", 0xcf, 3, 0, 0, 1)
  118. MUX_CFG_24XX("T4_242X_GPIO54", 0xd8, 3, 0, 0, 1)
  119. MUX_CFG_24XX("Y4_242X_GPIO54", 0xd0, 3, 0, 0, 1)
  120. MUX_CFG_24XX("T3_242X_GPIO55", 0xd9, 3, 0, 0, 1)
  121. MUX_CFG_24XX("U2_242X_GPIO56", 0xda, 3, 0, 0, 1)
  122. /* 24xx external DMA requests */
  123. MUX_CFG_24XX("AA10_242X_DMAREQ0", 0x0e5, 2, 0, 0, 1)
  124. MUX_CFG_24XX("AA6_242X_DMAREQ1", 0x0e6, 2, 0, 0, 1)
  125. MUX_CFG_24XX("E4_242X_DMAREQ2", 0x074, 2, 0, 0, 1)
  126. MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1)
  127. MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1)
  128. MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1)
  129. /* UART3 */
  130. MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1)
  131. MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1)
  132. /* MMC/SDIO */
  133. MUX_CFG_24XX("G19_24XX_MMC_CLKO", 0x0f3, 0, 0, 0, 1)
  134. MUX_CFG_24XX("H18_24XX_MMC_CMD", 0x0f4, 0, 0, 0, 1)
  135. MUX_CFG_24XX("F20_24XX_MMC_DAT0", 0x0f5, 0, 0, 0, 1)
  136. MUX_CFG_24XX("H14_24XX_MMC_DAT1", 0x0f6, 0, 0, 0, 1)
  137. MUX_CFG_24XX("E19_24XX_MMC_DAT2", 0x0f7, 0, 0, 0, 1)
  138. MUX_CFG_24XX("D19_24XX_MMC_DAT3", 0x0f8, 0, 0, 0, 1)
  139. MUX_CFG_24XX("F19_24XX_MMC_DAT_DIR0", 0x0f9, 0, 0, 0, 1)
  140. MUX_CFG_24XX("E20_24XX_MMC_DAT_DIR1", 0x0fa, 0, 0, 0, 1)
  141. MUX_CFG_24XX("F18_24XX_MMC_DAT_DIR2", 0x0fb, 0, 0, 0, 1)
  142. MUX_CFG_24XX("E18_24XX_MMC_DAT_DIR3", 0x0fc, 0, 0, 0, 1)
  143. MUX_CFG_24XX("G18_24XX_MMC_CMD_DIR", 0x0fd, 0, 0, 0, 1)
  144. MUX_CFG_24XX("H15_24XX_MMC_CLKI", 0x0fe, 0, 0, 0, 1)
  145. /* Full speed USB */
  146. MUX_CFG_24XX("J20_24XX_USB0_PUEN", 0x11d, 0, 0, 0, 1)
  147. MUX_CFG_24XX("J19_24XX_USB0_VP", 0x11e, 0, 0, 0, 1)
  148. MUX_CFG_24XX("K20_24XX_USB0_VM", 0x11f, 0, 0, 0, 1)
  149. MUX_CFG_24XX("J18_24XX_USB0_RCV", 0x120, 0, 0, 0, 1)
  150. MUX_CFG_24XX("K19_24XX_USB0_TXEN", 0x121, 0, 0, 0, 1)
  151. MUX_CFG_24XX("J14_24XX_USB0_SE0", 0x122, 0, 0, 0, 1)
  152. MUX_CFG_24XX("K18_24XX_USB0_DAT", 0x123, 0, 0, 0, 1)
  153. MUX_CFG_24XX("N14_24XX_USB1_SE0", 0x0ed, 2, 0, 0, 1)
  154. MUX_CFG_24XX("W12_24XX_USB1_SE0", 0x0dd, 3, 0, 0, 1)
  155. MUX_CFG_24XX("P15_24XX_USB1_DAT", 0x0ee, 2, 0, 0, 1)
  156. MUX_CFG_24XX("R13_24XX_USB1_DAT", 0x0e0, 3, 0, 0, 1)
  157. MUX_CFG_24XX("W20_24XX_USB1_TXEN", 0x0ec, 2, 0, 0, 1)
  158. MUX_CFG_24XX("P13_24XX_USB1_TXEN", 0x0df, 3, 0, 0, 1)
  159. MUX_CFG_24XX("V19_24XX_USB1_RCV", 0x0eb, 2, 0, 0, 1)
  160. MUX_CFG_24XX("V12_24XX_USB1_RCV", 0x0de, 3, 0, 0, 1)
  161. MUX_CFG_24XX("AA10_24XX_USB2_SE0", 0x0e5, 2, 0, 0, 1)
  162. MUX_CFG_24XX("Y11_24XX_USB2_DAT", 0x0e8, 2, 0, 0, 1)
  163. MUX_CFG_24XX("AA12_24XX_USB2_TXEN", 0x0e9, 2, 0, 0, 1)
  164. MUX_CFG_24XX("AA6_24XX_USB2_RCV", 0x0e6, 2, 0, 0, 1)
  165. MUX_CFG_24XX("AA4_24XX_USB2_TLLSE0", 0x0e7, 2, 0, 0, 1)
  166. /* Keypad GPIO*/
  167. MUX_CFG_24XX("T19_24XX_KBR0", 0x106, 3, 1, 1, 1)
  168. MUX_CFG_24XX("R19_24XX_KBR1", 0x107, 3, 1, 1, 1)
  169. MUX_CFG_24XX("V18_24XX_KBR2", 0x139, 3, 1, 1, 1)
  170. MUX_CFG_24XX("M21_24XX_KBR3", 0xc9, 3, 1, 1, 1)
  171. MUX_CFG_24XX("E5__24XX_KBR4", 0x138, 3, 1, 1, 1)
  172. MUX_CFG_24XX("M18_24XX_KBR5", 0x10e, 3, 1, 1, 1)
  173. MUX_CFG_24XX("R20_24XX_KBC0", 0x108, 3, 0, 0, 1)
  174. MUX_CFG_24XX("M14_24XX_KBC1", 0x109, 3, 0, 0, 1)
  175. MUX_CFG_24XX("H19_24XX_KBC2", 0x114, 3, 0, 0, 1)
  176. MUX_CFG_24XX("V17_24XX_KBC3", 0x135, 3, 0, 0, 1)
  177. MUX_CFG_24XX("P21_24XX_KBC4", 0xca, 3, 0, 0, 1)
  178. MUX_CFG_24XX("L14_24XX_KBC5", 0x10f, 3, 0, 0, 1)
  179. MUX_CFG_24XX("N19_24XX_KBC6", 0x110, 3, 0, 0, 1)
  180. /* 24xx Menelaus Keypad GPIO */
  181. MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1)
  182. MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1)
  183. MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1)
  184. /* 2430 USB */
  185. MUX_CFG_24XX("AD9_2430_USB0_PUEN", 0x133, 4, 0, 0, 1)
  186. MUX_CFG_24XX("Y11_2430_USB0_VP", 0x134, 4, 0, 0, 1)
  187. MUX_CFG_24XX("AD7_2430_USB0_VM", 0x135, 4, 0, 0, 1)
  188. MUX_CFG_24XX("AE7_2430_USB0_RCV", 0x136, 4, 0, 0, 1)
  189. MUX_CFG_24XX("AD4_2430_USB0_TXEN", 0x137, 4, 0, 0, 1)
  190. MUX_CFG_24XX("AF9_2430_USB0_SE0", 0x138, 4, 0, 0, 1)
  191. MUX_CFG_24XX("AE6_2430_USB0_DAT", 0x139, 4, 0, 0, 1)
  192. MUX_CFG_24XX("AD24_2430_USB1_SE0", 0x107, 2, 0, 0, 1)
  193. MUX_CFG_24XX("AB24_2430_USB1_RCV", 0x108, 2, 0, 0, 1)
  194. MUX_CFG_24XX("Y25_2430_USB1_TXEN", 0x109, 2, 0, 0, 1)
  195. MUX_CFG_24XX("AA26_2430_USB1_DAT", 0x10A, 2, 0, 0, 1)
  196. /* 2430 HS-USB */
  197. MUX_CFG_24XX("AD9_2430_USB0HS_DATA3", 0x133, 0, 0, 0, 1)
  198. MUX_CFG_24XX("Y11_2430_USB0HS_DATA4", 0x134, 0, 0, 0, 1)
  199. MUX_CFG_24XX("AD7_2430_USB0HS_DATA5", 0x135, 0, 0, 0, 1)
  200. MUX_CFG_24XX("AE7_2430_USB0HS_DATA6", 0x136, 0, 0, 0, 1)
  201. MUX_CFG_24XX("AD4_2430_USB0HS_DATA2", 0x137, 0, 0, 0, 1)
  202. MUX_CFG_24XX("AF9_2430_USB0HS_DATA0", 0x138, 0, 0, 0, 1)
  203. MUX_CFG_24XX("AE6_2430_USB0HS_DATA1", 0x139, 0, 0, 0, 1)
  204. MUX_CFG_24XX("AE8_2430_USB0HS_CLK", 0x13A, 0, 0, 0, 1)
  205. MUX_CFG_24XX("AD8_2430_USB0HS_DIR", 0x13B, 0, 0, 0, 1)
  206. MUX_CFG_24XX("AE5_2430_USB0HS_STP", 0x13c, 0, 1, 1, 1)
  207. MUX_CFG_24XX("AE9_2430_USB0HS_NXT", 0x13D, 0, 0, 0, 1)
  208. MUX_CFG_24XX("AC7_2430_USB0HS_DATA7", 0x13E, 0, 0, 0, 1)
  209. /* 2430 McBSP */
  210. MUX_CFG_24XX("AD6_2430_MCBSP_CLKS", 0x011E, 0, 0, 0, 1)
  211. MUX_CFG_24XX("AB2_2430_MCBSP1_CLKR", 0x011A, 0, 0, 0, 1)
  212. MUX_CFG_24XX("AD5_2430_MCBSP1_FSR", 0x011B, 0, 0, 0, 1)
  213. MUX_CFG_24XX("AA1_2430_MCBSP1_DX", 0x011C, 0, 0, 0, 1)
  214. MUX_CFG_24XX("AF3_2430_MCBSP1_DR", 0x011D, 0, 0, 0, 1)
  215. MUX_CFG_24XX("AB3_2430_MCBSP1_FSX", 0x011F, 0, 0, 0, 1)
  216. MUX_CFG_24XX("Y9_2430_MCBSP1_CLKX", 0x0120, 0, 0, 0, 1)
  217. MUX_CFG_24XX("AC10_2430_MCBSP2_FSX", 0x012E, 1, 0, 0, 1)
  218. MUX_CFG_24XX("AD16_2430_MCBSP2_CLX", 0x012F, 1, 0, 0, 1)
  219. MUX_CFG_24XX("AE13_2430_MCBSP2_DX", 0x0130, 1, 0, 0, 1)
  220. MUX_CFG_24XX("AD13_2430_MCBSP2_DR", 0x0131, 1, 0, 0, 1)
  221. MUX_CFG_24XX("AC10_2430_MCBSP2_FSX_OFF",0x012E, 0, 0, 0, 1)
  222. MUX_CFG_24XX("AD16_2430_MCBSP2_CLX_OFF",0x012F, 0, 0, 0, 1)
  223. MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1)
  224. MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1)
  225. MUX_CFG_24XX("AC9_2430_MCBSP3_CLKX", 0x0103, 0, 0, 0, 1)
  226. MUX_CFG_24XX("AE4_2430_MCBSP3_FSX", 0x0104, 0, 0, 0, 1)
  227. MUX_CFG_24XX("AE2_2430_MCBSP3_DR", 0x0105, 0, 0, 0, 1)
  228. MUX_CFG_24XX("AF4_2430_MCBSP3_DX", 0x0106, 0, 0, 0, 1)
  229. MUX_CFG_24XX("N3_2430_MCBSP4_CLKX", 0x010B, 1, 0, 0, 1)
  230. MUX_CFG_24XX("AD23_2430_MCBSP4_DR", 0x010C, 1, 0, 0, 1)
  231. MUX_CFG_24XX("AB25_2430_MCBSP4_DX", 0x010D, 1, 0, 0, 1)
  232. MUX_CFG_24XX("AC25_2430_MCBSP4_FSX", 0x010E, 1, 0, 0, 1)
  233. MUX_CFG_24XX("AE16_2430_MCBSP5_CLKX", 0x00ED, 1, 0, 0, 1)
  234. MUX_CFG_24XX("AF12_2430_MCBSP5_FSX", 0x00ED, 1, 0, 0, 1)
  235. MUX_CFG_24XX("K7_2430_MCBSP5_DX", 0x00EF, 1, 0, 0, 1)
  236. MUX_CFG_24XX("M1_2430_MCBSP5_DR", 0x00F0, 1, 0, 0, 1)
  237. /* 2430 MCSPI1 */
  238. MUX_CFG_24XX("Y18_2430_MCSPI1_CLK", 0x010F, 0, 0, 0, 1)
  239. MUX_CFG_24XX("AD15_2430_MCSPI1_SIMO", 0x0110, 0, 0, 0, 1)
  240. MUX_CFG_24XX("AE17_2430_MCSPI1_SOMI", 0x0111, 0, 0, 0, 1)
  241. MUX_CFG_24XX("U1_2430_MCSPI1_CS0", 0x0112, 0, 0, 0, 1)
  242. /* Touchscreen GPIO */
  243. MUX_CFG_24XX("AF19_2430_GPIO_85", 0x0113, 3, 0, 0, 1)
  244. };
  245. #define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
  246. #else
  247. #define omap24xx_pins NULL
  248. #define OMAP24XX_PINS_SZ 0
  249. #endif /* CONFIG_ARCH_OMAP24XX */
  250. #ifdef CONFIG_ARCH_OMAP34XX
  251. static struct pin_config __initdata_or_module omap34xx_pins[] = {
  252. /*
  253. * Name, reg-offset,
  254. * mux-mode | [active-mode | off-mode]
  255. */
  256. /* 34xx I2C */
  257. MUX_CFG_34XX("K21_34XX_I2C1_SCL", 0x1ba,
  258. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  259. MUX_CFG_34XX("J21_34XX_I2C1_SDA", 0x1bc,
  260. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  261. MUX_CFG_34XX("AF15_34XX_I2C2_SCL", 0x1be,
  262. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  263. MUX_CFG_34XX("AE15_34XX_I2C2_SDA", 0x1c0,
  264. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  265. MUX_CFG_34XX("AF14_34XX_I2C3_SCL", 0x1c2,
  266. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  267. MUX_CFG_34XX("AG14_34XX_I2C3_SDA", 0x1c4,
  268. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  269. MUX_CFG_34XX("AD26_34XX_I2C4_SCL", 0xa00,
  270. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  271. MUX_CFG_34XX("AE26_34XX_I2C4_SDA", 0xa02,
  272. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  273. /* PHY - HSUSB: 12-pin ULPI PHY: Port 1*/
  274. MUX_CFG_34XX("Y8_3430_USB1HS_PHY_CLK", 0x5da,
  275. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
  276. MUX_CFG_34XX("Y9_3430_USB1HS_PHY_STP", 0x5d8,
  277. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
  278. MUX_CFG_34XX("AA14_3430_USB1HS_PHY_DIR", 0x5ec,
  279. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  280. MUX_CFG_34XX("AA11_3430_USB1HS_PHY_NXT", 0x5ee,
  281. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  282. MUX_CFG_34XX("W13_3430_USB1HS_PHY_D0", 0x5dc,
  283. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  284. MUX_CFG_34XX("W12_3430_USB1HS_PHY_D1", 0x5de,
  285. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  286. MUX_CFG_34XX("W11_3430_USB1HS_PHY_D2", 0x5e0,
  287. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  288. MUX_CFG_34XX("Y11_3430_USB1HS_PHY_D3", 0x5ea,
  289. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  290. MUX_CFG_34XX("W9_3430_USB1HS_PHY_D4", 0x5e4,
  291. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  292. MUX_CFG_34XX("Y12_3430_USB1HS_PHY_D5", 0x5e6,
  293. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  294. MUX_CFG_34XX("W8_3430_USB1HS_PHY_D6", 0x5e8,
  295. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  296. MUX_CFG_34XX("Y13_3430_USB1HS_PHY_D7", 0x5e2,
  297. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  298. /* PHY - HSUSB: 12-pin ULPI PHY: Port 2*/
  299. MUX_CFG_34XX("AA8_3430_USB2HS_PHY_CLK", 0x5f0,
  300. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
  301. MUX_CFG_34XX("AA10_3430_USB2HS_PHY_STP", 0x5f2,
  302. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
  303. MUX_CFG_34XX("AA9_3430_USB2HS_PHY_DIR", 0x5f4,
  304. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  305. MUX_CFG_34XX("AB11_3430_USB2HS_PHY_NXT", 0x5f6,
  306. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  307. MUX_CFG_34XX("AB10_3430_USB2HS_PHY_D0", 0x5f8,
  308. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  309. MUX_CFG_34XX("AB9_3430_USB2HS_PHY_D1", 0x5fa,
  310. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  311. MUX_CFG_34XX("W3_3430_USB2HS_PHY_D2", 0x1d4,
  312. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  313. MUX_CFG_34XX("T4_3430_USB2HS_PHY_D3", 0x1de,
  314. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  315. MUX_CFG_34XX("T3_3430_USB2HS_PHY_D4", 0x1d8,
  316. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  317. MUX_CFG_34XX("R3_3430_USB2HS_PHY_D5", 0x1da,
  318. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  319. MUX_CFG_34XX("R4_3430_USB2HS_PHY_D6", 0x1dc,
  320. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  321. MUX_CFG_34XX("T2_3430_USB2HS_PHY_D7", 0x1d6,
  322. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
  323. /* TLL - HSUSB: 12-pin TLL Port 1*/
  324. MUX_CFG_34XX("Y8_3430_USB1HS_TLL_CLK", 0x5da,
  325. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  326. MUX_CFG_34XX("Y9_3430_USB1HS_TLL_STP", 0x5d8,
  327. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
  328. MUX_CFG_34XX("AA14_3430_USB1HS_TLL_DIR", 0x5ec,
  329. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  330. MUX_CFG_34XX("AA11_3430_USB1HS_TLL_NXT", 0x5ee,
  331. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  332. MUX_CFG_34XX("W13_3430_USB1HS_TLL_D0", 0x5dc,
  333. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  334. MUX_CFG_34XX("W12_3430_USB1HS_TLL_D1", 0x5de,
  335. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  336. MUX_CFG_34XX("W11_3430_USB1HS_TLL_D2", 0x5e0,
  337. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  338. MUX_CFG_34XX("Y11_3430_USB1HS_TLL_D3", 0x5ea,
  339. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  340. MUX_CFG_34XX("W9_3430_USB1HS_TLL_D4", 0x5e4,
  341. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  342. MUX_CFG_34XX("Y12_3430_USB1HS_TLL_D5", 0x5e6,
  343. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  344. MUX_CFG_34XX("W8_3430_USB1HS_TLL_D6", 0x5e8,
  345. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  346. MUX_CFG_34XX("Y13_3430_USB1HS_TLL_D7", 0x5e2,
  347. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  348. /* TLL - HSUSB: 12-pin TLL Port 2*/
  349. MUX_CFG_34XX("AA8_3430_USB2HS_TLL_CLK", 0x5f0,
  350. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  351. MUX_CFG_34XX("AA10_3430_USB2HS_TLL_STP", 0x5f2,
  352. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
  353. MUX_CFG_34XX("AA9_3430_USB2HS_TLL_DIR", 0x5f4,
  354. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  355. MUX_CFG_34XX("AB11_3430_USB2HS_TLL_NXT", 0x5f6,
  356. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  357. MUX_CFG_34XX("AB10_3430_USB2HS_TLL_D0", 0x5f8,
  358. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  359. MUX_CFG_34XX("AB9_3430_USB2HS_TLL_D1", 0x5fa,
  360. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  361. MUX_CFG_34XX("W3_3430_USB2HS_TLL_D2", 0x1d4,
  362. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  363. MUX_CFG_34XX("T4_3430_USB2HS_TLL_D3", 0x1de,
  364. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  365. MUX_CFG_34XX("T3_3430_USB2HS_TLL_D4", 0x1d8,
  366. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  367. MUX_CFG_34XX("R3_3430_USB2HS_TLL_D5", 0x1da,
  368. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  369. MUX_CFG_34XX("R4_3430_USB2HS_TLL_D6", 0x1dc,
  370. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  371. MUX_CFG_34XX("T2_3430_USB2HS_TLL_D7", 0x1d6,
  372. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
  373. /* TLL - HSUSB: 12-pin TLL Port 3*/
  374. MUX_CFG_34XX("AA6_3430_USB3HS_TLL_CLK", 0x180,
  375. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  376. MUX_CFG_34XX("AB3_3430_USB3HS_TLL_STP", 0x166,
  377. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLUP)
  378. MUX_CFG_34XX("AA3_3430_USB3HS_TLL_DIR", 0x168,
  379. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  380. MUX_CFG_34XX("Y3_3430_USB3HS_TLL_NXT", 0x16a,
  381. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  382. MUX_CFG_34XX("AA5_3430_USB3HS_TLL_D0", 0x186,
  383. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  384. MUX_CFG_34XX("Y4_3430_USB3HS_TLL_D1", 0x184,
  385. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  386. MUX_CFG_34XX("Y5_3430_USB3HS_TLL_D2", 0x188,
  387. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  388. MUX_CFG_34XX("W5_3430_USB3HS_TLL_D3", 0x18a,
  389. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  390. MUX_CFG_34XX("AB12_3430_USB3HS_TLL_D4", 0x16c,
  391. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  392. MUX_CFG_34XX("AB13_3430_USB3HS_TLL_D5", 0x16e,
  393. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  394. MUX_CFG_34XX("AA13_3430_USB3HS_TLL_D6", 0x170,
  395. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  396. MUX_CFG_34XX("AA12_3430_USB3HS_TLL_D7", 0x172,
  397. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  398. /* PHY FSUSB: FS Serial for Port 1 (multiple PHY modes supported) */
  399. MUX_CFG_34XX("AF10_3430_USB1FS_PHY_MM1_RXDP", 0x5d8,
  400. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  401. MUX_CFG_34XX("AG9_3430_USB1FS_PHY_MM1_RXDM", 0x5ee,
  402. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  403. MUX_CFG_34XX("W13_3430_USB1FS_PHY_MM1_RXRCV", 0x5dc,
  404. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  405. MUX_CFG_34XX("W12_3430_USB1FS_PHY_MM1_TXSE0", 0x5de,
  406. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  407. MUX_CFG_34XX("W11_3430_USB1FS_PHY_MM1_TXDAT", 0x5e0,
  408. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  409. MUX_CFG_34XX("Y11_3430_USB1FS_PHY_MM1_TXEN_N", 0x5ea,
  410. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
  411. /* PHY FSUSB: FS Serial for Port 2 (multiple PHY modes supported) */
  412. MUX_CFG_34XX("AF7_3430_USB2FS_PHY_MM2_RXDP", 0x5f2,
  413. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  414. MUX_CFG_34XX("AH7_3430_USB2FS_PHY_MM2_RXDM", 0x5f6,
  415. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  416. MUX_CFG_34XX("AB10_3430_USB2FS_PHY_MM2_RXRCV", 0x5f8,
  417. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  418. MUX_CFG_34XX("AB9_3430_USB2FS_PHY_MM2_TXSE0", 0x5fa,
  419. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  420. MUX_CFG_34XX("W3_3430_USB2FS_PHY_MM2_TXDAT", 0x1d4,
  421. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
  422. MUX_CFG_34XX("T4_3430_USB2FS_PHY_MM2_TXEN_N", 0x1de,
  423. OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
  424. /* PHY FSUSB: FS Serial for Port 3 (multiple PHY modes supported) */
  425. MUX_CFG_34XX("AH3_3430_USB3FS_PHY_MM3_RXDP", 0x166,
  426. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  427. MUX_CFG_34XX("AE3_3430_USB3FS_PHY_MM3_RXDM", 0x16a,
  428. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  429. MUX_CFG_34XX("AD1_3430_USB3FS_PHY_MM3_RXRCV", 0x186,
  430. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  431. MUX_CFG_34XX("AE1_3430_USB3FS_PHY_MM3_TXSE0", 0x184,
  432. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  433. MUX_CFG_34XX("AD2_3430_USB3FS_PHY_MM3_TXDAT", 0x188,
  434. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
  435. MUX_CFG_34XX("AC1_3430_USB3FS_PHY_MM3_TXEN_N", 0x18a,
  436. OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_OUTPUT)
  437. /* 34XX GPIO - bidirectional, unless the name has an "_OUT" suffix.
  438. * (Always specify PIN_INPUT, except for names suffixed by "_OUT".)
  439. * No internal pullup/pulldown without "_UP" or "_DOWN" suffix.
  440. */
  441. MUX_CFG_34XX("AF26_34XX_GPIO0", 0x1e0,
  442. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  443. MUX_CFG_34XX("AF22_34XX_GPIO9", 0xa18,
  444. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  445. MUX_CFG_34XX("AG9_34XX_GPIO23", 0x5ee,
  446. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  447. MUX_CFG_34XX("AH8_34XX_GPIO29", 0x5fa,
  448. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  449. MUX_CFG_34XX("U8_34XX_GPIO54_OUT", 0x0b4,
  450. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  451. MUX_CFG_34XX("U8_34XX_GPIO54_DOWN", 0x0b4,
  452. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLDOWN)
  453. MUX_CFG_34XX("L8_34XX_GPIO63", 0x0ce,
  454. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  455. MUX_CFG_34XX("G25_34XX_GPIO86_OUT", 0x0fc,
  456. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  457. MUX_CFG_34XX("AG4_34XX_GPIO134_OUT", 0x160,
  458. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  459. MUX_CFG_34XX("AF4_34XX_GPIO135_OUT", 0x162,
  460. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  461. MUX_CFG_34XX("AE4_34XX_GPIO136_OUT", 0x164,
  462. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  463. MUX_CFG_34XX("AF6_34XX_GPIO140_UP", 0x16c,
  464. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
  465. MUX_CFG_34XX("AE6_34XX_GPIO141", 0x16e,
  466. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  467. MUX_CFG_34XX("AF5_34XX_GPIO142", 0x170,
  468. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  469. MUX_CFG_34XX("AE5_34XX_GPIO143", 0x172,
  470. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  471. MUX_CFG_34XX("H19_34XX_GPIO164_OUT", 0x19c,
  472. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
  473. MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6,
  474. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
  475. /* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
  476. MUX_CFG_34XX("H16_34XX_SDRC_CKE0", 0x262,
  477. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
  478. MUX_CFG_34XX("H17_34XX_SDRC_CKE1", 0x264,
  479. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
  480. /* MMC1 */
  481. MUX_CFG_34XX("N28_3430_MMC1_CLK", 0x144,
  482. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  483. MUX_CFG_34XX("M27_3430_MMC1_CMD", 0x146,
  484. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  485. MUX_CFG_34XX("N27_3430_MMC1_DAT0", 0x148,
  486. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  487. MUX_CFG_34XX("N26_3430_MMC1_DAT1", 0x14a,
  488. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  489. MUX_CFG_34XX("N25_3430_MMC1_DAT2", 0x14c,
  490. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  491. MUX_CFG_34XX("P28_3430_MMC1_DAT3", 0x14e,
  492. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  493. MUX_CFG_34XX("P27_3430_MMC1_DAT4", 0x150,
  494. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  495. MUX_CFG_34XX("P26_3430_MMC1_DAT5", 0x152,
  496. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  497. MUX_CFG_34XX("R27_3430_MMC1_DAT6", 0x154,
  498. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  499. MUX_CFG_34XX("R25_3430_MMC1_DAT7", 0x156,
  500. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  501. /* MMC2 */
  502. MUX_CFG_34XX("AE2_3430_MMC2_CLK", 0x158,
  503. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  504. MUX_CFG_34XX("AG5_3430_MMC2_CMD", 0x15A,
  505. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  506. MUX_CFG_34XX("AH5_3430_MMC2_DAT0", 0x15c,
  507. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  508. MUX_CFG_34XX("AH4_3430_MMC2_DAT1", 0x15e,
  509. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  510. MUX_CFG_34XX("AG4_3430_MMC2_DAT2", 0x160,
  511. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  512. MUX_CFG_34XX("AF4_3430_MMC2_DAT3", 0x162,
  513. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  514. MUX_CFG_34XX("AE4_3430_MMC2_DAT4", 0x164,
  515. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  516. MUX_CFG_34XX("AH3_3430_MMC2_DAT5", 0x166,
  517. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  518. MUX_CFG_34XX("AF3_3430_MMC2_DAT6", 0x168,
  519. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  520. MUX_CFG_34XX("AE3_3430_MMC2_DAT7", 0x16A,
  521. OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
  522. /* MMC3 */
  523. MUX_CFG_34XX("AF10_3430_MMC3_CLK", 0x5d8,
  524. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
  525. MUX_CFG_34XX("AC3_3430_MMC3_CMD", 0x1d0,
  526. OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLUP)
  527. MUX_CFG_34XX("AE11_3430_MMC3_DAT0", 0x5e4,
  528. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
  529. MUX_CFG_34XX("AH9_3430_MMC3_DAT1", 0x5e6,
  530. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
  531. MUX_CFG_34XX("AF13_3430_MMC3_DAT2", 0x5e8,
  532. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
  533. MUX_CFG_34XX("AF13_3430_MMC3_DAT3", 0x5e2,
  534. OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
  535. /* SYS_NIRQ T2 INT1 */
  536. MUX_CFG_34XX("AF26_34XX_SYS_NIRQ", 0x1E0,
  537. OMAP3_WAKEUP_EN | OMAP34XX_PIN_INPUT_PULLUP |
  538. OMAP34XX_MUX_MODE0)
  539. /* EHCI GPIO's on OMAP3EVM (Rev >= E) */
  540. MUX_CFG_34XX("AH14_34XX_GPIO21", 0x5ea,
  541. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
  542. MUX_CFG_34XX("AF9_34XX_GPIO22", 0x5ec,
  543. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
  544. MUX_CFG_34XX("U3_34XX_GPIO61", 0x0c8,
  545. OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
  546. };
  547. #define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins)
  548. #else
  549. #define omap34xx_pins NULL
  550. #define OMAP34XX_PINS_SZ 0
  551. #endif /* CONFIG_ARCH_OMAP34XX */
  552. #if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
  553. static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 reg)
  554. {
  555. u16 orig;
  556. u8 warn = 0, debug = 0;
  557. orig = omap_mux_read(cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
  558. #ifdef CONFIG_OMAP_MUX_DEBUG
  559. debug = cfg->debug;
  560. #endif
  561. warn = (orig != reg);
  562. if (debug || warn)
  563. printk(KERN_WARNING
  564. "MUX: setup %s (0x%p): 0x%04x -> 0x%04x\n",
  565. cfg->name, omap_ctrl_base_get() + cfg->mux_reg,
  566. orig, reg);
  567. }
  568. #else
  569. #define omap2_cfg_debug(x, y) do {} while (0)
  570. #endif
  571. #ifdef CONFIG_ARCH_OMAP24XX
  572. static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
  573. {
  574. static DEFINE_SPINLOCK(mux_spin_lock);
  575. unsigned long flags;
  576. u8 reg = 0;
  577. spin_lock_irqsave(&mux_spin_lock, flags);
  578. reg |= cfg->mask & 0x7;
  579. if (cfg->pull_val)
  580. reg |= OMAP2_PULL_ENA;
  581. if (cfg->pu_pd_val)
  582. reg |= OMAP2_PULL_UP;
  583. omap2_cfg_debug(cfg, reg);
  584. omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
  585. spin_unlock_irqrestore(&mux_spin_lock, flags);
  586. return 0;
  587. }
  588. #else
  589. #define omap24xx_cfg_reg NULL
  590. #endif
  591. #ifdef CONFIG_ARCH_OMAP34XX
  592. static int __init_or_module omap34xx_cfg_reg(const struct pin_config *cfg)
  593. {
  594. static DEFINE_SPINLOCK(mux_spin_lock);
  595. unsigned long flags;
  596. u16 reg = 0;
  597. spin_lock_irqsave(&mux_spin_lock, flags);
  598. reg |= cfg->mux_val;
  599. omap2_cfg_debug(cfg, reg);
  600. omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
  601. spin_unlock_irqrestore(&mux_spin_lock, flags);
  602. return 0;
  603. }
  604. #else
  605. #define omap34xx_cfg_reg NULL
  606. #endif
  607. int __init omap2_mux_init(void)
  608. {
  609. u32 mux_pbase;
  610. if (cpu_is_omap2420())
  611. mux_pbase = OMAP2420_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
  612. else if (cpu_is_omap2430())
  613. mux_pbase = OMAP243X_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
  614. else
  615. return -ENODEV;
  616. mux_base = ioremap(mux_pbase, OMAP_MUX_BASE_SZ);
  617. if (!mux_base) {
  618. printk(KERN_ERR "mux: Could not ioremap\n");
  619. return -ENODEV;
  620. }
  621. if (cpu_is_omap24xx()) {
  622. arch_mux_cfg.pins = omap24xx_pins;
  623. arch_mux_cfg.size = OMAP24XX_PINS_SZ;
  624. arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
  625. } else if (cpu_is_omap34xx()) {
  626. arch_mux_cfg.pins = omap34xx_pins;
  627. arch_mux_cfg.size = OMAP34XX_PINS_SZ;
  628. arch_mux_cfg.cfg_reg = omap34xx_cfg_reg;
  629. }
  630. return omap_mux_register(&arch_mux_cfg);
  631. }
  632. #endif /* CONFIG_OMAP_MUX */
  633. /*----------------------------------------------------------------------------*/
  634. #ifdef CONFIG_ARCH_OMAP34XX
  635. static LIST_HEAD(muxmodes);
  636. static DEFINE_MUTEX(muxmode_mutex);
  637. #ifdef CONFIG_OMAP_MUX
  638. static char *omap_mux_options;
  639. int __init omap_mux_init_gpio(int gpio, int val)
  640. {
  641. struct omap_mux_entry *e;
  642. int found = 0;
  643. if (!gpio)
  644. return -EINVAL;
  645. list_for_each_entry(e, &muxmodes, node) {
  646. struct omap_mux *m = &e->mux;
  647. if (gpio == m->gpio) {
  648. u16 old_mode;
  649. u16 mux_mode;
  650. old_mode = omap_mux_read(m->reg_offset);
  651. mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
  652. mux_mode |= OMAP_MUX_MODE4;
  653. printk(KERN_DEBUG "mux: Setting signal "
  654. "%s.gpio%i 0x%04x -> 0x%04x\n",
  655. m->muxnames[0], gpio, old_mode, mux_mode);
  656. omap_mux_write(mux_mode, m->reg_offset);
  657. found++;
  658. }
  659. }
  660. if (found == 1)
  661. return 0;
  662. if (found > 1) {
  663. printk(KERN_ERR "mux: Multiple gpio paths for gpio%i\n", gpio);
  664. return -EINVAL;
  665. }
  666. printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
  667. return -ENODEV;
  668. }
  669. int __init omap_mux_init_signal(char *muxname, int val)
  670. {
  671. struct omap_mux_entry *e;
  672. char *m0_name = NULL, *mode_name = NULL;
  673. int found = 0;
  674. mode_name = strchr(muxname, '.');
  675. if (mode_name) {
  676. *mode_name = '\0';
  677. mode_name++;
  678. m0_name = muxname;
  679. } else {
  680. mode_name = muxname;
  681. }
  682. list_for_each_entry(e, &muxmodes, node) {
  683. struct omap_mux *m = &e->mux;
  684. char *m0_entry = m->muxnames[0];
  685. int i;
  686. if (m0_name && strcmp(m0_name, m0_entry))
  687. continue;
  688. for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
  689. char *mode_cur = m->muxnames[i];
  690. if (!mode_cur)
  691. continue;
  692. if (!strcmp(mode_name, mode_cur)) {
  693. u16 old_mode;
  694. u16 mux_mode;
  695. old_mode = omap_mux_read(m->reg_offset);
  696. mux_mode = val | i;
  697. printk(KERN_DEBUG "mux: Setting signal "
  698. "%s.%s 0x%04x -> 0x%04x\n",
  699. m0_entry, muxname, old_mode, mux_mode);
  700. omap_mux_write(mux_mode, m->reg_offset);
  701. found++;
  702. }
  703. }
  704. }
  705. if (found == 1)
  706. return 0;
  707. if (found > 1) {
  708. printk(KERN_ERR "mux: Multiple signal paths (%i) for %s\n",
  709. found, muxname);
  710. return -EINVAL;
  711. }
  712. printk(KERN_ERR "mux: Could not set signal %s\n", muxname);
  713. return -ENODEV;
  714. }
  715. #ifdef CONFIG_DEBUG_FS
  716. #define OMAP_MUX_MAX_NR_FLAGS 10
  717. #define OMAP_MUX_TEST_FLAG(val, mask) \
  718. if (((val) & (mask)) == (mask)) { \
  719. i++; \
  720. flags[i] = #mask; \
  721. }
  722. /* REVISIT: Add checking for non-optimal mux settings */
  723. static inline void omap_mux_decode(struct seq_file *s, u16 val)
  724. {
  725. char *flags[OMAP_MUX_MAX_NR_FLAGS];
  726. char mode[14];
  727. int i = -1;
  728. sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
  729. i++;
  730. flags[i] = mode;
  731. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_OFF_WAKEUPENABLE);
  732. if (val & OMAP_OFF_EN) {
  733. if (!(val & OMAP_OFFOUT_EN)) {
  734. if (!(val & OMAP_OFF_PULL_UP)) {
  735. OMAP_MUX_TEST_FLAG(val,
  736. OMAP_PIN_OFF_INPUT_PULLDOWN);
  737. } else {
  738. OMAP_MUX_TEST_FLAG(val,
  739. OMAP_PIN_OFF_INPUT_PULLUP);
  740. }
  741. } else {
  742. if (!(val & OMAP_OFFOUT_VAL)) {
  743. OMAP_MUX_TEST_FLAG(val,
  744. OMAP_PIN_OFF_OUTPUT_LOW);
  745. } else {
  746. OMAP_MUX_TEST_FLAG(val,
  747. OMAP_PIN_OFF_OUTPUT_HIGH);
  748. }
  749. }
  750. }
  751. if (val & OMAP_INPUT_EN) {
  752. if (val & OMAP_PULL_ENA) {
  753. if (!(val & OMAP_PULL_UP)) {
  754. OMAP_MUX_TEST_FLAG(val,
  755. OMAP_PIN_INPUT_PULLDOWN);
  756. } else {
  757. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT_PULLUP);
  758. }
  759. } else {
  760. OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT);
  761. }
  762. } else {
  763. i++;
  764. flags[i] = "OMAP_PIN_OUTPUT";
  765. }
  766. do {
  767. seq_printf(s, "%s", flags[i]);
  768. if (i > 0)
  769. seq_printf(s, " | ");
  770. } while (i-- > 0);
  771. }
  772. #define OMAP_MUX_DEFNAME_LEN 16
  773. static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
  774. {
  775. struct omap_mux_entry *e;
  776. list_for_each_entry(e, &muxmodes, node) {
  777. struct omap_mux *m = &e->mux;
  778. char m0_def[OMAP_MUX_DEFNAME_LEN];
  779. char *m0_name = m->muxnames[0];
  780. u16 val;
  781. int i, mode;
  782. if (!m0_name)
  783. continue;
  784. for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
  785. if (m0_name[i] == '\0') {
  786. m0_def[i] = m0_name[i];
  787. break;
  788. }
  789. m0_def[i] = toupper(m0_name[i]);
  790. }
  791. val = omap_mux_read(m->reg_offset);
  792. mode = val & OMAP_MUX_MODE7;
  793. seq_printf(s, "OMAP%i_MUX(%s, ",
  794. cpu_is_omap34xx() ? 3 : 0, m0_def);
  795. omap_mux_decode(s, val);
  796. seq_printf(s, "),\n");
  797. }
  798. return 0;
  799. }
  800. static int omap_mux_dbg_board_open(struct inode *inode, struct file *file)
  801. {
  802. return single_open(file, omap_mux_dbg_board_show, &inode->i_private);
  803. }
  804. static const struct file_operations omap_mux_dbg_board_fops = {
  805. .open = omap_mux_dbg_board_open,
  806. .read = seq_read,
  807. .llseek = seq_lseek,
  808. .release = single_release,
  809. };
  810. static int omap_mux_dbg_signal_show(struct seq_file *s, void *unused)
  811. {
  812. struct omap_mux *m = s->private;
  813. const char *none = "NA";
  814. u16 val;
  815. int mode;
  816. val = omap_mux_read(m->reg_offset);
  817. mode = val & OMAP_MUX_MODE7;
  818. seq_printf(s, "name: %s.%s (0x%08lx/0x%03x = 0x%04x), b %s, t %s\n",
  819. m->muxnames[0], m->muxnames[mode],
  820. mux_phys + m->reg_offset, m->reg_offset, val,
  821. m->balls[0] ? m->balls[0] : none,
  822. m->balls[1] ? m->balls[1] : none);
  823. seq_printf(s, "mode: ");
  824. omap_mux_decode(s, val);
  825. seq_printf(s, "\n");
  826. seq_printf(s, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
  827. m->muxnames[0] ? m->muxnames[0] : none,
  828. m->muxnames[1] ? m->muxnames[1] : none,
  829. m->muxnames[2] ? m->muxnames[2] : none,
  830. m->muxnames[3] ? m->muxnames[3] : none,
  831. m->muxnames[4] ? m->muxnames[4] : none,
  832. m->muxnames[5] ? m->muxnames[5] : none,
  833. m->muxnames[6] ? m->muxnames[6] : none,
  834. m->muxnames[7] ? m->muxnames[7] : none);
  835. return 0;
  836. }
  837. #define OMAP_MUX_MAX_ARG_CHAR 7
  838. static ssize_t omap_mux_dbg_signal_write(struct file *file,
  839. const char __user *user_buf,
  840. size_t count, loff_t *ppos)
  841. {
  842. char buf[OMAP_MUX_MAX_ARG_CHAR];
  843. struct seq_file *seqf;
  844. struct omap_mux *m;
  845. unsigned long val;
  846. int buf_size, ret;
  847. if (count > OMAP_MUX_MAX_ARG_CHAR)
  848. return -EINVAL;
  849. memset(buf, 0, sizeof(buf));
  850. buf_size = min(count, sizeof(buf) - 1);
  851. if (copy_from_user(buf, user_buf, buf_size))
  852. return -EFAULT;
  853. ret = strict_strtoul(buf, 0x10, &val);
  854. if (ret < 0)
  855. return ret;
  856. if (val > 0xffff)
  857. return -EINVAL;
  858. seqf = file->private_data;
  859. m = seqf->private;
  860. omap_mux_write((u16)val, m->reg_offset);
  861. *ppos += count;
  862. return count;
  863. }
  864. static int omap_mux_dbg_signal_open(struct inode *inode, struct file *file)
  865. {
  866. return single_open(file, omap_mux_dbg_signal_show, inode->i_private);
  867. }
  868. static const struct file_operations omap_mux_dbg_signal_fops = {
  869. .open = omap_mux_dbg_signal_open,
  870. .read = seq_read,
  871. .write = omap_mux_dbg_signal_write,
  872. .llseek = seq_lseek,
  873. .release = single_release,
  874. };
  875. static struct dentry *mux_dbg_dir;
  876. static void __init omap_mux_dbg_init(void)
  877. {
  878. struct omap_mux_entry *e;
  879. mux_dbg_dir = debugfs_create_dir("omap_mux", NULL);
  880. if (!mux_dbg_dir)
  881. return;
  882. (void)debugfs_create_file("board", S_IRUGO, mux_dbg_dir,
  883. NULL, &omap_mux_dbg_board_fops);
  884. list_for_each_entry(e, &muxmodes, node) {
  885. struct omap_mux *m = &e->mux;
  886. (void)debugfs_create_file(m->muxnames[0], S_IWUGO, mux_dbg_dir,
  887. m, &omap_mux_dbg_signal_fops);
  888. }
  889. }
  890. #else
  891. static inline void omap_mux_dbg_init(void)
  892. {
  893. }
  894. #endif /* CONFIG_DEBUG_FS */
  895. static void __init omap_mux_free_names(struct omap_mux *m)
  896. {
  897. int i;
  898. for (i = 0; i < OMAP_MUX_NR_MODES; i++)
  899. kfree(m->muxnames[i]);
  900. #ifdef CONFIG_DEBUG_FS
  901. for (i = 0; i < OMAP_MUX_NR_SIDES; i++)
  902. kfree(m->balls[i]);
  903. #endif
  904. }
  905. /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
  906. static int __init omap_mux_late_init(void)
  907. {
  908. struct omap_mux_entry *e, *tmp;
  909. list_for_each_entry_safe(e, tmp, &muxmodes, node) {
  910. struct omap_mux *m = &e->mux;
  911. u16 mode = omap_mux_read(m->reg_offset);
  912. if (OMAP_MODE_GPIO(mode))
  913. continue;
  914. #ifndef CONFIG_DEBUG_FS
  915. mutex_lock(&muxmode_mutex);
  916. list_del(&e->node);
  917. mutex_unlock(&muxmode_mutex);
  918. omap_mux_free_names(m);
  919. kfree(m);
  920. #endif
  921. }
  922. omap_mux_dbg_init();
  923. return 0;
  924. }
  925. late_initcall(omap_mux_late_init);
  926. static void __init omap_mux_package_fixup(struct omap_mux *p,
  927. struct omap_mux *superset)
  928. {
  929. while (p->reg_offset != OMAP_MUX_TERMINATOR) {
  930. struct omap_mux *s = superset;
  931. int found = 0;
  932. while (s->reg_offset != OMAP_MUX_TERMINATOR) {
  933. if (s->reg_offset == p->reg_offset) {
  934. *s = *p;
  935. found++;
  936. break;
  937. }
  938. s++;
  939. }
  940. if (!found)
  941. printk(KERN_ERR "mux: Unknown entry offset 0x%x\n",
  942. p->reg_offset);
  943. p++;
  944. }
  945. }
  946. #ifdef CONFIG_DEBUG_FS
  947. static void __init omap_mux_package_init_balls(struct omap_ball *b,
  948. struct omap_mux *superset)
  949. {
  950. while (b->reg_offset != OMAP_MUX_TERMINATOR) {
  951. struct omap_mux *s = superset;
  952. int found = 0;
  953. while (s->reg_offset != OMAP_MUX_TERMINATOR) {
  954. if (s->reg_offset == b->reg_offset) {
  955. s->balls[0] = b->balls[0];
  956. s->balls[1] = b->balls[1];
  957. found++;
  958. break;
  959. }
  960. s++;
  961. }
  962. if (!found)
  963. printk(KERN_ERR "mux: Unknown ball offset 0x%x\n",
  964. b->reg_offset);
  965. b++;
  966. }
  967. }
  968. #else /* CONFIG_DEBUG_FS */
  969. static inline void omap_mux_package_init_balls(struct omap_ball *b,
  970. struct omap_mux *superset)
  971. {
  972. }
  973. #endif /* CONFIG_DEBUG_FS */
  974. static int __init omap_mux_setup(char *options)
  975. {
  976. if (!options)
  977. return 0;
  978. omap_mux_options = options;
  979. return 1;
  980. }
  981. __setup("omap_mux=", omap_mux_setup);
  982. /*
  983. * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
  984. * cmdline options only override the bootloader values.
  985. * During development, please enable CONFIG_DEBUG_FS, and use the
  986. * signal specific entries under debugfs.
  987. */
  988. static void __init omap_mux_set_cmdline_signals(void)
  989. {
  990. char *options, *next_opt, *token;
  991. if (!omap_mux_options)
  992. return;
  993. options = kmalloc(strlen(omap_mux_options) + 1, GFP_KERNEL);
  994. if (!options)
  995. return;
  996. strcpy(options, omap_mux_options);
  997. next_opt = options;
  998. while ((token = strsep(&next_opt, ",")) != NULL) {
  999. char *keyval, *name;
  1000. unsigned long val;
  1001. keyval = token;
  1002. name = strsep(&keyval, "=");
  1003. if (name) {
  1004. int res;
  1005. res = strict_strtoul(keyval, 0x10, &val);
  1006. if (res < 0)
  1007. continue;
  1008. omap_mux_init_signal(name, (u16)val);
  1009. }
  1010. }
  1011. kfree(options);
  1012. }
  1013. static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
  1014. {
  1015. while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
  1016. omap_mux_write(board_mux->value, board_mux->reg_offset);
  1017. board_mux++;
  1018. }
  1019. }
  1020. static int __init omap_mux_copy_names(struct omap_mux *src,
  1021. struct omap_mux *dst)
  1022. {
  1023. int i;
  1024. for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
  1025. if (src->muxnames[i]) {
  1026. dst->muxnames[i] =
  1027. kmalloc(strlen(src->muxnames[i]) + 1,
  1028. GFP_KERNEL);
  1029. if (!dst->muxnames[i])
  1030. goto free;
  1031. strcpy(dst->muxnames[i], src->muxnames[i]);
  1032. }
  1033. }
  1034. #ifdef CONFIG_DEBUG_FS
  1035. for (i = 0; i < OMAP_MUX_NR_SIDES; i++) {
  1036. if (src->balls[i]) {
  1037. dst->balls[i] =
  1038. kmalloc(strlen(src->balls[i]) + 1,
  1039. GFP_KERNEL);
  1040. if (!dst->balls[i])
  1041. goto free;
  1042. strcpy(dst->balls[i], src->balls[i]);
  1043. }
  1044. }
  1045. #endif
  1046. return 0;
  1047. free:
  1048. omap_mux_free_names(dst);
  1049. return -ENOMEM;
  1050. }
  1051. #endif /* CONFIG_OMAP_MUX */
  1052. static u16 omap_mux_get_by_gpio(int gpio)
  1053. {
  1054. struct omap_mux_entry *e;
  1055. u16 offset = OMAP_MUX_TERMINATOR;
  1056. list_for_each_entry(e, &muxmodes, node) {
  1057. struct omap_mux *m = &e->mux;
  1058. if (m->gpio == gpio) {
  1059. offset = m->reg_offset;
  1060. break;
  1061. }
  1062. }
  1063. return offset;
  1064. }
  1065. /* Needed for dynamic muxing of GPIO pins for off-idle */
  1066. u16 omap_mux_get_gpio(int gpio)
  1067. {
  1068. u16 offset;
  1069. offset = omap_mux_get_by_gpio(gpio);
  1070. if (offset == OMAP_MUX_TERMINATOR) {
  1071. printk(KERN_ERR "mux: Could not get gpio%i\n", gpio);
  1072. return offset;
  1073. }
  1074. return omap_mux_read(offset);
  1075. }
  1076. /* Needed for dynamic muxing of GPIO pins for off-idle */
  1077. void omap_mux_set_gpio(u16 val, int gpio)
  1078. {
  1079. u16 offset;
  1080. offset = omap_mux_get_by_gpio(gpio);
  1081. if (offset == OMAP_MUX_TERMINATOR) {
  1082. printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
  1083. return;
  1084. }
  1085. omap_mux_write(val, offset);
  1086. }
  1087. static struct omap_mux * __init omap_mux_list_add(struct omap_mux *src)
  1088. {
  1089. struct omap_mux_entry *entry;
  1090. struct omap_mux *m;
  1091. entry = kzalloc(sizeof(struct omap_mux_entry), GFP_KERNEL);
  1092. if (!entry)
  1093. return NULL;
  1094. m = &entry->mux;
  1095. memcpy(m, src, sizeof(struct omap_mux_entry));
  1096. #ifdef CONFIG_OMAP_MUX
  1097. if (omap_mux_copy_names(src, m)) {
  1098. kfree(entry);
  1099. return NULL;
  1100. }
  1101. #endif
  1102. mutex_lock(&muxmode_mutex);
  1103. list_add_tail(&entry->node, &muxmodes);
  1104. mutex_unlock(&muxmode_mutex);
  1105. return m;
  1106. }
  1107. /*
  1108. * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
  1109. * the GPIO to mux offset mapping that is needed for dynamic muxing
  1110. * of GPIO pins for off-idle.
  1111. */
  1112. static void __init omap_mux_init_list(struct omap_mux *superset)
  1113. {
  1114. while (superset->reg_offset != OMAP_MUX_TERMINATOR) {
  1115. struct omap_mux *entry;
  1116. #ifndef CONFIG_OMAP_MUX
  1117. /* Skip pins that are not muxed as GPIO by bootloader */
  1118. if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) {
  1119. superset++;
  1120. continue;
  1121. }
  1122. #endif
  1123. entry = omap_mux_list_add(superset);
  1124. if (!entry) {
  1125. printk(KERN_ERR "mux: Could not add entry\n");
  1126. return;
  1127. }
  1128. superset++;
  1129. }
  1130. }
  1131. int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
  1132. struct omap_mux *superset,
  1133. struct omap_mux *package_subset,
  1134. struct omap_board_mux *board_mux,
  1135. struct omap_ball *package_balls)
  1136. {
  1137. if (mux_base)
  1138. return -EBUSY;
  1139. mux_phys = mux_pbase;
  1140. mux_base = ioremap(mux_pbase, mux_size);
  1141. if (!mux_base) {
  1142. printk(KERN_ERR "mux: Could not ioremap\n");
  1143. return -ENODEV;
  1144. }
  1145. #ifdef CONFIG_OMAP_MUX
  1146. omap_mux_package_fixup(package_subset, superset);
  1147. omap_mux_package_init_balls(package_balls, superset);
  1148. omap_mux_set_cmdline_signals();
  1149. omap_mux_set_board_signals(board_mux);
  1150. #endif
  1151. omap_mux_init_list(superset);
  1152. return 0;
  1153. }
  1154. #endif /* CONFIG_ARCH_OMAP34XX */