common.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2013 Gateworks Corporation
  4. *
  5. * Author: Tim Harvey <tharvey@gateworks.com>
  6. */
  7. #include <common.h>
  8. #include <log.h>
  9. #include <asm/arch/clock.h>
  10. #include <asm/arch/mx6-pins.h>
  11. #include <asm/arch/sys_proto.h>
  12. #include <asm/gpio.h>
  13. #include <asm/mach-imx/mxc_i2c.h>
  14. #include <env.h>
  15. #include <fsl_esdhc_imx.h>
  16. #include <hwconfig.h>
  17. #include <linux/delay.h>
  18. #include <power/pmic.h>
  19. #include <power/ltc3676_pmic.h>
  20. #include <power/pfuze100_pmic.h>
  21. #include "common.h"
  22. /* UART2: Serial Console */
  23. static iomux_v3_cfg_t const uart2_pads[] = {
  24. IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
  25. IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
  26. };
  27. void setup_iomux_uart(void)
  28. {
  29. SETUP_IOMUX_PADS(uart2_pads);
  30. }
  31. /* MMC */
  32. static iomux_v3_cfg_t const gw5904_emmc_pads[] = {
  33. IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  34. IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  35. IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  36. IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  37. IOMUX_PADS(PAD_SD3_DAT4__SD3_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  38. IOMUX_PADS(PAD_SD3_DAT5__SD3_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  39. IOMUX_PADS(PAD_SD3_DAT6__SD3_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  40. IOMUX_PADS(PAD_SD3_DAT7__SD3_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  41. IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  42. IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  43. IOMUX_PADS(PAD_SD3_RST__SD3_RESET | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  44. };
  45. /* 4-bit microSD on SD2 */
  46. static iomux_v3_cfg_t const gw5904_mmc_pads[] = {
  47. IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  48. IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  49. IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  50. IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  51. IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  52. IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  53. /* CD */
  54. IOMUX_PADS(PAD_NANDF_CS0__GPIO6_IO11 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  55. };
  56. /* 8-bit eMMC on SD2/NAND */
  57. static iomux_v3_cfg_t const gw560x_emmc_sd2_pads[] = {
  58. IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  59. IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  60. IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  61. IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  62. IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  63. IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  64. IOMUX_PADS(PAD_NANDF_D4__SD2_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  65. IOMUX_PADS(PAD_NANDF_D5__SD2_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  66. IOMUX_PADS(PAD_NANDF_D6__SD2_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  67. IOMUX_PADS(PAD_NANDF_D7__SD2_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  68. };
  69. static iomux_v3_cfg_t const usdhc3_pads[] = {
  70. IOMUX_PADS(PAD_SD3_CLK__SD3_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  71. IOMUX_PADS(PAD_SD3_CMD__SD3_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  72. IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  73. IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  74. IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  75. IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  76. IOMUX_PADS(PAD_SD3_DAT5__GPIO7_IO00 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  77. };
  78. /*
  79. * I2C pad configs:
  80. * I2C1: GSC
  81. * I2C2: PMIC,PCIe Switch,Clock,Mezz
  82. * I2C3: Multimedia/Expansion
  83. */
  84. static struct i2c_pads_info mx6q_i2c_pad_info[] = {
  85. {
  86. .scl = {
  87. .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
  88. .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
  89. .gp = IMX_GPIO_NR(3, 21)
  90. },
  91. .sda = {
  92. .i2c_mode = MX6Q_PAD_EIM_D28__I2C1_SDA | PC,
  93. .gpio_mode = MX6Q_PAD_EIM_D28__GPIO3_IO28 | PC,
  94. .gp = IMX_GPIO_NR(3, 28)
  95. }
  96. }, {
  97. .scl = {
  98. .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
  99. .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
  100. .gp = IMX_GPIO_NR(4, 12)
  101. },
  102. .sda = {
  103. .i2c_mode = MX6Q_PAD_KEY_ROW3__I2C2_SDA | PC,
  104. .gpio_mode = MX6Q_PAD_KEY_ROW3__GPIO4_IO13 | PC,
  105. .gp = IMX_GPIO_NR(4, 13)
  106. }
  107. }, {
  108. .scl = {
  109. .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
  110. .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
  111. .gp = IMX_GPIO_NR(1, 3)
  112. },
  113. .sda = {
  114. .i2c_mode = MX6Q_PAD_GPIO_6__I2C3_SDA | PC,
  115. .gpio_mode = MX6Q_PAD_GPIO_6__GPIO1_IO06 | PC,
  116. .gp = IMX_GPIO_NR(1, 6)
  117. }
  118. }
  119. };
  120. static struct i2c_pads_info mx6dl_i2c_pad_info[] = {
  121. {
  122. .scl = {
  123. .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
  124. .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
  125. .gp = IMX_GPIO_NR(3, 21)
  126. },
  127. .sda = {
  128. .i2c_mode = MX6DL_PAD_EIM_D28__I2C1_SDA | PC,
  129. .gpio_mode = MX6DL_PAD_EIM_D28__GPIO3_IO28 | PC,
  130. .gp = IMX_GPIO_NR(3, 28)
  131. }
  132. }, {
  133. .scl = {
  134. .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
  135. .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
  136. .gp = IMX_GPIO_NR(4, 12)
  137. },
  138. .sda = {
  139. .i2c_mode = MX6DL_PAD_KEY_ROW3__I2C2_SDA | PC,
  140. .gpio_mode = MX6DL_PAD_KEY_ROW3__GPIO4_IO13 | PC,
  141. .gp = IMX_GPIO_NR(4, 13)
  142. }
  143. }, {
  144. .scl = {
  145. .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
  146. .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
  147. .gp = IMX_GPIO_NR(1, 3)
  148. },
  149. .sda = {
  150. .i2c_mode = MX6DL_PAD_GPIO_6__I2C3_SDA | PC,
  151. .gpio_mode = MX6DL_PAD_GPIO_6__GPIO1_IO06 | PC,
  152. .gp = IMX_GPIO_NR(1, 6)
  153. }
  154. }
  155. };
  156. void setup_ventana_i2c(int i2c)
  157. {
  158. struct i2c_pads_info *p;
  159. if (is_cpu_type(MXC_CPU_MX6Q))
  160. p = &mx6q_i2c_pad_info[i2c];
  161. else
  162. p = &mx6dl_i2c_pad_info[i2c];
  163. setup_i2c(i2c, CONFIG_SYS_I2C_SPEED, 0x7f, p);
  164. }
  165. /*
  166. * Baseboard specific GPIO
  167. */
  168. static iomux_v3_cfg_t const gw51xx_gpio_pads[] = {
  169. /* IOEXP_PWREN# */
  170. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  171. /* IOEXP_IRQ# */
  172. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  173. /* GPS_SHDN */
  174. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  175. /* VID_PWR */
  176. IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
  177. /* PCI_RST# */
  178. IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
  179. /* PCIESKT_WDIS# */
  180. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  181. };
  182. static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
  183. /* SD3_VSELECT */
  184. IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
  185. /* RS232_EN# */
  186. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  187. /* MSATA_EN */
  188. IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
  189. /* IOEXP_PWREN# */
  190. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  191. /* IOEXP_IRQ# */
  192. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  193. /* CAN_STBY */
  194. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  195. /* GPS_SHDN */
  196. IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
  197. /* USBOTG_SEL */
  198. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  199. /* VID_PWR */
  200. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  201. /* PCI_RST# */
  202. IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
  203. /* PCI_RST# (GW522x) */
  204. IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23 | DIO_PAD_CFG),
  205. /* RS485_EN */
  206. IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
  207. /* PCIESKT_WDIS# */
  208. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  209. };
  210. static iomux_v3_cfg_t const gw53xx_gpio_pads[] = {
  211. /* SD3_VSELECT */
  212. IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
  213. /* RS232_EN# */
  214. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  215. /* MSATA_EN */
  216. IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
  217. /* CAN_STBY */
  218. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  219. /* USB_HUBRST# */
  220. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  221. /* IOEXP_PWREN# */
  222. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  223. /* IOEXP_IRQ# */
  224. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  225. /* DIOI2C_DIS# */
  226. IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
  227. /* GPS_SHDN */
  228. IOMUX_PADS(PAD_ENET_RXD0__GPIO1_IO27 | DIO_PAD_CFG),
  229. /* VID_EN */
  230. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  231. /* PCI_RST# */
  232. IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
  233. /* RS485_EN */
  234. IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
  235. /* PCIESKT_WDIS# */
  236. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  237. };
  238. static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
  239. /* SD3_VSELECT */
  240. IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
  241. /* RS232_EN# */
  242. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  243. /* MSATA_EN */
  244. IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
  245. /* CAN_STBY */
  246. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  247. /* USB_HUBRST# */
  248. IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16 | DIO_PAD_CFG),
  249. /* MIPI_DIO */
  250. IOMUX_PADS(PAD_SD1_DAT3__GPIO1_IO21 | DIO_PAD_CFG),
  251. /* RS485_EN */
  252. IOMUX_PADS(PAD_EIM_D24__GPIO3_IO24 | DIO_PAD_CFG),
  253. /* IOEXP_PWREN# */
  254. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  255. /* IOEXP_IRQ# */
  256. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  257. /* DIOI2C_DIS# */
  258. IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
  259. /* PCI_RST# */
  260. IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
  261. /* VID_EN */
  262. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  263. /* RS485_EN */
  264. IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
  265. /* PCIESKT_WDIS# */
  266. IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
  267. };
  268. static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
  269. /* CAN_STBY */
  270. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  271. /* PCI_RST# */
  272. IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
  273. /* PCIESKT_WDIS# */
  274. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  275. };
  276. static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
  277. /* MSATA_EN */
  278. IOMUX_PADS(PAD_SD4_DAT0__GPIO2_IO08 | DIO_PAD_CFG),
  279. /* USBOTG_SEL */
  280. IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
  281. /* USB_HUBRST# */
  282. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  283. /* PCI_RST# */
  284. IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
  285. /* MX6_DIO[4:9] */
  286. IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18 | DIO_PAD_CFG),
  287. IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
  288. IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21 | DIO_PAD_CFG),
  289. IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22 | DIO_PAD_CFG),
  290. IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23 | DIO_PAD_CFG),
  291. IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25 | DIO_PAD_CFG),
  292. /* PCIEGBE1_OFF# */
  293. IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
  294. /* PCIEGBE2_OFF# */
  295. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  296. /* PCIESKT_WDIS# */
  297. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  298. };
  299. static iomux_v3_cfg_t const gw553x_gpio_pads[] = {
  300. /* SD3_VSELECT */
  301. IOMUX_PADS(PAD_NANDF_CS1__GPIO6_IO14 | DIO_PAD_CFG),
  302. /* VID_PWR */
  303. IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20 | DIO_PAD_CFG),
  304. /* PCI_RST# */
  305. IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
  306. /* PCIESKT_WDIS# */
  307. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  308. };
  309. static iomux_v3_cfg_t const gw560x_gpio_pads[] = {
  310. /* RS232_EN# */
  311. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  312. /* CAN_STBY */
  313. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  314. /* USB_HUBRST# */
  315. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  316. /* IOEXP_PWREN# */
  317. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  318. /* IOEXP_IRQ# */
  319. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  320. /* DIOI2C_DIS# */
  321. IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
  322. /* VID_EN */
  323. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  324. /* PCI_RST# */
  325. IOMUX_PADS(PAD_DISP0_DAT10__GPIO4_IO31 | DIO_PAD_CFG),
  326. /* RS485_EN */
  327. IOMUX_PADS(PAD_SD3_DAT4__GPIO7_IO01 | DIO_PAD_CFG),
  328. /* PCIESKT_WDIS# */
  329. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  330. /* USBH2_PEN (OTG) */
  331. IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
  332. /* 12V0_PWR_EN */
  333. IOMUX_PADS(PAD_DISP0_DAT5__GPIO4_IO26 | DIO_PAD_CFG),
  334. };
  335. static iomux_v3_cfg_t const gw5901_gpio_pads[] = {
  336. /* ETH1_EN */
  337. IOMUX_PADS(PAD_GPIO_1__GPIO1_IO01 | DIO_PAD_CFG),
  338. /* CAN_STBY */
  339. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  340. /* PCI_RST# */
  341. IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
  342. /* PMIC reset */
  343. IOMUX_PADS(PAD_DISP0_DAT8__WDOG1_B | DIO_PAD_CFG),
  344. /* COM_CFGA/B/C/D */
  345. IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14 | DIO_PAD_CFG),
  346. IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15 | DIO_PAD_CFG),
  347. IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16 | DIO_PAD_CFG),
  348. IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
  349. /* ETI_IRQ# */
  350. IOMUX_PADS(PAD_GPIO_5__GPIO1_IO05 | DIO_PAD_CFG),
  351. /* DIO_IRQ# */
  352. IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
  353. /* FIBER_SIGDET */
  354. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  355. };
  356. static iomux_v3_cfg_t const gw5902_gpio_pads[] = {
  357. /* CAN1_STBY */
  358. IOMUX_PADS(PAD_GPIO_2__GPIO1_IO02 | DIO_PAD_CFG),
  359. /* CAN2_STBY */
  360. IOMUX_PADS(PAD_SD3_CLK__GPIO7_IO03 | DIO_PAD_CFG),
  361. /* UART1_EN# */
  362. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  363. /* PCI_RST# */
  364. IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
  365. /* 5V_UVLO */
  366. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  367. /* ETI_IRQ# */
  368. IOMUX_PADS(PAD_GPIO_5__GPIO1_IO05 | DIO_PAD_CFG),
  369. /* DIO_IRQ# */
  370. IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
  371. /* USBOTG_PEN */
  372. IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23 | DIO_PAD_CFG),
  373. };
  374. static iomux_v3_cfg_t const gw5903_gpio_pads[] = {
  375. /* BKLT_12VEN */
  376. IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
  377. /* EMMY_PDN# */
  378. IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02 | DIO_PAD_CFG),
  379. /* EMMY_CFG1# */
  380. IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03 | DIO_PAD_CFG),
  381. /* EMMY_CFG1# */
  382. IOMUX_PADS(PAD_NANDF_D4__GPIO2_IO04 | DIO_PAD_CFG),
  383. /* USBH1_PEN (EHCI) */
  384. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  385. /* USBH2_PEN (OTG) */
  386. IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | DIO_PAD_CFG),
  387. /* USBDPC_PEN */
  388. IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
  389. /* TOUCH_RST */
  390. IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
  391. /* AUDIO_RST# */
  392. IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
  393. /* UART1_TEN# */
  394. IOMUX_PADS(PAD_CSI0_DAT12__GPIO5_IO30 | DIO_PAD_CFG),
  395. /* LVDS_BKLEN # */
  396. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  397. /* RGMII_PDWN# */
  398. IOMUX_PADS(PAD_ENET_CRS_DV__GPIO1_IO25 | DIO_PAD_CFG),
  399. /* TOUCH_IRQ# */
  400. IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
  401. /* TOUCH_RST# */
  402. IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
  403. };
  404. static iomux_v3_cfg_t const gw5904_gpio_pads[] = {
  405. /* USB_HUBRST# */
  406. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  407. /* IOEXP_PWREN# */
  408. IOMUX_PADS(PAD_EIM_A19__GPIO2_IO19 | DIO_PAD_CFG),
  409. /* IOEXP_IRQ# */
  410. IOMUX_PADS(PAD_EIM_A20__GPIO2_IO18 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
  411. /* DIOI2C_DIS# */
  412. IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
  413. /* UART_RS485 */
  414. IOMUX_PADS(PAD_DISP0_DAT2__GPIO4_IO23 | DIO_PAD_CFG),
  415. /* UART_HALF */
  416. IOMUX_PADS(PAD_DISP0_DAT3__GPIO4_IO24 | DIO_PAD_CFG),
  417. /* SKT1_WDIS# */
  418. IOMUX_PADS(PAD_DISP0_DAT17__GPIO5_IO11 | DIO_PAD_CFG),
  419. /* SKT1_RST# */
  420. IOMUX_PADS(PAD_DISP0_DAT18__GPIO5_IO12 | DIO_PAD_CFG),
  421. /* SKT2_WDIS# */
  422. IOMUX_PADS(PAD_DISP0_DAT19__GPIO5_IO13 | DIO_PAD_CFG),
  423. /* SKT2_RST# */
  424. IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
  425. /* M2_OFF# */
  426. IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | DIO_PAD_CFG),
  427. /* M2_WDIS# */
  428. IOMUX_PADS(PAD_SD2_DAT1__GPIO1_IO14 | DIO_PAD_CFG),
  429. /* M2_RST# */
  430. IOMUX_PADS(PAD_SD2_DAT2__GPIO1_IO13 | DIO_PAD_CFG),
  431. /* RS232_EN# */
  432. IOMUX_PADS(PAD_SD4_DAT3__GPIO2_IO11 | DIO_PAD_CFG),
  433. };
  434. static iomux_v3_cfg_t const gw5905_gpio_pads[] = {
  435. /* EMMY_PDN# */
  436. IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03 | DIO_PAD_CFG),
  437. /* MIPI_RST */
  438. IOMUX_PADS(PAD_SD2_DAT0__GPIO1_IO15 | DIO_PAD_CFG),
  439. /* MIPI_PWDN */
  440. IOMUX_PADS(PAD_SD2_DAT1__GPIO1_IO14 | DIO_PAD_CFG),
  441. /* USBEHCI_SEL */
  442. IOMUX_PADS(PAD_GPIO_7__GPIO1_IO07 | DIO_PAD_CFG),
  443. /* PCI_RST# */
  444. IOMUX_PADS(PAD_GPIO_16__GPIO7_IO11 | DIO_PAD_CFG),
  445. /* LVDS_BKLEN # */
  446. IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
  447. /* PCIESKT_WDIS# */
  448. IOMUX_PADS(PAD_GPIO_18__GPIO7_IO13 | DIO_PAD_CFG),
  449. /* SPK_SHDN# */
  450. IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
  451. /* DECT_RST# */
  452. IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14 | DIO_PAD_CFG),
  453. /* USBH1_PEN (EHCI) */
  454. IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
  455. /* LVDS_PWM */
  456. IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09 | DIO_PAD_CFG),
  457. /* CODEC_RST */
  458. IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
  459. /* GYRO_CONTROL/DATA_EN */
  460. IOMUX_PADS(PAD_CSI0_DAT8__GPIO5_IO26 | DIO_PAD_CFG),
  461. /* TOUCH_RST */
  462. IOMUX_PADS(PAD_KEY_COL1__GPIO4_IO08 | DIO_PAD_CFG),
  463. /* TOUCH_IRQ */
  464. IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
  465. };
  466. /* Digital I/O */
  467. struct dio_cfg gw51xx_dio[] = {
  468. {
  469. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  470. IMX_GPIO_NR(1, 16),
  471. { 0, 0 },
  472. 0
  473. },
  474. {
  475. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  476. IMX_GPIO_NR(1, 19),
  477. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  478. 2
  479. },
  480. {
  481. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  482. IMX_GPIO_NR(1, 17),
  483. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  484. 3
  485. },
  486. {
  487. { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
  488. IMX_GPIO_NR(1, 18),
  489. { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
  490. 4
  491. },
  492. };
  493. struct dio_cfg gw52xx_dio[] = {
  494. {
  495. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  496. IMX_GPIO_NR(1, 16),
  497. { 0, 0 },
  498. 0
  499. },
  500. {
  501. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  502. IMX_GPIO_NR(1, 19),
  503. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  504. 2
  505. },
  506. {
  507. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  508. IMX_GPIO_NR(1, 17),
  509. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  510. 3
  511. },
  512. {
  513. { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  514. IMX_GPIO_NR(1, 20),
  515. { 0, 0 },
  516. 0
  517. },
  518. };
  519. struct dio_cfg gw53xx_dio[] = {
  520. {
  521. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  522. IMX_GPIO_NR(1, 16),
  523. { 0, 0 },
  524. 0
  525. },
  526. {
  527. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  528. IMX_GPIO_NR(1, 19),
  529. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  530. 2
  531. },
  532. {
  533. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  534. IMX_GPIO_NR(1, 17),
  535. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  536. 3
  537. },
  538. {
  539. {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  540. IMX_GPIO_NR(1, 20),
  541. { 0, 0 },
  542. 0
  543. },
  544. };
  545. struct dio_cfg gw54xx_dio[] = {
  546. {
  547. { IOMUX_PADS(PAD_GPIO_9__GPIO1_IO09) },
  548. IMX_GPIO_NR(1, 9),
  549. { IOMUX_PADS(PAD_GPIO_9__PWM1_OUT) },
  550. 1
  551. },
  552. {
  553. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  554. IMX_GPIO_NR(1, 19),
  555. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  556. 2
  557. },
  558. {
  559. { IOMUX_PADS(PAD_SD4_DAT1__GPIO2_IO09) },
  560. IMX_GPIO_NR(2, 9),
  561. { IOMUX_PADS(PAD_SD4_DAT1__PWM3_OUT) },
  562. 3
  563. },
  564. {
  565. { IOMUX_PADS(PAD_SD4_DAT2__GPIO2_IO10) },
  566. IMX_GPIO_NR(2, 10),
  567. { IOMUX_PADS(PAD_SD4_DAT2__PWM4_OUT) },
  568. 4
  569. },
  570. };
  571. struct dio_cfg gw551x_dio[] = {
  572. {
  573. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  574. IMX_GPIO_NR(1, 19),
  575. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  576. 2
  577. },
  578. {
  579. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  580. IMX_GPIO_NR(1, 17),
  581. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  582. 3
  583. },
  584. };
  585. struct dio_cfg gw552x_dio[] = {
  586. {
  587. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  588. IMX_GPIO_NR(1, 16),
  589. { 0, 0 },
  590. 0
  591. },
  592. {
  593. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  594. IMX_GPIO_NR(1, 19),
  595. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  596. 2
  597. },
  598. {
  599. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  600. IMX_GPIO_NR(1, 17),
  601. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  602. 3
  603. },
  604. {
  605. {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  606. IMX_GPIO_NR(1, 20),
  607. { 0, 0 },
  608. 0
  609. },
  610. {
  611. {IOMUX_PADS(PAD_CSI0_PIXCLK__GPIO5_IO18) },
  612. IMX_GPIO_NR(5, 18),
  613. { 0, 0 },
  614. 0
  615. },
  616. {
  617. {IOMUX_PADS(PAD_CSI0_DATA_EN__GPIO5_IO20) },
  618. IMX_GPIO_NR(5, 20),
  619. { 0, 0 },
  620. 0
  621. },
  622. {
  623. {IOMUX_PADS(PAD_CSI0_VSYNC__GPIO5_IO21) },
  624. IMX_GPIO_NR(5, 21),
  625. { 0, 0 },
  626. 0
  627. },
  628. {
  629. {IOMUX_PADS(PAD_CSI0_DAT4__GPIO5_IO22) },
  630. IMX_GPIO_NR(5, 22),
  631. { 0, 0 },
  632. 0
  633. },
  634. {
  635. {IOMUX_PADS(PAD_CSI0_DAT5__GPIO5_IO23) },
  636. IMX_GPIO_NR(5, 23),
  637. { 0, 0 },
  638. 0
  639. },
  640. {
  641. {IOMUX_PADS(PAD_CSI0_DAT7__GPIO5_IO25) },
  642. IMX_GPIO_NR(5, 25),
  643. { 0, 0 },
  644. 0
  645. },
  646. };
  647. struct dio_cfg gw553x_dio[] = {
  648. {
  649. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  650. IMX_GPIO_NR(1, 16),
  651. { 0, 0 },
  652. 0
  653. },
  654. {
  655. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  656. IMX_GPIO_NR(1, 19),
  657. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  658. 2
  659. },
  660. {
  661. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  662. IMX_GPIO_NR(1, 17),
  663. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  664. 3
  665. },
  666. {
  667. { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
  668. IMX_GPIO_NR(1, 18),
  669. { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
  670. 4
  671. },
  672. };
  673. struct dio_cfg gw560x_dio[] = {
  674. {
  675. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  676. IMX_GPIO_NR(1, 16),
  677. { 0, 0 },
  678. 0
  679. },
  680. {
  681. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  682. IMX_GPIO_NR(1, 19),
  683. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  684. 2
  685. },
  686. {
  687. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  688. IMX_GPIO_NR(1, 17),
  689. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  690. 3
  691. },
  692. {
  693. {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  694. IMX_GPIO_NR(1, 20),
  695. { 0, 0 },
  696. 0
  697. },
  698. };
  699. struct dio_cfg gw5901_dio[] = {
  700. {
  701. { IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14) },
  702. IMX_GPIO_NR(5, 14),
  703. { 0, 0 },
  704. 0
  705. },
  706. {
  707. { IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15) },
  708. IMX_GPIO_NR(5, 15),
  709. { 0, 0 },
  710. 0
  711. },
  712. {
  713. { IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16) },
  714. IMX_GPIO_NR(5, 16),
  715. { 0, 0 },
  716. 0
  717. },
  718. {
  719. { IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17) },
  720. IMX_GPIO_NR(5, 17),
  721. { 0, 0 },
  722. 0
  723. },
  724. };
  725. struct dio_cfg gw5902_dio[] = {
  726. {
  727. { IOMUX_PADS(PAD_DISP0_DAT20__GPIO5_IO14) },
  728. IMX_GPIO_NR(5, 14),
  729. { 0, 0 },
  730. 0
  731. },
  732. {
  733. { IOMUX_PADS(PAD_DISP0_DAT21__GPIO5_IO15) },
  734. IMX_GPIO_NR(5, 15),
  735. { 0, 0 },
  736. 0
  737. },
  738. {
  739. { IOMUX_PADS(PAD_DISP0_DAT22__GPIO5_IO16) },
  740. IMX_GPIO_NR(5, 16),
  741. { 0, 0 },
  742. 0
  743. },
  744. {
  745. { IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17) },
  746. IMX_GPIO_NR(5, 17),
  747. { 0, 0 },
  748. 0
  749. },
  750. };
  751. struct dio_cfg gw5903_dio[] = {
  752. };
  753. struct dio_cfg gw5904_dio[] = {
  754. {
  755. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  756. IMX_GPIO_NR(1, 16),
  757. { 0, 0 },
  758. 0
  759. },
  760. {
  761. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  762. IMX_GPIO_NR(1, 19),
  763. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  764. 2
  765. },
  766. {
  767. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  768. IMX_GPIO_NR(1, 17),
  769. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  770. 3
  771. },
  772. {
  773. {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  774. IMX_GPIO_NR(1, 20),
  775. { 0, 0 },
  776. 0
  777. },
  778. {
  779. {IOMUX_PADS(PAD_NANDF_D0__GPIO2_IO00) },
  780. IMX_GPIO_NR(2, 0),
  781. { 0, 0 },
  782. 0
  783. },
  784. {
  785. {IOMUX_PADS(PAD_NANDF_D1__GPIO2_IO01) },
  786. IMX_GPIO_NR(2, 1),
  787. { 0, 0 },
  788. 0
  789. },
  790. {
  791. {IOMUX_PADS(PAD_NANDF_D2__GPIO2_IO02) },
  792. IMX_GPIO_NR(2, 2),
  793. { 0, 0 },
  794. 0
  795. },
  796. {
  797. {IOMUX_PADS(PAD_NANDF_D3__GPIO2_IO03) },
  798. IMX_GPIO_NR(2, 3),
  799. { 0, 0 },
  800. 0
  801. },
  802. {
  803. {IOMUX_PADS(PAD_NANDF_D4__GPIO2_IO04) },
  804. IMX_GPIO_NR(2, 4),
  805. { 0, 0 },
  806. 0
  807. },
  808. {
  809. {IOMUX_PADS(PAD_NANDF_D5__GPIO2_IO05) },
  810. IMX_GPIO_NR(2, 5),
  811. { 0, 0 },
  812. 0
  813. },
  814. {
  815. {IOMUX_PADS(PAD_NANDF_D6__GPIO2_IO06) },
  816. IMX_GPIO_NR(2, 6),
  817. { 0, 0 },
  818. 0
  819. },
  820. {
  821. {IOMUX_PADS(PAD_NANDF_D7__GPIO2_IO07) },
  822. IMX_GPIO_NR(2, 7),
  823. { 0, 0 },
  824. 0
  825. },
  826. };
  827. struct dio_cfg gw5906_dio[] = {
  828. {
  829. { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
  830. IMX_GPIO_NR(1, 16),
  831. { 0, 0 },
  832. 0
  833. },
  834. {
  835. { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
  836. IMX_GPIO_NR(1, 19),
  837. { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
  838. 2
  839. },
  840. {
  841. { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
  842. IMX_GPIO_NR(1, 17),
  843. { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
  844. 3
  845. },
  846. {
  847. {IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
  848. IMX_GPIO_NR(1, 20),
  849. { 0, 0 },
  850. 0
  851. },
  852. };
  853. /*
  854. * Board Specific GPIO
  855. */
  856. struct ventana gpio_cfg[GW_UNKNOWN] = {
  857. /* GW5400proto */
  858. {
  859. .gpio_pads = gw54xx_gpio_pads,
  860. .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
  861. .dio_cfg = gw54xx_dio,
  862. .dio_num = ARRAY_SIZE(gw54xx_dio),
  863. .pcie_rst = IMX_GPIO_NR(1, 29),
  864. .mezz_pwren = IMX_GPIO_NR(4, 7),
  865. .mezz_irq = IMX_GPIO_NR(4, 9),
  866. .rs485en = IMX_GPIO_NR(3, 24),
  867. .dioi2c_en = IMX_GPIO_NR(4, 5),
  868. .pcie_sson = IMX_GPIO_NR(1, 20),
  869. .mmc_cd = IMX_GPIO_NR(7, 0),
  870. },
  871. /* GW51xx */
  872. {
  873. .gpio_pads = gw51xx_gpio_pads,
  874. .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
  875. .dio_cfg = gw51xx_dio,
  876. .dio_num = ARRAY_SIZE(gw51xx_dio),
  877. .pcie_rst = IMX_GPIO_NR(1, 0),
  878. .mezz_pwren = IMX_GPIO_NR(2, 19),
  879. .mezz_irq = IMX_GPIO_NR(2, 18),
  880. .gps_shdn = IMX_GPIO_NR(1, 2),
  881. .vidin_en = IMX_GPIO_NR(5, 20),
  882. .wdis = IMX_GPIO_NR(7, 12),
  883. },
  884. /* GW52xx */
  885. {
  886. .gpio_pads = gw52xx_gpio_pads,
  887. .num_pads = ARRAY_SIZE(gw52xx_gpio_pads)/2,
  888. .dio_cfg = gw52xx_dio,
  889. .dio_num = ARRAY_SIZE(gw52xx_dio),
  890. .pcie_rst = IMX_GPIO_NR(1, 29),
  891. .mezz_pwren = IMX_GPIO_NR(2, 19),
  892. .mezz_irq = IMX_GPIO_NR(2, 18),
  893. .gps_shdn = IMX_GPIO_NR(1, 27),
  894. .vidin_en = IMX_GPIO_NR(3, 31),
  895. .usb_sel = IMX_GPIO_NR(1, 2),
  896. .wdis = IMX_GPIO_NR(7, 12),
  897. .msata_en = GP_MSATA_SEL,
  898. .rs232_en = GP_RS232_EN,
  899. .vsel_pin = IMX_GPIO_NR(6, 14),
  900. .mmc_cd = IMX_GPIO_NR(7, 0),
  901. },
  902. /* GW53xx */
  903. {
  904. .gpio_pads = gw53xx_gpio_pads,
  905. .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
  906. .dio_cfg = gw53xx_dio,
  907. .dio_num = ARRAY_SIZE(gw53xx_dio),
  908. .pcie_rst = IMX_GPIO_NR(1, 29),
  909. .mezz_pwren = IMX_GPIO_NR(2, 19),
  910. .mezz_irq = IMX_GPIO_NR(2, 18),
  911. .gps_shdn = IMX_GPIO_NR(1, 27),
  912. .vidin_en = IMX_GPIO_NR(3, 31),
  913. .wdis = IMX_GPIO_NR(7, 12),
  914. .msata_en = GP_MSATA_SEL,
  915. .rs232_en = GP_RS232_EN,
  916. .vsel_pin = IMX_GPIO_NR(6, 14),
  917. .mmc_cd = IMX_GPIO_NR(7, 0),
  918. },
  919. /* GW54xx */
  920. {
  921. .gpio_pads = gw54xx_gpio_pads,
  922. .num_pads = ARRAY_SIZE(gw54xx_gpio_pads)/2,
  923. .dio_cfg = gw54xx_dio,
  924. .dio_num = ARRAY_SIZE(gw54xx_dio),
  925. .pcie_rst = IMX_GPIO_NR(1, 29),
  926. .mezz_pwren = IMX_GPIO_NR(2, 19),
  927. .mezz_irq = IMX_GPIO_NR(2, 18),
  928. .rs485en = IMX_GPIO_NR(7, 1),
  929. .vidin_en = IMX_GPIO_NR(3, 31),
  930. .dioi2c_en = IMX_GPIO_NR(4, 5),
  931. .pcie_sson = IMX_GPIO_NR(1, 20),
  932. .wdis = IMX_GPIO_NR(5, 17),
  933. .msata_en = GP_MSATA_SEL,
  934. .rs232_en = GP_RS232_EN,
  935. .vsel_pin = IMX_GPIO_NR(6, 14),
  936. .mmc_cd = IMX_GPIO_NR(7, 0),
  937. },
  938. /* GW551x */
  939. {
  940. .gpio_pads = gw551x_gpio_pads,
  941. .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
  942. .dio_cfg = gw551x_dio,
  943. .dio_num = ARRAY_SIZE(gw551x_dio),
  944. .pcie_rst = IMX_GPIO_NR(1, 0),
  945. .wdis = IMX_GPIO_NR(7, 12),
  946. },
  947. /* GW552x */
  948. {
  949. .gpio_pads = gw552x_gpio_pads,
  950. .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
  951. .dio_cfg = gw552x_dio,
  952. .dio_num = ARRAY_SIZE(gw552x_dio),
  953. .pcie_rst = IMX_GPIO_NR(1, 29),
  954. .usb_sel = IMX_GPIO_NR(1, 7),
  955. .wdis = IMX_GPIO_NR(7, 12),
  956. .msata_en = GP_MSATA_SEL,
  957. },
  958. /* GW553x */
  959. {
  960. .gpio_pads = gw553x_gpio_pads,
  961. .num_pads = ARRAY_SIZE(gw553x_gpio_pads)/2,
  962. .dio_cfg = gw553x_dio,
  963. .dio_num = ARRAY_SIZE(gw553x_dio),
  964. .pcie_rst = IMX_GPIO_NR(1, 0),
  965. .vidin_en = IMX_GPIO_NR(5, 20),
  966. .wdis = IMX_GPIO_NR(7, 12),
  967. .vsel_pin = IMX_GPIO_NR(6, 14),
  968. .mmc_cd = IMX_GPIO_NR(7, 0),
  969. },
  970. /* GW560x */
  971. {
  972. .gpio_pads = gw560x_gpio_pads,
  973. .num_pads = ARRAY_SIZE(gw560x_gpio_pads)/2,
  974. .dio_cfg = gw560x_dio,
  975. .dio_num = ARRAY_SIZE(gw560x_dio),
  976. .pcie_rst = IMX_GPIO_NR(4, 31),
  977. .mezz_pwren = IMX_GPIO_NR(2, 19),
  978. .mezz_irq = IMX_GPIO_NR(2, 18),
  979. .rs232_en = GP_RS232_EN,
  980. .vidin_en = IMX_GPIO_NR(3, 31),
  981. .wdis = IMX_GPIO_NR(7, 12),
  982. .mmc_cd = IMX_GPIO_NR(7, 0),
  983. },
  984. /* GW5901 */
  985. {
  986. .gpio_pads = gw5901_gpio_pads,
  987. .num_pads = ARRAY_SIZE(gw5901_gpio_pads)/2,
  988. .dio_cfg = gw5901_dio,
  989. .pcie_rst = IMX_GPIO_NR(1, 29),
  990. },
  991. /* GW5902 */
  992. {
  993. .gpio_pads = gw5902_gpio_pads,
  994. .num_pads = ARRAY_SIZE(gw5902_gpio_pads)/2,
  995. .dio_cfg = gw5902_dio,
  996. .pcie_rst = IMX_GPIO_NR(1, 0),
  997. .rs232_en = GP_RS232_EN,
  998. },
  999. /* GW5903 */
  1000. {
  1001. .gpio_pads = gw5903_gpio_pads,
  1002. .num_pads = ARRAY_SIZE(gw5903_gpio_pads)/2,
  1003. .dio_cfg = gw5903_dio,
  1004. .dio_num = ARRAY_SIZE(gw5903_dio),
  1005. .mmc_cd = IMX_GPIO_NR(6, 11),
  1006. },
  1007. /* GW5904 */
  1008. {
  1009. .gpio_pads = gw5904_gpio_pads,
  1010. .num_pads = ARRAY_SIZE(gw5904_gpio_pads)/2,
  1011. .dio_cfg = gw5904_dio,
  1012. .dio_num = ARRAY_SIZE(gw5904_dio),
  1013. .pcie_rst = IMX_GPIO_NR(1, 0),
  1014. .mezz_pwren = IMX_GPIO_NR(2, 19),
  1015. .mezz_irq = IMX_GPIO_NR(2, 18),
  1016. },
  1017. /* GW5905 */
  1018. {
  1019. .gpio_pads = gw5905_gpio_pads,
  1020. .num_pads = ARRAY_SIZE(gw5905_gpio_pads)/2,
  1021. .pcie_rst = IMX_GPIO_NR(7, 11),
  1022. .wdis = IMX_GPIO_NR(7, 13),
  1023. },
  1024. /* GW5906 */
  1025. {
  1026. .gpio_pads = gw552x_gpio_pads,
  1027. .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
  1028. .dio_cfg = gw5906_dio,
  1029. .dio_num = ARRAY_SIZE(gw5906_dio),
  1030. .pcie_rst = IMX_GPIO_NR(1, 29),
  1031. .usb_sel = IMX_GPIO_NR(1, 7),
  1032. .wdis = IMX_GPIO_NR(7, 12),
  1033. .msata_en = GP_MSATA_SEL,
  1034. },
  1035. /* GW5907 */
  1036. {
  1037. .gpio_pads = gw51xx_gpio_pads,
  1038. .num_pads = ARRAY_SIZE(gw51xx_gpio_pads)/2,
  1039. .dio_cfg = gw51xx_dio,
  1040. .dio_num = ARRAY_SIZE(gw51xx_dio),
  1041. .pcie_rst = IMX_GPIO_NR(1, 0),
  1042. .wdis = IMX_GPIO_NR(7, 12),
  1043. },
  1044. /* GW5908 */
  1045. {
  1046. .gpio_pads = gw53xx_gpio_pads,
  1047. .num_pads = ARRAY_SIZE(gw53xx_gpio_pads)/2,
  1048. .dio_cfg = gw53xx_dio,
  1049. .dio_num = ARRAY_SIZE(gw53xx_dio),
  1050. .pcie_rst = IMX_GPIO_NR(1, 29),
  1051. .mezz_pwren = IMX_GPIO_NR(2, 19),
  1052. .mezz_irq = IMX_GPIO_NR(2, 18),
  1053. .gps_shdn = IMX_GPIO_NR(1, 27),
  1054. .vidin_en = IMX_GPIO_NR(3, 31),
  1055. .wdis = IMX_GPIO_NR(7, 12),
  1056. .msata_en = GP_MSATA_SEL,
  1057. .rs232_en = GP_RS232_EN,
  1058. },
  1059. /* GW5909 */
  1060. {
  1061. .gpio_pads = gw5904_gpio_pads,
  1062. .num_pads = ARRAY_SIZE(gw5904_gpio_pads)/2,
  1063. .dio_cfg = gw5904_dio,
  1064. .dio_num = ARRAY_SIZE(gw5904_dio),
  1065. .pcie_rst = IMX_GPIO_NR(1, 0),
  1066. .mezz_pwren = IMX_GPIO_NR(2, 19),
  1067. .mezz_irq = IMX_GPIO_NR(2, 18),
  1068. },
  1069. };
  1070. #define SETUP_GPIO_OUTPUT(gpio, name, level) \
  1071. gpio_request(gpio, name); \
  1072. gpio_direction_output(gpio, level);
  1073. #define SETUP_GPIO_INPUT(gpio, name) \
  1074. gpio_request(gpio, name); \
  1075. gpio_direction_input(gpio);
  1076. void setup_iomux_gpio(int board, struct ventana_board_info *info)
  1077. {
  1078. if (board >= GW_UNKNOWN)
  1079. return;
  1080. /* board specific iomux */
  1081. imx_iomux_v3_setup_multiple_pads(gpio_cfg[board].gpio_pads,
  1082. gpio_cfg[board].num_pads);
  1083. /* RS232_EN# */
  1084. if (gpio_cfg[board].rs232_en) {
  1085. gpio_request(gpio_cfg[board].rs232_en, "rs232_en#");
  1086. gpio_direction_output(gpio_cfg[board].rs232_en, 0);
  1087. }
  1088. /* GW522x Uses GPIO3_IO23 for PCIE_RST# */
  1089. if (board == GW52xx && info->model[4] == '2')
  1090. gpio_cfg[board].pcie_rst = IMX_GPIO_NR(3, 23);
  1091. /* assert PCI_RST# */
  1092. gpio_request(gpio_cfg[board].pcie_rst, "pci_rst#");
  1093. gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
  1094. /* MSATA Enable - default to PCI */
  1095. if (gpio_cfg[board].msata_en) {
  1096. gpio_request(gpio_cfg[board].msata_en, "msata_en");
  1097. gpio_direction_output(gpio_cfg[board].msata_en, 0);
  1098. }
  1099. /* Expansion Mezzanine IO */
  1100. if (gpio_cfg[board].mezz_pwren) {
  1101. gpio_request(gpio_cfg[board].mezz_pwren, "mezz_pwr");
  1102. gpio_direction_output(gpio_cfg[board].mezz_pwren, 0);
  1103. }
  1104. if (gpio_cfg[board].mezz_irq) {
  1105. gpio_request(gpio_cfg[board].mezz_irq, "mezz_irq#");
  1106. gpio_direction_input(gpio_cfg[board].mezz_irq);
  1107. }
  1108. /* RS485 Transmit Enable */
  1109. if (gpio_cfg[board].rs485en) {
  1110. gpio_request(gpio_cfg[board].rs485en, "rs485_en");
  1111. gpio_direction_output(gpio_cfg[board].rs485en, 0);
  1112. }
  1113. /* GPS_SHDN */
  1114. if (gpio_cfg[board].gps_shdn) {
  1115. gpio_request(gpio_cfg[board].gps_shdn, "gps_shdn");
  1116. gpio_direction_output(gpio_cfg[board].gps_shdn, 1);
  1117. }
  1118. /* Analog video codec power enable */
  1119. if (gpio_cfg[board].vidin_en) {
  1120. gpio_request(gpio_cfg[board].vidin_en, "anavidin_en");
  1121. gpio_direction_output(gpio_cfg[board].vidin_en, 1);
  1122. }
  1123. /* DIOI2C_DIS# */
  1124. if (gpio_cfg[board].dioi2c_en) {
  1125. gpio_request(gpio_cfg[board].dioi2c_en, "dioi2c_dis#");
  1126. gpio_direction_output(gpio_cfg[board].dioi2c_en, 0);
  1127. }
  1128. /* PCICK_SSON: disable spread-spectrum clock */
  1129. if (gpio_cfg[board].pcie_sson) {
  1130. gpio_request(gpio_cfg[board].pcie_sson, "pci_sson");
  1131. gpio_direction_output(gpio_cfg[board].pcie_sson, 0);
  1132. }
  1133. /* USBOTG mux routing */
  1134. if (gpio_cfg[board].usb_sel) {
  1135. gpio_request(gpio_cfg[board].usb_sel, "usb_pcisel");
  1136. gpio_direction_output(gpio_cfg[board].usb_sel, 0);
  1137. }
  1138. /* PCISKT_WDIS# (Wireless disable GPIO to miniPCIe sockets) */
  1139. if (gpio_cfg[board].wdis) {
  1140. gpio_request(gpio_cfg[board].wdis, "wlan_dis");
  1141. gpio_direction_output(gpio_cfg[board].wdis, 1);
  1142. }
  1143. /* sense vselect pin to see if we support uhs-i */
  1144. if (gpio_cfg[board].vsel_pin) {
  1145. gpio_request(gpio_cfg[board].vsel_pin, "sd3_vselect");
  1146. gpio_direction_input(gpio_cfg[board].vsel_pin);
  1147. gpio_cfg[board].usd_vsel = !gpio_get_value(gpio_cfg[board].vsel_pin);
  1148. }
  1149. /* microSD CD */
  1150. if (gpio_cfg[board].mmc_cd) {
  1151. gpio_request(gpio_cfg[board].mmc_cd, "sd_cd");
  1152. gpio_direction_input(gpio_cfg[board].mmc_cd);
  1153. }
  1154. /* Anything else board specific */
  1155. switch(board) {
  1156. case GW560x:
  1157. gpio_request(IMX_GPIO_NR(4, 26), "12p0_en");
  1158. gpio_direction_output(IMX_GPIO_NR(4, 26), 1);
  1159. break;
  1160. case GW5901:
  1161. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 2), "can_stby", 0);
  1162. break;
  1163. case GW5902:
  1164. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 2), "can1_stby", 0);
  1165. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 3), "can2_stby", 0);
  1166. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 12), "5P0V_EN", 1);
  1167. break;
  1168. case GW5903:
  1169. gpio_request(IMX_GPIO_NR(3, 31) , "usbh1-ehci_pwr");
  1170. gpio_direction_output(IMX_GPIO_NR(3, 31), 1);
  1171. gpio_request(IMX_GPIO_NR(4, 15) , "usbh2-otg_pwr");
  1172. gpio_direction_output(IMX_GPIO_NR(4, 15), 1);
  1173. gpio_request(IMX_GPIO_NR(4, 7) , "usbdpc_pwr");
  1174. gpio_direction_output(IMX_GPIO_NR(4, 15), 1);
  1175. gpio_request(IMX_GPIO_NR(1, 25) , "rgmii_en");
  1176. gpio_direction_output(IMX_GPIO_NR(1, 25), 1);
  1177. gpio_request(IMX_GPIO_NR(4, 6) , "touch_irq#");
  1178. gpio_direction_input(IMX_GPIO_NR(4, 6));
  1179. gpio_request(IMX_GPIO_NR(4, 8) , "touch_rst");
  1180. gpio_direction_output(IMX_GPIO_NR(4, 8), 1);
  1181. gpio_request(IMX_GPIO_NR(1, 7) , "bklt_12ven");
  1182. gpio_direction_output(IMX_GPIO_NR(1, 7), 1);
  1183. break;
  1184. case GW5909:
  1185. case GW5904:
  1186. gpio_request(IMX_GPIO_NR(4, 23), "rs485_en");
  1187. gpio_direction_output(IMX_GPIO_NR(4, 23), 0);
  1188. gpio_request(IMX_GPIO_NR(5, 11), "skt1_wdis#");
  1189. gpio_direction_output(IMX_GPIO_NR(5, 11), 1);
  1190. gpio_request(IMX_GPIO_NR(5, 12), "skt1_rst#");
  1191. gpio_direction_output(IMX_GPIO_NR(5, 12), 1);
  1192. gpio_request(IMX_GPIO_NR(5, 13), "skt2_wdis#");
  1193. gpio_direction_output(IMX_GPIO_NR(5, 13), 1);
  1194. gpio_request(IMX_GPIO_NR(1, 15), "m2_off#");
  1195. gpio_direction_output(IMX_GPIO_NR(1, 15), 1);
  1196. gpio_request(IMX_GPIO_NR(1, 14), "m2_wdis#");
  1197. gpio_direction_output(IMX_GPIO_NR(1, 14), 1);
  1198. gpio_request(IMX_GPIO_NR(1, 13), "m2_rst#");
  1199. gpio_direction_output(IMX_GPIO_NR(1, 13), 1);
  1200. break;
  1201. case GW5905:
  1202. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 7), "usb_pcisel", 0);
  1203. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 9), "lvds_cabc", 1);
  1204. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 14), "mipi_pdwn", 1);
  1205. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(1, 15), "mipi_rst#", 0);
  1206. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(2, 3), "emmy_pdwn#", 1);
  1207. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 5), "spk_shdn#", 0);
  1208. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 8), "touch_rst", 0);
  1209. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 6), "touch_irq", 0);
  1210. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 5), "flash_en1", 0);
  1211. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 6), "flash_en2", 0);
  1212. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 14), "dect_rst#", 1);
  1213. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 17), "codec_rst#", 0);
  1214. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(5, 26), "imu_den", 1);
  1215. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(7, 12), "lvds_cabc", 0);
  1216. mdelay(100);
  1217. /*
  1218. * gauruntee touch controller comes out of reset with INT
  1219. * low for address
  1220. */
  1221. SETUP_GPIO_OUTPUT(IMX_GPIO_NR(4, 8), "touch_rst", 1);
  1222. break;
  1223. }
  1224. }
  1225. /* setup GPIO pinmux and default configuration per baseboard and env */
  1226. void setup_board_gpio(int board, struct ventana_board_info *info)
  1227. {
  1228. const char *s;
  1229. char arg[10];
  1230. size_t len;
  1231. int i;
  1232. int quiet = simple_strtol(env_get("quiet"), NULL, 10);
  1233. if (board >= GW_UNKNOWN)
  1234. return;
  1235. /* RS232_EN# */
  1236. if (gpio_cfg[board].rs232_en) {
  1237. gpio_direction_output(gpio_cfg[board].rs232_en,
  1238. (hwconfig("rs232")) ? 0 : 1);
  1239. }
  1240. /* MSATA Enable */
  1241. if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
  1242. gpio_direction_output(GP_MSATA_SEL,
  1243. (hwconfig("msata")) ? 1 : 0);
  1244. }
  1245. /* USBOTG Select (PCISKT or FrontPanel) */
  1246. if (gpio_cfg[board].usb_sel) {
  1247. gpio_direction_output(gpio_cfg[board].usb_sel,
  1248. (hwconfig("usb_pcisel")) ? 1 : 0);
  1249. }
  1250. /*
  1251. * Configure DIO pinmux/padctl registers
  1252. * see IMX6DQRM/IMX6SDLRM IOMUXC_SW_PAD_CTL_PAD_* register definitions
  1253. */
  1254. for (i = 0; i < gpio_cfg[board].dio_num; i++) {
  1255. struct dio_cfg *cfg = &gpio_cfg[board].dio_cfg[i];
  1256. iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
  1257. unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
  1258. if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
  1259. continue;
  1260. sprintf(arg, "dio%d", i);
  1261. if (!hwconfig(arg))
  1262. continue;
  1263. s = hwconfig_subarg(arg, "padctrl", &len);
  1264. if (s) {
  1265. ctrl = MUX_PAD_CTRL(hextoul(s, NULL)
  1266. & 0x1ffff) | MUX_MODE_SION;
  1267. }
  1268. if (hwconfig_subarg_cmp(arg, "mode", "gpio")) {
  1269. if (!quiet) {
  1270. printf("DIO%d: GPIO%d_IO%02d (gpio-%d)\n", i,
  1271. (cfg->gpio_param/32)+1,
  1272. cfg->gpio_param%32,
  1273. cfg->gpio_param);
  1274. }
  1275. imx_iomux_v3_setup_pad(cfg->gpio_padmux[cputype] |
  1276. ctrl);
  1277. gpio_requestf(cfg->gpio_param, "dio%d", i);
  1278. gpio_direction_input(cfg->gpio_param);
  1279. } else if (hwconfig_subarg_cmp(arg, "mode", "pwm") &&
  1280. cfg->pwm_padmux) {
  1281. if (!cfg->pwm_param) {
  1282. printf("DIO%d: Error: pwm config invalid\n",
  1283. i);
  1284. continue;
  1285. }
  1286. if (!quiet)
  1287. printf("DIO%d: pwm%d\n", i, cfg->pwm_param);
  1288. imx_iomux_v3_setup_pad(cfg->pwm_padmux[cputype] |
  1289. MUX_PAD_CTRL(ctrl));
  1290. }
  1291. }
  1292. if (!quiet) {
  1293. if (gpio_cfg[board].msata_en && is_cpu_type(MXC_CPU_MX6Q)) {
  1294. printf("MSATA: %s\n", (hwconfig("msata") ?
  1295. "enabled" : "disabled"));
  1296. }
  1297. if (gpio_cfg[board].rs232_en) {
  1298. printf("RS232: %s\n", (hwconfig("rs232")) ?
  1299. "enabled" : "disabled");
  1300. }
  1301. }
  1302. }
  1303. /* setup board specific PMIC */
  1304. void setup_pmic(void)
  1305. {
  1306. struct pmic *p;
  1307. struct ventana_board_info ventana_info;
  1308. int board = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
  1309. const int i2c_pmic = 1;
  1310. u32 reg;
  1311. char rev;
  1312. int i;
  1313. /* determine board revision */
  1314. rev = 'A';
  1315. for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
  1316. if (ventana_info.model[i] >= 'A') {
  1317. rev = ventana_info.model[i];
  1318. break;
  1319. }
  1320. }
  1321. i2c_set_bus_num(i2c_pmic);
  1322. /* configure PFUZE100 PMIC */
  1323. if (!i2c_probe(CONFIG_POWER_PFUZE100_I2C_ADDR)) {
  1324. debug("probed PFUZE100@0x%x\n", CONFIG_POWER_PFUZE100_I2C_ADDR);
  1325. power_pfuze100_init(i2c_pmic);
  1326. p = pmic_get("PFUZE100");
  1327. if (p && !pmic_probe(p)) {
  1328. pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
  1329. printf("PMIC: PFUZE100 ID=0x%02x\n", reg);
  1330. /* Set VGEN1 to 1.5V and enable */
  1331. pmic_reg_read(p, PFUZE100_VGEN1VOL, &reg);
  1332. reg &= ~(LDO_VOL_MASK);
  1333. reg |= (LDOA_1_50V | LDO_EN);
  1334. pmic_reg_write(p, PFUZE100_VGEN1VOL, reg);
  1335. /* Set SWBST to 5.0V and enable */
  1336. pmic_reg_read(p, PFUZE100_SWBSTCON1, &reg);
  1337. reg &= ~(SWBST_MODE_MASK | SWBST_VOL_MASK);
  1338. reg |= (SWBST_5_00V | (SWBST_MODE_AUTO << SWBST_MODE_SHIFT));
  1339. pmic_reg_write(p, PFUZE100_SWBSTCON1, reg);
  1340. if (board == GW54xx && (rev == 'G')) {
  1341. /* Disable VGEN5 */
  1342. pmic_reg_write(p, PFUZE100_VGEN5VOL, 0);
  1343. /* Set VGEN6 to 2.5V and enable */
  1344. pmic_reg_read(p, PFUZE100_VGEN6VOL, &reg);
  1345. reg &= ~(LDO_VOL_MASK);
  1346. reg |= (LDOB_2_50V | LDO_EN);
  1347. pmic_reg_write(p, PFUZE100_VGEN6VOL, reg);
  1348. }
  1349. }
  1350. /* put all switchers in continuous mode */
  1351. pmic_reg_read(p, PFUZE100_SW1ABMODE, &reg);
  1352. reg &= ~(SW_MODE_MASK);
  1353. reg |= PWM_PWM;
  1354. pmic_reg_write(p, PFUZE100_SW1ABMODE, reg);
  1355. pmic_reg_read(p, PFUZE100_SW2MODE, &reg);
  1356. reg &= ~(SW_MODE_MASK);
  1357. reg |= PWM_PWM;
  1358. pmic_reg_write(p, PFUZE100_SW2MODE, reg);
  1359. pmic_reg_read(p, PFUZE100_SW3AMODE, &reg);
  1360. reg &= ~(SW_MODE_MASK);
  1361. reg |= PWM_PWM;
  1362. pmic_reg_write(p, PFUZE100_SW3AMODE, reg);
  1363. pmic_reg_read(p, PFUZE100_SW3BMODE, &reg);
  1364. reg &= ~(SW_MODE_MASK);
  1365. reg |= PWM_PWM;
  1366. pmic_reg_write(p, PFUZE100_SW3BMODE, reg);
  1367. pmic_reg_read(p, PFUZE100_SW4MODE, &reg);
  1368. reg &= ~(SW_MODE_MASK);
  1369. reg |= PWM_PWM;
  1370. pmic_reg_write(p, PFUZE100_SW4MODE, reg);
  1371. }
  1372. /* configure LTC3676 PMIC */
  1373. else if (!i2c_probe(CONFIG_POWER_LTC3676_I2C_ADDR)) {
  1374. debug("probed LTC3676@0x%x\n", CONFIG_POWER_LTC3676_I2C_ADDR);
  1375. power_ltc3676_init(i2c_pmic);
  1376. p = pmic_get("LTC3676_PMIC");
  1377. if (!p || pmic_probe(p))
  1378. return;
  1379. puts("PMIC: LTC3676\n");
  1380. /*
  1381. * set board-specific scalar for max CPU frequency
  1382. * per CPU based on the LDO enabled Operating Ranges
  1383. * defined in the respective IMX6DQ and IMX6SDL
  1384. * datasheets. The voltage resulting from the R1/R2
  1385. * feedback inputs on Ventana is 1308mV. Note that this
  1386. * is a bit shy of the Vmin of 1350mV in the datasheet
  1387. * for LDO enabled mode but is as high as we can go.
  1388. */
  1389. switch (board) {
  1390. case GW560x:
  1391. /* mask PGOOD during SW3 transition */
  1392. pmic_reg_write(p, LTC3676_DVB3B,
  1393. 0x1f | LTC3676_PGOOD_MASK);
  1394. /* set SW3 (VDD_ARM) */
  1395. pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
  1396. break;
  1397. case GW5903:
  1398. /* mask PGOOD during SW3 transition */
  1399. pmic_reg_write(p, LTC3676_DVB3B,
  1400. 0x1f | LTC3676_PGOOD_MASK);
  1401. /* set SW3 (VDD_ARM) */
  1402. pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
  1403. /* mask PGOOD during SW4 transition */
  1404. pmic_reg_write(p, LTC3676_DVB4B,
  1405. 0x1f | LTC3676_PGOOD_MASK);
  1406. /* set SW4 (VDD_SOC) */
  1407. pmic_reg_write(p, LTC3676_DVB4A, 0x1f);
  1408. break;
  1409. case GW5905:
  1410. /* mask PGOOD during SW1 transition */
  1411. pmic_reg_write(p, LTC3676_DVB1B,
  1412. 0x1f | LTC3676_PGOOD_MASK);
  1413. /* set SW1 (VDD_ARM) */
  1414. pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
  1415. /* mask PGOOD during SW3 transition */
  1416. pmic_reg_write(p, LTC3676_DVB3B,
  1417. 0x1f | LTC3676_PGOOD_MASK);
  1418. /* set SW3 (VDD_SOC) */
  1419. pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
  1420. break;
  1421. default:
  1422. /* mask PGOOD during SW1 transition */
  1423. pmic_reg_write(p, LTC3676_DVB1B,
  1424. 0x1f | LTC3676_PGOOD_MASK);
  1425. /* set SW1 (VDD_SOC) */
  1426. pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
  1427. /* mask PGOOD during SW3 transition */
  1428. pmic_reg_write(p, LTC3676_DVB3B,
  1429. 0x1f | LTC3676_PGOOD_MASK);
  1430. /* set SW3 (VDD_ARM) */
  1431. pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
  1432. }
  1433. /* put all switchers in continuous mode */
  1434. pmic_reg_write(p, LTC3676_BUCK1, 0xc0);
  1435. pmic_reg_write(p, LTC3676_BUCK2, 0xc0);
  1436. pmic_reg_write(p, LTC3676_BUCK3, 0xc0);
  1437. pmic_reg_write(p, LTC3676_BUCK4, 0xc0);
  1438. }
  1439. }
  1440. #include <fdt_support.h>
  1441. #define WDOG1_ADDR 0x20bc000
  1442. #define WDOG2_ADDR 0x20c0000
  1443. #define GPIO3_ADDR 0x20a4000
  1444. #define USDHC3_ADDR 0x2198000
  1445. static void ft_board_wdog_fixup(void *blob, phys_addr_t addr)
  1446. {
  1447. int off = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt", addr);
  1448. if (off) {
  1449. fdt_delprop(blob, off, "ext-reset-output");
  1450. fdt_delprop(blob, off, "fsl,ext-reset-output");
  1451. }
  1452. }
  1453. void ft_early_fixup(void *blob, int board_type)
  1454. {
  1455. struct ventana_board_info *info = &ventana_info;
  1456. char rev = 0;
  1457. int i;
  1458. /* determine board revision */
  1459. for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
  1460. if (ventana_info.model[i] >= 'A') {
  1461. rev = ventana_info.model[i];
  1462. break;
  1463. }
  1464. }
  1465. /*
  1466. * Board model specific fixups
  1467. */
  1468. switch (board_type) {
  1469. case GW51xx:
  1470. /*
  1471. * disable wdog node for GW51xx-A/B to work around
  1472. * errata causing wdog timer to be unreliable.
  1473. */
  1474. if (rev >= 'A' && rev < 'C') {
  1475. i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt",
  1476. WDOG1_ADDR);
  1477. if (i)
  1478. fdt_status_disabled(blob, i);
  1479. }
  1480. /* GW51xx-E adds WDOG1_B external reset */
  1481. if (rev < 'E')
  1482. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1483. break;
  1484. case GW52xx:
  1485. /* GW522x Uses GPIO3_IO23 instead of GPIO1_IO29 */
  1486. if (info->model[4] == '2') {
  1487. u32 handle = 0;
  1488. u32 *range = NULL;
  1489. i = fdt_node_offset_by_compatible(blob, -1,
  1490. "fsl,imx6q-pcie");
  1491. if (i)
  1492. range = (u32 *)fdt_getprop(blob, i,
  1493. "reset-gpio", NULL);
  1494. if (range) {
  1495. i = fdt_node_offset_by_compat_reg(blob,
  1496. "fsl,imx6q-gpio", GPIO3_ADDR);
  1497. if (i)
  1498. handle = fdt_get_phandle(blob, i);
  1499. if (handle) {
  1500. range[0] = cpu_to_fdt32(handle);
  1501. range[1] = cpu_to_fdt32(23);
  1502. }
  1503. }
  1504. /* these have broken usd_vsel */
  1505. if (strstr((const char *)info->model, "SP318-B") ||
  1506. strstr((const char *)info->model, "SP331-B"))
  1507. gpio_cfg[board_type].usd_vsel = 0;
  1508. /* GW522x-B adds WDOG1_B external reset */
  1509. if (rev < 'B')
  1510. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1511. }
  1512. /* GW520x-E adds WDOG1_B external reset */
  1513. else if (info->model[4] == '0' && rev < 'E')
  1514. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1515. break;
  1516. case GW53xx:
  1517. /* GW53xx-E adds WDOG1_B external reset */
  1518. if (rev < 'E')
  1519. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1520. break;
  1521. case GW54xx:
  1522. /*
  1523. * disable serial2 node for GW54xx for compatibility with older
  1524. * 3.10.x kernel that improperly had this node enabled in the DT
  1525. */
  1526. fdt_set_status_by_alias(blob, "serial2", FDT_STATUS_DISABLED,
  1527. 0);
  1528. /* GW54xx-E adds WDOG2_B external reset */
  1529. if (rev < 'E')
  1530. ft_board_wdog_fixup(blob, WDOG2_ADDR);
  1531. break;
  1532. case GW551x:
  1533. /* GW551x-C adds WDOG1_B external reset */
  1534. if (rev < 'C')
  1535. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1536. break;
  1537. case GW5901:
  1538. case GW5902:
  1539. /* GW5901/GW5901 revB adds WDOG1_B as an external reset */
  1540. if (rev < 'B')
  1541. ft_board_wdog_fixup(blob, WDOG1_ADDR);
  1542. break;
  1543. }
  1544. /* remove no-1-8-v if UHS-I support is present */
  1545. if (gpio_cfg[board_type].usd_vsel) {
  1546. debug("Enabling UHS-I support\n");
  1547. i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-usdhc",
  1548. USDHC3_ADDR);
  1549. if (i)
  1550. fdt_delprop(blob, i, "no-1-8-v");
  1551. }
  1552. }
  1553. #ifdef CONFIG_FSL_ESDHC_IMX
  1554. static struct fsl_esdhc_cfg usdhc_cfg[2];
  1555. int board_mmc_init(struct bd_info *bis)
  1556. {
  1557. struct ventana_board_info ventana_info;
  1558. int board_type = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
  1559. int ret;
  1560. switch (board_type) {
  1561. case GW52xx:
  1562. case GW53xx:
  1563. case GW54xx:
  1564. case GW553x:
  1565. /* usdhc3: 4bit microSD */
  1566. SETUP_IOMUX_PADS(usdhc3_pads);
  1567. usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
  1568. usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  1569. usdhc_cfg[0].max_bus_width = 4;
  1570. return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
  1571. case GW560x:
  1572. /* usdhc2: 8-bit eMMC */
  1573. SETUP_IOMUX_PADS(gw560x_emmc_sd2_pads);
  1574. usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
  1575. usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
  1576. usdhc_cfg[0].max_bus_width = 8;
  1577. ret = fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
  1578. if (ret)
  1579. return ret;
  1580. /* usdhc3: 4-bit microSD */
  1581. SETUP_IOMUX_PADS(usdhc3_pads);
  1582. usdhc_cfg[1].esdhc_base = USDHC3_BASE_ADDR;
  1583. usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  1584. usdhc_cfg[1].max_bus_width = 4;
  1585. return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
  1586. case GW5903:
  1587. /* usdhc3: 8-bit eMMC */
  1588. SETUP_IOMUX_PADS(gw5904_emmc_pads);
  1589. usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
  1590. usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  1591. usdhc_cfg[0].max_bus_width = 8;
  1592. ret = fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
  1593. if (ret)
  1594. return ret;
  1595. /* usdhc2: 4-bit microSD */
  1596. SETUP_IOMUX_PADS(gw5904_mmc_pads);
  1597. usdhc_cfg[1].esdhc_base = USDHC2_BASE_ADDR;
  1598. usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
  1599. usdhc_cfg[1].max_bus_width = 4;
  1600. return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
  1601. case GW5904:
  1602. case GW5905:
  1603. case GW5909:
  1604. /* usdhc3: 8bit eMMC */
  1605. SETUP_IOMUX_PADS(gw5904_emmc_pads);
  1606. usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
  1607. usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  1608. usdhc_cfg[0].max_bus_width = 8;
  1609. return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
  1610. default:
  1611. /* doesn't have MMC */
  1612. printf("None");
  1613. return -1;
  1614. }
  1615. }
  1616. int board_mmc_getcd(struct mmc *mmc)
  1617. {
  1618. struct ventana_board_info ventana_info;
  1619. struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
  1620. int board = read_eeprom(CONFIG_I2C_GSC, &ventana_info);
  1621. int gpio = gpio_cfg[board].mmc_cd;
  1622. /* Card Detect */
  1623. switch (board) {
  1624. case GW560x:
  1625. /* emmc is always present */
  1626. if (cfg->esdhc_base == USDHC2_BASE_ADDR)
  1627. return 1;
  1628. break;
  1629. case GW5903:
  1630. case GW5904:
  1631. case GW5905:
  1632. case GW5909:
  1633. /* emmc is always present */
  1634. if (cfg->esdhc_base == USDHC3_BASE_ADDR)
  1635. return 1;
  1636. break;
  1637. }
  1638. if (gpio) {
  1639. debug("%s: gpio%d=%d\n", __func__, gpio, gpio_get_value(gpio));
  1640. return !gpio_get_value(gpio);
  1641. }
  1642. return -1;
  1643. }
  1644. #endif /* CONFIG_FSL_ESDHC_IMX */