pinctrl-k210.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2020 Sean Anderson <[email protected]>
  4. * Copyright (c) 2020 Western Digital Corporation or its affiliates.
  5. */
  6. #include <linux/io.h>
  7. #include <linux/of_device.h>
  8. #include <linux/clk.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/bitfield.h>
  12. #include <linux/regmap.h>
  13. #include <linux/slab.h>
  14. #include <linux/pinctrl/pinctrl.h>
  15. #include <linux/pinctrl/pinmux.h>
  16. #include <linux/pinctrl/pinconf.h>
  17. #include <linux/pinctrl/pinconf-generic.h>
  18. #include <dt-bindings/pinctrl/k210-fpioa.h>
  19. #include "core.h"
  20. #include "pinconf.h"
  21. #include "pinctrl-utils.h"
  22. /*
  23. * The K210 only implements 8 drive levels, even though
  24. * there is register space for 16
  25. */
  26. #define K210_PC_DRIVE_MASK GENMASK(11, 8)
  27. #define K210_PC_DRIVE_SHIFT 8
  28. #define K210_PC_DRIVE_0 (0 << K210_PC_DRIVE_SHIFT)
  29. #define K210_PC_DRIVE_1 (1 << K210_PC_DRIVE_SHIFT)
  30. #define K210_PC_DRIVE_2 (2 << K210_PC_DRIVE_SHIFT)
  31. #define K210_PC_DRIVE_3 (3 << K210_PC_DRIVE_SHIFT)
  32. #define K210_PC_DRIVE_4 (4 << K210_PC_DRIVE_SHIFT)
  33. #define K210_PC_DRIVE_5 (5 << K210_PC_DRIVE_SHIFT)
  34. #define K210_PC_DRIVE_6 (6 << K210_PC_DRIVE_SHIFT)
  35. #define K210_PC_DRIVE_7 (7 << K210_PC_DRIVE_SHIFT)
  36. #define K210_PC_DRIVE_MAX 7
  37. #define K210_PC_MODE_MASK GENMASK(23, 12)
  38. /*
  39. * output enabled == PC_OE & (PC_OE_INV ^ FUNCTION_OE)
  40. * where FUNCTION_OE is a physical signal from the function.
  41. */
  42. #define K210_PC_OE BIT(12) /* Output Enable */
  43. #define K210_PC_OE_INV BIT(13) /* INVert Output Enable */
  44. #define K210_PC_DO_OE BIT(14) /* set Data Out to Output Enable sig */
  45. #define K210_PC_DO_INV BIT(15) /* INVert final Data Output */
  46. #define K210_PC_PU BIT(16) /* Pull Up */
  47. #define K210_PC_PD BIT(17) /* Pull Down */
  48. /* Strong pull up not implemented on K210 */
  49. #define K210_PC_SL BIT(19) /* reduce SLew rate */
  50. /* Same semantics as OE above */
  51. #define K210_PC_IE BIT(20) /* Input Enable */
  52. #define K210_PC_IE_INV BIT(21) /* INVert Input Enable */
  53. #define K210_PC_DI_INV BIT(22) /* INVert Data Input */
  54. #define K210_PC_ST BIT(23) /* Schmitt Trigger */
  55. #define K210_PC_DI BIT(31) /* raw Data Input */
  56. #define K210_PC_BIAS_MASK (K210_PC_PU & K210_PC_PD)
  57. #define K210_PC_MODE_IN (K210_PC_IE | K210_PC_ST)
  58. #define K210_PC_MODE_OUT (K210_PC_DRIVE_7 | K210_PC_OE)
  59. #define K210_PC_MODE_I2C (K210_PC_MODE_IN | K210_PC_SL | \
  60. K210_PC_OE | K210_PC_PU)
  61. #define K210_PC_MODE_SCCB (K210_PC_MODE_I2C | \
  62. K210_PC_OE_INV | K210_PC_IE_INV)
  63. #define K210_PC_MODE_SPI (K210_PC_MODE_IN | K210_PC_IE_INV | \
  64. K210_PC_MODE_OUT | K210_PC_OE_INV)
  65. #define K210_PC_MODE_GPIO (K210_PC_MODE_IN | K210_PC_MODE_OUT)
  66. #define K210_PG_FUNC GENMASK(7, 0)
  67. #define K210_PG_DO BIT(8)
  68. #define K210_PG_PIN GENMASK(22, 16)
  69. /*
  70. * struct k210_fpioa: Kendryte K210 FPIOA memory mapped registers
  71. * @pins: 48 32-bits IO pin registers
  72. * @tie_en: 256 (one per function) input tie enable bits
  73. * @tie_val: 256 (one per function) input tie value bits
  74. */
  75. struct k210_fpioa {
  76. u32 pins[48];
  77. u32 tie_en[8];
  78. u32 tie_val[8];
  79. };
  80. struct k210_fpioa_data {
  81. struct device *dev;
  82. struct pinctrl_dev *pctl;
  83. struct k210_fpioa __iomem *fpioa;
  84. struct regmap *sysctl_map;
  85. u32 power_offset;
  86. struct clk *clk;
  87. struct clk *pclk;
  88. };
  89. #define K210_PIN_NAME(i) ("IO_" #i)
  90. #define K210_PIN(i) [(i)] = PINCTRL_PIN((i), K210_PIN_NAME(i))
  91. static const struct pinctrl_pin_desc k210_pins[] = {
  92. K210_PIN(0), K210_PIN(1), K210_PIN(2),
  93. K210_PIN(3), K210_PIN(4), K210_PIN(5),
  94. K210_PIN(6), K210_PIN(7), K210_PIN(8),
  95. K210_PIN(9), K210_PIN(10), K210_PIN(11),
  96. K210_PIN(12), K210_PIN(13), K210_PIN(14),
  97. K210_PIN(15), K210_PIN(16), K210_PIN(17),
  98. K210_PIN(18), K210_PIN(19), K210_PIN(20),
  99. K210_PIN(21), K210_PIN(22), K210_PIN(23),
  100. K210_PIN(24), K210_PIN(25), K210_PIN(26),
  101. K210_PIN(27), K210_PIN(28), K210_PIN(29),
  102. K210_PIN(30), K210_PIN(31), K210_PIN(32),
  103. K210_PIN(33), K210_PIN(34), K210_PIN(35),
  104. K210_PIN(36), K210_PIN(37), K210_PIN(38),
  105. K210_PIN(39), K210_PIN(40), K210_PIN(41),
  106. K210_PIN(42), K210_PIN(43), K210_PIN(44),
  107. K210_PIN(45), K210_PIN(46), K210_PIN(47)
  108. };
  109. #define K210_NPINS ARRAY_SIZE(k210_pins)
  110. /*
  111. * Pin groups: each of the 48 programmable pins is a group.
  112. * To this are added 8 power domain groups, which for the purposes of
  113. * the pin subsystem, contain no pins. The power domain groups only exist
  114. * to set the power level. The id should never be used (since there are
  115. * no pins 48-55).
  116. */
  117. static const char *const k210_group_names[] = {
  118. /* The first 48 groups are for pins, one each */
  119. K210_PIN_NAME(0), K210_PIN_NAME(1), K210_PIN_NAME(2),
  120. K210_PIN_NAME(3), K210_PIN_NAME(4), K210_PIN_NAME(5),
  121. K210_PIN_NAME(6), K210_PIN_NAME(7), K210_PIN_NAME(8),
  122. K210_PIN_NAME(9), K210_PIN_NAME(10), K210_PIN_NAME(11),
  123. K210_PIN_NAME(12), K210_PIN_NAME(13), K210_PIN_NAME(14),
  124. K210_PIN_NAME(15), K210_PIN_NAME(16), K210_PIN_NAME(17),
  125. K210_PIN_NAME(18), K210_PIN_NAME(19), K210_PIN_NAME(20),
  126. K210_PIN_NAME(21), K210_PIN_NAME(22), K210_PIN_NAME(23),
  127. K210_PIN_NAME(24), K210_PIN_NAME(25), K210_PIN_NAME(26),
  128. K210_PIN_NAME(27), K210_PIN_NAME(28), K210_PIN_NAME(29),
  129. K210_PIN_NAME(30), K210_PIN_NAME(31), K210_PIN_NAME(32),
  130. K210_PIN_NAME(33), K210_PIN_NAME(34), K210_PIN_NAME(35),
  131. K210_PIN_NAME(36), K210_PIN_NAME(37), K210_PIN_NAME(38),
  132. K210_PIN_NAME(39), K210_PIN_NAME(40), K210_PIN_NAME(41),
  133. K210_PIN_NAME(42), K210_PIN_NAME(43), K210_PIN_NAME(44),
  134. K210_PIN_NAME(45), K210_PIN_NAME(46), K210_PIN_NAME(47),
  135. [48] = "A0", [49] = "A1", [50] = "A2",
  136. [51] = "B3", [52] = "B4", [53] = "B5",
  137. [54] = "C6", [55] = "C7"
  138. };
  139. #define K210_NGROUPS ARRAY_SIZE(k210_group_names)
  140. enum k210_pinctrl_mode_id {
  141. K210_PC_DEFAULT_DISABLED,
  142. K210_PC_DEFAULT_IN,
  143. K210_PC_DEFAULT_IN_TIE,
  144. K210_PC_DEFAULT_OUT,
  145. K210_PC_DEFAULT_I2C,
  146. K210_PC_DEFAULT_SCCB,
  147. K210_PC_DEFAULT_SPI,
  148. K210_PC_DEFAULT_GPIO,
  149. K210_PC_DEFAULT_INT13,
  150. };
  151. #define K210_PC_DEFAULT(mode) \
  152. [K210_PC_DEFAULT_##mode] = K210_PC_MODE_##mode
  153. static const u32 k210_pinconf_mode_id_to_mode[] = {
  154. [K210_PC_DEFAULT_DISABLED] = 0,
  155. K210_PC_DEFAULT(IN),
  156. [K210_PC_DEFAULT_IN_TIE] = K210_PC_MODE_IN,
  157. K210_PC_DEFAULT(OUT),
  158. K210_PC_DEFAULT(I2C),
  159. K210_PC_DEFAULT(SCCB),
  160. K210_PC_DEFAULT(SPI),
  161. K210_PC_DEFAULT(GPIO),
  162. [K210_PC_DEFAULT_INT13] = K210_PC_MODE_IN | K210_PC_PU,
  163. };
  164. #undef DEFAULT
  165. /*
  166. * Pin functions configuration information.
  167. */
  168. struct k210_pcf_info {
  169. char name[15];
  170. u8 mode_id;
  171. };
  172. #define K210_FUNC(id, mode) \
  173. [K210_PCF_##id] = { \
  174. .name = #id, \
  175. .mode_id = K210_PC_DEFAULT_##mode \
  176. }
  177. static const struct k210_pcf_info k210_pcf_infos[] = {
  178. K210_FUNC(JTAG_TCLK, IN),
  179. K210_FUNC(JTAG_TDI, IN),
  180. K210_FUNC(JTAG_TMS, IN),
  181. K210_FUNC(JTAG_TDO, OUT),
  182. K210_FUNC(SPI0_D0, SPI),
  183. K210_FUNC(SPI0_D1, SPI),
  184. K210_FUNC(SPI0_D2, SPI),
  185. K210_FUNC(SPI0_D3, SPI),
  186. K210_FUNC(SPI0_D4, SPI),
  187. K210_FUNC(SPI0_D5, SPI),
  188. K210_FUNC(SPI0_D6, SPI),
  189. K210_FUNC(SPI0_D7, SPI),
  190. K210_FUNC(SPI0_SS0, OUT),
  191. K210_FUNC(SPI0_SS1, OUT),
  192. K210_FUNC(SPI0_SS2, OUT),
  193. K210_FUNC(SPI0_SS3, OUT),
  194. K210_FUNC(SPI0_ARB, IN_TIE),
  195. K210_FUNC(SPI0_SCLK, OUT),
  196. K210_FUNC(UARTHS_RX, IN),
  197. K210_FUNC(UARTHS_TX, OUT),
  198. K210_FUNC(RESV6, IN),
  199. K210_FUNC(RESV7, IN),
  200. K210_FUNC(CLK_SPI1, OUT),
  201. K210_FUNC(CLK_I2C1, OUT),
  202. K210_FUNC(GPIOHS0, GPIO),
  203. K210_FUNC(GPIOHS1, GPIO),
  204. K210_FUNC(GPIOHS2, GPIO),
  205. K210_FUNC(GPIOHS3, GPIO),
  206. K210_FUNC(GPIOHS4, GPIO),
  207. K210_FUNC(GPIOHS5, GPIO),
  208. K210_FUNC(GPIOHS6, GPIO),
  209. K210_FUNC(GPIOHS7, GPIO),
  210. K210_FUNC(GPIOHS8, GPIO),
  211. K210_FUNC(GPIOHS9, GPIO),
  212. K210_FUNC(GPIOHS10, GPIO),
  213. K210_FUNC(GPIOHS11, GPIO),
  214. K210_FUNC(GPIOHS12, GPIO),
  215. K210_FUNC(GPIOHS13, GPIO),
  216. K210_FUNC(GPIOHS14, GPIO),
  217. K210_FUNC(GPIOHS15, GPIO),
  218. K210_FUNC(GPIOHS16, GPIO),
  219. K210_FUNC(GPIOHS17, GPIO),
  220. K210_FUNC(GPIOHS18, GPIO),
  221. K210_FUNC(GPIOHS19, GPIO),
  222. K210_FUNC(GPIOHS20, GPIO),
  223. K210_FUNC(GPIOHS21, GPIO),
  224. K210_FUNC(GPIOHS22, GPIO),
  225. K210_FUNC(GPIOHS23, GPIO),
  226. K210_FUNC(GPIOHS24, GPIO),
  227. K210_FUNC(GPIOHS25, GPIO),
  228. K210_FUNC(GPIOHS26, GPIO),
  229. K210_FUNC(GPIOHS27, GPIO),
  230. K210_FUNC(GPIOHS28, GPIO),
  231. K210_FUNC(GPIOHS29, GPIO),
  232. K210_FUNC(GPIOHS30, GPIO),
  233. K210_FUNC(GPIOHS31, GPIO),
  234. K210_FUNC(GPIO0, GPIO),
  235. K210_FUNC(GPIO1, GPIO),
  236. K210_FUNC(GPIO2, GPIO),
  237. K210_FUNC(GPIO3, GPIO),
  238. K210_FUNC(GPIO4, GPIO),
  239. K210_FUNC(GPIO5, GPIO),
  240. K210_FUNC(GPIO6, GPIO),
  241. K210_FUNC(GPIO7, GPIO),
  242. K210_FUNC(UART1_RX, IN),
  243. K210_FUNC(UART1_TX, OUT),
  244. K210_FUNC(UART2_RX, IN),
  245. K210_FUNC(UART2_TX, OUT),
  246. K210_FUNC(UART3_RX, IN),
  247. K210_FUNC(UART3_TX, OUT),
  248. K210_FUNC(SPI1_D0, SPI),
  249. K210_FUNC(SPI1_D1, SPI),
  250. K210_FUNC(SPI1_D2, SPI),
  251. K210_FUNC(SPI1_D3, SPI),
  252. K210_FUNC(SPI1_D4, SPI),
  253. K210_FUNC(SPI1_D5, SPI),
  254. K210_FUNC(SPI1_D6, SPI),
  255. K210_FUNC(SPI1_D7, SPI),
  256. K210_FUNC(SPI1_SS0, OUT),
  257. K210_FUNC(SPI1_SS1, OUT),
  258. K210_FUNC(SPI1_SS2, OUT),
  259. K210_FUNC(SPI1_SS3, OUT),
  260. K210_FUNC(SPI1_ARB, IN_TIE),
  261. K210_FUNC(SPI1_SCLK, OUT),
  262. K210_FUNC(SPI2_D0, SPI),
  263. K210_FUNC(SPI2_SS, IN),
  264. K210_FUNC(SPI2_SCLK, IN),
  265. K210_FUNC(I2S0_MCLK, OUT),
  266. K210_FUNC(I2S0_SCLK, OUT),
  267. K210_FUNC(I2S0_WS, OUT),
  268. K210_FUNC(I2S0_IN_D0, IN),
  269. K210_FUNC(I2S0_IN_D1, IN),
  270. K210_FUNC(I2S0_IN_D2, IN),
  271. K210_FUNC(I2S0_IN_D3, IN),
  272. K210_FUNC(I2S0_OUT_D0, OUT),
  273. K210_FUNC(I2S0_OUT_D1, OUT),
  274. K210_FUNC(I2S0_OUT_D2, OUT),
  275. K210_FUNC(I2S0_OUT_D3, OUT),
  276. K210_FUNC(I2S1_MCLK, OUT),
  277. K210_FUNC(I2S1_SCLK, OUT),
  278. K210_FUNC(I2S1_WS, OUT),
  279. K210_FUNC(I2S1_IN_D0, IN),
  280. K210_FUNC(I2S1_IN_D1, IN),
  281. K210_FUNC(I2S1_IN_D2, IN),
  282. K210_FUNC(I2S1_IN_D3, IN),
  283. K210_FUNC(I2S1_OUT_D0, OUT),
  284. K210_FUNC(I2S1_OUT_D1, OUT),
  285. K210_FUNC(I2S1_OUT_D2, OUT),
  286. K210_FUNC(I2S1_OUT_D3, OUT),
  287. K210_FUNC(I2S2_MCLK, OUT),
  288. K210_FUNC(I2S2_SCLK, OUT),
  289. K210_FUNC(I2S2_WS, OUT),
  290. K210_FUNC(I2S2_IN_D0, IN),
  291. K210_FUNC(I2S2_IN_D1, IN),
  292. K210_FUNC(I2S2_IN_D2, IN),
  293. K210_FUNC(I2S2_IN_D3, IN),
  294. K210_FUNC(I2S2_OUT_D0, OUT),
  295. K210_FUNC(I2S2_OUT_D1, OUT),
  296. K210_FUNC(I2S2_OUT_D2, OUT),
  297. K210_FUNC(I2S2_OUT_D3, OUT),
  298. K210_FUNC(RESV0, DISABLED),
  299. K210_FUNC(RESV1, DISABLED),
  300. K210_FUNC(RESV2, DISABLED),
  301. K210_FUNC(RESV3, DISABLED),
  302. K210_FUNC(RESV4, DISABLED),
  303. K210_FUNC(RESV5, DISABLED),
  304. K210_FUNC(I2C0_SCLK, I2C),
  305. K210_FUNC(I2C0_SDA, I2C),
  306. K210_FUNC(I2C1_SCLK, I2C),
  307. K210_FUNC(I2C1_SDA, I2C),
  308. K210_FUNC(I2C2_SCLK, I2C),
  309. K210_FUNC(I2C2_SDA, I2C),
  310. K210_FUNC(DVP_XCLK, OUT),
  311. K210_FUNC(DVP_RST, OUT),
  312. K210_FUNC(DVP_PWDN, OUT),
  313. K210_FUNC(DVP_VSYNC, IN),
  314. K210_FUNC(DVP_HSYNC, IN),
  315. K210_FUNC(DVP_PCLK, IN),
  316. K210_FUNC(DVP_D0, IN),
  317. K210_FUNC(DVP_D1, IN),
  318. K210_FUNC(DVP_D2, IN),
  319. K210_FUNC(DVP_D3, IN),
  320. K210_FUNC(DVP_D4, IN),
  321. K210_FUNC(DVP_D5, IN),
  322. K210_FUNC(DVP_D6, IN),
  323. K210_FUNC(DVP_D7, IN),
  324. K210_FUNC(SCCB_SCLK, SCCB),
  325. K210_FUNC(SCCB_SDA, SCCB),
  326. K210_FUNC(UART1_CTS, IN),
  327. K210_FUNC(UART1_DSR, IN),
  328. K210_FUNC(UART1_DCD, IN),
  329. K210_FUNC(UART1_RI, IN),
  330. K210_FUNC(UART1_SIR_IN, IN),
  331. K210_FUNC(UART1_DTR, OUT),
  332. K210_FUNC(UART1_RTS, OUT),
  333. K210_FUNC(UART1_OUT2, OUT),
  334. K210_FUNC(UART1_OUT1, OUT),
  335. K210_FUNC(UART1_SIR_OUT, OUT),
  336. K210_FUNC(UART1_BAUD, OUT),
  337. K210_FUNC(UART1_RE, OUT),
  338. K210_FUNC(UART1_DE, OUT),
  339. K210_FUNC(UART1_RS485_EN, OUT),
  340. K210_FUNC(UART2_CTS, IN),
  341. K210_FUNC(UART2_DSR, IN),
  342. K210_FUNC(UART2_DCD, IN),
  343. K210_FUNC(UART2_RI, IN),
  344. K210_FUNC(UART2_SIR_IN, IN),
  345. K210_FUNC(UART2_DTR, OUT),
  346. K210_FUNC(UART2_RTS, OUT),
  347. K210_FUNC(UART2_OUT2, OUT),
  348. K210_FUNC(UART2_OUT1, OUT),
  349. K210_FUNC(UART2_SIR_OUT, OUT),
  350. K210_FUNC(UART2_BAUD, OUT),
  351. K210_FUNC(UART2_RE, OUT),
  352. K210_FUNC(UART2_DE, OUT),
  353. K210_FUNC(UART2_RS485_EN, OUT),
  354. K210_FUNC(UART3_CTS, IN),
  355. K210_FUNC(UART3_DSR, IN),
  356. K210_FUNC(UART3_DCD, IN),
  357. K210_FUNC(UART3_RI, IN),
  358. K210_FUNC(UART3_SIR_IN, IN),
  359. K210_FUNC(UART3_DTR, OUT),
  360. K210_FUNC(UART3_RTS, OUT),
  361. K210_FUNC(UART3_OUT2, OUT),
  362. K210_FUNC(UART3_OUT1, OUT),
  363. K210_FUNC(UART3_SIR_OUT, OUT),
  364. K210_FUNC(UART3_BAUD, OUT),
  365. K210_FUNC(UART3_RE, OUT),
  366. K210_FUNC(UART3_DE, OUT),
  367. K210_FUNC(UART3_RS485_EN, OUT),
  368. K210_FUNC(TIMER0_TOGGLE1, OUT),
  369. K210_FUNC(TIMER0_TOGGLE2, OUT),
  370. K210_FUNC(TIMER0_TOGGLE3, OUT),
  371. K210_FUNC(TIMER0_TOGGLE4, OUT),
  372. K210_FUNC(TIMER1_TOGGLE1, OUT),
  373. K210_FUNC(TIMER1_TOGGLE2, OUT),
  374. K210_FUNC(TIMER1_TOGGLE3, OUT),
  375. K210_FUNC(TIMER1_TOGGLE4, OUT),
  376. K210_FUNC(TIMER2_TOGGLE1, OUT),
  377. K210_FUNC(TIMER2_TOGGLE2, OUT),
  378. K210_FUNC(TIMER2_TOGGLE3, OUT),
  379. K210_FUNC(TIMER2_TOGGLE4, OUT),
  380. K210_FUNC(CLK_SPI2, OUT),
  381. K210_FUNC(CLK_I2C2, OUT),
  382. K210_FUNC(INTERNAL0, OUT),
  383. K210_FUNC(INTERNAL1, OUT),
  384. K210_FUNC(INTERNAL2, OUT),
  385. K210_FUNC(INTERNAL3, OUT),
  386. K210_FUNC(INTERNAL4, OUT),
  387. K210_FUNC(INTERNAL5, OUT),
  388. K210_FUNC(INTERNAL6, OUT),
  389. K210_FUNC(INTERNAL7, OUT),
  390. K210_FUNC(INTERNAL8, OUT),
  391. K210_FUNC(INTERNAL9, IN),
  392. K210_FUNC(INTERNAL10, IN),
  393. K210_FUNC(INTERNAL11, IN),
  394. K210_FUNC(INTERNAL12, IN),
  395. K210_FUNC(INTERNAL13, INT13),
  396. K210_FUNC(INTERNAL14, I2C),
  397. K210_FUNC(INTERNAL15, IN),
  398. K210_FUNC(INTERNAL16, IN),
  399. K210_FUNC(INTERNAL17, IN),
  400. K210_FUNC(CONSTANT, DISABLED),
  401. K210_FUNC(INTERNAL18, IN),
  402. K210_FUNC(DEBUG0, OUT),
  403. K210_FUNC(DEBUG1, OUT),
  404. K210_FUNC(DEBUG2, OUT),
  405. K210_FUNC(DEBUG3, OUT),
  406. K210_FUNC(DEBUG4, OUT),
  407. K210_FUNC(DEBUG5, OUT),
  408. K210_FUNC(DEBUG6, OUT),
  409. K210_FUNC(DEBUG7, OUT),
  410. K210_FUNC(DEBUG8, OUT),
  411. K210_FUNC(DEBUG9, OUT),
  412. K210_FUNC(DEBUG10, OUT),
  413. K210_FUNC(DEBUG11, OUT),
  414. K210_FUNC(DEBUG12, OUT),
  415. K210_FUNC(DEBUG13, OUT),
  416. K210_FUNC(DEBUG14, OUT),
  417. K210_FUNC(DEBUG15, OUT),
  418. K210_FUNC(DEBUG16, OUT),
  419. K210_FUNC(DEBUG17, OUT),
  420. K210_FUNC(DEBUG18, OUT),
  421. K210_FUNC(DEBUG19, OUT),
  422. K210_FUNC(DEBUG20, OUT),
  423. K210_FUNC(DEBUG21, OUT),
  424. K210_FUNC(DEBUG22, OUT),
  425. K210_FUNC(DEBUG23, OUT),
  426. K210_FUNC(DEBUG24, OUT),
  427. K210_FUNC(DEBUG25, OUT),
  428. K210_FUNC(DEBUG26, OUT),
  429. K210_FUNC(DEBUG27, OUT),
  430. K210_FUNC(DEBUG28, OUT),
  431. K210_FUNC(DEBUG29, OUT),
  432. K210_FUNC(DEBUG30, OUT),
  433. K210_FUNC(DEBUG31, OUT),
  434. };
  435. #define PIN_CONFIG_OUTPUT_INVERT (PIN_CONFIG_END + 1)
  436. #define PIN_CONFIG_INPUT_INVERT (PIN_CONFIG_END + 2)
  437. static const struct pinconf_generic_params k210_pinconf_custom_params[] = {
  438. { "output-polarity-invert", PIN_CONFIG_OUTPUT_INVERT, 1 },
  439. { "input-polarity-invert", PIN_CONFIG_INPUT_INVERT, 1 },
  440. };
  441. /*
  442. * Max drive strength in uA.
  443. */
  444. static const int k210_pinconf_drive_strength[] = {
  445. [0] = 11200,
  446. [1] = 16800,
  447. [2] = 22300,
  448. [3] = 27800,
  449. [4] = 33300,
  450. [5] = 38700,
  451. [6] = 44100,
  452. [7] = 49500,
  453. };
  454. static int k210_pinconf_get_drive(unsigned int max_strength_ua)
  455. {
  456. int i;
  457. for (i = K210_PC_DRIVE_MAX; i >= 0; i--) {
  458. if (k210_pinconf_drive_strength[i] <= max_strength_ua)
  459. return i;
  460. }
  461. return -EINVAL;
  462. }
  463. static void k210_pinmux_set_pin_function(struct pinctrl_dev *pctldev,
  464. u32 pin, u32 func)
  465. {
  466. struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  467. const struct k210_pcf_info *info = &k210_pcf_infos[func];
  468. u32 mode = k210_pinconf_mode_id_to_mode[info->mode_id];
  469. u32 val = func | mode;
  470. dev_dbg(pdata->dev, "set pin %u function %s (%u) -> 0x%08x\n",
  471. pin, info->name, func, val);
  472. writel(val, &pdata->fpioa->pins[pin]);
  473. }
  474. static int k210_pinconf_set_param(struct pinctrl_dev *pctldev,
  475. unsigned int pin,
  476. unsigned int param, unsigned int arg)
  477. {
  478. struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  479. u32 val = readl(&pdata->fpioa->pins[pin]);
  480. int drive;
  481. dev_dbg(pdata->dev, "set pin %u param %u, arg 0x%x\n",
  482. pin, param, arg);
  483. switch (param) {
  484. case PIN_CONFIG_BIAS_DISABLE:
  485. val &= ~K210_PC_BIAS_MASK;
  486. break;
  487. case PIN_CONFIG_BIAS_PULL_DOWN:
  488. if (!arg)
  489. return -EINVAL;
  490. val |= K210_PC_PD;
  491. break;
  492. case PIN_CONFIG_BIAS_PULL_UP:
  493. if (!arg)
  494. return -EINVAL;
  495. val |= K210_PC_PU;
  496. break;
  497. case PIN_CONFIG_DRIVE_STRENGTH:
  498. arg *= 1000;
  499. fallthrough;
  500. case PIN_CONFIG_DRIVE_STRENGTH_UA:
  501. drive = k210_pinconf_get_drive(arg);
  502. if (drive < 0)
  503. return drive;
  504. val &= ~K210_PC_DRIVE_MASK;
  505. val |= FIELD_PREP(K210_PC_DRIVE_MASK, drive);
  506. break;
  507. case PIN_CONFIG_INPUT_ENABLE:
  508. if (arg)
  509. val |= K210_PC_IE;
  510. else
  511. val &= ~K210_PC_IE;
  512. break;
  513. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  514. if (arg)
  515. val |= K210_PC_ST;
  516. else
  517. val &= ~K210_PC_ST;
  518. break;
  519. case PIN_CONFIG_OUTPUT:
  520. k210_pinmux_set_pin_function(pctldev, pin, K210_PCF_CONSTANT);
  521. val = readl(&pdata->fpioa->pins[pin]);
  522. val |= K210_PC_MODE_OUT;
  523. if (!arg)
  524. val |= K210_PC_DO_INV;
  525. break;
  526. case PIN_CONFIG_OUTPUT_ENABLE:
  527. if (arg)
  528. val |= K210_PC_OE;
  529. else
  530. val &= ~K210_PC_OE;
  531. break;
  532. case PIN_CONFIG_SLEW_RATE:
  533. if (arg)
  534. val |= K210_PC_SL;
  535. else
  536. val &= ~K210_PC_SL;
  537. break;
  538. case PIN_CONFIG_OUTPUT_INVERT:
  539. if (arg)
  540. val |= K210_PC_DO_INV;
  541. else
  542. val &= ~K210_PC_DO_INV;
  543. break;
  544. case PIN_CONFIG_INPUT_INVERT:
  545. if (arg)
  546. val |= K210_PC_DI_INV;
  547. else
  548. val &= ~K210_PC_DI_INV;
  549. break;
  550. default:
  551. return -EINVAL;
  552. }
  553. writel(val, &pdata->fpioa->pins[pin]);
  554. return 0;
  555. }
  556. static int k210_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  557. unsigned long *configs, unsigned int num_configs)
  558. {
  559. unsigned int param, arg;
  560. int i, ret;
  561. if (WARN_ON(pin >= K210_NPINS))
  562. return -EINVAL;
  563. for (i = 0; i < num_configs; i++) {
  564. param = pinconf_to_config_param(configs[i]);
  565. arg = pinconf_to_config_argument(configs[i]);
  566. ret = k210_pinconf_set_param(pctldev, pin, param, arg);
  567. if (ret)
  568. return ret;
  569. }
  570. return 0;
  571. }
  572. static void k210_pinconf_dbg_show(struct pinctrl_dev *pctldev,
  573. struct seq_file *s, unsigned int pin)
  574. {
  575. struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  576. seq_printf(s, "%#x", readl(&pdata->fpioa->pins[pin]));
  577. }
  578. static int k210_pinconf_group_set(struct pinctrl_dev *pctldev,
  579. unsigned int selector, unsigned long *configs,
  580. unsigned int num_configs)
  581. {
  582. struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  583. unsigned int param, arg;
  584. u32 bit;
  585. int i;
  586. /* Pins should be configured with pinmux, not groups*/
  587. if (selector < K210_NPINS)
  588. return -EINVAL;
  589. /* Otherwise it's a power domain */
  590. for (i = 0; i < num_configs; i++) {
  591. param = pinconf_to_config_param(configs[i]);
  592. if (param != PIN_CONFIG_POWER_SOURCE)
  593. return -EINVAL;
  594. arg = pinconf_to_config_argument(configs[i]);
  595. bit = BIT(selector - K210_NPINS);
  596. regmap_update_bits(pdata->sysctl_map,
  597. pdata->power_offset,
  598. bit, arg ? bit : 0);
  599. }
  600. return 0;
  601. }
  602. static void k210_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
  603. struct seq_file *s,
  604. unsigned int selector)
  605. {
  606. struct k210_fpioa_data *pdata = pinctrl_dev_get_drvdata(pctldev);
  607. int ret;
  608. u32 val;
  609. if (selector < K210_NPINS)
  610. return k210_pinconf_dbg_show(pctldev, s, selector);
  611. ret = regmap_read(pdata->sysctl_map, pdata->power_offset, &val);
  612. if (ret) {
  613. dev_err(pdata->dev, "Failed to read power reg\n");
  614. return;
  615. }
  616. seq_printf(s, "%s: %s V", k210_group_names[selector],
  617. val & BIT(selector - K210_NPINS) ? "1.8" : "3.3");
  618. }
  619. static const struct pinconf_ops k210_pinconf_ops = {
  620. .is_generic = true,
  621. .pin_config_set = k210_pinconf_set,
  622. .pin_config_group_set = k210_pinconf_group_set,
  623. .pin_config_dbg_show = k210_pinconf_dbg_show,
  624. .pin_config_group_dbg_show = k210_pinconf_group_dbg_show,
  625. };
  626. static int k210_pinmux_get_function_count(struct pinctrl_dev *pctldev)
  627. {
  628. return ARRAY_SIZE(k210_pcf_infos);
  629. }
  630. static const char *k210_pinmux_get_function_name(struct pinctrl_dev *pctldev,
  631. unsigned int selector)
  632. {
  633. return k210_pcf_infos[selector].name;
  634. }
  635. static int k210_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
  636. unsigned int selector,
  637. const char * const **groups,
  638. unsigned int * const num_groups)
  639. {
  640. /* Any function can be mapped to any pin */
  641. *groups = k210_group_names;
  642. *num_groups = K210_NPINS;
  643. return 0;
  644. }
  645. static int k210_pinmux_set_mux(struct pinctrl_dev *pctldev,
  646. unsigned int function,
  647. unsigned int group)
  648. {
  649. /* Can't mux power domains */
  650. if (group >= K210_NPINS)
  651. return -EINVAL;
  652. k210_pinmux_set_pin_function(pctldev, group, function);
  653. return 0;
  654. }
  655. static const struct pinmux_ops k210_pinmux_ops = {
  656. .get_functions_count = k210_pinmux_get_function_count,
  657. .get_function_name = k210_pinmux_get_function_name,
  658. .get_function_groups = k210_pinmux_get_function_groups,
  659. .set_mux = k210_pinmux_set_mux,
  660. .strict = true,
  661. };
  662. static int k210_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
  663. {
  664. return K210_NGROUPS;
  665. }
  666. static const char *k210_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
  667. unsigned int group)
  668. {
  669. return k210_group_names[group];
  670. }
  671. static int k210_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
  672. unsigned int group,
  673. const unsigned int **pins,
  674. unsigned int *npins)
  675. {
  676. if (group >= K210_NPINS) {
  677. *pins = NULL;
  678. *npins = 0;
  679. return 0;
  680. }
  681. *pins = &k210_pins[group].number;
  682. *npins = 1;
  683. return 0;
  684. }
  685. static void k210_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
  686. struct seq_file *s, unsigned int offset)
  687. {
  688. seq_printf(s, "%s", dev_name(pctldev->dev));
  689. }
  690. static int k210_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
  691. struct device_node *np,
  692. struct pinctrl_map **map,
  693. unsigned int *reserved_maps,
  694. unsigned int *num_maps)
  695. {
  696. struct property *prop;
  697. const __be32 *p;
  698. int ret, pinmux_groups;
  699. u32 pinmux_group;
  700. unsigned long *configs = NULL;
  701. unsigned int num_configs = 0;
  702. unsigned int reserve = 0;
  703. ret = of_property_count_strings(np, "groups");
  704. if (!ret)
  705. return pinconf_generic_dt_subnode_to_map(pctldev, np, map,
  706. reserved_maps, num_maps,
  707. PIN_MAP_TYPE_CONFIGS_GROUP);
  708. pinmux_groups = of_property_count_u32_elems(np, "pinmux");
  709. if (pinmux_groups <= 0) {
  710. /* Ignore this node */
  711. return 0;
  712. }
  713. ret = pinconf_generic_parse_dt_config(np, pctldev, &configs,
  714. &num_configs);
  715. if (ret < 0) {
  716. dev_err(pctldev->dev, "%pOF: could not parse node property\n",
  717. np);
  718. return ret;
  719. }
  720. reserve = pinmux_groups * (1 + num_configs);
  721. ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps,
  722. reserve);
  723. if (ret < 0)
  724. goto exit;
  725. of_property_for_each_u32(np, "pinmux", prop, p, pinmux_group) {
  726. const char *group_name, *func_name;
  727. u32 pin = FIELD_GET(K210_PG_PIN, pinmux_group);
  728. u32 func = FIELD_GET(K210_PG_FUNC, pinmux_group);
  729. if (pin >= K210_NPINS) {
  730. ret = -EINVAL;
  731. goto exit;
  732. }
  733. group_name = k210_group_names[pin];
  734. func_name = k210_pcf_infos[func].name;
  735. dev_dbg(pctldev->dev, "Pinmux %s: pin %u func %s\n",
  736. np->name, pin, func_name);
  737. ret = pinctrl_utils_add_map_mux(pctldev, map, reserved_maps,
  738. num_maps, group_name,
  739. func_name);
  740. if (ret < 0) {
  741. dev_err(pctldev->dev, "%pOF add mux map failed %d\n",
  742. np, ret);
  743. goto exit;
  744. }
  745. if (num_configs) {
  746. ret = pinctrl_utils_add_map_configs(pctldev, map,
  747. reserved_maps, num_maps, group_name,
  748. configs, num_configs,
  749. PIN_MAP_TYPE_CONFIGS_PIN);
  750. if (ret < 0) {
  751. dev_err(pctldev->dev,
  752. "%pOF add configs map failed %d\n",
  753. np, ret);
  754. goto exit;
  755. }
  756. }
  757. }
  758. ret = 0;
  759. exit:
  760. kfree(configs);
  761. return ret;
  762. }
  763. static int k210_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
  764. struct device_node *np_config,
  765. struct pinctrl_map **map,
  766. unsigned int *num_maps)
  767. {
  768. unsigned int reserved_maps;
  769. struct device_node *np;
  770. int ret;
  771. reserved_maps = 0;
  772. *map = NULL;
  773. *num_maps = 0;
  774. ret = k210_pinctrl_dt_subnode_to_map(pctldev, np_config, map,
  775. &reserved_maps, num_maps);
  776. if (ret < 0)
  777. goto err;
  778. for_each_available_child_of_node(np_config, np) {
  779. ret = k210_pinctrl_dt_subnode_to_map(pctldev, np, map,
  780. &reserved_maps, num_maps);
  781. if (ret < 0) {
  782. of_node_put(np);
  783. goto err;
  784. }
  785. }
  786. return 0;
  787. err:
  788. pinctrl_utils_free_map(pctldev, *map, *num_maps);
  789. return ret;
  790. }
  791. static const struct pinctrl_ops k210_pinctrl_ops = {
  792. .get_groups_count = k210_pinctrl_get_groups_count,
  793. .get_group_name = k210_pinctrl_get_group_name,
  794. .get_group_pins = k210_pinctrl_get_group_pins,
  795. .pin_dbg_show = k210_pinctrl_pin_dbg_show,
  796. .dt_node_to_map = k210_pinctrl_dt_node_to_map,
  797. .dt_free_map = pinconf_generic_dt_free_map,
  798. };
  799. static struct pinctrl_desc k210_pinctrl_desc = {
  800. .name = "k210-pinctrl",
  801. .pins = k210_pins,
  802. .npins = K210_NPINS,
  803. .pctlops = &k210_pinctrl_ops,
  804. .pmxops = &k210_pinmux_ops,
  805. .confops = &k210_pinconf_ops,
  806. .custom_params = k210_pinconf_custom_params,
  807. .num_custom_params = ARRAY_SIZE(k210_pinconf_custom_params),
  808. };
  809. static void k210_fpioa_init_ties(struct k210_fpioa_data *pdata)
  810. {
  811. struct k210_fpioa __iomem *fpioa = pdata->fpioa;
  812. u32 val;
  813. int i, j;
  814. dev_dbg(pdata->dev, "Init pin ties\n");
  815. /* Init pin functions input ties */
  816. for (i = 0; i < ARRAY_SIZE(fpioa->tie_en); i++) {
  817. val = 0;
  818. for (j = 0; j < 32; j++) {
  819. if (k210_pcf_infos[i * 32 + j].mode_id ==
  820. K210_PC_DEFAULT_IN_TIE) {
  821. dev_dbg(pdata->dev,
  822. "tie_en function %d (%s)\n",
  823. i * 32 + j,
  824. k210_pcf_infos[i * 32 + j].name);
  825. val |= BIT(j);
  826. }
  827. }
  828. /* Set value before enable */
  829. writel(val, &fpioa->tie_val[i]);
  830. writel(val, &fpioa->tie_en[i]);
  831. }
  832. }
  833. static int k210_fpioa_probe(struct platform_device *pdev)
  834. {
  835. struct device *dev = &pdev->dev;
  836. struct device_node *np = dev->of_node;
  837. struct k210_fpioa_data *pdata;
  838. int ret;
  839. dev_info(dev, "K210 FPIOA pin controller\n");
  840. pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
  841. if (!pdata)
  842. return -ENOMEM;
  843. pdata->dev = dev;
  844. platform_set_drvdata(pdev, pdata);
  845. pdata->fpioa = devm_platform_ioremap_resource(pdev, 0);
  846. if (IS_ERR(pdata->fpioa))
  847. return PTR_ERR(pdata->fpioa);
  848. pdata->clk = devm_clk_get(dev, "ref");
  849. if (IS_ERR(pdata->clk))
  850. return PTR_ERR(pdata->clk);
  851. ret = clk_prepare_enable(pdata->clk);
  852. if (ret)
  853. return ret;
  854. pdata->pclk = devm_clk_get_optional(dev, "pclk");
  855. if (!IS_ERR(pdata->pclk)) {
  856. ret = clk_prepare_enable(pdata->pclk);
  857. if (ret)
  858. goto disable_clk;
  859. }
  860. pdata->sysctl_map =
  861. syscon_regmap_lookup_by_phandle_args(np,
  862. "canaan,k210-sysctl-power",
  863. 1, &pdata->power_offset);
  864. if (IS_ERR(pdata->sysctl_map)) {
  865. ret = PTR_ERR(pdata->sysctl_map);
  866. goto disable_pclk;
  867. }
  868. k210_fpioa_init_ties(pdata);
  869. pdata->pctl = pinctrl_register(&k210_pinctrl_desc, dev, (void *)pdata);
  870. if (IS_ERR(pdata->pctl)) {
  871. ret = PTR_ERR(pdata->pctl);
  872. goto disable_pclk;
  873. }
  874. return 0;
  875. disable_pclk:
  876. clk_disable_unprepare(pdata->pclk);
  877. disable_clk:
  878. clk_disable_unprepare(pdata->clk);
  879. return ret;
  880. }
  881. static const struct of_device_id k210_fpioa_dt_ids[] = {
  882. { .compatible = "canaan,k210-fpioa" },
  883. { /* sentinel */ },
  884. };
  885. static struct platform_driver k210_fpioa_driver = {
  886. .probe = k210_fpioa_probe,
  887. .driver = {
  888. .name = "k210-fpioa",
  889. .of_match_table = k210_fpioa_dt_ids,
  890. },
  891. };
  892. builtin_platform_driver(k210_fpioa_driver);