pinctrl-imx7ulp.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (C) 2016 Freescale Semiconductor, Inc.
  4. // Copyright (C) 2017 NXP
  5. //
  6. // Author: Dong Aisheng <[email protected]>
  7. #include <linux/err.h>
  8. #include <linux/init.h>
  9. #include <linux/io.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/of_device.h>
  13. #include <linux/pinctrl/pinctrl.h>
  14. #include "pinctrl-imx.h"
  15. enum imx7ulp_pads {
  16. IMX7ULP_PAD_PTC0 = 0,
  17. IMX7ULP_PAD_PTC1,
  18. IMX7ULP_PAD_PTC2,
  19. IMX7ULP_PAD_PTC3,
  20. IMX7ULP_PAD_PTC4,
  21. IMX7ULP_PAD_PTC5,
  22. IMX7ULP_PAD_PTC6,
  23. IMX7ULP_PAD_PTC7,
  24. IMX7ULP_PAD_PTC8,
  25. IMX7ULP_PAD_PTC9,
  26. IMX7ULP_PAD_PTC10,
  27. IMX7ULP_PAD_PTC11,
  28. IMX7ULP_PAD_PTC12,
  29. IMX7ULP_PAD_PTC13,
  30. IMX7ULP_PAD_PTC14,
  31. IMX7ULP_PAD_PTC15,
  32. IMX7ULP_PAD_PTC16,
  33. IMX7ULP_PAD_PTC17,
  34. IMX7ULP_PAD_PTC18,
  35. IMX7ULP_PAD_PTC19,
  36. IMX7ULP_PAD_RESERVE0,
  37. IMX7ULP_PAD_RESERVE1,
  38. IMX7ULP_PAD_RESERVE2,
  39. IMX7ULP_PAD_RESERVE3,
  40. IMX7ULP_PAD_RESERVE4,
  41. IMX7ULP_PAD_RESERVE5,
  42. IMX7ULP_PAD_RESERVE6,
  43. IMX7ULP_PAD_RESERVE7,
  44. IMX7ULP_PAD_RESERVE8,
  45. IMX7ULP_PAD_RESERVE9,
  46. IMX7ULP_PAD_RESERVE10,
  47. IMX7ULP_PAD_RESERVE11,
  48. IMX7ULP_PAD_PTD0,
  49. IMX7ULP_PAD_PTD1,
  50. IMX7ULP_PAD_PTD2,
  51. IMX7ULP_PAD_PTD3,
  52. IMX7ULP_PAD_PTD4,
  53. IMX7ULP_PAD_PTD5,
  54. IMX7ULP_PAD_PTD6,
  55. IMX7ULP_PAD_PTD7,
  56. IMX7ULP_PAD_PTD8,
  57. IMX7ULP_PAD_PTD9,
  58. IMX7ULP_PAD_PTD10,
  59. IMX7ULP_PAD_PTD11,
  60. IMX7ULP_PAD_RESERVE12,
  61. IMX7ULP_PAD_RESERVE13,
  62. IMX7ULP_PAD_RESERVE14,
  63. IMX7ULP_PAD_RESERVE15,
  64. IMX7ULP_PAD_RESERVE16,
  65. IMX7ULP_PAD_RESERVE17,
  66. IMX7ULP_PAD_RESERVE18,
  67. IMX7ULP_PAD_RESERVE19,
  68. IMX7ULP_PAD_RESERVE20,
  69. IMX7ULP_PAD_RESERVE21,
  70. IMX7ULP_PAD_RESERVE22,
  71. IMX7ULP_PAD_RESERVE23,
  72. IMX7ULP_PAD_RESERVE24,
  73. IMX7ULP_PAD_RESERVE25,
  74. IMX7ULP_PAD_RESERVE26,
  75. IMX7ULP_PAD_RESERVE27,
  76. IMX7ULP_PAD_RESERVE28,
  77. IMX7ULP_PAD_RESERVE29,
  78. IMX7ULP_PAD_RESERVE30,
  79. IMX7ULP_PAD_RESERVE31,
  80. IMX7ULP_PAD_PTE0,
  81. IMX7ULP_PAD_PTE1,
  82. IMX7ULP_PAD_PTE2,
  83. IMX7ULP_PAD_PTE3,
  84. IMX7ULP_PAD_PTE4,
  85. IMX7ULP_PAD_PTE5,
  86. IMX7ULP_PAD_PTE6,
  87. IMX7ULP_PAD_PTE7,
  88. IMX7ULP_PAD_PTE8,
  89. IMX7ULP_PAD_PTE9,
  90. IMX7ULP_PAD_PTE10,
  91. IMX7ULP_PAD_PTE11,
  92. IMX7ULP_PAD_PTE12,
  93. IMX7ULP_PAD_PTE13,
  94. IMX7ULP_PAD_PTE14,
  95. IMX7ULP_PAD_PTE15,
  96. IMX7ULP_PAD_RESERVE32,
  97. IMX7ULP_PAD_RESERVE33,
  98. IMX7ULP_PAD_RESERVE34,
  99. IMX7ULP_PAD_RESERVE35,
  100. IMX7ULP_PAD_RESERVE36,
  101. IMX7ULP_PAD_RESERVE37,
  102. IMX7ULP_PAD_RESERVE38,
  103. IMX7ULP_PAD_RESERVE39,
  104. IMX7ULP_PAD_RESERVE40,
  105. IMX7ULP_PAD_RESERVE41,
  106. IMX7ULP_PAD_RESERVE42,
  107. IMX7ULP_PAD_RESERVE43,
  108. IMX7ULP_PAD_RESERVE44,
  109. IMX7ULP_PAD_RESERVE45,
  110. IMX7ULP_PAD_RESERVE46,
  111. IMX7ULP_PAD_RESERVE47,
  112. IMX7ULP_PAD_PTF0,
  113. IMX7ULP_PAD_PTF1,
  114. IMX7ULP_PAD_PTF2,
  115. IMX7ULP_PAD_PTF3,
  116. IMX7ULP_PAD_PTF4,
  117. IMX7ULP_PAD_PTF5,
  118. IMX7ULP_PAD_PTF6,
  119. IMX7ULP_PAD_PTF7,
  120. IMX7ULP_PAD_PTF8,
  121. IMX7ULP_PAD_PTF9,
  122. IMX7ULP_PAD_PTF10,
  123. IMX7ULP_PAD_PTF11,
  124. IMX7ULP_PAD_PTF12,
  125. IMX7ULP_PAD_PTF13,
  126. IMX7ULP_PAD_PTF14,
  127. IMX7ULP_PAD_PTF15,
  128. IMX7ULP_PAD_PTF16,
  129. IMX7ULP_PAD_PTF17,
  130. IMX7ULP_PAD_PTF18,
  131. IMX7ULP_PAD_PTF19,
  132. };
  133. /* Pad names for the pinmux subsystem */
  134. static const struct pinctrl_pin_desc imx7ulp_pinctrl_pads[] = {
  135. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC0),
  136. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC1),
  137. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC2),
  138. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC3),
  139. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC4),
  140. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC5),
  141. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC6),
  142. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC7),
  143. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC8),
  144. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC9),
  145. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC10),
  146. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC11),
  147. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC12),
  148. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC13),
  149. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC14),
  150. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC15),
  151. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC16),
  152. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC17),
  153. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC18),
  154. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTC19),
  155. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE0),
  156. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE1),
  157. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE2),
  158. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE3),
  159. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE4),
  160. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE5),
  161. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE6),
  162. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE7),
  163. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE8),
  164. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE9),
  165. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE10),
  166. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE11),
  167. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD0),
  168. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD1),
  169. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD2),
  170. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD3),
  171. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD4),
  172. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD5),
  173. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD6),
  174. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD7),
  175. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD8),
  176. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD9),
  177. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD10),
  178. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTD11),
  179. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE12),
  180. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE13),
  181. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE14),
  182. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE15),
  183. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE16),
  184. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE17),
  185. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE18),
  186. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE19),
  187. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE20),
  188. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE21),
  189. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE22),
  190. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE23),
  191. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE24),
  192. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE25),
  193. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE26),
  194. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE27),
  195. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE28),
  196. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE29),
  197. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE30),
  198. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE31),
  199. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE0),
  200. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE1),
  201. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE2),
  202. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE3),
  203. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE4),
  204. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE5),
  205. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE6),
  206. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE7),
  207. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE8),
  208. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE9),
  209. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE10),
  210. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE11),
  211. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE12),
  212. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE13),
  213. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE14),
  214. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTE15),
  215. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE32),
  216. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE33),
  217. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE34),
  218. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE35),
  219. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE36),
  220. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE37),
  221. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE38),
  222. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE39),
  223. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE40),
  224. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE41),
  225. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE42),
  226. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE43),
  227. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE44),
  228. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE45),
  229. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE46),
  230. IMX_PINCTRL_PIN(IMX7ULP_PAD_RESERVE47),
  231. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF0),
  232. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF1),
  233. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF2),
  234. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF3),
  235. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF4),
  236. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF5),
  237. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF6),
  238. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF7),
  239. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF8),
  240. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF9),
  241. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF10),
  242. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF11),
  243. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF12),
  244. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF13),
  245. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF14),
  246. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF15),
  247. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF16),
  248. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF17),
  249. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF18),
  250. IMX_PINCTRL_PIN(IMX7ULP_PAD_PTF19),
  251. };
  252. #define BM_OBE_ENABLED BIT(17)
  253. #define BM_IBE_ENABLED BIT(16)
  254. #define BM_MUX_MODE 0xf00
  255. #define BP_MUX_MODE 8
  256. static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
  257. struct pinctrl_gpio_range *range,
  258. unsigned offset, bool input)
  259. {
  260. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  261. const struct imx_pin_reg *pin_reg;
  262. u32 reg;
  263. pin_reg = &ipctl->pin_regs[offset];
  264. if (pin_reg->mux_reg == -1)
  265. return -EINVAL;
  266. reg = readl(ipctl->base + pin_reg->mux_reg);
  267. if (input)
  268. reg = (reg & ~BM_OBE_ENABLED) | BM_IBE_ENABLED;
  269. else
  270. reg = (reg & ~BM_IBE_ENABLED) | BM_OBE_ENABLED;
  271. writel(reg, ipctl->base + pin_reg->mux_reg);
  272. return 0;
  273. }
  274. static const struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
  275. .pins = imx7ulp_pinctrl_pads,
  276. .npins = ARRAY_SIZE(imx7ulp_pinctrl_pads),
  277. .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
  278. .gpio_set_direction = imx7ulp_pmx_gpio_set_direction,
  279. .mux_mask = BM_MUX_MODE,
  280. .mux_shift = BP_MUX_MODE,
  281. };
  282. static const struct of_device_id imx7ulp_pinctrl_of_match[] = {
  283. { .compatible = "fsl,imx7ulp-iomuxc1", },
  284. { /* sentinel */ }
  285. };
  286. static int imx7ulp_pinctrl_probe(struct platform_device *pdev)
  287. {
  288. return imx_pinctrl_probe(pdev, &imx7ulp_pinctrl_info);
  289. }
  290. static struct platform_driver imx7ulp_pinctrl_driver = {
  291. .driver = {
  292. .name = "imx7ulp-pinctrl",
  293. .of_match_table = imx7ulp_pinctrl_of_match,
  294. .suppress_bind_attrs = true,
  295. },
  296. .probe = imx7ulp_pinctrl_probe,
  297. };
  298. static int __init imx7ulp_pinctrl_init(void)
  299. {
  300. return platform_driver_register(&imx7ulp_pinctrl_driver);
  301. }
  302. arch_initcall(imx7ulp_pinctrl_init);