pinctrl-tb10x.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Abilis Systems TB10x pin control driver
  4. *
  5. * Copyright (C) Abilis Systems 2012
  6. *
  7. * Author: Christian Ruppert <[email protected]>
  8. */
  9. #include <linux/stringify.h>
  10. #include <linux/pinctrl/pinctrl.h>
  11. #include <linux/pinctrl/pinmux.h>
  12. #include <linux/pinctrl/machine.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/module.h>
  15. #include <linux/mutex.h>
  16. #include <linux/err.h>
  17. #include <linux/io.h>
  18. #include <linux/of.h>
  19. #include <linux/slab.h>
  20. #include "pinctrl-utils.h"
  21. #define TB10X_PORT1 (0)
  22. #define TB10X_PORT2 (16)
  23. #define TB10X_PORT3 (32)
  24. #define TB10X_PORT4 (48)
  25. #define TB10X_PORT5 (128)
  26. #define TB10X_PORT6 (64)
  27. #define TB10X_PORT7 (80)
  28. #define TB10X_PORT8 (96)
  29. #define TB10X_PORT9 (112)
  30. #define TB10X_GPIOS (256)
  31. #define PCFG_PORT_BITWIDTH (2)
  32. #define PCFG_PORT_MASK(PORT) \
  33. (((1 << PCFG_PORT_BITWIDTH) - 1) << (PCFG_PORT_BITWIDTH * (PORT)))
  34. static const struct pinctrl_pin_desc tb10x_pins[] = {
  35. /* Port 1 */
  36. PINCTRL_PIN(TB10X_PORT1 + 0, "MICLK_S0"),
  37. PINCTRL_PIN(TB10X_PORT1 + 1, "MISTRT_S0"),
  38. PINCTRL_PIN(TB10X_PORT1 + 2, "MIVAL_S0"),
  39. PINCTRL_PIN(TB10X_PORT1 + 3, "MDI_S0"),
  40. PINCTRL_PIN(TB10X_PORT1 + 4, "GPIOA0"),
  41. PINCTRL_PIN(TB10X_PORT1 + 5, "GPIOA1"),
  42. PINCTRL_PIN(TB10X_PORT1 + 6, "GPIOA2"),
  43. PINCTRL_PIN(TB10X_PORT1 + 7, "MDI_S1"),
  44. PINCTRL_PIN(TB10X_PORT1 + 8, "MIVAL_S1"),
  45. PINCTRL_PIN(TB10X_PORT1 + 9, "MISTRT_S1"),
  46. PINCTRL_PIN(TB10X_PORT1 + 10, "MICLK_S1"),
  47. /* Port 2 */
  48. PINCTRL_PIN(TB10X_PORT2 + 0, "MICLK_S2"),
  49. PINCTRL_PIN(TB10X_PORT2 + 1, "MISTRT_S2"),
  50. PINCTRL_PIN(TB10X_PORT2 + 2, "MIVAL_S2"),
  51. PINCTRL_PIN(TB10X_PORT2 + 3, "MDI_S2"),
  52. PINCTRL_PIN(TB10X_PORT2 + 4, "GPIOC0"),
  53. PINCTRL_PIN(TB10X_PORT2 + 5, "GPIOC1"),
  54. PINCTRL_PIN(TB10X_PORT2 + 6, "GPIOC2"),
  55. PINCTRL_PIN(TB10X_PORT2 + 7, "MDI_S3"),
  56. PINCTRL_PIN(TB10X_PORT2 + 8, "MIVAL_S3"),
  57. PINCTRL_PIN(TB10X_PORT2 + 9, "MISTRT_S3"),
  58. PINCTRL_PIN(TB10X_PORT2 + 10, "MICLK_S3"),
  59. /* Port 3 */
  60. PINCTRL_PIN(TB10X_PORT3 + 0, "MICLK_S4"),
  61. PINCTRL_PIN(TB10X_PORT3 + 1, "MISTRT_S4"),
  62. PINCTRL_PIN(TB10X_PORT3 + 2, "MIVAL_S4"),
  63. PINCTRL_PIN(TB10X_PORT3 + 3, "MDI_S4"),
  64. PINCTRL_PIN(TB10X_PORT3 + 4, "GPIOE0"),
  65. PINCTRL_PIN(TB10X_PORT3 + 5, "GPIOE1"),
  66. PINCTRL_PIN(TB10X_PORT3 + 6, "GPIOE2"),
  67. PINCTRL_PIN(TB10X_PORT3 + 7, "MDI_S5"),
  68. PINCTRL_PIN(TB10X_PORT3 + 8, "MIVAL_S5"),
  69. PINCTRL_PIN(TB10X_PORT3 + 9, "MISTRT_S5"),
  70. PINCTRL_PIN(TB10X_PORT3 + 10, "MICLK_S5"),
  71. /* Port 4 */
  72. PINCTRL_PIN(TB10X_PORT4 + 0, "MICLK_S6"),
  73. PINCTRL_PIN(TB10X_PORT4 + 1, "MISTRT_S6"),
  74. PINCTRL_PIN(TB10X_PORT4 + 2, "MIVAL_S6"),
  75. PINCTRL_PIN(TB10X_PORT4 + 3, "MDI_S6"),
  76. PINCTRL_PIN(TB10X_PORT4 + 4, "GPIOG0"),
  77. PINCTRL_PIN(TB10X_PORT4 + 5, "GPIOG1"),
  78. PINCTRL_PIN(TB10X_PORT4 + 6, "GPIOG2"),
  79. PINCTRL_PIN(TB10X_PORT4 + 7, "MDI_S7"),
  80. PINCTRL_PIN(TB10X_PORT4 + 8, "MIVAL_S7"),
  81. PINCTRL_PIN(TB10X_PORT4 + 9, "MISTRT_S7"),
  82. PINCTRL_PIN(TB10X_PORT4 + 10, "MICLK_S7"),
  83. /* Port 5 */
  84. PINCTRL_PIN(TB10X_PORT5 + 0, "PC_CE1N"),
  85. PINCTRL_PIN(TB10X_PORT5 + 1, "PC_CE2N"),
  86. PINCTRL_PIN(TB10X_PORT5 + 2, "PC_REGN"),
  87. PINCTRL_PIN(TB10X_PORT5 + 3, "PC_INPACKN"),
  88. PINCTRL_PIN(TB10X_PORT5 + 4, "PC_OEN"),
  89. PINCTRL_PIN(TB10X_PORT5 + 5, "PC_WEN"),
  90. PINCTRL_PIN(TB10X_PORT5 + 6, "PC_IORDN"),
  91. PINCTRL_PIN(TB10X_PORT5 + 7, "PC_IOWRN"),
  92. PINCTRL_PIN(TB10X_PORT5 + 8, "PC_RDYIRQN"),
  93. PINCTRL_PIN(TB10X_PORT5 + 9, "PC_WAITN"),
  94. PINCTRL_PIN(TB10X_PORT5 + 10, "PC_A0"),
  95. PINCTRL_PIN(TB10X_PORT5 + 11, "PC_A1"),
  96. PINCTRL_PIN(TB10X_PORT5 + 12, "PC_A2"),
  97. PINCTRL_PIN(TB10X_PORT5 + 13, "PC_A3"),
  98. PINCTRL_PIN(TB10X_PORT5 + 14, "PC_A4"),
  99. PINCTRL_PIN(TB10X_PORT5 + 15, "PC_A5"),
  100. PINCTRL_PIN(TB10X_PORT5 + 16, "PC_A6"),
  101. PINCTRL_PIN(TB10X_PORT5 + 17, "PC_A7"),
  102. PINCTRL_PIN(TB10X_PORT5 + 18, "PC_A8"),
  103. PINCTRL_PIN(TB10X_PORT5 + 19, "PC_A9"),
  104. PINCTRL_PIN(TB10X_PORT5 + 20, "PC_A10"),
  105. PINCTRL_PIN(TB10X_PORT5 + 21, "PC_A11"),
  106. PINCTRL_PIN(TB10X_PORT5 + 22, "PC_A12"),
  107. PINCTRL_PIN(TB10X_PORT5 + 23, "PC_A13"),
  108. PINCTRL_PIN(TB10X_PORT5 + 24, "PC_A14"),
  109. PINCTRL_PIN(TB10X_PORT5 + 25, "PC_D0"),
  110. PINCTRL_PIN(TB10X_PORT5 + 26, "PC_D1"),
  111. PINCTRL_PIN(TB10X_PORT5 + 27, "PC_D2"),
  112. PINCTRL_PIN(TB10X_PORT5 + 28, "PC_D3"),
  113. PINCTRL_PIN(TB10X_PORT5 + 29, "PC_D4"),
  114. PINCTRL_PIN(TB10X_PORT5 + 30, "PC_D5"),
  115. PINCTRL_PIN(TB10X_PORT5 + 31, "PC_D6"),
  116. PINCTRL_PIN(TB10X_PORT5 + 32, "PC_D7"),
  117. PINCTRL_PIN(TB10X_PORT5 + 33, "PC_MOSTRT"),
  118. PINCTRL_PIN(TB10X_PORT5 + 34, "PC_MOVAL"),
  119. PINCTRL_PIN(TB10X_PORT5 + 35, "PC_MDO0"),
  120. PINCTRL_PIN(TB10X_PORT5 + 36, "PC_MDO1"),
  121. PINCTRL_PIN(TB10X_PORT5 + 37, "PC_MDO2"),
  122. PINCTRL_PIN(TB10X_PORT5 + 38, "PC_MDO3"),
  123. PINCTRL_PIN(TB10X_PORT5 + 39, "PC_MDO4"),
  124. PINCTRL_PIN(TB10X_PORT5 + 40, "PC_MDO5"),
  125. PINCTRL_PIN(TB10X_PORT5 + 41, "PC_MDO6"),
  126. PINCTRL_PIN(TB10X_PORT5 + 42, "PC_MDO7"),
  127. PINCTRL_PIN(TB10X_PORT5 + 43, "PC_MISTRT"),
  128. PINCTRL_PIN(TB10X_PORT5 + 44, "PC_MIVAL"),
  129. PINCTRL_PIN(TB10X_PORT5 + 45, "PC_MDI0"),
  130. PINCTRL_PIN(TB10X_PORT5 + 46, "PC_MDI1"),
  131. PINCTRL_PIN(TB10X_PORT5 + 47, "PC_MDI2"),
  132. PINCTRL_PIN(TB10X_PORT5 + 48, "PC_MDI3"),
  133. PINCTRL_PIN(TB10X_PORT5 + 49, "PC_MDI4"),
  134. PINCTRL_PIN(TB10X_PORT5 + 50, "PC_MDI5"),
  135. PINCTRL_PIN(TB10X_PORT5 + 51, "PC_MDI6"),
  136. PINCTRL_PIN(TB10X_PORT5 + 52, "PC_MDI7"),
  137. PINCTRL_PIN(TB10X_PORT5 + 53, "PC_MICLK"),
  138. /* Port 6 */
  139. PINCTRL_PIN(TB10X_PORT6 + 0, "T_MOSTRT_S0"),
  140. PINCTRL_PIN(TB10X_PORT6 + 1, "T_MOVAL_S0"),
  141. PINCTRL_PIN(TB10X_PORT6 + 2, "T_MDO_S0"),
  142. PINCTRL_PIN(TB10X_PORT6 + 3, "T_MOSTRT_S1"),
  143. PINCTRL_PIN(TB10X_PORT6 + 4, "T_MOVAL_S1"),
  144. PINCTRL_PIN(TB10X_PORT6 + 5, "T_MDO_S1"),
  145. PINCTRL_PIN(TB10X_PORT6 + 6, "T_MOSTRT_S2"),
  146. PINCTRL_PIN(TB10X_PORT6 + 7, "T_MOVAL_S2"),
  147. PINCTRL_PIN(TB10X_PORT6 + 8, "T_MDO_S2"),
  148. PINCTRL_PIN(TB10X_PORT6 + 9, "T_MOSTRT_S3"),
  149. /* Port 7 */
  150. PINCTRL_PIN(TB10X_PORT7 + 0, "UART0_TXD"),
  151. PINCTRL_PIN(TB10X_PORT7 + 1, "UART0_RXD"),
  152. PINCTRL_PIN(TB10X_PORT7 + 2, "UART0_CTS"),
  153. PINCTRL_PIN(TB10X_PORT7 + 3, "UART0_RTS"),
  154. PINCTRL_PIN(TB10X_PORT7 + 4, "UART1_TXD"),
  155. PINCTRL_PIN(TB10X_PORT7 + 5, "UART1_RXD"),
  156. PINCTRL_PIN(TB10X_PORT7 + 6, "UART1_CTS"),
  157. PINCTRL_PIN(TB10X_PORT7 + 7, "UART1_RTS"),
  158. /* Port 8 */
  159. PINCTRL_PIN(TB10X_PORT8 + 0, "SPI3_CLK"),
  160. PINCTRL_PIN(TB10X_PORT8 + 1, "SPI3_MISO"),
  161. PINCTRL_PIN(TB10X_PORT8 + 2, "SPI3_MOSI"),
  162. PINCTRL_PIN(TB10X_PORT8 + 3, "SPI3_SSN"),
  163. /* Port 9 */
  164. PINCTRL_PIN(TB10X_PORT9 + 0, "SPI1_CLK"),
  165. PINCTRL_PIN(TB10X_PORT9 + 1, "SPI1_MISO"),
  166. PINCTRL_PIN(TB10X_PORT9 + 2, "SPI1_MOSI"),
  167. PINCTRL_PIN(TB10X_PORT9 + 3, "SPI1_SSN0"),
  168. PINCTRL_PIN(TB10X_PORT9 + 4, "SPI1_SSN1"),
  169. /* Unmuxed GPIOs */
  170. PINCTRL_PIN(TB10X_GPIOS + 0, "GPIOB0"),
  171. PINCTRL_PIN(TB10X_GPIOS + 1, "GPIOB1"),
  172. PINCTRL_PIN(TB10X_GPIOS + 2, "GPIOD0"),
  173. PINCTRL_PIN(TB10X_GPIOS + 3, "GPIOD1"),
  174. PINCTRL_PIN(TB10X_GPIOS + 4, "GPIOF0"),
  175. PINCTRL_PIN(TB10X_GPIOS + 5, "GPIOF1"),
  176. PINCTRL_PIN(TB10X_GPIOS + 6, "GPIOH0"),
  177. PINCTRL_PIN(TB10X_GPIOS + 7, "GPIOH1"),
  178. PINCTRL_PIN(TB10X_GPIOS + 8, "GPIOI0"),
  179. PINCTRL_PIN(TB10X_GPIOS + 9, "GPIOI1"),
  180. PINCTRL_PIN(TB10X_GPIOS + 10, "GPIOI2"),
  181. PINCTRL_PIN(TB10X_GPIOS + 11, "GPIOI3"),
  182. PINCTRL_PIN(TB10X_GPIOS + 12, "GPIOI4"),
  183. PINCTRL_PIN(TB10X_GPIOS + 13, "GPIOI5"),
  184. PINCTRL_PIN(TB10X_GPIOS + 14, "GPIOI6"),
  185. PINCTRL_PIN(TB10X_GPIOS + 15, "GPIOI7"),
  186. PINCTRL_PIN(TB10X_GPIOS + 16, "GPIOI8"),
  187. PINCTRL_PIN(TB10X_GPIOS + 17, "GPIOI9"),
  188. PINCTRL_PIN(TB10X_GPIOS + 18, "GPIOI10"),
  189. PINCTRL_PIN(TB10X_GPIOS + 19, "GPIOI11"),
  190. PINCTRL_PIN(TB10X_GPIOS + 20, "GPION0"),
  191. PINCTRL_PIN(TB10X_GPIOS + 21, "GPION1"),
  192. PINCTRL_PIN(TB10X_GPIOS + 22, "GPION2"),
  193. PINCTRL_PIN(TB10X_GPIOS + 23, "GPION3"),
  194. #define MAX_PIN (TB10X_GPIOS + 24)
  195. PINCTRL_PIN(MAX_PIN, "GPION4"),
  196. };
  197. /* Port 1 */
  198. static const unsigned mis0_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1,
  199. TB10X_PORT1 + 2, TB10X_PORT1 + 3};
  200. static const unsigned gpioa_pins[] = { TB10X_PORT1 + 4, TB10X_PORT1 + 5,
  201. TB10X_PORT1 + 6};
  202. static const unsigned mis1_pins[] = { TB10X_PORT1 + 7, TB10X_PORT1 + 8,
  203. TB10X_PORT1 + 9, TB10X_PORT1 + 10};
  204. static const unsigned mip1_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1,
  205. TB10X_PORT1 + 2, TB10X_PORT1 + 3,
  206. TB10X_PORT1 + 4, TB10X_PORT1 + 5,
  207. TB10X_PORT1 + 6, TB10X_PORT1 + 7,
  208. TB10X_PORT1 + 8, TB10X_PORT1 + 9,
  209. TB10X_PORT1 + 10};
  210. /* Port 2 */
  211. static const unsigned mis2_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1,
  212. TB10X_PORT2 + 2, TB10X_PORT2 + 3};
  213. static const unsigned gpioc_pins[] = { TB10X_PORT2 + 4, TB10X_PORT2 + 5,
  214. TB10X_PORT2 + 6};
  215. static const unsigned mis3_pins[] = { TB10X_PORT2 + 7, TB10X_PORT2 + 8,
  216. TB10X_PORT2 + 9, TB10X_PORT2 + 10};
  217. static const unsigned mip3_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1,
  218. TB10X_PORT2 + 2, TB10X_PORT2 + 3,
  219. TB10X_PORT2 + 4, TB10X_PORT2 + 5,
  220. TB10X_PORT2 + 6, TB10X_PORT2 + 7,
  221. TB10X_PORT2 + 8, TB10X_PORT2 + 9,
  222. TB10X_PORT2 + 10};
  223. /* Port 3 */
  224. static const unsigned mis4_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1,
  225. TB10X_PORT3 + 2, TB10X_PORT3 + 3};
  226. static const unsigned gpioe_pins[] = { TB10X_PORT3 + 4, TB10X_PORT3 + 5,
  227. TB10X_PORT3 + 6};
  228. static const unsigned mis5_pins[] = { TB10X_PORT3 + 7, TB10X_PORT3 + 8,
  229. TB10X_PORT3 + 9, TB10X_PORT3 + 10};
  230. static const unsigned mip5_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1,
  231. TB10X_PORT3 + 2, TB10X_PORT3 + 3,
  232. TB10X_PORT3 + 4, TB10X_PORT3 + 5,
  233. TB10X_PORT3 + 6, TB10X_PORT3 + 7,
  234. TB10X_PORT3 + 8, TB10X_PORT3 + 9,
  235. TB10X_PORT3 + 10};
  236. /* Port 4 */
  237. static const unsigned mis6_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1,
  238. TB10X_PORT4 + 2, TB10X_PORT4 + 3};
  239. static const unsigned gpiog_pins[] = { TB10X_PORT4 + 4, TB10X_PORT4 + 5,
  240. TB10X_PORT4 + 6};
  241. static const unsigned mis7_pins[] = { TB10X_PORT4 + 7, TB10X_PORT4 + 8,
  242. TB10X_PORT4 + 9, TB10X_PORT4 + 10};
  243. static const unsigned mip7_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1,
  244. TB10X_PORT4 + 2, TB10X_PORT4 + 3,
  245. TB10X_PORT4 + 4, TB10X_PORT4 + 5,
  246. TB10X_PORT4 + 6, TB10X_PORT4 + 7,
  247. TB10X_PORT4 + 8, TB10X_PORT4 + 9,
  248. TB10X_PORT4 + 10};
  249. /* Port 6 */
  250. static const unsigned mop_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1,
  251. TB10X_PORT6 + 2, TB10X_PORT6 + 3,
  252. TB10X_PORT6 + 4, TB10X_PORT6 + 5,
  253. TB10X_PORT6 + 6, TB10X_PORT6 + 7,
  254. TB10X_PORT6 + 8, TB10X_PORT6 + 9};
  255. static const unsigned mos0_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1,
  256. TB10X_PORT6 + 2};
  257. static const unsigned mos1_pins[] = { TB10X_PORT6 + 3, TB10X_PORT6 + 4,
  258. TB10X_PORT6 + 5};
  259. static const unsigned mos2_pins[] = { TB10X_PORT6 + 6, TB10X_PORT6 + 7,
  260. TB10X_PORT6 + 8};
  261. static const unsigned mos3_pins[] = { TB10X_PORT6 + 9};
  262. /* Port 7 */
  263. static const unsigned uart0_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1,
  264. TB10X_PORT7 + 2, TB10X_PORT7 + 3};
  265. static const unsigned uart1_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5,
  266. TB10X_PORT7 + 6, TB10X_PORT7 + 7};
  267. static const unsigned gpiol_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1,
  268. TB10X_PORT7 + 2, TB10X_PORT7 + 3};
  269. static const unsigned gpiom_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5,
  270. TB10X_PORT7 + 6, TB10X_PORT7 + 7};
  271. /* Port 8 */
  272. static const unsigned spi3_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1,
  273. TB10X_PORT8 + 2, TB10X_PORT8 + 3};
  274. static const unsigned jtag_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1,
  275. TB10X_PORT8 + 2, TB10X_PORT8 + 3};
  276. /* Port 9 */
  277. static const unsigned spi1_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1,
  278. TB10X_PORT9 + 2, TB10X_PORT9 + 3,
  279. TB10X_PORT9 + 4};
  280. static const unsigned gpion_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1,
  281. TB10X_PORT9 + 2, TB10X_PORT9 + 3,
  282. TB10X_PORT9 + 4};
  283. /* Port 5 */
  284. static const unsigned gpioj_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1,
  285. TB10X_PORT5 + 2, TB10X_PORT5 + 3,
  286. TB10X_PORT5 + 4, TB10X_PORT5 + 5,
  287. TB10X_PORT5 + 6, TB10X_PORT5 + 7,
  288. TB10X_PORT5 + 8, TB10X_PORT5 + 9,
  289. TB10X_PORT5 + 10, TB10X_PORT5 + 11,
  290. TB10X_PORT5 + 12, TB10X_PORT5 + 13,
  291. TB10X_PORT5 + 14, TB10X_PORT5 + 15,
  292. TB10X_PORT5 + 16, TB10X_PORT5 + 17,
  293. TB10X_PORT5 + 18, TB10X_PORT5 + 19,
  294. TB10X_PORT5 + 20, TB10X_PORT5 + 21,
  295. TB10X_PORT5 + 22, TB10X_PORT5 + 23,
  296. TB10X_PORT5 + 24, TB10X_PORT5 + 25,
  297. TB10X_PORT5 + 26, TB10X_PORT5 + 27,
  298. TB10X_PORT5 + 28, TB10X_PORT5 + 29,
  299. TB10X_PORT5 + 30, TB10X_PORT5 + 31};
  300. static const unsigned gpiok_pins[] = { TB10X_PORT5 + 32, TB10X_PORT5 + 33,
  301. TB10X_PORT5 + 34, TB10X_PORT5 + 35,
  302. TB10X_PORT5 + 36, TB10X_PORT5 + 37,
  303. TB10X_PORT5 + 38, TB10X_PORT5 + 39,
  304. TB10X_PORT5 + 40, TB10X_PORT5 + 41,
  305. TB10X_PORT5 + 42, TB10X_PORT5 + 43,
  306. TB10X_PORT5 + 44, TB10X_PORT5 + 45,
  307. TB10X_PORT5 + 46, TB10X_PORT5 + 47,
  308. TB10X_PORT5 + 48, TB10X_PORT5 + 49,
  309. TB10X_PORT5 + 50, TB10X_PORT5 + 51,
  310. TB10X_PORT5 + 52, TB10X_PORT5 + 53};
  311. static const unsigned ciplus_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1,
  312. TB10X_PORT5 + 2, TB10X_PORT5 + 3,
  313. TB10X_PORT5 + 4, TB10X_PORT5 + 5,
  314. TB10X_PORT5 + 6, TB10X_PORT5 + 7,
  315. TB10X_PORT5 + 8, TB10X_PORT5 + 9,
  316. TB10X_PORT5 + 10, TB10X_PORT5 + 11,
  317. TB10X_PORT5 + 12, TB10X_PORT5 + 13,
  318. TB10X_PORT5 + 14, TB10X_PORT5 + 15,
  319. TB10X_PORT5 + 16, TB10X_PORT5 + 17,
  320. TB10X_PORT5 + 18, TB10X_PORT5 + 19,
  321. TB10X_PORT5 + 20, TB10X_PORT5 + 21,
  322. TB10X_PORT5 + 22, TB10X_PORT5 + 23,
  323. TB10X_PORT5 + 24, TB10X_PORT5 + 25,
  324. TB10X_PORT5 + 26, TB10X_PORT5 + 27,
  325. TB10X_PORT5 + 28, TB10X_PORT5 + 29,
  326. TB10X_PORT5 + 30, TB10X_PORT5 + 31,
  327. TB10X_PORT5 + 32, TB10X_PORT5 + 33,
  328. TB10X_PORT5 + 34, TB10X_PORT5 + 35,
  329. TB10X_PORT5 + 36, TB10X_PORT5 + 37,
  330. TB10X_PORT5 + 38, TB10X_PORT5 + 39,
  331. TB10X_PORT5 + 40, TB10X_PORT5 + 41,
  332. TB10X_PORT5 + 42, TB10X_PORT5 + 43,
  333. TB10X_PORT5 + 44, TB10X_PORT5 + 45,
  334. TB10X_PORT5 + 46, TB10X_PORT5 + 47,
  335. TB10X_PORT5 + 48, TB10X_PORT5 + 49,
  336. TB10X_PORT5 + 50, TB10X_PORT5 + 51,
  337. TB10X_PORT5 + 52, TB10X_PORT5 + 53};
  338. static const unsigned mcard_pins[] = { TB10X_PORT5 + 3, TB10X_PORT5 + 10,
  339. TB10X_PORT5 + 11, TB10X_PORT5 + 12,
  340. TB10X_PORT5 + 22, TB10X_PORT5 + 23,
  341. TB10X_PORT5 + 33, TB10X_PORT5 + 35,
  342. TB10X_PORT5 + 36, TB10X_PORT5 + 37,
  343. TB10X_PORT5 + 38, TB10X_PORT5 + 39,
  344. TB10X_PORT5 + 40, TB10X_PORT5 + 41,
  345. TB10X_PORT5 + 42, TB10X_PORT5 + 43,
  346. TB10X_PORT5 + 45, TB10X_PORT5 + 46,
  347. TB10X_PORT5 + 47, TB10X_PORT5 + 48,
  348. TB10X_PORT5 + 49, TB10X_PORT5 + 50,
  349. TB10X_PORT5 + 51, TB10X_PORT5 + 52,
  350. TB10X_PORT5 + 53};
  351. static const unsigned stc0_pins[] = { TB10X_PORT5 + 34, TB10X_PORT5 + 35,
  352. TB10X_PORT5 + 36, TB10X_PORT5 + 37,
  353. TB10X_PORT5 + 38, TB10X_PORT5 + 39,
  354. TB10X_PORT5 + 40};
  355. static const unsigned stc1_pins[] = { TB10X_PORT5 + 25, TB10X_PORT5 + 26,
  356. TB10X_PORT5 + 27, TB10X_PORT5 + 28,
  357. TB10X_PORT5 + 29, TB10X_PORT5 + 30,
  358. TB10X_PORT5 + 44};
  359. /* Unmuxed GPIOs */
  360. static const unsigned gpiob_pins[] = { TB10X_GPIOS + 0, TB10X_GPIOS + 1};
  361. static const unsigned gpiod_pins[] = { TB10X_GPIOS + 2, TB10X_GPIOS + 3};
  362. static const unsigned gpiof_pins[] = { TB10X_GPIOS + 4, TB10X_GPIOS + 5};
  363. static const unsigned gpioh_pins[] = { TB10X_GPIOS + 6, TB10X_GPIOS + 7};
  364. static const unsigned gpioi_pins[] = { TB10X_GPIOS + 8, TB10X_GPIOS + 9,
  365. TB10X_GPIOS + 10, TB10X_GPIOS + 11,
  366. TB10X_GPIOS + 12, TB10X_GPIOS + 13,
  367. TB10X_GPIOS + 14, TB10X_GPIOS + 15,
  368. TB10X_GPIOS + 16, TB10X_GPIOS + 17,
  369. TB10X_GPIOS + 18, TB10X_GPIOS + 19};
  370. struct tb10x_pinfuncgrp {
  371. const char *name;
  372. const unsigned int *pins;
  373. const unsigned int pincnt;
  374. const int port;
  375. const unsigned int mode;
  376. const int isgpio;
  377. };
  378. #define DEFPINFUNCGRP(NAME, PORT, MODE, ISGPIO) { \
  379. .name = __stringify(NAME), \
  380. .pins = NAME##_pins, .pincnt = ARRAY_SIZE(NAME##_pins), \
  381. .port = (PORT), .mode = (MODE), \
  382. .isgpio = (ISGPIO), \
  383. }
  384. static const struct tb10x_pinfuncgrp tb10x_pingroups[] = {
  385. DEFPINFUNCGRP(mis0, 0, 0, 0),
  386. DEFPINFUNCGRP(gpioa, 0, 0, 1),
  387. DEFPINFUNCGRP(mis1, 0, 0, 0),
  388. DEFPINFUNCGRP(mip1, 0, 1, 0),
  389. DEFPINFUNCGRP(mis2, 1, 0, 0),
  390. DEFPINFUNCGRP(gpioc, 1, 0, 1),
  391. DEFPINFUNCGRP(mis3, 1, 0, 0),
  392. DEFPINFUNCGRP(mip3, 1, 1, 0),
  393. DEFPINFUNCGRP(mis4, 2, 0, 0),
  394. DEFPINFUNCGRP(gpioe, 2, 0, 1),
  395. DEFPINFUNCGRP(mis5, 2, 0, 0),
  396. DEFPINFUNCGRP(mip5, 2, 1, 0),
  397. DEFPINFUNCGRP(mis6, 3, 0, 0),
  398. DEFPINFUNCGRP(gpiog, 3, 0, 1),
  399. DEFPINFUNCGRP(mis7, 3, 0, 0),
  400. DEFPINFUNCGRP(mip7, 3, 1, 0),
  401. DEFPINFUNCGRP(gpioj, 4, 0, 1),
  402. DEFPINFUNCGRP(gpiok, 4, 0, 1),
  403. DEFPINFUNCGRP(ciplus, 4, 1, 0),
  404. DEFPINFUNCGRP(mcard, 4, 2, 0),
  405. DEFPINFUNCGRP(stc0, 4, 3, 0),
  406. DEFPINFUNCGRP(stc1, 4, 3, 0),
  407. DEFPINFUNCGRP(mop, 5, 0, 0),
  408. DEFPINFUNCGRP(mos0, 5, 1, 0),
  409. DEFPINFUNCGRP(mos1, 5, 1, 0),
  410. DEFPINFUNCGRP(mos2, 5, 1, 0),
  411. DEFPINFUNCGRP(mos3, 5, 1, 0),
  412. DEFPINFUNCGRP(uart0, 6, 0, 0),
  413. DEFPINFUNCGRP(uart1, 6, 0, 0),
  414. DEFPINFUNCGRP(gpiol, 6, 1, 1),
  415. DEFPINFUNCGRP(gpiom, 6, 1, 1),
  416. DEFPINFUNCGRP(spi3, 7, 0, 0),
  417. DEFPINFUNCGRP(jtag, 7, 1, 0),
  418. DEFPINFUNCGRP(spi1, 8, 0, 0),
  419. DEFPINFUNCGRP(gpion, 8, 1, 1),
  420. DEFPINFUNCGRP(gpiob, -1, 0, 1),
  421. DEFPINFUNCGRP(gpiod, -1, 0, 1),
  422. DEFPINFUNCGRP(gpiof, -1, 0, 1),
  423. DEFPINFUNCGRP(gpioh, -1, 0, 1),
  424. DEFPINFUNCGRP(gpioi, -1, 0, 1),
  425. };
  426. #undef DEFPINFUNCGRP
  427. struct tb10x_of_pinfunc {
  428. const char *name;
  429. const char *group;
  430. };
  431. #define TB10X_PORTS (9)
  432. /**
  433. * struct tb10x_port - state of an I/O port
  434. * @mode: Node this port is currently in.
  435. * @count: Number of enabled functions which require this port to be
  436. * configured in @mode.
  437. */
  438. struct tb10x_port {
  439. unsigned int mode;
  440. unsigned int count;
  441. };
  442. /**
  443. * struct tb10x_pinctrl - TB10x pin controller internal state
  444. * @pctl: pointer to the pinctrl_dev structure of this pin controller.
  445. * @base: register set base address.
  446. * @pingroups: pointer to an array of the pin groups this driver manages.
  447. * @pinfuncgrpcnt: number of pingroups in @pingroups.
  448. * @pinfuncnt: number of pin functions in @pinfuncs.
  449. * @mutex: mutex for exclusive access to a pin controller's state.
  450. * @ports: current state of each port.
  451. * @gpios: Indicates if a given pin is currently used as GPIO (1) or not (0).
  452. * @pinfuncs: flexible array of pin functions this driver manages.
  453. */
  454. struct tb10x_pinctrl {
  455. struct pinctrl_dev *pctl;
  456. void *base;
  457. const struct tb10x_pinfuncgrp *pingroups;
  458. unsigned int pinfuncgrpcnt;
  459. unsigned int pinfuncnt;
  460. struct mutex mutex;
  461. struct tb10x_port ports[TB10X_PORTS];
  462. DECLARE_BITMAP(gpios, MAX_PIN + 1);
  463. struct tb10x_of_pinfunc pinfuncs[];
  464. };
  465. static inline void tb10x_pinctrl_set_config(struct tb10x_pinctrl *state,
  466. unsigned int port, unsigned int mode)
  467. {
  468. u32 pcfg;
  469. if (state->ports[port].count)
  470. return;
  471. state->ports[port].mode = mode;
  472. pcfg = ioread32(state->base) & ~(PCFG_PORT_MASK(port));
  473. pcfg |= (mode << (PCFG_PORT_BITWIDTH * port)) & PCFG_PORT_MASK(port);
  474. iowrite32(pcfg, state->base);
  475. }
  476. static inline unsigned int tb10x_pinctrl_get_config(
  477. struct tb10x_pinctrl *state,
  478. unsigned int port)
  479. {
  480. return (ioread32(state->base) & PCFG_PORT_MASK(port))
  481. >> (PCFG_PORT_BITWIDTH * port);
  482. }
  483. static int tb10x_get_groups_count(struct pinctrl_dev *pctl)
  484. {
  485. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  486. return state->pinfuncgrpcnt;
  487. }
  488. static const char *tb10x_get_group_name(struct pinctrl_dev *pctl, unsigned n)
  489. {
  490. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  491. return state->pingroups[n].name;
  492. }
  493. static int tb10x_get_group_pins(struct pinctrl_dev *pctl, unsigned n,
  494. unsigned const **pins,
  495. unsigned * const num_pins)
  496. {
  497. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  498. *pins = state->pingroups[n].pins;
  499. *num_pins = state->pingroups[n].pincnt;
  500. return 0;
  501. }
  502. static int tb10x_dt_node_to_map(struct pinctrl_dev *pctl,
  503. struct device_node *np_config,
  504. struct pinctrl_map **map, unsigned *num_maps)
  505. {
  506. const char *string;
  507. unsigned reserved_maps = 0;
  508. int ret = 0;
  509. if (of_property_read_string(np_config, "abilis,function", &string)) {
  510. pr_err("%pOF: No abilis,function property in device tree.\n",
  511. np_config);
  512. return -EINVAL;
  513. }
  514. *map = NULL;
  515. *num_maps = 0;
  516. ret = pinctrl_utils_reserve_map(pctl, map, &reserved_maps,
  517. num_maps, 1);
  518. if (ret)
  519. goto out;
  520. ret = pinctrl_utils_add_map_mux(pctl, map, &reserved_maps,
  521. num_maps, string, np_config->name);
  522. out:
  523. return ret;
  524. }
  525. static const struct pinctrl_ops tb10x_pinctrl_ops = {
  526. .get_groups_count = tb10x_get_groups_count,
  527. .get_group_name = tb10x_get_group_name,
  528. .get_group_pins = tb10x_get_group_pins,
  529. .dt_node_to_map = tb10x_dt_node_to_map,
  530. .dt_free_map = pinctrl_utils_free_map,
  531. };
  532. static int tb10x_get_functions_count(struct pinctrl_dev *pctl)
  533. {
  534. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  535. return state->pinfuncnt;
  536. }
  537. static const char *tb10x_get_function_name(struct pinctrl_dev *pctl,
  538. unsigned n)
  539. {
  540. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  541. return state->pinfuncs[n].name;
  542. }
  543. static int tb10x_get_function_groups(struct pinctrl_dev *pctl,
  544. unsigned n, const char * const **groups,
  545. unsigned * const num_groups)
  546. {
  547. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  548. *groups = &state->pinfuncs[n].group;
  549. *num_groups = 1;
  550. return 0;
  551. }
  552. static int tb10x_gpio_request_enable(struct pinctrl_dev *pctl,
  553. struct pinctrl_gpio_range *range,
  554. unsigned pin)
  555. {
  556. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  557. int muxport = -1;
  558. int muxmode = -1;
  559. int i;
  560. mutex_lock(&state->mutex);
  561. /*
  562. * Figure out to which port the requested GPIO belongs and how to
  563. * configure that port.
  564. * This loop also checks for pin conflicts between GPIOs and other
  565. * functions.
  566. */
  567. for (i = 0; i < state->pinfuncgrpcnt; i++) {
  568. const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i];
  569. unsigned int mode = pfg->mode;
  570. int j, port = pfg->port;
  571. /*
  572. * Skip pin groups which are always mapped and don't need
  573. * to be configured.
  574. */
  575. if (port < 0)
  576. continue;
  577. for (j = 0; j < pfg->pincnt; j++) {
  578. if (pin == pfg->pins[j]) {
  579. if (pfg->isgpio) {
  580. /*
  581. * Remember the GPIO-only setting of
  582. * the port this pin belongs to.
  583. */
  584. muxport = port;
  585. muxmode = mode;
  586. } else if (state->ports[port].count
  587. && (state->ports[port].mode == mode)) {
  588. /*
  589. * Error: The requested pin is already
  590. * used for something else.
  591. */
  592. mutex_unlock(&state->mutex);
  593. return -EBUSY;
  594. }
  595. break;
  596. }
  597. }
  598. }
  599. /*
  600. * If we haven't returned an error at this point, the GPIO pin is not
  601. * used by another function and the GPIO request can be granted:
  602. * Register pin as being used as GPIO so we don't allocate it to
  603. * another function later.
  604. */
  605. set_bit(pin, state->gpios);
  606. /*
  607. * Potential conflicts between GPIOs and pin functions were caught
  608. * earlier in this function and tb10x_pinctrl_set_config will do the
  609. * Right Thing, either configure the port in GPIO only mode or leave
  610. * another mode compatible with this GPIO request untouched.
  611. */
  612. if (muxport >= 0)
  613. tb10x_pinctrl_set_config(state, muxport, muxmode);
  614. mutex_unlock(&state->mutex);
  615. return 0;
  616. }
  617. static void tb10x_gpio_disable_free(struct pinctrl_dev *pctl,
  618. struct pinctrl_gpio_range *range,
  619. unsigned pin)
  620. {
  621. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  622. mutex_lock(&state->mutex);
  623. clear_bit(pin, state->gpios);
  624. mutex_unlock(&state->mutex);
  625. }
  626. static int tb10x_pctl_set_mux(struct pinctrl_dev *pctl,
  627. unsigned func_selector, unsigned group_selector)
  628. {
  629. struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
  630. const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector];
  631. int i;
  632. if (grp->port < 0)
  633. return 0;
  634. mutex_lock(&state->mutex);
  635. /*
  636. * Check if the requested function is compatible with previously
  637. * requested functions.
  638. */
  639. if (state->ports[grp->port].count
  640. && (state->ports[grp->port].mode != grp->mode)) {
  641. mutex_unlock(&state->mutex);
  642. return -EBUSY;
  643. }
  644. /*
  645. * Check if the requested function is compatible with previously
  646. * requested GPIOs.
  647. */
  648. for (i = 0; i < grp->pincnt; i++)
  649. if (test_bit(grp->pins[i], state->gpios)) {
  650. mutex_unlock(&state->mutex);
  651. return -EBUSY;
  652. }
  653. tb10x_pinctrl_set_config(state, grp->port, grp->mode);
  654. state->ports[grp->port].count++;
  655. mutex_unlock(&state->mutex);
  656. return 0;
  657. }
  658. static const struct pinmux_ops tb10x_pinmux_ops = {
  659. .get_functions_count = tb10x_get_functions_count,
  660. .get_function_name = tb10x_get_function_name,
  661. .get_function_groups = tb10x_get_function_groups,
  662. .gpio_request_enable = tb10x_gpio_request_enable,
  663. .gpio_disable_free = tb10x_gpio_disable_free,
  664. .set_mux = tb10x_pctl_set_mux,
  665. };
  666. static struct pinctrl_desc tb10x_pindesc = {
  667. .name = "TB10x",
  668. .pins = tb10x_pins,
  669. .npins = ARRAY_SIZE(tb10x_pins),
  670. .owner = THIS_MODULE,
  671. .pctlops = &tb10x_pinctrl_ops,
  672. .pmxops = &tb10x_pinmux_ops,
  673. };
  674. static int tb10x_pinctrl_probe(struct platform_device *pdev)
  675. {
  676. int ret = -EINVAL;
  677. struct device *dev = &pdev->dev;
  678. struct device_node *of_node = dev->of_node;
  679. struct device_node *child;
  680. struct tb10x_pinctrl *state;
  681. int i;
  682. if (!of_node) {
  683. dev_err(dev, "No device tree node found.\n");
  684. return -EINVAL;
  685. }
  686. state = devm_kzalloc(dev, struct_size(state, pinfuncs,
  687. of_get_child_count(of_node)),
  688. GFP_KERNEL);
  689. if (!state)
  690. return -ENOMEM;
  691. platform_set_drvdata(pdev, state);
  692. mutex_init(&state->mutex);
  693. state->base = devm_platform_ioremap_resource(pdev, 0);
  694. if (IS_ERR(state->base)) {
  695. ret = PTR_ERR(state->base);
  696. goto fail;
  697. }
  698. state->pingroups = tb10x_pingroups;
  699. state->pinfuncgrpcnt = ARRAY_SIZE(tb10x_pingroups);
  700. for (i = 0; i < TB10X_PORTS; i++)
  701. state->ports[i].mode = tb10x_pinctrl_get_config(state, i);
  702. for_each_child_of_node(of_node, child) {
  703. const char *name;
  704. if (!of_property_read_string(child, "abilis,function",
  705. &name)) {
  706. state->pinfuncs[state->pinfuncnt].name = child->name;
  707. state->pinfuncs[state->pinfuncnt].group = name;
  708. state->pinfuncnt++;
  709. }
  710. }
  711. state->pctl = devm_pinctrl_register(dev, &tb10x_pindesc, state);
  712. if (IS_ERR(state->pctl)) {
  713. dev_err(dev, "could not register TB10x pin driver\n");
  714. ret = PTR_ERR(state->pctl);
  715. goto fail;
  716. }
  717. return 0;
  718. fail:
  719. mutex_destroy(&state->mutex);
  720. return ret;
  721. }
  722. static int tb10x_pinctrl_remove(struct platform_device *pdev)
  723. {
  724. struct tb10x_pinctrl *state = platform_get_drvdata(pdev);
  725. mutex_destroy(&state->mutex);
  726. return 0;
  727. }
  728. static const struct of_device_id tb10x_pinctrl_dt_ids[] = {
  729. { .compatible = "abilis,tb10x-iomux" },
  730. { }
  731. };
  732. MODULE_DEVICE_TABLE(of, tb10x_pinctrl_dt_ids);
  733. static struct platform_driver tb10x_pinctrl_pdrv = {
  734. .probe = tb10x_pinctrl_probe,
  735. .remove = tb10x_pinctrl_remove,
  736. .driver = {
  737. .name = "tb10x_pinctrl",
  738. .of_match_table = of_match_ptr(tb10x_pinctrl_dt_ids),
  739. }
  740. };
  741. module_platform_driver(tb10x_pinctrl_pdrv);
  742. MODULE_AUTHOR("Christian Ruppert <[email protected]>");
  743. MODULE_LICENSE("GPL");