pinctrl-bcm281xx.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // Copyright (C) 2013-2017 Broadcom
  3. #include <linux/err.h>
  4. #include <linux/io.h>
  5. #include <linux/init.h>
  6. #include <linux/of.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/pinctrl/pinctrl.h>
  9. #include <linux/pinctrl/pinmux.h>
  10. #include <linux/pinctrl/pinconf.h>
  11. #include <linux/pinctrl/pinconf-generic.h>
  12. #include <linux/regmap.h>
  13. #include <linux/slab.h>
  14. #include "../core.h"
  15. #include "../pinctrl-utils.h"
  16. /* BCM281XX Pin Control Registers Definitions */
  17. /* Function Select bits are the same for all pin control registers */
  18. #define BCM281XX_PIN_REG_F_SEL_MASK 0x0700
  19. #define BCM281XX_PIN_REG_F_SEL_SHIFT 8
  20. /* Standard pin register */
  21. #define BCM281XX_STD_PIN_REG_DRV_STR_MASK 0x0007
  22. #define BCM281XX_STD_PIN_REG_DRV_STR_SHIFT 0
  23. #define BCM281XX_STD_PIN_REG_INPUT_DIS_MASK 0x0008
  24. #define BCM281XX_STD_PIN_REG_INPUT_DIS_SHIFT 3
  25. #define BCM281XX_STD_PIN_REG_SLEW_MASK 0x0010
  26. #define BCM281XX_STD_PIN_REG_SLEW_SHIFT 4
  27. #define BCM281XX_STD_PIN_REG_PULL_UP_MASK 0x0020
  28. #define BCM281XX_STD_PIN_REG_PULL_UP_SHIFT 5
  29. #define BCM281XX_STD_PIN_REG_PULL_DN_MASK 0x0040
  30. #define BCM281XX_STD_PIN_REG_PULL_DN_SHIFT 6
  31. #define BCM281XX_STD_PIN_REG_HYST_MASK 0x0080
  32. #define BCM281XX_STD_PIN_REG_HYST_SHIFT 7
  33. /* I2C pin register */
  34. #define BCM281XX_I2C_PIN_REG_INPUT_DIS_MASK 0x0004
  35. #define BCM281XX_I2C_PIN_REG_INPUT_DIS_SHIFT 2
  36. #define BCM281XX_I2C_PIN_REG_SLEW_MASK 0x0008
  37. #define BCM281XX_I2C_PIN_REG_SLEW_SHIFT 3
  38. #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_MASK 0x0070
  39. #define BCM281XX_I2C_PIN_REG_PULL_UP_STR_SHIFT 4
  40. /* HDMI pin register */
  41. #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_MASK 0x0008
  42. #define BCM281XX_HDMI_PIN_REG_INPUT_DIS_SHIFT 3
  43. #define BCM281XX_HDMI_PIN_REG_MODE_MASK 0x0010
  44. #define BCM281XX_HDMI_PIN_REG_MODE_SHIFT 4
  45. /*
  46. * bcm281xx_pin_type - types of pin register
  47. */
  48. enum bcm281xx_pin_type {
  49. BCM281XX_PIN_TYPE_UNKNOWN = 0,
  50. BCM281XX_PIN_TYPE_STD,
  51. BCM281XX_PIN_TYPE_I2C,
  52. BCM281XX_PIN_TYPE_HDMI,
  53. };
  54. static enum bcm281xx_pin_type std_pin = BCM281XX_PIN_TYPE_STD;
  55. static enum bcm281xx_pin_type i2c_pin = BCM281XX_PIN_TYPE_I2C;
  56. static enum bcm281xx_pin_type hdmi_pin = BCM281XX_PIN_TYPE_HDMI;
  57. /*
  58. * bcm281xx_pin_function- define pin function
  59. */
  60. struct bcm281xx_pin_function {
  61. const char *name;
  62. const char * const *groups;
  63. const unsigned ngroups;
  64. };
  65. /*
  66. * bcm281xx_pinctrl_data - Broadcom-specific pinctrl data
  67. * @reg_base - base of pinctrl registers
  68. */
  69. struct bcm281xx_pinctrl_data {
  70. void __iomem *reg_base;
  71. /* List of all pins */
  72. const struct pinctrl_pin_desc *pins;
  73. const unsigned npins;
  74. const struct bcm281xx_pin_function *functions;
  75. const unsigned nfunctions;
  76. struct regmap *regmap;
  77. };
  78. /*
  79. * Pin number definition. The order here must be the same as defined in the
  80. * PADCTRLREG block in the RDB.
  81. */
  82. #define BCM281XX_PIN_ADCSYNC 0
  83. #define BCM281XX_PIN_BAT_RM 1
  84. #define BCM281XX_PIN_BSC1_SCL 2
  85. #define BCM281XX_PIN_BSC1_SDA 3
  86. #define BCM281XX_PIN_BSC2_SCL 4
  87. #define BCM281XX_PIN_BSC2_SDA 5
  88. #define BCM281XX_PIN_CLASSGPWR 6
  89. #define BCM281XX_PIN_CLK_CX8 7
  90. #define BCM281XX_PIN_CLKOUT_0 8
  91. #define BCM281XX_PIN_CLKOUT_1 9
  92. #define BCM281XX_PIN_CLKOUT_2 10
  93. #define BCM281XX_PIN_CLKOUT_3 11
  94. #define BCM281XX_PIN_CLKREQ_IN_0 12
  95. #define BCM281XX_PIN_CLKREQ_IN_1 13
  96. #define BCM281XX_PIN_CWS_SYS_REQ1 14
  97. #define BCM281XX_PIN_CWS_SYS_REQ2 15
  98. #define BCM281XX_PIN_CWS_SYS_REQ3 16
  99. #define BCM281XX_PIN_DIGMIC1_CLK 17
  100. #define BCM281XX_PIN_DIGMIC1_DQ 18
  101. #define BCM281XX_PIN_DIGMIC2_CLK 19
  102. #define BCM281XX_PIN_DIGMIC2_DQ 20
  103. #define BCM281XX_PIN_GPEN13 21
  104. #define BCM281XX_PIN_GPEN14 22
  105. #define BCM281XX_PIN_GPEN15 23
  106. #define BCM281XX_PIN_GPIO00 24
  107. #define BCM281XX_PIN_GPIO01 25
  108. #define BCM281XX_PIN_GPIO02 26
  109. #define BCM281XX_PIN_GPIO03 27
  110. #define BCM281XX_PIN_GPIO04 28
  111. #define BCM281XX_PIN_GPIO05 29
  112. #define BCM281XX_PIN_GPIO06 30
  113. #define BCM281XX_PIN_GPIO07 31
  114. #define BCM281XX_PIN_GPIO08 32
  115. #define BCM281XX_PIN_GPIO09 33
  116. #define BCM281XX_PIN_GPIO10 34
  117. #define BCM281XX_PIN_GPIO11 35
  118. #define BCM281XX_PIN_GPIO12 36
  119. #define BCM281XX_PIN_GPIO13 37
  120. #define BCM281XX_PIN_GPIO14 38
  121. #define BCM281XX_PIN_GPS_PABLANK 39
  122. #define BCM281XX_PIN_GPS_TMARK 40
  123. #define BCM281XX_PIN_HDMI_SCL 41
  124. #define BCM281XX_PIN_HDMI_SDA 42
  125. #define BCM281XX_PIN_IC_DM 43
  126. #define BCM281XX_PIN_IC_DP 44
  127. #define BCM281XX_PIN_KP_COL_IP_0 45
  128. #define BCM281XX_PIN_KP_COL_IP_1 46
  129. #define BCM281XX_PIN_KP_COL_IP_2 47
  130. #define BCM281XX_PIN_KP_COL_IP_3 48
  131. #define BCM281XX_PIN_KP_ROW_OP_0 49
  132. #define BCM281XX_PIN_KP_ROW_OP_1 50
  133. #define BCM281XX_PIN_KP_ROW_OP_2 51
  134. #define BCM281XX_PIN_KP_ROW_OP_3 52
  135. #define BCM281XX_PIN_LCD_B_0 53
  136. #define BCM281XX_PIN_LCD_B_1 54
  137. #define BCM281XX_PIN_LCD_B_2 55
  138. #define BCM281XX_PIN_LCD_B_3 56
  139. #define BCM281XX_PIN_LCD_B_4 57
  140. #define BCM281XX_PIN_LCD_B_5 58
  141. #define BCM281XX_PIN_LCD_B_6 59
  142. #define BCM281XX_PIN_LCD_B_7 60
  143. #define BCM281XX_PIN_LCD_G_0 61
  144. #define BCM281XX_PIN_LCD_G_1 62
  145. #define BCM281XX_PIN_LCD_G_2 63
  146. #define BCM281XX_PIN_LCD_G_3 64
  147. #define BCM281XX_PIN_LCD_G_4 65
  148. #define BCM281XX_PIN_LCD_G_5 66
  149. #define BCM281XX_PIN_LCD_G_6 67
  150. #define BCM281XX_PIN_LCD_G_7 68
  151. #define BCM281XX_PIN_LCD_HSYNC 69
  152. #define BCM281XX_PIN_LCD_OE 70
  153. #define BCM281XX_PIN_LCD_PCLK 71
  154. #define BCM281XX_PIN_LCD_R_0 72
  155. #define BCM281XX_PIN_LCD_R_1 73
  156. #define BCM281XX_PIN_LCD_R_2 74
  157. #define BCM281XX_PIN_LCD_R_3 75
  158. #define BCM281XX_PIN_LCD_R_4 76
  159. #define BCM281XX_PIN_LCD_R_5 77
  160. #define BCM281XX_PIN_LCD_R_6 78
  161. #define BCM281XX_PIN_LCD_R_7 79
  162. #define BCM281XX_PIN_LCD_VSYNC 80
  163. #define BCM281XX_PIN_MDMGPIO0 81
  164. #define BCM281XX_PIN_MDMGPIO1 82
  165. #define BCM281XX_PIN_MDMGPIO2 83
  166. #define BCM281XX_PIN_MDMGPIO3 84
  167. #define BCM281XX_PIN_MDMGPIO4 85
  168. #define BCM281XX_PIN_MDMGPIO5 86
  169. #define BCM281XX_PIN_MDMGPIO6 87
  170. #define BCM281XX_PIN_MDMGPIO7 88
  171. #define BCM281XX_PIN_MDMGPIO8 89
  172. #define BCM281XX_PIN_MPHI_DATA_0 90
  173. #define BCM281XX_PIN_MPHI_DATA_1 91
  174. #define BCM281XX_PIN_MPHI_DATA_2 92
  175. #define BCM281XX_PIN_MPHI_DATA_3 93
  176. #define BCM281XX_PIN_MPHI_DATA_4 94
  177. #define BCM281XX_PIN_MPHI_DATA_5 95
  178. #define BCM281XX_PIN_MPHI_DATA_6 96
  179. #define BCM281XX_PIN_MPHI_DATA_7 97
  180. #define BCM281XX_PIN_MPHI_DATA_8 98
  181. #define BCM281XX_PIN_MPHI_DATA_9 99
  182. #define BCM281XX_PIN_MPHI_DATA_10 100
  183. #define BCM281XX_PIN_MPHI_DATA_11 101
  184. #define BCM281XX_PIN_MPHI_DATA_12 102
  185. #define BCM281XX_PIN_MPHI_DATA_13 103
  186. #define BCM281XX_PIN_MPHI_DATA_14 104
  187. #define BCM281XX_PIN_MPHI_DATA_15 105
  188. #define BCM281XX_PIN_MPHI_HA0 106
  189. #define BCM281XX_PIN_MPHI_HAT0 107
  190. #define BCM281XX_PIN_MPHI_HAT1 108
  191. #define BCM281XX_PIN_MPHI_HCE0_N 109
  192. #define BCM281XX_PIN_MPHI_HCE1_N 110
  193. #define BCM281XX_PIN_MPHI_HRD_N 111
  194. #define BCM281XX_PIN_MPHI_HWR_N 112
  195. #define BCM281XX_PIN_MPHI_RUN0 113
  196. #define BCM281XX_PIN_MPHI_RUN1 114
  197. #define BCM281XX_PIN_MTX_SCAN_CLK 115
  198. #define BCM281XX_PIN_MTX_SCAN_DATA 116
  199. #define BCM281XX_PIN_NAND_AD_0 117
  200. #define BCM281XX_PIN_NAND_AD_1 118
  201. #define BCM281XX_PIN_NAND_AD_2 119
  202. #define BCM281XX_PIN_NAND_AD_3 120
  203. #define BCM281XX_PIN_NAND_AD_4 121
  204. #define BCM281XX_PIN_NAND_AD_5 122
  205. #define BCM281XX_PIN_NAND_AD_6 123
  206. #define BCM281XX_PIN_NAND_AD_7 124
  207. #define BCM281XX_PIN_NAND_ALE 125
  208. #define BCM281XX_PIN_NAND_CEN_0 126
  209. #define BCM281XX_PIN_NAND_CEN_1 127
  210. #define BCM281XX_PIN_NAND_CLE 128
  211. #define BCM281XX_PIN_NAND_OEN 129
  212. #define BCM281XX_PIN_NAND_RDY_0 130
  213. #define BCM281XX_PIN_NAND_RDY_1 131
  214. #define BCM281XX_PIN_NAND_WEN 132
  215. #define BCM281XX_PIN_NAND_WP 133
  216. #define BCM281XX_PIN_PC1 134
  217. #define BCM281XX_PIN_PC2 135
  218. #define BCM281XX_PIN_PMU_INT 136
  219. #define BCM281XX_PIN_PMU_SCL 137
  220. #define BCM281XX_PIN_PMU_SDA 138
  221. #define BCM281XX_PIN_RFST2G_MTSLOTEN3G 139
  222. #define BCM281XX_PIN_RGMII_0_RX_CTL 140
  223. #define BCM281XX_PIN_RGMII_0_RXC 141
  224. #define BCM281XX_PIN_RGMII_0_RXD_0 142
  225. #define BCM281XX_PIN_RGMII_0_RXD_1 143
  226. #define BCM281XX_PIN_RGMII_0_RXD_2 144
  227. #define BCM281XX_PIN_RGMII_0_RXD_3 145
  228. #define BCM281XX_PIN_RGMII_0_TX_CTL 146
  229. #define BCM281XX_PIN_RGMII_0_TXC 147
  230. #define BCM281XX_PIN_RGMII_0_TXD_0 148
  231. #define BCM281XX_PIN_RGMII_0_TXD_1 149
  232. #define BCM281XX_PIN_RGMII_0_TXD_2 150
  233. #define BCM281XX_PIN_RGMII_0_TXD_3 151
  234. #define BCM281XX_PIN_RGMII_1_RX_CTL 152
  235. #define BCM281XX_PIN_RGMII_1_RXC 153
  236. #define BCM281XX_PIN_RGMII_1_RXD_0 154
  237. #define BCM281XX_PIN_RGMII_1_RXD_1 155
  238. #define BCM281XX_PIN_RGMII_1_RXD_2 156
  239. #define BCM281XX_PIN_RGMII_1_RXD_3 157
  240. #define BCM281XX_PIN_RGMII_1_TX_CTL 158
  241. #define BCM281XX_PIN_RGMII_1_TXC 159
  242. #define BCM281XX_PIN_RGMII_1_TXD_0 160
  243. #define BCM281XX_PIN_RGMII_1_TXD_1 161
  244. #define BCM281XX_PIN_RGMII_1_TXD_2 162
  245. #define BCM281XX_PIN_RGMII_1_TXD_3 163
  246. #define BCM281XX_PIN_RGMII_GPIO_0 164
  247. #define BCM281XX_PIN_RGMII_GPIO_1 165
  248. #define BCM281XX_PIN_RGMII_GPIO_2 166
  249. #define BCM281XX_PIN_RGMII_GPIO_3 167
  250. #define BCM281XX_PIN_RTXDATA2G_TXDATA3G1 168
  251. #define BCM281XX_PIN_RTXEN2G_TXDATA3G2 169
  252. #define BCM281XX_PIN_RXDATA3G0 170
  253. #define BCM281XX_PIN_RXDATA3G1 171
  254. #define BCM281XX_PIN_RXDATA3G2 172
  255. #define BCM281XX_PIN_SDIO1_CLK 173
  256. #define BCM281XX_PIN_SDIO1_CMD 174
  257. #define BCM281XX_PIN_SDIO1_DATA_0 175
  258. #define BCM281XX_PIN_SDIO1_DATA_1 176
  259. #define BCM281XX_PIN_SDIO1_DATA_2 177
  260. #define BCM281XX_PIN_SDIO1_DATA_3 178
  261. #define BCM281XX_PIN_SDIO4_CLK 179
  262. #define BCM281XX_PIN_SDIO4_CMD 180
  263. #define BCM281XX_PIN_SDIO4_DATA_0 181
  264. #define BCM281XX_PIN_SDIO4_DATA_1 182
  265. #define BCM281XX_PIN_SDIO4_DATA_2 183
  266. #define BCM281XX_PIN_SDIO4_DATA_3 184
  267. #define BCM281XX_PIN_SIM_CLK 185
  268. #define BCM281XX_PIN_SIM_DATA 186
  269. #define BCM281XX_PIN_SIM_DET 187
  270. #define BCM281XX_PIN_SIM_RESETN 188
  271. #define BCM281XX_PIN_SIM2_CLK 189
  272. #define BCM281XX_PIN_SIM2_DATA 190
  273. #define BCM281XX_PIN_SIM2_DET 191
  274. #define BCM281XX_PIN_SIM2_RESETN 192
  275. #define BCM281XX_PIN_SRI_C 193
  276. #define BCM281XX_PIN_SRI_D 194
  277. #define BCM281XX_PIN_SRI_E 195
  278. #define BCM281XX_PIN_SSP_EXTCLK 196
  279. #define BCM281XX_PIN_SSP0_CLK 197
  280. #define BCM281XX_PIN_SSP0_FS 198
  281. #define BCM281XX_PIN_SSP0_RXD 199
  282. #define BCM281XX_PIN_SSP0_TXD 200
  283. #define BCM281XX_PIN_SSP2_CLK 201
  284. #define BCM281XX_PIN_SSP2_FS_0 202
  285. #define BCM281XX_PIN_SSP2_FS_1 203
  286. #define BCM281XX_PIN_SSP2_FS_2 204
  287. #define BCM281XX_PIN_SSP2_FS_3 205
  288. #define BCM281XX_PIN_SSP2_RXD_0 206
  289. #define BCM281XX_PIN_SSP2_RXD_1 207
  290. #define BCM281XX_PIN_SSP2_TXD_0 208
  291. #define BCM281XX_PIN_SSP2_TXD_1 209
  292. #define BCM281XX_PIN_SSP3_CLK 210
  293. #define BCM281XX_PIN_SSP3_FS 211
  294. #define BCM281XX_PIN_SSP3_RXD 212
  295. #define BCM281XX_PIN_SSP3_TXD 213
  296. #define BCM281XX_PIN_SSP4_CLK 214
  297. #define BCM281XX_PIN_SSP4_FS 215
  298. #define BCM281XX_PIN_SSP4_RXD 216
  299. #define BCM281XX_PIN_SSP4_TXD 217
  300. #define BCM281XX_PIN_SSP5_CLK 218
  301. #define BCM281XX_PIN_SSP5_FS 219
  302. #define BCM281XX_PIN_SSP5_RXD 220
  303. #define BCM281XX_PIN_SSP5_TXD 221
  304. #define BCM281XX_PIN_SSP6_CLK 222
  305. #define BCM281XX_PIN_SSP6_FS 223
  306. #define BCM281XX_PIN_SSP6_RXD 224
  307. #define BCM281XX_PIN_SSP6_TXD 225
  308. #define BCM281XX_PIN_STAT_1 226
  309. #define BCM281XX_PIN_STAT_2 227
  310. #define BCM281XX_PIN_SYSCLKEN 228
  311. #define BCM281XX_PIN_TRACECLK 229
  312. #define BCM281XX_PIN_TRACEDT00 230
  313. #define BCM281XX_PIN_TRACEDT01 231
  314. #define BCM281XX_PIN_TRACEDT02 232
  315. #define BCM281XX_PIN_TRACEDT03 233
  316. #define BCM281XX_PIN_TRACEDT04 234
  317. #define BCM281XX_PIN_TRACEDT05 235
  318. #define BCM281XX_PIN_TRACEDT06 236
  319. #define BCM281XX_PIN_TRACEDT07 237
  320. #define BCM281XX_PIN_TRACEDT08 238
  321. #define BCM281XX_PIN_TRACEDT09 239
  322. #define BCM281XX_PIN_TRACEDT10 240
  323. #define BCM281XX_PIN_TRACEDT11 241
  324. #define BCM281XX_PIN_TRACEDT12 242
  325. #define BCM281XX_PIN_TRACEDT13 243
  326. #define BCM281XX_PIN_TRACEDT14 244
  327. #define BCM281XX_PIN_TRACEDT15 245
  328. #define BCM281XX_PIN_TXDATA3G0 246
  329. #define BCM281XX_PIN_TXPWRIND 247
  330. #define BCM281XX_PIN_UARTB1_UCTS 248
  331. #define BCM281XX_PIN_UARTB1_URTS 249
  332. #define BCM281XX_PIN_UARTB1_URXD 250
  333. #define BCM281XX_PIN_UARTB1_UTXD 251
  334. #define BCM281XX_PIN_UARTB2_URXD 252
  335. #define BCM281XX_PIN_UARTB2_UTXD 253
  336. #define BCM281XX_PIN_UARTB3_UCTS 254
  337. #define BCM281XX_PIN_UARTB3_URTS 255
  338. #define BCM281XX_PIN_UARTB3_URXD 256
  339. #define BCM281XX_PIN_UARTB3_UTXD 257
  340. #define BCM281XX_PIN_UARTB4_UCTS 258
  341. #define BCM281XX_PIN_UARTB4_URTS 259
  342. #define BCM281XX_PIN_UARTB4_URXD 260
  343. #define BCM281XX_PIN_UARTB4_UTXD 261
  344. #define BCM281XX_PIN_VC_CAM1_SCL 262
  345. #define BCM281XX_PIN_VC_CAM1_SDA 263
  346. #define BCM281XX_PIN_VC_CAM2_SCL 264
  347. #define BCM281XX_PIN_VC_CAM2_SDA 265
  348. #define BCM281XX_PIN_VC_CAM3_SCL 266
  349. #define BCM281XX_PIN_VC_CAM3_SDA 267
  350. #define BCM281XX_PIN_DESC(a, b, c) \
  351. { .number = a, .name = b, .drv_data = &c##_pin }
  352. /*
  353. * Pin description definition. The order here must be the same as defined in
  354. * the PADCTRLREG block in the RDB, since the pin number is used as an index
  355. * into this array.
  356. */
  357. static const struct pinctrl_pin_desc bcm281xx_pinctrl_pins[] = {
  358. BCM281XX_PIN_DESC(BCM281XX_PIN_ADCSYNC, "adcsync", std),
  359. BCM281XX_PIN_DESC(BCM281XX_PIN_BAT_RM, "bat_rm", std),
  360. BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SCL, "bsc1_scl", i2c),
  361. BCM281XX_PIN_DESC(BCM281XX_PIN_BSC1_SDA, "bsc1_sda", i2c),
  362. BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SCL, "bsc2_scl", i2c),
  363. BCM281XX_PIN_DESC(BCM281XX_PIN_BSC2_SDA, "bsc2_sda", i2c),
  364. BCM281XX_PIN_DESC(BCM281XX_PIN_CLASSGPWR, "classgpwr", std),
  365. BCM281XX_PIN_DESC(BCM281XX_PIN_CLK_CX8, "clk_cx8", std),
  366. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_0, "clkout_0", std),
  367. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_1, "clkout_1", std),
  368. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_2, "clkout_2", std),
  369. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKOUT_3, "clkout_3", std),
  370. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_0, "clkreq_in_0", std),
  371. BCM281XX_PIN_DESC(BCM281XX_PIN_CLKREQ_IN_1, "clkreq_in_1", std),
  372. BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ1, "cws_sys_req1", std),
  373. BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ2, "cws_sys_req2", std),
  374. BCM281XX_PIN_DESC(BCM281XX_PIN_CWS_SYS_REQ3, "cws_sys_req3", std),
  375. BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_CLK, "digmic1_clk", std),
  376. BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC1_DQ, "digmic1_dq", std),
  377. BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_CLK, "digmic2_clk", std),
  378. BCM281XX_PIN_DESC(BCM281XX_PIN_DIGMIC2_DQ, "digmic2_dq", std),
  379. BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN13, "gpen13", std),
  380. BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN14, "gpen14", std),
  381. BCM281XX_PIN_DESC(BCM281XX_PIN_GPEN15, "gpen15", std),
  382. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO00, "gpio00", std),
  383. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO01, "gpio01", std),
  384. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO02, "gpio02", std),
  385. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO03, "gpio03", std),
  386. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO04, "gpio04", std),
  387. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO05, "gpio05", std),
  388. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO06, "gpio06", std),
  389. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO07, "gpio07", std),
  390. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO08, "gpio08", std),
  391. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO09, "gpio09", std),
  392. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO10, "gpio10", std),
  393. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO11, "gpio11", std),
  394. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO12, "gpio12", std),
  395. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO13, "gpio13", std),
  396. BCM281XX_PIN_DESC(BCM281XX_PIN_GPIO14, "gpio14", std),
  397. BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_PABLANK, "gps_pablank", std),
  398. BCM281XX_PIN_DESC(BCM281XX_PIN_GPS_TMARK, "gps_tmark", std),
  399. BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SCL, "hdmi_scl", hdmi),
  400. BCM281XX_PIN_DESC(BCM281XX_PIN_HDMI_SDA, "hdmi_sda", hdmi),
  401. BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DM, "ic_dm", std),
  402. BCM281XX_PIN_DESC(BCM281XX_PIN_IC_DP, "ic_dp", std),
  403. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_0, "kp_col_ip_0", std),
  404. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_1, "kp_col_ip_1", std),
  405. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_2, "kp_col_ip_2", std),
  406. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_COL_IP_3, "kp_col_ip_3", std),
  407. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_0, "kp_row_op_0", std),
  408. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_1, "kp_row_op_1", std),
  409. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_2, "kp_row_op_2", std),
  410. BCM281XX_PIN_DESC(BCM281XX_PIN_KP_ROW_OP_3, "kp_row_op_3", std),
  411. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_0, "lcd_b_0", std),
  412. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_1, "lcd_b_1", std),
  413. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_2, "lcd_b_2", std),
  414. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_3, "lcd_b_3", std),
  415. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_4, "lcd_b_4", std),
  416. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_5, "lcd_b_5", std),
  417. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_6, "lcd_b_6", std),
  418. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_B_7, "lcd_b_7", std),
  419. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_0, "lcd_g_0", std),
  420. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_1, "lcd_g_1", std),
  421. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_2, "lcd_g_2", std),
  422. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_3, "lcd_g_3", std),
  423. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_4, "lcd_g_4", std),
  424. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_5, "lcd_g_5", std),
  425. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_6, "lcd_g_6", std),
  426. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_G_7, "lcd_g_7", std),
  427. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_HSYNC, "lcd_hsync", std),
  428. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_OE, "lcd_oe", std),
  429. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_PCLK, "lcd_pclk", std),
  430. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_0, "lcd_r_0", std),
  431. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_1, "lcd_r_1", std),
  432. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_2, "lcd_r_2", std),
  433. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_3, "lcd_r_3", std),
  434. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_4, "lcd_r_4", std),
  435. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_5, "lcd_r_5", std),
  436. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_6, "lcd_r_6", std),
  437. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_R_7, "lcd_r_7", std),
  438. BCM281XX_PIN_DESC(BCM281XX_PIN_LCD_VSYNC, "lcd_vsync", std),
  439. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO0, "mdmgpio0", std),
  440. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO1, "mdmgpio1", std),
  441. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO2, "mdmgpio2", std),
  442. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO3, "mdmgpio3", std),
  443. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO4, "mdmgpio4", std),
  444. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO5, "mdmgpio5", std),
  445. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO6, "mdmgpio6", std),
  446. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO7, "mdmgpio7", std),
  447. BCM281XX_PIN_DESC(BCM281XX_PIN_MDMGPIO8, "mdmgpio8", std),
  448. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_0, "mphi_data_0", std),
  449. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_1, "mphi_data_1", std),
  450. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_2, "mphi_data_2", std),
  451. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_3, "mphi_data_3", std),
  452. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_4, "mphi_data_4", std),
  453. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_5, "mphi_data_5", std),
  454. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_6, "mphi_data_6", std),
  455. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_7, "mphi_data_7", std),
  456. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_8, "mphi_data_8", std),
  457. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_9, "mphi_data_9", std),
  458. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_10, "mphi_data_10", std),
  459. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_11, "mphi_data_11", std),
  460. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_12, "mphi_data_12", std),
  461. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_13, "mphi_data_13", std),
  462. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_14, "mphi_data_14", std),
  463. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_DATA_15, "mphi_data_15", std),
  464. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HA0, "mphi_ha0", std),
  465. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT0, "mphi_hat0", std),
  466. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HAT1, "mphi_hat1", std),
  467. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE0_N, "mphi_hce0_n", std),
  468. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HCE1_N, "mphi_hce1_n", std),
  469. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HRD_N, "mphi_hrd_n", std),
  470. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_HWR_N, "mphi_hwr_n", std),
  471. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN0, "mphi_run0", std),
  472. BCM281XX_PIN_DESC(BCM281XX_PIN_MPHI_RUN1, "mphi_run1", std),
  473. BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_CLK, "mtx_scan_clk", std),
  474. BCM281XX_PIN_DESC(BCM281XX_PIN_MTX_SCAN_DATA, "mtx_scan_data", std),
  475. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_0, "nand_ad_0", std),
  476. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_1, "nand_ad_1", std),
  477. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_2, "nand_ad_2", std),
  478. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_3, "nand_ad_3", std),
  479. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_4, "nand_ad_4", std),
  480. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_5, "nand_ad_5", std),
  481. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_6, "nand_ad_6", std),
  482. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_AD_7, "nand_ad_7", std),
  483. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_ALE, "nand_ale", std),
  484. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_0, "nand_cen_0", std),
  485. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CEN_1, "nand_cen_1", std),
  486. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_CLE, "nand_cle", std),
  487. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_OEN, "nand_oen", std),
  488. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_0, "nand_rdy_0", std),
  489. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_RDY_1, "nand_rdy_1", std),
  490. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WEN, "nand_wen", std),
  491. BCM281XX_PIN_DESC(BCM281XX_PIN_NAND_WP, "nand_wp", std),
  492. BCM281XX_PIN_DESC(BCM281XX_PIN_PC1, "pc1", std),
  493. BCM281XX_PIN_DESC(BCM281XX_PIN_PC2, "pc2", std),
  494. BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_INT, "pmu_int", std),
  495. BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SCL, "pmu_scl", i2c),
  496. BCM281XX_PIN_DESC(BCM281XX_PIN_PMU_SDA, "pmu_sda", i2c),
  497. BCM281XX_PIN_DESC(BCM281XX_PIN_RFST2G_MTSLOTEN3G, "rfst2g_mtsloten3g",
  498. std),
  499. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RX_CTL, "rgmii_0_rx_ctl", std),
  500. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXC, "rgmii_0_rxc", std),
  501. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_0, "rgmii_0_rxd_0", std),
  502. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_1, "rgmii_0_rxd_1", std),
  503. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_2, "rgmii_0_rxd_2", std),
  504. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_RXD_3, "rgmii_0_rxd_3", std),
  505. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TX_CTL, "rgmii_0_tx_ctl", std),
  506. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXC, "rgmii_0_txc", std),
  507. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_0, "rgmii_0_txd_0", std),
  508. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_1, "rgmii_0_txd_1", std),
  509. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_2, "rgmii_0_txd_2", std),
  510. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_0_TXD_3, "rgmii_0_txd_3", std),
  511. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RX_CTL, "rgmii_1_rx_ctl", std),
  512. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXC, "rgmii_1_rxc", std),
  513. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_0, "rgmii_1_rxd_0", std),
  514. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_1, "rgmii_1_rxd_1", std),
  515. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_2, "rgmii_1_rxd_2", std),
  516. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_RXD_3, "rgmii_1_rxd_3", std),
  517. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TX_CTL, "rgmii_1_tx_ctl", std),
  518. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXC, "rgmii_1_txc", std),
  519. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_0, "rgmii_1_txd_0", std),
  520. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_1, "rgmii_1_txd_1", std),
  521. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_2, "rgmii_1_txd_2", std),
  522. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_1_TXD_3, "rgmii_1_txd_3", std),
  523. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_0, "rgmii_gpio_0", std),
  524. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_1, "rgmii_gpio_1", std),
  525. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_2, "rgmii_gpio_2", std),
  526. BCM281XX_PIN_DESC(BCM281XX_PIN_RGMII_GPIO_3, "rgmii_gpio_3", std),
  527. BCM281XX_PIN_DESC(BCM281XX_PIN_RTXDATA2G_TXDATA3G1,
  528. "rtxdata2g_txdata3g1", std),
  529. BCM281XX_PIN_DESC(BCM281XX_PIN_RTXEN2G_TXDATA3G2, "rtxen2g_txdata3g2",
  530. std),
  531. BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G0, "rxdata3g0", std),
  532. BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G1, "rxdata3g1", std),
  533. BCM281XX_PIN_DESC(BCM281XX_PIN_RXDATA3G2, "rxdata3g2", std),
  534. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CLK, "sdio1_clk", std),
  535. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_CMD, "sdio1_cmd", std),
  536. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_0, "sdio1_data_0", std),
  537. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_1, "sdio1_data_1", std),
  538. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_2, "sdio1_data_2", std),
  539. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO1_DATA_3, "sdio1_data_3", std),
  540. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CLK, "sdio4_clk", std),
  541. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_CMD, "sdio4_cmd", std),
  542. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_0, "sdio4_data_0", std),
  543. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_1, "sdio4_data_1", std),
  544. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_2, "sdio4_data_2", std),
  545. BCM281XX_PIN_DESC(BCM281XX_PIN_SDIO4_DATA_3, "sdio4_data_3", std),
  546. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_CLK, "sim_clk", std),
  547. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DATA, "sim_data", std),
  548. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_DET, "sim_det", std),
  549. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM_RESETN, "sim_resetn", std),
  550. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_CLK, "sim2_clk", std),
  551. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DATA, "sim2_data", std),
  552. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_DET, "sim2_det", std),
  553. BCM281XX_PIN_DESC(BCM281XX_PIN_SIM2_RESETN, "sim2_resetn", std),
  554. BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_C, "sri_c", std),
  555. BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_D, "sri_d", std),
  556. BCM281XX_PIN_DESC(BCM281XX_PIN_SRI_E, "sri_e", std),
  557. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP_EXTCLK, "ssp_extclk", std),
  558. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_CLK, "ssp0_clk", std),
  559. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_FS, "ssp0_fs", std),
  560. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_RXD, "ssp0_rxd", std),
  561. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP0_TXD, "ssp0_txd", std),
  562. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_CLK, "ssp2_clk", std),
  563. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_0, "ssp2_fs_0", std),
  564. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_1, "ssp2_fs_1", std),
  565. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_2, "ssp2_fs_2", std),
  566. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_FS_3, "ssp2_fs_3", std),
  567. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_0, "ssp2_rxd_0", std),
  568. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_RXD_1, "ssp2_rxd_1", std),
  569. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_0, "ssp2_txd_0", std),
  570. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP2_TXD_1, "ssp2_txd_1", std),
  571. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_CLK, "ssp3_clk", std),
  572. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_FS, "ssp3_fs", std),
  573. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_RXD, "ssp3_rxd", std),
  574. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP3_TXD, "ssp3_txd", std),
  575. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_CLK, "ssp4_clk", std),
  576. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_FS, "ssp4_fs", std),
  577. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_RXD, "ssp4_rxd", std),
  578. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP4_TXD, "ssp4_txd", std),
  579. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_CLK, "ssp5_clk", std),
  580. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_FS, "ssp5_fs", std),
  581. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_RXD, "ssp5_rxd", std),
  582. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP5_TXD, "ssp5_txd", std),
  583. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_CLK, "ssp6_clk", std),
  584. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_FS, "ssp6_fs", std),
  585. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_RXD, "ssp6_rxd", std),
  586. BCM281XX_PIN_DESC(BCM281XX_PIN_SSP6_TXD, "ssp6_txd", std),
  587. BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_1, "stat_1", std),
  588. BCM281XX_PIN_DESC(BCM281XX_PIN_STAT_2, "stat_2", std),
  589. BCM281XX_PIN_DESC(BCM281XX_PIN_SYSCLKEN, "sysclken", std),
  590. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACECLK, "traceclk", std),
  591. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT00, "tracedt00", std),
  592. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT01, "tracedt01", std),
  593. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT02, "tracedt02", std),
  594. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT03, "tracedt03", std),
  595. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT04, "tracedt04", std),
  596. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT05, "tracedt05", std),
  597. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT06, "tracedt06", std),
  598. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT07, "tracedt07", std),
  599. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT08, "tracedt08", std),
  600. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT09, "tracedt09", std),
  601. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT10, "tracedt10", std),
  602. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT11, "tracedt11", std),
  603. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT12, "tracedt12", std),
  604. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT13, "tracedt13", std),
  605. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT14, "tracedt14", std),
  606. BCM281XX_PIN_DESC(BCM281XX_PIN_TRACEDT15, "tracedt15", std),
  607. BCM281XX_PIN_DESC(BCM281XX_PIN_TXDATA3G0, "txdata3g0", std),
  608. BCM281XX_PIN_DESC(BCM281XX_PIN_TXPWRIND, "txpwrind", std),
  609. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UCTS, "uartb1_ucts", std),
  610. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URTS, "uartb1_urts", std),
  611. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_URXD, "uartb1_urxd", std),
  612. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB1_UTXD, "uartb1_utxd", std),
  613. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_URXD, "uartb2_urxd", std),
  614. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB2_UTXD, "uartb2_utxd", std),
  615. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UCTS, "uartb3_ucts", std),
  616. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URTS, "uartb3_urts", std),
  617. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_URXD, "uartb3_urxd", std),
  618. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB3_UTXD, "uartb3_utxd", std),
  619. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UCTS, "uartb4_ucts", std),
  620. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URTS, "uartb4_urts", std),
  621. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_URXD, "uartb4_urxd", std),
  622. BCM281XX_PIN_DESC(BCM281XX_PIN_UARTB4_UTXD, "uartb4_utxd", std),
  623. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SCL, "vc_cam1_scl", i2c),
  624. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM1_SDA, "vc_cam1_sda", i2c),
  625. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SCL, "vc_cam2_scl", i2c),
  626. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM2_SDA, "vc_cam2_sda", i2c),
  627. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SCL, "vc_cam3_scl", i2c),
  628. BCM281XX_PIN_DESC(BCM281XX_PIN_VC_CAM3_SDA, "vc_cam3_sda", i2c),
  629. };
  630. static const char * const bcm281xx_alt_groups[] = {
  631. "adcsync",
  632. "bat_rm",
  633. "bsc1_scl",
  634. "bsc1_sda",
  635. "bsc2_scl",
  636. "bsc2_sda",
  637. "classgpwr",
  638. "clk_cx8",
  639. "clkout_0",
  640. "clkout_1",
  641. "clkout_2",
  642. "clkout_3",
  643. "clkreq_in_0",
  644. "clkreq_in_1",
  645. "cws_sys_req1",
  646. "cws_sys_req2",
  647. "cws_sys_req3",
  648. "digmic1_clk",
  649. "digmic1_dq",
  650. "digmic2_clk",
  651. "digmic2_dq",
  652. "gpen13",
  653. "gpen14",
  654. "gpen15",
  655. "gpio00",
  656. "gpio01",
  657. "gpio02",
  658. "gpio03",
  659. "gpio04",
  660. "gpio05",
  661. "gpio06",
  662. "gpio07",
  663. "gpio08",
  664. "gpio09",
  665. "gpio10",
  666. "gpio11",
  667. "gpio12",
  668. "gpio13",
  669. "gpio14",
  670. "gps_pablank",
  671. "gps_tmark",
  672. "hdmi_scl",
  673. "hdmi_sda",
  674. "ic_dm",
  675. "ic_dp",
  676. "kp_col_ip_0",
  677. "kp_col_ip_1",
  678. "kp_col_ip_2",
  679. "kp_col_ip_3",
  680. "kp_row_op_0",
  681. "kp_row_op_1",
  682. "kp_row_op_2",
  683. "kp_row_op_3",
  684. "lcd_b_0",
  685. "lcd_b_1",
  686. "lcd_b_2",
  687. "lcd_b_3",
  688. "lcd_b_4",
  689. "lcd_b_5",
  690. "lcd_b_6",
  691. "lcd_b_7",
  692. "lcd_g_0",
  693. "lcd_g_1",
  694. "lcd_g_2",
  695. "lcd_g_3",
  696. "lcd_g_4",
  697. "lcd_g_5",
  698. "lcd_g_6",
  699. "lcd_g_7",
  700. "lcd_hsync",
  701. "lcd_oe",
  702. "lcd_pclk",
  703. "lcd_r_0",
  704. "lcd_r_1",
  705. "lcd_r_2",
  706. "lcd_r_3",
  707. "lcd_r_4",
  708. "lcd_r_5",
  709. "lcd_r_6",
  710. "lcd_r_7",
  711. "lcd_vsync",
  712. "mdmgpio0",
  713. "mdmgpio1",
  714. "mdmgpio2",
  715. "mdmgpio3",
  716. "mdmgpio4",
  717. "mdmgpio5",
  718. "mdmgpio6",
  719. "mdmgpio7",
  720. "mdmgpio8",
  721. "mphi_data_0",
  722. "mphi_data_1",
  723. "mphi_data_2",
  724. "mphi_data_3",
  725. "mphi_data_4",
  726. "mphi_data_5",
  727. "mphi_data_6",
  728. "mphi_data_7",
  729. "mphi_data_8",
  730. "mphi_data_9",
  731. "mphi_data_10",
  732. "mphi_data_11",
  733. "mphi_data_12",
  734. "mphi_data_13",
  735. "mphi_data_14",
  736. "mphi_data_15",
  737. "mphi_ha0",
  738. "mphi_hat0",
  739. "mphi_hat1",
  740. "mphi_hce0_n",
  741. "mphi_hce1_n",
  742. "mphi_hrd_n",
  743. "mphi_hwr_n",
  744. "mphi_run0",
  745. "mphi_run1",
  746. "mtx_scan_clk",
  747. "mtx_scan_data",
  748. "nand_ad_0",
  749. "nand_ad_1",
  750. "nand_ad_2",
  751. "nand_ad_3",
  752. "nand_ad_4",
  753. "nand_ad_5",
  754. "nand_ad_6",
  755. "nand_ad_7",
  756. "nand_ale",
  757. "nand_cen_0",
  758. "nand_cen_1",
  759. "nand_cle",
  760. "nand_oen",
  761. "nand_rdy_0",
  762. "nand_rdy_1",
  763. "nand_wen",
  764. "nand_wp",
  765. "pc1",
  766. "pc2",
  767. "pmu_int",
  768. "pmu_scl",
  769. "pmu_sda",
  770. "rfst2g_mtsloten3g",
  771. "rgmii_0_rx_ctl",
  772. "rgmii_0_rxc",
  773. "rgmii_0_rxd_0",
  774. "rgmii_0_rxd_1",
  775. "rgmii_0_rxd_2",
  776. "rgmii_0_rxd_3",
  777. "rgmii_0_tx_ctl",
  778. "rgmii_0_txc",
  779. "rgmii_0_txd_0",
  780. "rgmii_0_txd_1",
  781. "rgmii_0_txd_2",
  782. "rgmii_0_txd_3",
  783. "rgmii_1_rx_ctl",
  784. "rgmii_1_rxc",
  785. "rgmii_1_rxd_0",
  786. "rgmii_1_rxd_1",
  787. "rgmii_1_rxd_2",
  788. "rgmii_1_rxd_3",
  789. "rgmii_1_tx_ctl",
  790. "rgmii_1_txc",
  791. "rgmii_1_txd_0",
  792. "rgmii_1_txd_1",
  793. "rgmii_1_txd_2",
  794. "rgmii_1_txd_3",
  795. "rgmii_gpio_0",
  796. "rgmii_gpio_1",
  797. "rgmii_gpio_2",
  798. "rgmii_gpio_3",
  799. "rtxdata2g_txdata3g1",
  800. "rtxen2g_txdata3g2",
  801. "rxdata3g0",
  802. "rxdata3g1",
  803. "rxdata3g2",
  804. "sdio1_clk",
  805. "sdio1_cmd",
  806. "sdio1_data_0",
  807. "sdio1_data_1",
  808. "sdio1_data_2",
  809. "sdio1_data_3",
  810. "sdio4_clk",
  811. "sdio4_cmd",
  812. "sdio4_data_0",
  813. "sdio4_data_1",
  814. "sdio4_data_2",
  815. "sdio4_data_3",
  816. "sim_clk",
  817. "sim_data",
  818. "sim_det",
  819. "sim_resetn",
  820. "sim2_clk",
  821. "sim2_data",
  822. "sim2_det",
  823. "sim2_resetn",
  824. "sri_c",
  825. "sri_d",
  826. "sri_e",
  827. "ssp_extclk",
  828. "ssp0_clk",
  829. "ssp0_fs",
  830. "ssp0_rxd",
  831. "ssp0_txd",
  832. "ssp2_clk",
  833. "ssp2_fs_0",
  834. "ssp2_fs_1",
  835. "ssp2_fs_2",
  836. "ssp2_fs_3",
  837. "ssp2_rxd_0",
  838. "ssp2_rxd_1",
  839. "ssp2_txd_0",
  840. "ssp2_txd_1",
  841. "ssp3_clk",
  842. "ssp3_fs",
  843. "ssp3_rxd",
  844. "ssp3_txd",
  845. "ssp4_clk",
  846. "ssp4_fs",
  847. "ssp4_rxd",
  848. "ssp4_txd",
  849. "ssp5_clk",
  850. "ssp5_fs",
  851. "ssp5_rxd",
  852. "ssp5_txd",
  853. "ssp6_clk",
  854. "ssp6_fs",
  855. "ssp6_rxd",
  856. "ssp6_txd",
  857. "stat_1",
  858. "stat_2",
  859. "sysclken",
  860. "traceclk",
  861. "tracedt00",
  862. "tracedt01",
  863. "tracedt02",
  864. "tracedt03",
  865. "tracedt04",
  866. "tracedt05",
  867. "tracedt06",
  868. "tracedt07",
  869. "tracedt08",
  870. "tracedt09",
  871. "tracedt10",
  872. "tracedt11",
  873. "tracedt12",
  874. "tracedt13",
  875. "tracedt14",
  876. "tracedt15",
  877. "txdata3g0",
  878. "txpwrind",
  879. "uartb1_ucts",
  880. "uartb1_urts",
  881. "uartb1_urxd",
  882. "uartb1_utxd",
  883. "uartb2_urxd",
  884. "uartb2_utxd",
  885. "uartb3_ucts",
  886. "uartb3_urts",
  887. "uartb3_urxd",
  888. "uartb3_utxd",
  889. "uartb4_ucts",
  890. "uartb4_urts",
  891. "uartb4_urxd",
  892. "uartb4_utxd",
  893. "vc_cam1_scl",
  894. "vc_cam1_sda",
  895. "vc_cam2_scl",
  896. "vc_cam2_sda",
  897. "vc_cam3_scl",
  898. "vc_cam3_sda",
  899. };
  900. /* Every pin can implement all ALT1-ALT4 functions */
  901. #define BCM281XX_PIN_FUNCTION(fcn_name) \
  902. { \
  903. .name = #fcn_name, \
  904. .groups = bcm281xx_alt_groups, \
  905. .ngroups = ARRAY_SIZE(bcm281xx_alt_groups), \
  906. }
  907. static const struct bcm281xx_pin_function bcm281xx_functions[] = {
  908. BCM281XX_PIN_FUNCTION(alt1),
  909. BCM281XX_PIN_FUNCTION(alt2),
  910. BCM281XX_PIN_FUNCTION(alt3),
  911. BCM281XX_PIN_FUNCTION(alt4),
  912. };
  913. static struct bcm281xx_pinctrl_data bcm281xx_pinctrl = {
  914. .pins = bcm281xx_pinctrl_pins,
  915. .npins = ARRAY_SIZE(bcm281xx_pinctrl_pins),
  916. .functions = bcm281xx_functions,
  917. .nfunctions = ARRAY_SIZE(bcm281xx_functions),
  918. };
  919. static inline enum bcm281xx_pin_type pin_type_get(struct pinctrl_dev *pctldev,
  920. unsigned pin)
  921. {
  922. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  923. if (pin >= pdata->npins)
  924. return BCM281XX_PIN_TYPE_UNKNOWN;
  925. return *(enum bcm281xx_pin_type *)(pdata->pins[pin].drv_data);
  926. }
  927. #define BCM281XX_PIN_SHIFT(type, param) \
  928. (BCM281XX_ ## type ## _PIN_REG_ ## param ## _SHIFT)
  929. #define BCM281XX_PIN_MASK(type, param) \
  930. (BCM281XX_ ## type ## _PIN_REG_ ## param ## _MASK)
  931. /*
  932. * This helper function is used to build up the value and mask used to write to
  933. * a pin register, but does not actually write to the register.
  934. */
  935. static inline void bcm281xx_pin_update(u32 *reg_val, u32 *reg_mask,
  936. u32 param_val, u32 param_shift,
  937. u32 param_mask)
  938. {
  939. *reg_val &= ~param_mask;
  940. *reg_val |= (param_val << param_shift) & param_mask;
  941. *reg_mask |= param_mask;
  942. }
  943. static const struct regmap_config bcm281xx_pinctrl_regmap_config = {
  944. .reg_bits = 32,
  945. .reg_stride = 4,
  946. .val_bits = 32,
  947. .max_register = BCM281XX_PIN_VC_CAM3_SDA,
  948. };
  949. static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  950. {
  951. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  952. return pdata->npins;
  953. }
  954. static const char *bcm281xx_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  955. unsigned group)
  956. {
  957. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  958. return pdata->pins[group].name;
  959. }
  960. static int bcm281xx_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  961. unsigned group,
  962. const unsigned **pins,
  963. unsigned *num_pins)
  964. {
  965. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  966. *pins = &pdata->pins[group].number;
  967. *num_pins = 1;
  968. return 0;
  969. }
  970. static void bcm281xx_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
  971. struct seq_file *s,
  972. unsigned offset)
  973. {
  974. seq_printf(s, " %s", dev_name(pctldev->dev));
  975. }
  976. static const struct pinctrl_ops bcm281xx_pinctrl_ops = {
  977. .get_groups_count = bcm281xx_pinctrl_get_groups_count,
  978. .get_group_name = bcm281xx_pinctrl_get_group_name,
  979. .get_group_pins = bcm281xx_pinctrl_get_group_pins,
  980. .pin_dbg_show = bcm281xx_pinctrl_pin_dbg_show,
  981. .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
  982. .dt_free_map = pinctrl_utils_free_map,
  983. };
  984. static int bcm281xx_pinctrl_get_fcns_count(struct pinctrl_dev *pctldev)
  985. {
  986. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  987. return pdata->nfunctions;
  988. }
  989. static const char *bcm281xx_pinctrl_get_fcn_name(struct pinctrl_dev *pctldev,
  990. unsigned function)
  991. {
  992. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  993. return pdata->functions[function].name;
  994. }
  995. static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
  996. unsigned function,
  997. const char * const **groups,
  998. unsigned * const num_groups)
  999. {
  1000. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1001. *groups = pdata->functions[function].groups;
  1002. *num_groups = pdata->functions[function].ngroups;
  1003. return 0;
  1004. }
  1005. static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
  1006. unsigned function,
  1007. unsigned group)
  1008. {
  1009. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1010. const struct bcm281xx_pin_function *f = &pdata->functions[function];
  1011. u32 offset = 4 * pdata->pins[group].number;
  1012. int rc = 0;
  1013. dev_dbg(pctldev->dev,
  1014. "%s(): Enable function %s (%d) of pin %s (%d) @offset 0x%x.\n",
  1015. __func__, f->name, function, pdata->pins[group].name,
  1016. pdata->pins[group].number, offset);
  1017. rc = regmap_update_bits(pdata->regmap, offset,
  1018. BCM281XX_PIN_REG_F_SEL_MASK,
  1019. function << BCM281XX_PIN_REG_F_SEL_SHIFT);
  1020. if (rc)
  1021. dev_err(pctldev->dev,
  1022. "Error updating register for pin %s (%d).\n",
  1023. pdata->pins[group].name, pdata->pins[group].number);
  1024. return rc;
  1025. }
  1026. static const struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
  1027. .get_functions_count = bcm281xx_pinctrl_get_fcns_count,
  1028. .get_function_name = bcm281xx_pinctrl_get_fcn_name,
  1029. .get_function_groups = bcm281xx_pinctrl_get_fcn_groups,
  1030. .set_mux = bcm281xx_pinmux_set,
  1031. };
  1032. static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
  1033. unsigned pin,
  1034. unsigned long *config)
  1035. {
  1036. return -ENOTSUPP;
  1037. }
  1038. /* Goes through the configs and update register val/mask */
  1039. static int bcm281xx_std_pin_update(struct pinctrl_dev *pctldev,
  1040. unsigned pin,
  1041. unsigned long *configs,
  1042. unsigned num_configs,
  1043. u32 *val,
  1044. u32 *mask)
  1045. {
  1046. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1047. int i;
  1048. enum pin_config_param param;
  1049. u32 arg;
  1050. for (i = 0; i < num_configs; i++) {
  1051. param = pinconf_to_config_param(configs[i]);
  1052. arg = pinconf_to_config_argument(configs[i]);
  1053. switch (param) {
  1054. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  1055. arg = (arg >= 1 ? 1 : 0);
  1056. bcm281xx_pin_update(val, mask, arg,
  1057. BCM281XX_PIN_SHIFT(STD, HYST),
  1058. BCM281XX_PIN_MASK(STD, HYST));
  1059. break;
  1060. /*
  1061. * The pin bias can only be one of pull-up, pull-down, or
  1062. * disable. The user does not need to specify a value for the
  1063. * property, and the default value from pinconf-generic is
  1064. * ignored.
  1065. */
  1066. case PIN_CONFIG_BIAS_DISABLE:
  1067. bcm281xx_pin_update(val, mask, 0,
  1068. BCM281XX_PIN_SHIFT(STD, PULL_UP),
  1069. BCM281XX_PIN_MASK(STD, PULL_UP));
  1070. bcm281xx_pin_update(val, mask, 0,
  1071. BCM281XX_PIN_SHIFT(STD, PULL_DN),
  1072. BCM281XX_PIN_MASK(STD, PULL_DN));
  1073. break;
  1074. case PIN_CONFIG_BIAS_PULL_UP:
  1075. bcm281xx_pin_update(val, mask, 1,
  1076. BCM281XX_PIN_SHIFT(STD, PULL_UP),
  1077. BCM281XX_PIN_MASK(STD, PULL_UP));
  1078. bcm281xx_pin_update(val, mask, 0,
  1079. BCM281XX_PIN_SHIFT(STD, PULL_DN),
  1080. BCM281XX_PIN_MASK(STD, PULL_DN));
  1081. break;
  1082. case PIN_CONFIG_BIAS_PULL_DOWN:
  1083. bcm281xx_pin_update(val, mask, 0,
  1084. BCM281XX_PIN_SHIFT(STD, PULL_UP),
  1085. BCM281XX_PIN_MASK(STD, PULL_UP));
  1086. bcm281xx_pin_update(val, mask, 1,
  1087. BCM281XX_PIN_SHIFT(STD, PULL_DN),
  1088. BCM281XX_PIN_MASK(STD, PULL_DN));
  1089. break;
  1090. case PIN_CONFIG_SLEW_RATE:
  1091. arg = (arg >= 1 ? 1 : 0);
  1092. bcm281xx_pin_update(val, mask, arg,
  1093. BCM281XX_PIN_SHIFT(STD, SLEW),
  1094. BCM281XX_PIN_MASK(STD, SLEW));
  1095. break;
  1096. case PIN_CONFIG_INPUT_ENABLE:
  1097. /* inversed since register is for input _disable_ */
  1098. arg = (arg >= 1 ? 0 : 1);
  1099. bcm281xx_pin_update(val, mask, arg,
  1100. BCM281XX_PIN_SHIFT(STD, INPUT_DIS),
  1101. BCM281XX_PIN_MASK(STD, INPUT_DIS));
  1102. break;
  1103. case PIN_CONFIG_DRIVE_STRENGTH:
  1104. /* Valid range is 2-16 mA, even numbers only */
  1105. if ((arg < 2) || (arg > 16) || (arg % 2)) {
  1106. dev_err(pctldev->dev,
  1107. "Invalid Drive Strength value (%d) for "
  1108. "pin %s (%d). Valid values are "
  1109. "(2..16) mA, even numbers only.\n",
  1110. arg, pdata->pins[pin].name, pin);
  1111. return -EINVAL;
  1112. }
  1113. bcm281xx_pin_update(val, mask, (arg/2)-1,
  1114. BCM281XX_PIN_SHIFT(STD, DRV_STR),
  1115. BCM281XX_PIN_MASK(STD, DRV_STR));
  1116. break;
  1117. default:
  1118. dev_err(pctldev->dev,
  1119. "Unrecognized pin config %d for pin %s (%d).\n",
  1120. param, pdata->pins[pin].name, pin);
  1121. return -EINVAL;
  1122. } /* switch config */
  1123. } /* for each config */
  1124. return 0;
  1125. }
  1126. /*
  1127. * The pull-up strength for an I2C pin is represented by bits 4-6 in the
  1128. * register with the following mapping:
  1129. * 0b000: No pull-up
  1130. * 0b001: 1200 Ohm
  1131. * 0b010: 1800 Ohm
  1132. * 0b011: 720 Ohm
  1133. * 0b100: 2700 Ohm
  1134. * 0b101: 831 Ohm
  1135. * 0b110: 1080 Ohm
  1136. * 0b111: 568 Ohm
  1137. * This array maps pull-up strength in Ohms to register values (1+index).
  1138. */
  1139. static const u16 bcm281xx_pullup_map[] = {
  1140. 1200, 1800, 720, 2700, 831, 1080, 568
  1141. };
  1142. /* Goes through the configs and update register val/mask */
  1143. static int bcm281xx_i2c_pin_update(struct pinctrl_dev *pctldev,
  1144. unsigned pin,
  1145. unsigned long *configs,
  1146. unsigned num_configs,
  1147. u32 *val,
  1148. u32 *mask)
  1149. {
  1150. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1151. int i, j;
  1152. enum pin_config_param param;
  1153. u32 arg;
  1154. for (i = 0; i < num_configs; i++) {
  1155. param = pinconf_to_config_param(configs[i]);
  1156. arg = pinconf_to_config_argument(configs[i]);
  1157. switch (param) {
  1158. case PIN_CONFIG_BIAS_PULL_UP:
  1159. for (j = 0; j < ARRAY_SIZE(bcm281xx_pullup_map); j++)
  1160. if (bcm281xx_pullup_map[j] == arg)
  1161. break;
  1162. if (j == ARRAY_SIZE(bcm281xx_pullup_map)) {
  1163. dev_err(pctldev->dev,
  1164. "Invalid pull-up value (%d) for pin %s "
  1165. "(%d). Valid values are 568, 720, 831, "
  1166. "1080, 1200, 1800, 2700 Ohms.\n",
  1167. arg, pdata->pins[pin].name, pin);
  1168. return -EINVAL;
  1169. }
  1170. bcm281xx_pin_update(val, mask, j+1,
  1171. BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
  1172. BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
  1173. break;
  1174. case PIN_CONFIG_BIAS_DISABLE:
  1175. bcm281xx_pin_update(val, mask, 0,
  1176. BCM281XX_PIN_SHIFT(I2C, PULL_UP_STR),
  1177. BCM281XX_PIN_MASK(I2C, PULL_UP_STR));
  1178. break;
  1179. case PIN_CONFIG_SLEW_RATE:
  1180. arg = (arg >= 1 ? 1 : 0);
  1181. bcm281xx_pin_update(val, mask, arg,
  1182. BCM281XX_PIN_SHIFT(I2C, SLEW),
  1183. BCM281XX_PIN_MASK(I2C, SLEW));
  1184. break;
  1185. case PIN_CONFIG_INPUT_ENABLE:
  1186. /* inversed since register is for input _disable_ */
  1187. arg = (arg >= 1 ? 0 : 1);
  1188. bcm281xx_pin_update(val, mask, arg,
  1189. BCM281XX_PIN_SHIFT(I2C, INPUT_DIS),
  1190. BCM281XX_PIN_MASK(I2C, INPUT_DIS));
  1191. break;
  1192. default:
  1193. dev_err(pctldev->dev,
  1194. "Unrecognized pin config %d for pin %s (%d).\n",
  1195. param, pdata->pins[pin].name, pin);
  1196. return -EINVAL;
  1197. } /* switch config */
  1198. } /* for each config */
  1199. return 0;
  1200. }
  1201. /* Goes through the configs and update register val/mask */
  1202. static int bcm281xx_hdmi_pin_update(struct pinctrl_dev *pctldev,
  1203. unsigned pin,
  1204. unsigned long *configs,
  1205. unsigned num_configs,
  1206. u32 *val,
  1207. u32 *mask)
  1208. {
  1209. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1210. int i;
  1211. enum pin_config_param param;
  1212. u32 arg;
  1213. for (i = 0; i < num_configs; i++) {
  1214. param = pinconf_to_config_param(configs[i]);
  1215. arg = pinconf_to_config_argument(configs[i]);
  1216. switch (param) {
  1217. case PIN_CONFIG_SLEW_RATE:
  1218. arg = (arg >= 1 ? 1 : 0);
  1219. bcm281xx_pin_update(val, mask, arg,
  1220. BCM281XX_PIN_SHIFT(HDMI, MODE),
  1221. BCM281XX_PIN_MASK(HDMI, MODE));
  1222. break;
  1223. case PIN_CONFIG_INPUT_ENABLE:
  1224. /* inversed since register is for input _disable_ */
  1225. arg = (arg >= 1 ? 0 : 1);
  1226. bcm281xx_pin_update(val, mask, arg,
  1227. BCM281XX_PIN_SHIFT(HDMI, INPUT_DIS),
  1228. BCM281XX_PIN_MASK(HDMI, INPUT_DIS));
  1229. break;
  1230. default:
  1231. dev_err(pctldev->dev,
  1232. "Unrecognized pin config %d for pin %s (%d).\n",
  1233. param, pdata->pins[pin].name, pin);
  1234. return -EINVAL;
  1235. } /* switch config */
  1236. } /* for each config */
  1237. return 0;
  1238. }
  1239. static int bcm281xx_pinctrl_pin_config_set(struct pinctrl_dev *pctldev,
  1240. unsigned pin,
  1241. unsigned long *configs,
  1242. unsigned num_configs)
  1243. {
  1244. struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  1245. enum bcm281xx_pin_type pin_type;
  1246. u32 offset = 4 * pin;
  1247. u32 cfg_val, cfg_mask;
  1248. int rc;
  1249. cfg_val = 0;
  1250. cfg_mask = 0;
  1251. pin_type = pin_type_get(pctldev, pin);
  1252. /* Different pins have different configuration options */
  1253. switch (pin_type) {
  1254. case BCM281XX_PIN_TYPE_STD:
  1255. rc = bcm281xx_std_pin_update(pctldev, pin, configs,
  1256. num_configs, &cfg_val, &cfg_mask);
  1257. break;
  1258. case BCM281XX_PIN_TYPE_I2C:
  1259. rc = bcm281xx_i2c_pin_update(pctldev, pin, configs,
  1260. num_configs, &cfg_val, &cfg_mask);
  1261. break;
  1262. case BCM281XX_PIN_TYPE_HDMI:
  1263. rc = bcm281xx_hdmi_pin_update(pctldev, pin, configs,
  1264. num_configs, &cfg_val, &cfg_mask);
  1265. break;
  1266. default:
  1267. dev_err(pctldev->dev, "Unknown pin type for pin %s (%d).\n",
  1268. pdata->pins[pin].name, pin);
  1269. return -EINVAL;
  1270. } /* switch pin type */
  1271. if (rc)
  1272. return rc;
  1273. dev_dbg(pctldev->dev,
  1274. "%s(): Set pin %s (%d) with config 0x%x, mask 0x%x\n",
  1275. __func__, pdata->pins[pin].name, pin, cfg_val, cfg_mask);
  1276. rc = regmap_update_bits(pdata->regmap, offset, cfg_mask, cfg_val);
  1277. if (rc) {
  1278. dev_err(pctldev->dev,
  1279. "Error updating register for pin %s (%d).\n",
  1280. pdata->pins[pin].name, pin);
  1281. return rc;
  1282. }
  1283. return 0;
  1284. }
  1285. static const struct pinconf_ops bcm281xx_pinctrl_pinconf_ops = {
  1286. .pin_config_get = bcm281xx_pinctrl_pin_config_get,
  1287. .pin_config_set = bcm281xx_pinctrl_pin_config_set,
  1288. };
  1289. static struct pinctrl_desc bcm281xx_pinctrl_desc = {
  1290. /* name, pins, npins members initialized in probe function */
  1291. .pctlops = &bcm281xx_pinctrl_ops,
  1292. .pmxops = &bcm281xx_pinctrl_pinmux_ops,
  1293. .confops = &bcm281xx_pinctrl_pinconf_ops,
  1294. .owner = THIS_MODULE,
  1295. };
  1296. static int __init bcm281xx_pinctrl_probe(struct platform_device *pdev)
  1297. {
  1298. struct bcm281xx_pinctrl_data *pdata = &bcm281xx_pinctrl;
  1299. struct pinctrl_dev *pctl;
  1300. /* So far We can assume there is only 1 bank of registers */
  1301. pdata->reg_base = devm_platform_ioremap_resource(pdev, 0);
  1302. if (IS_ERR(pdata->reg_base)) {
  1303. dev_err(&pdev->dev, "Failed to ioremap MEM resource\n");
  1304. return PTR_ERR(pdata->reg_base);
  1305. }
  1306. /* Initialize the dynamic part of pinctrl_desc */
  1307. pdata->regmap = devm_regmap_init_mmio(&pdev->dev, pdata->reg_base,
  1308. &bcm281xx_pinctrl_regmap_config);
  1309. if (IS_ERR(pdata->regmap)) {
  1310. dev_err(&pdev->dev, "Regmap MMIO init failed.\n");
  1311. return -ENODEV;
  1312. }
  1313. bcm281xx_pinctrl_desc.name = dev_name(&pdev->dev);
  1314. bcm281xx_pinctrl_desc.pins = bcm281xx_pinctrl.pins;
  1315. bcm281xx_pinctrl_desc.npins = bcm281xx_pinctrl.npins;
  1316. pctl = devm_pinctrl_register(&pdev->dev, &bcm281xx_pinctrl_desc, pdata);
  1317. if (IS_ERR(pctl)) {
  1318. dev_err(&pdev->dev, "Failed to register pinctrl\n");
  1319. return PTR_ERR(pctl);
  1320. }
  1321. platform_set_drvdata(pdev, pdata);
  1322. return 0;
  1323. }
  1324. static const struct of_device_id bcm281xx_pinctrl_of_match[] = {
  1325. { .compatible = "brcm,bcm11351-pinctrl", },
  1326. { },
  1327. };
  1328. static struct platform_driver bcm281xx_pinctrl_driver = {
  1329. .driver = {
  1330. .name = "bcm281xx-pinctrl",
  1331. .of_match_table = bcm281xx_pinctrl_of_match,
  1332. },
  1333. };
  1334. builtin_platform_driver_probe(bcm281xx_pinctrl_driver, bcm281xx_pinctrl_probe);