pinctrl-imx8ulp.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2021 NXP
  4. */
  5. #include <linux/err.h>
  6. #include <linux/init.h>
  7. #include <linux/io.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/of_device.h>
  11. #include <linux/pinctrl/pinctrl.h>
  12. #include "pinctrl-imx.h"
  13. enum imx8ulp_pads {
  14. IMX8ULP_PAD_PTD0 = 0,
  15. IMX8ULP_PAD_PTD1,
  16. IMX8ULP_PAD_PTD2,
  17. IMX8ULP_PAD_PTD3,
  18. IMX8ULP_PAD_PTD4,
  19. IMX8ULP_PAD_PTD5,
  20. IMX8ULP_PAD_PTD6,
  21. IMX8ULP_PAD_PTD7,
  22. IMX8ULP_PAD_PTD8,
  23. IMX8ULP_PAD_PTD9,
  24. IMX8ULP_PAD_PTD10,
  25. IMX8ULP_PAD_PTD11,
  26. IMX8ULP_PAD_PTD12,
  27. IMX8ULP_PAD_PTD13,
  28. IMX8ULP_PAD_PTD14,
  29. IMX8ULP_PAD_PTD15,
  30. IMX8ULP_PAD_PTD16,
  31. IMX8ULP_PAD_PTD17,
  32. IMX8ULP_PAD_PTD18,
  33. IMX8ULP_PAD_PTD19,
  34. IMX8ULP_PAD_PTD20,
  35. IMX8ULP_PAD_PTD21,
  36. IMX8ULP_PAD_PTD22,
  37. IMX8ULP_PAD_PTD23,
  38. IMX8ULP_PAD_RESERVE0,
  39. IMX8ULP_PAD_RESERVE1,
  40. IMX8ULP_PAD_RESERVE2,
  41. IMX8ULP_PAD_RESERVE3,
  42. IMX8ULP_PAD_RESERVE4,
  43. IMX8ULP_PAD_RESERVE5,
  44. IMX8ULP_PAD_RESERVE6,
  45. IMX8ULP_PAD_RESERVE7,
  46. IMX8ULP_PAD_PTE0,
  47. IMX8ULP_PAD_PTE1,
  48. IMX8ULP_PAD_PTE2,
  49. IMX8ULP_PAD_PTE3,
  50. IMX8ULP_PAD_PTE4,
  51. IMX8ULP_PAD_PTE5,
  52. IMX8ULP_PAD_PTE6,
  53. IMX8ULP_PAD_PTE7,
  54. IMX8ULP_PAD_PTE8,
  55. IMX8ULP_PAD_PTE9,
  56. IMX8ULP_PAD_PTE10,
  57. IMX8ULP_PAD_PTE11,
  58. IMX8ULP_PAD_PTE12,
  59. IMX8ULP_PAD_PTE13,
  60. IMX8ULP_PAD_PTE14,
  61. IMX8ULP_PAD_PTE15,
  62. IMX8ULP_PAD_PTE16,
  63. IMX8ULP_PAD_PTE17,
  64. IMX8ULP_PAD_PTE18,
  65. IMX8ULP_PAD_PTE19,
  66. IMX8ULP_PAD_PTE20,
  67. IMX8ULP_PAD_PTE21,
  68. IMX8ULP_PAD_PTE22,
  69. IMX8ULP_PAD_PTE23,
  70. IMX8ULP_PAD_RESERVE8,
  71. IMX8ULP_PAD_RESERVE9,
  72. IMX8ULP_PAD_RESERVE10,
  73. IMX8ULP_PAD_RESERVE11,
  74. IMX8ULP_PAD_RESERVE12,
  75. IMX8ULP_PAD_RESERVE13,
  76. IMX8ULP_PAD_RESERVE14,
  77. IMX8ULP_PAD_RESERVE15,
  78. IMX8ULP_PAD_PTF0,
  79. IMX8ULP_PAD_PTF1,
  80. IMX8ULP_PAD_PTF2,
  81. IMX8ULP_PAD_PTF3,
  82. IMX8ULP_PAD_PTF4,
  83. IMX8ULP_PAD_PTF5,
  84. IMX8ULP_PAD_PTF6,
  85. IMX8ULP_PAD_PTF7,
  86. IMX8ULP_PAD_PTF8,
  87. IMX8ULP_PAD_PTF9,
  88. IMX8ULP_PAD_PTF10,
  89. IMX8ULP_PAD_PTF11,
  90. IMX8ULP_PAD_PTF12,
  91. IMX8ULP_PAD_PTF13,
  92. IMX8ULP_PAD_PTF14,
  93. IMX8ULP_PAD_PTF15,
  94. IMX8ULP_PAD_PTF16,
  95. IMX8ULP_PAD_PTF17,
  96. IMX8ULP_PAD_PTF18,
  97. IMX8ULP_PAD_PTF19,
  98. IMX8ULP_PAD_PTF20,
  99. IMX8ULP_PAD_PTF21,
  100. IMX8ULP_PAD_PTF22,
  101. IMX8ULP_PAD_PTF23,
  102. IMX8ULP_PAD_PTF24,
  103. IMX8ULP_PAD_PTF25,
  104. IMX8ULP_PAD_PTF26,
  105. IMX8ULP_PAD_PTF27,
  106. IMX8ULP_PAD_PTF28,
  107. IMX8ULP_PAD_PTF29,
  108. IMX8ULP_PAD_PTF30,
  109. IMX8ULP_PAD_PTF31,
  110. };
  111. /* Pad names for the pinmux subsystem */
  112. static const struct pinctrl_pin_desc imx8ulp_pinctrl_pads[] = {
  113. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD0),
  114. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD1),
  115. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD2),
  116. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD3),
  117. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD4),
  118. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD5),
  119. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD6),
  120. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD7),
  121. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD8),
  122. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD9),
  123. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD10),
  124. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD11),
  125. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD12),
  126. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD13),
  127. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD14),
  128. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD15),
  129. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD16),
  130. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD17),
  131. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD18),
  132. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD19),
  133. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD20),
  134. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD21),
  135. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD22),
  136. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTD23),
  137. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE0),
  138. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE1),
  139. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE2),
  140. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE3),
  141. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE4),
  142. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE5),
  143. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE6),
  144. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE7),
  145. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE0),
  146. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE1),
  147. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE2),
  148. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE3),
  149. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE4),
  150. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE5),
  151. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE6),
  152. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE7),
  153. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE8),
  154. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE9),
  155. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE10),
  156. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE11),
  157. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE12),
  158. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE13),
  159. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE14),
  160. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE15),
  161. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE16),
  162. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE17),
  163. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE18),
  164. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE19),
  165. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE20),
  166. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE21),
  167. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE22),
  168. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTE23),
  169. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE8),
  170. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE9),
  171. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE10),
  172. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE11),
  173. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE12),
  174. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE13),
  175. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE14),
  176. IMX_PINCTRL_PIN(IMX8ULP_PAD_RESERVE15),
  177. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF0),
  178. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF1),
  179. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF2),
  180. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF3),
  181. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF4),
  182. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF5),
  183. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF6),
  184. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF7),
  185. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF8),
  186. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF9),
  187. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF10),
  188. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF11),
  189. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF12),
  190. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF13),
  191. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF14),
  192. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF15),
  193. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF16),
  194. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF17),
  195. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF18),
  196. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF19),
  197. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF20),
  198. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF21),
  199. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF22),
  200. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF23),
  201. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF24),
  202. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF25),
  203. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF26),
  204. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF27),
  205. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF28),
  206. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF29),
  207. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF30),
  208. IMX_PINCTRL_PIN(IMX8ULP_PAD_PTF31),
  209. };
  210. #define BM_OBE_ENABLED BIT(17)
  211. #define BM_IBE_ENABLED BIT(16)
  212. #define BM_MUX_MODE 0xf00
  213. #define BP_MUX_MODE 8
  214. static int imx8ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
  215. struct pinctrl_gpio_range *range,
  216. unsigned offset, bool input)
  217. {
  218. struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
  219. const struct imx_pin_reg *pin_reg;
  220. u32 reg;
  221. pin_reg = &ipctl->pin_regs[offset];
  222. if (pin_reg->mux_reg == -1)
  223. return -EINVAL;
  224. reg = readl(ipctl->base + pin_reg->mux_reg);
  225. if (input)
  226. reg = (reg & ~BM_OBE_ENABLED) | BM_IBE_ENABLED;
  227. else
  228. reg = (reg & ~BM_IBE_ENABLED) | BM_OBE_ENABLED;
  229. writel(reg, ipctl->base + pin_reg->mux_reg);
  230. return 0;
  231. }
  232. static const struct imx_pinctrl_soc_info imx8ulp_pinctrl_info = {
  233. .pins = imx8ulp_pinctrl_pads,
  234. .npins = ARRAY_SIZE(imx8ulp_pinctrl_pads),
  235. .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
  236. .gpio_set_direction = imx8ulp_pmx_gpio_set_direction,
  237. .mux_mask = BM_MUX_MODE,
  238. .mux_shift = BP_MUX_MODE,
  239. };
  240. static const struct of_device_id imx8ulp_pinctrl_of_match[] = {
  241. { .compatible = "fsl,imx8ulp-iomuxc1", },
  242. { /* sentinel */ }
  243. };
  244. static int imx8ulp_pinctrl_probe(struct platform_device *pdev)
  245. {
  246. return imx_pinctrl_probe(pdev, &imx8ulp_pinctrl_info);
  247. }
  248. static struct platform_driver imx8ulp_pinctrl_driver = {
  249. .driver = {
  250. .name = "imx8ulp-pinctrl",
  251. .of_match_table = imx8ulp_pinctrl_of_match,
  252. .suppress_bind_attrs = true,
  253. },
  254. .probe = imx8ulp_pinctrl_probe,
  255. };
  256. static int __init imx8ulp_pinctrl_init(void)
  257. {
  258. return platform_driver_register(&imx8ulp_pinctrl_driver);
  259. }
  260. arch_initcall(imx8ulp_pinctrl_init);
  261. MODULE_AUTHOR("Jacky Bai <[email protected]>");
  262. MODULE_DESCRIPTION("NXP i.MX8ULP pinctrl driver");
  263. MODULE_LICENSE("GPL v2");