pinctrl-th1520.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Pinctrl driver for the T-Head TH1520 SoC
  4. *
  5. * Copyright (C) 2023 Emil Renner Berthing <emil.renner.berthing@canonical.com>
  6. */
  7. #include <linux/array_size.h>
  8. #include <linux/bits.h>
  9. #include <linux/cleanup.h>
  10. #include <linux/clk.h>
  11. #include <linux/device.h>
  12. #include <linux/io.h>
  13. #include <linux/mod_devicetable.h>
  14. #include <linux/module.h>
  15. #include <linux/mutex.h>
  16. #include <linux/of.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/seq_file.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/of_address.h>
  21. #include <linux/of_device.h>
  22. #include <linux/pinctrl/pinconf.h>
  23. #include <linux/pinctrl/pinconf-generic.h>
  24. #include <linux/pinctrl/pinctrl.h>
  25. #include <linux/pinctrl/pinmux.h>
  26. #include "core.h"
  27. #include "pinmux.h"
  28. #include "pinconf.h"
  29. #define TH1520_PADCFG_IE BIT(9)
  30. #define TH1520_PADCFG_SL BIT(8)
  31. #define TH1520_PADCFG_ST BIT(7)
  32. #define TH1520_PADCFG_SPU BIT(6)
  33. #define TH1520_PADCFG_PS BIT(5)
  34. #define TH1520_PADCFG_PE BIT(4)
  35. #define TH1520_PADCFG_BIAS (TH1520_PADCFG_SPU | TH1520_PADCFG_PS | TH1520_PADCFG_PE)
  36. #define TH1520_PADCFG_DS GENMASK(3, 0)
  37. #define TH1520_PULL_DOWN_OHM 44000 /* typ. 44kOhm */
  38. #define TH1520_PULL_UP_OHM 48000 /* typ. 48kOhm */
  39. #define TH1520_PULL_STRONG_OHM 2100 /* typ. 2.1kOhm */
  40. #define TH1520_PAD_NO_PADCFG BIT(30)
  41. #define TH1520_PAD_MUXDATA GENMASK(29, 0)
  42. struct th1520_pad_group {
  43. const char *name;
  44. const struct pinctrl_pin_desc *pins;
  45. unsigned int npins;
  46. };
  47. struct th1520_pinctrl {
  48. struct pinctrl_desc desc;
  49. struct mutex mutex; /* serialize adding functions */
  50. raw_spinlock_t lock; /* serialize register access */
  51. void __iomem *base;
  52. struct pinctrl_dev *pctl;
  53. };
  54. static void __iomem *th1520_padcfg(struct th1520_pinctrl *thp,
  55. unsigned int pin)
  56. {
  57. return thp->base + 4 * (pin / 2);
  58. }
  59. static unsigned int th1520_padcfg_shift(unsigned int pin)
  60. {
  61. return 16 * (pin & BIT(0));
  62. }
  63. static void __iomem *th1520_muxcfg(struct th1520_pinctrl *thp,
  64. unsigned int pin)
  65. {
  66. return thp->base + 0x400 + 4 * (pin / 8);
  67. }
  68. static unsigned int th1520_muxcfg_shift(unsigned int pin)
  69. {
  70. return 4 * (pin & GENMASK(2, 0));
  71. }
  72. enum th1520_muxtype {
  73. TH1520_MUX_____,
  74. TH1520_MUX_GPIO,
  75. TH1520_MUX_PWM,
  76. TH1520_MUX_UART,
  77. TH1520_MUX_IR,
  78. TH1520_MUX_I2C,
  79. TH1520_MUX_SPI,
  80. TH1520_MUX_QSPI,
  81. TH1520_MUX_SDIO,
  82. TH1520_MUX_AUD,
  83. TH1520_MUX_I2S,
  84. TH1520_MUX_MAC0,
  85. TH1520_MUX_MAC1,
  86. TH1520_MUX_DPU0,
  87. TH1520_MUX_DPU1,
  88. TH1520_MUX_ISP,
  89. TH1520_MUX_HDMI,
  90. TH1520_MUX_BSEL,
  91. TH1520_MUX_DBG,
  92. TH1520_MUX_CLK,
  93. TH1520_MUX_JTAG,
  94. TH1520_MUX_ISO,
  95. TH1520_MUX_FUSE,
  96. TH1520_MUX_RST,
  97. };
  98. static const char *const th1520_muxtype_string[] = {
  99. [TH1520_MUX_GPIO] = "gpio",
  100. [TH1520_MUX_PWM] = "pwm",
  101. [TH1520_MUX_UART] = "uart",
  102. [TH1520_MUX_IR] = "ir",
  103. [TH1520_MUX_I2C] = "i2c",
  104. [TH1520_MUX_SPI] = "spi",
  105. [TH1520_MUX_QSPI] = "qspi",
  106. [TH1520_MUX_SDIO] = "sdio",
  107. [TH1520_MUX_AUD] = "audio",
  108. [TH1520_MUX_I2S] = "i2s",
  109. [TH1520_MUX_MAC0] = "gmac0",
  110. [TH1520_MUX_MAC1] = "gmac1",
  111. [TH1520_MUX_DPU0] = "dpu0",
  112. [TH1520_MUX_DPU1] = "dpu1",
  113. [TH1520_MUX_ISP] = "isp",
  114. [TH1520_MUX_HDMI] = "hdmi",
  115. [TH1520_MUX_BSEL] = "bootsel",
  116. [TH1520_MUX_DBG] = "debug",
  117. [TH1520_MUX_CLK] = "clock",
  118. [TH1520_MUX_JTAG] = "jtag",
  119. [TH1520_MUX_ISO] = "iso7816",
  120. [TH1520_MUX_FUSE] = "efuse",
  121. [TH1520_MUX_RST] = "reset",
  122. };
  123. static enum th1520_muxtype th1520_muxtype_get(const char *str)
  124. {
  125. enum th1520_muxtype mt;
  126. for (mt = TH1520_MUX_GPIO; mt < ARRAY_SIZE(th1520_muxtype_string); mt++) {
  127. if (!strcmp(str, th1520_muxtype_string[mt]))
  128. return mt;
  129. }
  130. return TH1520_MUX_____;
  131. }
  132. #define TH1520_PAD(_nr, _name, m0, m1, m2, m3, m4, m5, _flags) \
  133. { .number = _nr, .name = #_name, .drv_data = (void *)((_flags) | \
  134. (TH1520_MUX_##m0 << 0) | (TH1520_MUX_##m1 << 5) | (TH1520_MUX_##m2 << 10) | \
  135. (TH1520_MUX_##m3 << 15) | (TH1520_MUX_##m4 << 20) | (TH1520_MUX_##m5 << 25)) }
  136. static unsigned long th1520_pad_muxdata(void *drv_data)
  137. {
  138. return (uintptr_t)drv_data & TH1520_PAD_MUXDATA;
  139. }
  140. static bool th1520_pad_no_padcfg(void *drv_data)
  141. {
  142. return (uintptr_t)drv_data & TH1520_PAD_NO_PADCFG;
  143. }
  144. static const struct pinctrl_pin_desc th1520_group1_pins[] = {
  145. TH1520_PAD(0, OSC_CLK_IN, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  146. TH1520_PAD(1, OSC_CLK_OUT, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  147. TH1520_PAD(2, SYS_RST_N, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  148. TH1520_PAD(3, RTC_CLK_IN, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  149. TH1520_PAD(4, RTC_CLK_OUT, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  150. /* skip number 5 so we can calculate register offsets and shifts from the pin number */
  151. TH1520_PAD(6, TEST_MODE, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  152. TH1520_PAD(7, DEBUG_MODE, DBG, ____, ____, GPIO, ____, ____, TH1520_PAD_NO_PADCFG),
  153. TH1520_PAD(8, POR_SEL, ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
  154. TH1520_PAD(9, I2C_AON_SCL, I2C, ____, ____, GPIO, ____, ____, 0),
  155. TH1520_PAD(10, I2C_AON_SDA, I2C, ____, ____, GPIO, ____, ____, 0),
  156. TH1520_PAD(11, CPU_JTG_TCLK, JTAG, ____, ____, GPIO, ____, ____, 0),
  157. TH1520_PAD(12, CPU_JTG_TMS, JTAG, ____, ____, GPIO, ____, ____, 0),
  158. TH1520_PAD(13, CPU_JTG_TDI, JTAG, ____, ____, GPIO, ____, ____, 0),
  159. TH1520_PAD(14, CPU_JTG_TDO, JTAG, ____, ____, GPIO, ____, ____, 0),
  160. TH1520_PAD(15, CPU_JTG_TRST, JTAG, ____, ____, GPIO, ____, ____, 0),
  161. TH1520_PAD(16, AOGPIO_7, CLK, AUD, ____, GPIO, ____, ____, 0),
  162. TH1520_PAD(17, AOGPIO_8, UART, AUD, IR, GPIO, ____, ____, 0),
  163. TH1520_PAD(18, AOGPIO_9, UART, AUD, IR, GPIO, ____, ____, 0),
  164. TH1520_PAD(19, AOGPIO_10, CLK, AUD, ____, GPIO, ____, ____, 0),
  165. TH1520_PAD(20, AOGPIO_11, GPIO, AUD, ____, ____, ____, ____, 0),
  166. TH1520_PAD(21, AOGPIO_12, GPIO, AUD, ____, ____, ____, ____, 0),
  167. TH1520_PAD(22, AOGPIO_13, GPIO, AUD, ____, ____, ____, ____, 0),
  168. TH1520_PAD(23, AOGPIO_14, GPIO, AUD, ____, ____, ____, ____, 0),
  169. TH1520_PAD(24, AOGPIO_15, GPIO, AUD, ____, ____, ____, ____, 0),
  170. TH1520_PAD(25, AUDIO_PA0, AUD, ____, ____, GPIO, ____, ____, 0),
  171. TH1520_PAD(26, AUDIO_PA1, AUD, ____, ____, GPIO, ____, ____, 0),
  172. TH1520_PAD(27, AUDIO_PA2, AUD, ____, ____, GPIO, ____, ____, 0),
  173. TH1520_PAD(28, AUDIO_PA3, AUD, ____, ____, GPIO, ____, ____, 0),
  174. TH1520_PAD(29, AUDIO_PA4, AUD, ____, ____, GPIO, ____, ____, 0),
  175. TH1520_PAD(30, AUDIO_PA5, AUD, ____, ____, GPIO, ____, ____, 0),
  176. TH1520_PAD(31, AUDIO_PA6, AUD, ____, ____, GPIO, ____, ____, 0),
  177. TH1520_PAD(32, AUDIO_PA7, AUD, ____, ____, GPIO, ____, ____, 0),
  178. TH1520_PAD(33, AUDIO_PA8, AUD, ____, ____, GPIO, ____, ____, 0),
  179. TH1520_PAD(34, AUDIO_PA9, AUD, ____, ____, GPIO, ____, ____, 0),
  180. TH1520_PAD(35, AUDIO_PA10, AUD, ____, ____, GPIO, ____, ____, 0),
  181. TH1520_PAD(36, AUDIO_PA11, AUD, ____, ____, GPIO, ____, ____, 0),
  182. TH1520_PAD(37, AUDIO_PA12, AUD, ____, ____, GPIO, ____, ____, 0),
  183. TH1520_PAD(38, AUDIO_PA13, AUD, ____, ____, GPIO, ____, ____, 0),
  184. TH1520_PAD(39, AUDIO_PA14, AUD, ____, ____, GPIO, ____, ____, 0),
  185. TH1520_PAD(40, AUDIO_PA15, AUD, ____, ____, GPIO, ____, ____, 0),
  186. TH1520_PAD(41, AUDIO_PA16, AUD, ____, ____, GPIO, ____, ____, 0),
  187. TH1520_PAD(42, AUDIO_PA17, AUD, ____, ____, GPIO, ____, ____, 0),
  188. TH1520_PAD(43, AUDIO_PA27, AUD, ____, ____, GPIO, ____, ____, 0),
  189. TH1520_PAD(44, AUDIO_PA28, AUD, ____, ____, GPIO, ____, ____, 0),
  190. TH1520_PAD(45, AUDIO_PA29, AUD, ____, ____, GPIO, ____, ____, 0),
  191. TH1520_PAD(46, AUDIO_PA30, AUD, RST, ____, GPIO, ____, ____, 0),
  192. };
  193. static const struct pinctrl_pin_desc th1520_group2_pins[] = {
  194. TH1520_PAD(0, QSPI1_SCLK, QSPI, ISO, ____, GPIO, FUSE, ____, 0),
  195. TH1520_PAD(1, QSPI1_CSN0, QSPI, ____, I2C, GPIO, FUSE, ____, 0),
  196. TH1520_PAD(2, QSPI1_D0_MOSI, QSPI, ISO, I2C, GPIO, FUSE, ____, 0),
  197. TH1520_PAD(3, QSPI1_D1_MISO, QSPI, ISO, ____, GPIO, FUSE, ____, 0),
  198. TH1520_PAD(4, QSPI1_D2_WP, QSPI, ISO, UART, GPIO, FUSE, ____, 0),
  199. TH1520_PAD(5, QSPI1_D3_HOLD, QSPI, ISO, UART, GPIO, ____, ____, 0),
  200. TH1520_PAD(6, I2C0_SCL, I2C, ____, ____, GPIO, ____, ____, 0),
  201. TH1520_PAD(7, I2C0_SDA, I2C, ____, ____, GPIO, ____, ____, 0),
  202. TH1520_PAD(8, I2C1_SCL, I2C, ____, ____, GPIO, ____, ____, 0),
  203. TH1520_PAD(9, I2C1_SDA, I2C, ____, ____, GPIO, ____, ____, 0),
  204. TH1520_PAD(10, UART1_TXD, UART, ____, ____, GPIO, ____, ____, 0),
  205. TH1520_PAD(11, UART1_RXD, UART, ____, ____, GPIO, ____, ____, 0),
  206. TH1520_PAD(12, UART4_TXD, UART, ____, ____, GPIO, ____, ____, 0),
  207. TH1520_PAD(13, UART4_RXD, UART, ____, ____, GPIO, ____, ____, 0),
  208. TH1520_PAD(14, UART4_CTSN, UART, ____, ____, GPIO, ____, ____, 0),
  209. TH1520_PAD(15, UART4_RTSN, UART, ____, ____, GPIO, ____, ____, 0),
  210. TH1520_PAD(16, UART3_TXD, DBG, UART, ____, GPIO, ____, ____, 0),
  211. TH1520_PAD(17, UART3_RXD, DBG, UART, ____, GPIO, ____, ____, 0),
  212. TH1520_PAD(18, GPIO0_18, GPIO, I2C, ____, ____, DPU0, DPU1, 0),
  213. TH1520_PAD(19, GPIO0_19, GPIO, I2C, ____, ____, DPU0, DPU1, 0),
  214. TH1520_PAD(20, GPIO0_20, GPIO, UART, IR, ____, DPU0, DPU1, 0),
  215. TH1520_PAD(21, GPIO0_21, GPIO, UART, IR, ____, DPU0, DPU1, 0),
  216. TH1520_PAD(22, GPIO0_22, GPIO, JTAG, I2C, ____, DPU0, DPU1, 0),
  217. TH1520_PAD(23, GPIO0_23, GPIO, JTAG, I2C, ____, DPU0, DPU1, 0),
  218. TH1520_PAD(24, GPIO0_24, GPIO, JTAG, QSPI, ____, DPU0, DPU1, 0),
  219. TH1520_PAD(25, GPIO0_25, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  220. TH1520_PAD(26, GPIO0_26, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  221. TH1520_PAD(27, GPIO0_27, GPIO, ____, I2C, ____, DPU0, DPU1, 0),
  222. TH1520_PAD(28, GPIO0_28, GPIO, ____, I2C, ____, DPU0, DPU1, 0),
  223. TH1520_PAD(29, GPIO0_29, GPIO, ____, ____, ____, DPU0, DPU1, 0),
  224. TH1520_PAD(30, GPIO0_30, GPIO, ____, ____, ____, DPU0, DPU1, 0),
  225. TH1520_PAD(31, GPIO0_31, GPIO, ____, ____, ____, DPU0, DPU1, 0),
  226. TH1520_PAD(32, GPIO1_0, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  227. TH1520_PAD(33, GPIO1_1, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  228. TH1520_PAD(34, GPIO1_2, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  229. TH1520_PAD(35, GPIO1_3, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  230. TH1520_PAD(36, GPIO1_4, GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
  231. TH1520_PAD(37, GPIO1_5, GPIO, ____, ____, ____, DPU0, DPU1, 0),
  232. TH1520_PAD(38, GPIO1_6, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  233. TH1520_PAD(39, GPIO1_7, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  234. TH1520_PAD(40, GPIO1_8, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  235. TH1520_PAD(41, GPIO1_9, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  236. TH1520_PAD(42, GPIO1_10, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  237. TH1520_PAD(43, GPIO1_11, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  238. TH1520_PAD(44, GPIO1_12, GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
  239. TH1520_PAD(45, GPIO1_13, GPIO, UART, ____, ____, DPU0, DPU1, 0),
  240. TH1520_PAD(46, GPIO1_14, GPIO, UART, ____, ____, DPU0, DPU1, 0),
  241. TH1520_PAD(47, GPIO1_15, GPIO, UART, ____, ____, DPU0, DPU1, 0),
  242. TH1520_PAD(48, GPIO1_16, GPIO, UART, ____, ____, DPU0, DPU1, 0),
  243. TH1520_PAD(49, CLK_OUT_0, BSEL, CLK, ____, GPIO, ____, ____, 0),
  244. TH1520_PAD(50, CLK_OUT_1, BSEL, CLK, ____, GPIO, ____, ____, 0),
  245. TH1520_PAD(51, CLK_OUT_2, BSEL, CLK, ____, GPIO, ____, ____, 0),
  246. TH1520_PAD(52, CLK_OUT_3, BSEL, CLK, ____, GPIO, ____, ____, 0),
  247. TH1520_PAD(53, GPIO1_21, JTAG, ____, ISP, GPIO, ____, ____, 0),
  248. TH1520_PAD(54, GPIO1_22, JTAG, ____, ISP, GPIO, ____, ____, 0),
  249. TH1520_PAD(55, GPIO1_23, JTAG, ____, ISP, GPIO, ____, ____, 0),
  250. TH1520_PAD(56, GPIO1_24, JTAG, ____, ISP, GPIO, ____, ____, 0),
  251. TH1520_PAD(57, GPIO1_25, JTAG, ____, ISP, GPIO, ____, ____, 0),
  252. TH1520_PAD(58, GPIO1_26, GPIO, ____, ISP, ____, ____, ____, 0),
  253. TH1520_PAD(59, GPIO1_27, GPIO, ____, ISP, ____, ____, ____, 0),
  254. TH1520_PAD(60, GPIO1_28, GPIO, ____, ISP, ____, ____, ____, 0),
  255. TH1520_PAD(61, GPIO1_29, GPIO, ____, ISP, ____, ____, ____, 0),
  256. TH1520_PAD(62, GPIO1_30, GPIO, ____, ISP, ____, ____, ____, 0),
  257. };
  258. static const struct pinctrl_pin_desc th1520_group3_pins[] = {
  259. TH1520_PAD(0, UART0_TXD, UART, ____, ____, GPIO, ____, ____, 0),
  260. TH1520_PAD(1, UART0_RXD, UART, ____, ____, GPIO, ____, ____, 0),
  261. TH1520_PAD(2, QSPI0_SCLK, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  262. TH1520_PAD(3, QSPI0_CSN0, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  263. TH1520_PAD(4, QSPI0_CSN1, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  264. TH1520_PAD(5, QSPI0_D0_MOSI, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  265. TH1520_PAD(6, QSPI0_D1_MISO, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  266. TH1520_PAD(7, QSPI0_D2_WP, QSPI, PWM, I2S, GPIO, ____, ____, 0),
  267. TH1520_PAD(8, QSPI0_D3_HOLD, QSPI, ____, I2S, GPIO, ____, ____, 0),
  268. TH1520_PAD(9, I2C2_SCL, I2C, UART, ____, GPIO, ____, ____, 0),
  269. TH1520_PAD(10, I2C2_SDA, I2C, UART, ____, GPIO, ____, ____, 0),
  270. TH1520_PAD(11, I2C3_SCL, I2C, ____, ____, GPIO, ____, ____, 0),
  271. TH1520_PAD(12, I2C3_SDA, I2C, ____, ____, GPIO, ____, ____, 0),
  272. TH1520_PAD(13, GPIO2_13, GPIO, SPI, ____, ____, ____, ____, 0),
  273. TH1520_PAD(14, SPI_SCLK, SPI, UART, IR, GPIO, ____, ____, 0),
  274. TH1520_PAD(15, SPI_CSN, SPI, UART, IR, GPIO, ____, ____, 0),
  275. TH1520_PAD(16, SPI_MOSI, SPI, ____, ____, GPIO, ____, ____, 0),
  276. TH1520_PAD(17, SPI_MISO, SPI, ____, ____, GPIO, ____, ____, 0),
  277. TH1520_PAD(18, GPIO2_18, GPIO, MAC1, ____, ____, ____, ____, 0),
  278. TH1520_PAD(19, GPIO2_19, GPIO, MAC1, ____, ____, ____, ____, 0),
  279. TH1520_PAD(20, GPIO2_20, GPIO, MAC1, ____, ____, ____, ____, 0),
  280. TH1520_PAD(21, GPIO2_21, GPIO, MAC1, ____, ____, ____, ____, 0),
  281. TH1520_PAD(22, GPIO2_22, GPIO, MAC1, ____, ____, ____, ____, 0),
  282. TH1520_PAD(23, GPIO2_23, GPIO, MAC1, ____, ____, ____, ____, 0),
  283. TH1520_PAD(24, GPIO2_24, GPIO, MAC1, ____, ____, ____, ____, 0),
  284. TH1520_PAD(25, GPIO2_25, GPIO, MAC1, ____, ____, ____, ____, 0),
  285. TH1520_PAD(26, SDIO0_WPRTN, SDIO, ____, ____, GPIO, ____, ____, 0),
  286. TH1520_PAD(27, SDIO0_DETN, SDIO, ____, ____, GPIO, ____, ____, 0),
  287. TH1520_PAD(28, SDIO1_WPRTN, SDIO, ____, ____, GPIO, ____, ____, 0),
  288. TH1520_PAD(29, SDIO1_DETN, SDIO, ____, ____, GPIO, ____, ____, 0),
  289. TH1520_PAD(30, GPIO2_30, GPIO, MAC1, ____, ____, ____, ____, 0),
  290. TH1520_PAD(31, GPIO2_31, GPIO, MAC1, ____, ____, ____, ____, 0),
  291. TH1520_PAD(32, GPIO3_0, GPIO, MAC1, ____, ____, ____, ____, 0),
  292. TH1520_PAD(33, GPIO3_1, GPIO, MAC1, ____, ____, ____, ____, 0),
  293. TH1520_PAD(34, GPIO3_2, GPIO, PWM, ____, ____, ____, ____, 0),
  294. TH1520_PAD(35, GPIO3_3, GPIO, PWM, ____, ____, ____, ____, 0),
  295. TH1520_PAD(36, HDMI_SCL, HDMI, PWM, ____, GPIO, ____, ____, 0),
  296. TH1520_PAD(37, HDMI_SDA, HDMI, PWM, ____, GPIO, ____, ____, 0),
  297. TH1520_PAD(38, HDMI_CEC, HDMI, ____, ____, GPIO, ____, ____, 0),
  298. TH1520_PAD(39, GMAC0_TX_CLK, MAC0, ____, ____, GPIO, ____, ____, 0),
  299. TH1520_PAD(40, GMAC0_RX_CLK, MAC0, ____, ____, GPIO, ____, ____, 0),
  300. TH1520_PAD(41, GMAC0_TXEN, MAC0, UART, ____, GPIO, ____, ____, 0),
  301. TH1520_PAD(42, GMAC0_TXD0, MAC0, UART, ____, GPIO, ____, ____, 0),
  302. TH1520_PAD(43, GMAC0_TXD1, MAC0, UART, ____, GPIO, ____, ____, 0),
  303. TH1520_PAD(44, GMAC0_TXD2, MAC0, UART, ____, GPIO, ____, ____, 0),
  304. TH1520_PAD(45, GMAC0_TXD3, MAC0, I2C, ____, GPIO, ____, ____, 0),
  305. TH1520_PAD(46, GMAC0_RXDV, MAC0, I2C, ____, GPIO, ____, ____, 0),
  306. TH1520_PAD(47, GMAC0_RXD0, MAC0, I2C, ____, GPIO, ____, ____, 0),
  307. TH1520_PAD(48, GMAC0_RXD1, MAC0, I2C, ____, GPIO, ____, ____, 0),
  308. TH1520_PAD(49, GMAC0_RXD2, MAC0, SPI, ____, GPIO, ____, ____, 0),
  309. TH1520_PAD(50, GMAC0_RXD3, MAC0, SPI, ____, GPIO, ____, ____, 0),
  310. TH1520_PAD(51, GMAC0_MDC, MAC0, SPI, MAC1, GPIO, ____, ____, 0),
  311. TH1520_PAD(52, GMAC0_MDIO, MAC0, SPI, MAC1, GPIO, ____, ____, 0),
  312. TH1520_PAD(53, GMAC0_COL, MAC0, PWM, ____, GPIO, ____, ____, 0),
  313. TH1520_PAD(54, GMAC0_CRS, MAC0, PWM, ____, GPIO, ____, ____, 0),
  314. };
  315. static const struct th1520_pad_group th1520_group1 = {
  316. .name = "th1520-group1",
  317. .pins = th1520_group1_pins,
  318. .npins = ARRAY_SIZE(th1520_group1_pins),
  319. };
  320. static const struct th1520_pad_group th1520_group2 = {
  321. .name = "th1520-group2",
  322. .pins = th1520_group2_pins,
  323. .npins = ARRAY_SIZE(th1520_group2_pins),
  324. };
  325. static const struct th1520_pad_group th1520_group3 = {
  326. .name = "th1520-group3",
  327. .pins = th1520_group3_pins,
  328. .npins = ARRAY_SIZE(th1520_group3_pins),
  329. };
  330. static int th1520_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  331. {
  332. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  333. return thp->desc.npins;
  334. }
  335. static const char *th1520_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  336. unsigned int gsel)
  337. {
  338. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  339. return thp->desc.pins[gsel].name;
  340. }
  341. static int th1520_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  342. unsigned int gsel,
  343. const unsigned int **pins,
  344. unsigned int *npins)
  345. {
  346. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  347. *pins = &thp->desc.pins[gsel].number;
  348. *npins = 1;
  349. return 0;
  350. }
  351. #ifdef CONFIG_DEBUG_FS
  352. static void th1520_pin_dbg_show(struct pinctrl_dev *pctldev,
  353. struct seq_file *s, unsigned int pin)
  354. {
  355. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  356. void __iomem *padcfg = th1520_padcfg(thp, pin);
  357. void __iomem *muxcfg = th1520_muxcfg(thp, pin);
  358. u32 pad;
  359. u32 mux;
  360. scoped_guard(raw_spinlock_irqsave, &thp->lock) {
  361. pad = readl_relaxed(padcfg);
  362. mux = readl_relaxed(muxcfg);
  363. }
  364. seq_printf(s, "[PADCFG_%03u:0x%x=0x%07x MUXCFG_%03u:0x%x=0x%08x]",
  365. 1 + pin / 2, 0x000 + 4 * (pin / 2), pad,
  366. 1 + pin / 8, 0x400 + 4 * (pin / 8), mux);
  367. }
  368. #else
  369. #define th1520_pin_dbg_show NULL
  370. #endif
  371. static void th1520_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
  372. struct pinctrl_map *map, unsigned int nmaps)
  373. {
  374. unsigned long *seen = NULL;
  375. unsigned int i;
  376. for (i = 0; i < nmaps; i++) {
  377. if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN &&
  378. map[i].data.configs.configs != seen) {
  379. seen = map[i].data.configs.configs;
  380. kfree(seen);
  381. }
  382. }
  383. kfree(map);
  384. }
  385. static int th1520_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  386. struct device_node *np,
  387. struct pinctrl_map **maps,
  388. unsigned int *num_maps)
  389. {
  390. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  391. struct pinctrl_map *map;
  392. unsigned long *configs;
  393. unsigned int nconfigs;
  394. unsigned int nmaps;
  395. int ret;
  396. nmaps = 0;
  397. for_each_available_child_of_node_scoped(np, child) {
  398. int npins = of_property_count_strings(child, "pins");
  399. if (npins <= 0) {
  400. dev_err(thp->pctl->dev, "no pins selected for %pOFn.%pOFn\n",
  401. np, child);
  402. return -EINVAL;
  403. }
  404. nmaps += npins;
  405. if (of_property_present(child, "function"))
  406. nmaps += npins;
  407. }
  408. map = kzalloc_objs(*map, nmaps);
  409. if (!map)
  410. return -ENOMEM;
  411. nmaps = 0;
  412. guard(mutex)(&thp->mutex);
  413. for_each_available_child_of_node_scoped(np, child) {
  414. unsigned int rollback = nmaps;
  415. enum th1520_muxtype muxtype;
  416. struct property *prop;
  417. const char *funcname;
  418. const char **pgnames;
  419. const char *pinname;
  420. int npins;
  421. ret = pinconf_generic_parse_dt_config(child, pctldev, &configs, &nconfigs);
  422. if (ret) {
  423. dev_err(thp->pctl->dev, "%pOFn.%pOFn: error parsing pin config\n",
  424. np, child);
  425. goto free_map;
  426. }
  427. if (!of_property_read_string(child, "function", &funcname)) {
  428. muxtype = th1520_muxtype_get(funcname);
  429. if (!muxtype) {
  430. dev_err(thp->pctl->dev, "%pOFn.%pOFn: unknown function '%s'\n",
  431. np, child, funcname);
  432. ret = -EINVAL;
  433. goto free_configs;
  434. }
  435. funcname = devm_kasprintf(thp->pctl->dev, GFP_KERNEL, "%pOFn.%pOFn",
  436. np, child);
  437. if (!funcname) {
  438. ret = -ENOMEM;
  439. goto free_configs;
  440. }
  441. npins = of_property_count_strings(child, "pins");
  442. pgnames = devm_kcalloc(thp->pctl->dev, npins, sizeof(*pgnames), GFP_KERNEL);
  443. if (!pgnames) {
  444. ret = -ENOMEM;
  445. goto free_configs;
  446. }
  447. } else {
  448. funcname = NULL;
  449. }
  450. npins = 0;
  451. of_property_for_each_string(child, "pins", prop, pinname) {
  452. unsigned int i;
  453. for (i = 0; i < thp->desc.npins; i++) {
  454. if (!strcmp(pinname, thp->desc.pins[i].name))
  455. break;
  456. }
  457. if (i == thp->desc.npins) {
  458. nmaps = rollback;
  459. dev_err(thp->pctl->dev, "%pOFn.%pOFn: unknown pin '%s'\n",
  460. np, child, pinname);
  461. ret = -EINVAL;
  462. goto free_configs;
  463. }
  464. if (nconfigs) {
  465. map[nmaps].type = PIN_MAP_TYPE_CONFIGS_PIN;
  466. map[nmaps].data.configs.group_or_pin = thp->desc.pins[i].name;
  467. map[nmaps].data.configs.configs = configs;
  468. map[nmaps].data.configs.num_configs = nconfigs;
  469. nmaps += 1;
  470. }
  471. if (funcname) {
  472. pgnames[npins++] = thp->desc.pins[i].name;
  473. map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
  474. map[nmaps].data.mux.function = funcname;
  475. map[nmaps].data.mux.group = thp->desc.pins[i].name;
  476. nmaps += 1;
  477. }
  478. }
  479. if (funcname) {
  480. ret = pinmux_generic_add_function(pctldev, funcname, pgnames,
  481. npins, (void *)muxtype);
  482. if (ret < 0) {
  483. dev_err(thp->pctl->dev, "error adding function %s\n", funcname);
  484. goto free_map;
  485. }
  486. }
  487. }
  488. *maps = map;
  489. *num_maps = nmaps;
  490. return 0;
  491. free_configs:
  492. kfree(configs);
  493. free_map:
  494. th1520_pinctrl_dt_free_map(pctldev, map, nmaps);
  495. return ret;
  496. }
  497. static const struct pinctrl_ops th1520_pinctrl_ops = {
  498. .get_groups_count = th1520_pinctrl_get_groups_count,
  499. .get_group_name = th1520_pinctrl_get_group_name,
  500. .get_group_pins = th1520_pinctrl_get_group_pins,
  501. .pin_dbg_show = th1520_pin_dbg_show,
  502. .dt_node_to_map = th1520_pinctrl_dt_node_to_map,
  503. .dt_free_map = th1520_pinctrl_dt_free_map,
  504. };
  505. static const u8 th1520_drive_strength_in_ma[16] = {
  506. 1, 2, 3, 5, 7, 8, 10, 12, 13, 15, 16, 18, 20, 21, 23, 25,
  507. };
  508. static u16 th1520_drive_strength_from_ma(u32 arg)
  509. {
  510. u16 ds;
  511. for (ds = 0; ds < TH1520_PADCFG_DS; ds++) {
  512. if (arg <= th1520_drive_strength_in_ma[ds])
  513. return ds;
  514. }
  515. return TH1520_PADCFG_DS;
  516. }
  517. static int th1520_padcfg_rmw(struct th1520_pinctrl *thp, unsigned int pin,
  518. u32 mask, u32 value)
  519. {
  520. void __iomem *padcfg = th1520_padcfg(thp, pin);
  521. unsigned int shift = th1520_padcfg_shift(pin);
  522. u32 tmp;
  523. mask <<= shift;
  524. value <<= shift;
  525. scoped_guard(raw_spinlock_irqsave, &thp->lock) {
  526. tmp = readl_relaxed(padcfg);
  527. tmp = (tmp & ~mask) | value;
  528. writel_relaxed(tmp, padcfg);
  529. }
  530. return 0;
  531. }
  532. static int th1520_pinconf_get(struct pinctrl_dev *pctldev,
  533. unsigned int pin, unsigned long *config)
  534. {
  535. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  536. const struct pin_desc *desc = pin_desc_get(pctldev, pin);
  537. bool enabled;
  538. int param;
  539. u32 value;
  540. u32 arg;
  541. if (th1520_pad_no_padcfg(desc->drv_data))
  542. return -ENOTSUPP;
  543. value = readl_relaxed(th1520_padcfg(thp, pin));
  544. value = (value >> th1520_padcfg_shift(pin)) & GENMASK(9, 0);
  545. param = pinconf_to_config_param(*config);
  546. switch (param) {
  547. case PIN_CONFIG_BIAS_DISABLE:
  548. enabled = !(value & (TH1520_PADCFG_SPU | TH1520_PADCFG_PE));
  549. arg = 0;
  550. break;
  551. case PIN_CONFIG_BIAS_PULL_DOWN:
  552. enabled = (value & TH1520_PADCFG_BIAS) == TH1520_PADCFG_PE;
  553. arg = enabled ? TH1520_PULL_DOWN_OHM : 0;
  554. break;
  555. case PIN_CONFIG_BIAS_PULL_UP:
  556. if (value & TH1520_PADCFG_SPU) {
  557. enabled = true;
  558. arg = TH1520_PULL_STRONG_OHM;
  559. } else if ((value & (TH1520_PADCFG_PE | TH1520_PADCFG_PS)) ==
  560. (TH1520_PADCFG_PE | TH1520_PADCFG_PS)) {
  561. enabled = true;
  562. arg = TH1520_PULL_UP_OHM;
  563. } else {
  564. enabled = false;
  565. arg = 0;
  566. }
  567. break;
  568. case PIN_CONFIG_DRIVE_STRENGTH:
  569. enabled = true;
  570. arg = th1520_drive_strength_in_ma[value & TH1520_PADCFG_DS];
  571. break;
  572. case PIN_CONFIG_INPUT_ENABLE:
  573. enabled = value & TH1520_PADCFG_IE;
  574. arg = enabled ? 1 : 0;
  575. break;
  576. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  577. enabled = value & TH1520_PADCFG_ST;
  578. arg = enabled ? 1 : 0;
  579. break;
  580. case PIN_CONFIG_SLEW_RATE:
  581. enabled = value & TH1520_PADCFG_SL;
  582. arg = enabled ? 1 : 0;
  583. break;
  584. default:
  585. return -ENOTSUPP;
  586. }
  587. *config = pinconf_to_config_packed(param, arg);
  588. return enabled ? 0 : -EINVAL;
  589. }
  590. static int th1520_pinconf_group_get(struct pinctrl_dev *pctldev,
  591. unsigned int gsel, unsigned long *config)
  592. {
  593. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  594. unsigned int pin = thp->desc.pins[gsel].number;
  595. return th1520_pinconf_get(pctldev, pin, config);
  596. }
  597. static int th1520_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  598. unsigned long *configs, unsigned int num_configs)
  599. {
  600. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  601. const struct pin_desc *desc = pin_desc_get(pctldev, pin);
  602. unsigned int i;
  603. u16 mask, value;
  604. if (th1520_pad_no_padcfg(desc->drv_data))
  605. return -ENOTSUPP;
  606. mask = 0;
  607. value = 0;
  608. for (i = 0; i < num_configs; i++) {
  609. int param = pinconf_to_config_param(configs[i]);
  610. u32 arg = pinconf_to_config_argument(configs[i]);
  611. switch (param) {
  612. case PIN_CONFIG_BIAS_DISABLE:
  613. mask |= TH1520_PADCFG_BIAS;
  614. value &= ~TH1520_PADCFG_BIAS;
  615. break;
  616. case PIN_CONFIG_BIAS_PULL_DOWN:
  617. if (arg == 0)
  618. return -ENOTSUPP;
  619. mask |= TH1520_PADCFG_BIAS;
  620. value &= ~TH1520_PADCFG_BIAS;
  621. value |= TH1520_PADCFG_PE;
  622. break;
  623. case PIN_CONFIG_BIAS_PULL_UP:
  624. if (arg == 0)
  625. return -ENOTSUPP;
  626. mask |= TH1520_PADCFG_BIAS;
  627. value &= ~TH1520_PADCFG_BIAS;
  628. if (arg == TH1520_PULL_STRONG_OHM)
  629. value |= TH1520_PADCFG_SPU;
  630. else
  631. value |= TH1520_PADCFG_PE | TH1520_PADCFG_PS;
  632. break;
  633. case PIN_CONFIG_DRIVE_STRENGTH:
  634. mask |= TH1520_PADCFG_DS;
  635. value &= ~TH1520_PADCFG_DS;
  636. value |= th1520_drive_strength_from_ma(arg);
  637. break;
  638. case PIN_CONFIG_INPUT_ENABLE:
  639. mask |= TH1520_PADCFG_IE;
  640. if (arg)
  641. value |= TH1520_PADCFG_IE;
  642. else
  643. value &= ~TH1520_PADCFG_IE;
  644. break;
  645. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  646. mask |= TH1520_PADCFG_ST;
  647. if (arg)
  648. value |= TH1520_PADCFG_ST;
  649. else
  650. value &= ~TH1520_PADCFG_ST;
  651. break;
  652. case PIN_CONFIG_SLEW_RATE:
  653. mask |= TH1520_PADCFG_SL;
  654. if (arg)
  655. value |= TH1520_PADCFG_SL;
  656. else
  657. value &= ~TH1520_PADCFG_SL;
  658. break;
  659. default:
  660. return -ENOTSUPP;
  661. }
  662. }
  663. return th1520_padcfg_rmw(thp, pin, mask, value);
  664. }
  665. static int th1520_pinconf_group_set(struct pinctrl_dev *pctldev,
  666. unsigned int gsel,
  667. unsigned long *configs,
  668. unsigned int num_configs)
  669. {
  670. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  671. unsigned int pin = thp->desc.pins[gsel].number;
  672. return th1520_pinconf_set(pctldev, pin, configs, num_configs);
  673. }
  674. #ifdef CONFIG_DEBUG_FS
  675. static void th1520_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  676. struct seq_file *s, unsigned int pin)
  677. {
  678. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  679. u32 value = readl_relaxed(th1520_padcfg(thp, pin));
  680. value = (value >> th1520_padcfg_shift(pin)) & GENMASK(9, 0);
  681. seq_printf(s, " [0x%03x]", value);
  682. }
  683. #else
  684. #define th1520_pinconf_dbg_show NULL
  685. #endif
  686. static const struct pinconf_ops th1520_pinconf_ops = {
  687. .pin_config_get = th1520_pinconf_get,
  688. .pin_config_group_get = th1520_pinconf_group_get,
  689. .pin_config_set = th1520_pinconf_set,
  690. .pin_config_group_set = th1520_pinconf_group_set,
  691. .pin_config_dbg_show = th1520_pinconf_dbg_show,
  692. .is_generic = true,
  693. };
  694. static int th1520_pinmux_set(struct th1520_pinctrl *thp, unsigned int pin,
  695. unsigned long muxdata, enum th1520_muxtype muxtype)
  696. {
  697. void __iomem *muxcfg = th1520_muxcfg(thp, pin);
  698. unsigned int shift = th1520_muxcfg_shift(pin);
  699. u32 mask, value, tmp;
  700. for (value = 0; muxdata; muxdata >>= 5, value++) {
  701. if ((muxdata & GENMASK(4, 0)) == muxtype)
  702. break;
  703. }
  704. if (!muxdata) {
  705. dev_err(thp->pctl->dev, "invalid mux %s for pin %s\n",
  706. th1520_muxtype_string[muxtype], pin_get_name(thp->pctl, pin));
  707. return -EINVAL;
  708. }
  709. mask = GENMASK(3, 0) << shift;
  710. value = value << shift;
  711. scoped_guard(raw_spinlock_irqsave, &thp->lock) {
  712. tmp = readl_relaxed(muxcfg);
  713. tmp = (tmp & ~mask) | value;
  714. writel_relaxed(tmp, muxcfg);
  715. }
  716. return 0;
  717. }
  718. static int th1520_pinmux_set_mux(struct pinctrl_dev *pctldev,
  719. unsigned int fsel, unsigned int gsel)
  720. {
  721. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  722. const struct function_desc *func = pinmux_generic_get_function(pctldev, fsel);
  723. enum th1520_muxtype muxtype;
  724. if (!func)
  725. return -EINVAL;
  726. muxtype = (uintptr_t)func->data;
  727. return th1520_pinmux_set(thp, thp->desc.pins[gsel].number,
  728. th1520_pad_muxdata(thp->desc.pins[gsel].drv_data),
  729. muxtype);
  730. }
  731. static int th1520_gpio_request_enable(struct pinctrl_dev *pctldev,
  732. struct pinctrl_gpio_range *range,
  733. unsigned int offset)
  734. {
  735. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  736. const struct pin_desc *desc = pin_desc_get(pctldev, offset);
  737. return th1520_pinmux_set(thp, offset,
  738. th1520_pad_muxdata(desc->drv_data),
  739. TH1520_MUX_GPIO);
  740. }
  741. static int th1520_gpio_set_direction(struct pinctrl_dev *pctldev,
  742. struct pinctrl_gpio_range *range,
  743. unsigned int offset, bool input)
  744. {
  745. struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
  746. return th1520_padcfg_rmw(thp, offset, TH1520_PADCFG_IE,
  747. input ? TH1520_PADCFG_IE : 0);
  748. }
  749. static const struct pinmux_ops th1520_pinmux_ops = {
  750. .get_functions_count = pinmux_generic_get_function_count,
  751. .get_function_name = pinmux_generic_get_function_name,
  752. .get_function_groups = pinmux_generic_get_function_groups,
  753. .set_mux = th1520_pinmux_set_mux,
  754. .gpio_request_enable = th1520_gpio_request_enable,
  755. .gpio_set_direction = th1520_gpio_set_direction,
  756. .strict = true,
  757. };
  758. static int th1520_pinctrl_probe(struct platform_device *pdev)
  759. {
  760. struct device *dev = &pdev->dev;
  761. const struct th1520_pad_group *group;
  762. struct device_node *np = dev->of_node;
  763. struct th1520_pinctrl *thp;
  764. struct clk *clk;
  765. u32 pin_group;
  766. int ret;
  767. thp = devm_kzalloc(dev, sizeof(*thp), GFP_KERNEL);
  768. if (!thp)
  769. return -ENOMEM;
  770. thp->base = devm_platform_ioremap_resource(pdev, 0);
  771. if (IS_ERR(thp->base))
  772. return PTR_ERR(thp->base);
  773. clk = devm_clk_get_enabled(dev, NULL);
  774. if (IS_ERR(clk))
  775. return dev_err_probe(dev, PTR_ERR(clk), "error getting clock\n");
  776. ret = of_property_read_u32(np, "thead,pad-group", &pin_group);
  777. if (ret)
  778. return dev_err_probe(dev, ret, "failed to read the thead,pad-group property\n");
  779. if (pin_group == 1)
  780. group = &th1520_group1;
  781. else if (pin_group == 2)
  782. group = &th1520_group2;
  783. else if (pin_group == 3)
  784. group = &th1520_group3;
  785. else
  786. return dev_err_probe(dev, -EINVAL, "unit address did not match any pad group\n");
  787. thp->desc.name = group->name;
  788. thp->desc.pins = group->pins;
  789. thp->desc.npins = group->npins;
  790. thp->desc.pctlops = &th1520_pinctrl_ops;
  791. thp->desc.pmxops = &th1520_pinmux_ops;
  792. thp->desc.confops = &th1520_pinconf_ops;
  793. thp->desc.owner = THIS_MODULE;
  794. mutex_init(&thp->mutex);
  795. raw_spin_lock_init(&thp->lock);
  796. ret = devm_pinctrl_register_and_init(dev, &thp->desc, thp, &thp->pctl);
  797. if (ret)
  798. return dev_err_probe(dev, ret, "could not register pinctrl driver\n");
  799. return pinctrl_enable(thp->pctl);
  800. }
  801. static const struct of_device_id th1520_pinctrl_of_match[] = {
  802. { .compatible = "thead,th1520-pinctrl"},
  803. { /* sentinel */ }
  804. };
  805. MODULE_DEVICE_TABLE(of, th1520_pinctrl_of_match);
  806. static struct platform_driver th1520_pinctrl_driver = {
  807. .probe = th1520_pinctrl_probe,
  808. .driver = {
  809. .name = "pinctrl-th1520",
  810. .of_match_table = th1520_pinctrl_of_match,
  811. },
  812. };
  813. module_platform_driver(th1520_pinctrl_driver);
  814. MODULE_DESCRIPTION("Pinctrl driver for the T-Head TH1520 SoC");
  815. MODULE_AUTHOR("Emil Renner Berthing <emil.renner.berthing@canonical.com>");
  816. MODULE_LICENSE("GPL");