pinctrl-upboard.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * UP board pin control driver.
  4. *
  5. * Copyright (C) 2025 Bootlin
  6. *
  7. * Author: Thomas Richard <thomas.richard@bootlin.com>
  8. */
  9. #include <linux/array_size.h>
  10. #include <linux/container_of.h>
  11. #include <linux/device.h>
  12. #include <linux/dmi.h>
  13. #include <linux/err.h>
  14. #include <linux/gpio/forwarder.h>
  15. #include <linux/mfd/upboard-fpga.h>
  16. #include <linux/module.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/regmap.h>
  19. #include <linux/seq_file.h>
  20. #include <linux/stddef.h>
  21. #include <linux/string_choices.h>
  22. #include <linux/types.h>
  23. #include <linux/pinctrl/consumer.h>
  24. #include <linux/pinctrl/pinctrl.h>
  25. #include <linux/pinctrl/pinmux.h>
  26. #include <linux/gpio/driver.h>
  27. #include <linux/gpio/consumer.h>
  28. #include "core.h"
  29. #include "pinmux.h"
  30. enum upboard_pin_mode {
  31. UPBOARD_PIN_MODE_FUNCTION,
  32. UPBOARD_PIN_MODE_GPIO_IN,
  33. UPBOARD_PIN_MODE_GPIO_OUT,
  34. UPBOARD_PIN_MODE_DISABLED,
  35. };
  36. struct upboard_pin {
  37. struct regmap_field *funcbit;
  38. struct regmap_field *enbit;
  39. struct regmap_field *dirbit;
  40. };
  41. struct upboard_pingroup {
  42. struct pingroup grp;
  43. enum upboard_pin_mode mode;
  44. const enum upboard_pin_mode *modes;
  45. };
  46. struct upboard_pinctrl_data {
  47. const struct upboard_pingroup *groups;
  48. size_t ngroups;
  49. const struct pinfunction *funcs;
  50. size_t nfuncs;
  51. const unsigned int *pin_header;
  52. size_t ngpio;
  53. };
  54. struct upboard_pinctrl {
  55. struct device *dev;
  56. struct pinctrl_dev *pctldev;
  57. const struct upboard_pinctrl_data *pctrl_data;
  58. struct gpio_pin_range pin_range;
  59. struct upboard_pin *pins;
  60. };
  61. struct upboard_pinctrl_map {
  62. const struct pinctrl_map *maps;
  63. size_t nmaps;
  64. };
  65. enum upboard_func0_fpgabit {
  66. UPBOARD_FUNC_I2C0_EN = 8,
  67. UPBOARD_FUNC_I2C1_EN = 9,
  68. UPBOARD_FUNC_CEC0_EN = 12,
  69. UPBOARD_FUNC_ADC0_EN = 14,
  70. };
  71. static const struct reg_field upboard_i2c0_reg =
  72. REG_FIELD(UPBOARD_REG_FUNC_EN0, UPBOARD_FUNC_I2C0_EN, UPBOARD_FUNC_I2C0_EN);
  73. static const struct reg_field upboard_i2c1_reg =
  74. REG_FIELD(UPBOARD_REG_FUNC_EN0, UPBOARD_FUNC_I2C1_EN, UPBOARD_FUNC_I2C1_EN);
  75. static const struct reg_field upboard_adc0_reg =
  76. REG_FIELD(UPBOARD_REG_FUNC_EN0, UPBOARD_FUNC_ADC0_EN, UPBOARD_FUNC_ADC0_EN);
  77. #define UPBOARD_UP_BIT_TO_PIN(bit) UPBOARD_UP_BIT_##bit
  78. #define UPBOARD_UP_PIN_NAME(id) \
  79. { \
  80. .number = UPBOARD_UP_BIT_##id, \
  81. .name = #id, \
  82. }
  83. #define UPBOARD_UP_PIN_MUX(bit, data) \
  84. { \
  85. .number = UPBOARD_UP_BIT_##bit, \
  86. .name = "PINMUX_"#bit, \
  87. .drv_data = (void *)(data), \
  88. }
  89. #define UPBOARD_UP_PIN_FUNC(id, data) \
  90. { \
  91. .number = UPBOARD_UP_BIT_##id, \
  92. .name = #id, \
  93. .drv_data = (void *)(data), \
  94. }
  95. enum upboard_up_fpgabit {
  96. UPBOARD_UP_BIT_I2C1_SDA,
  97. UPBOARD_UP_BIT_I2C1_SCL,
  98. UPBOARD_UP_BIT_ADC0,
  99. UPBOARD_UP_BIT_UART1_RTS,
  100. UPBOARD_UP_BIT_GPIO27,
  101. UPBOARD_UP_BIT_GPIO22,
  102. UPBOARD_UP_BIT_SPI_MOSI,
  103. UPBOARD_UP_BIT_SPI_MISO,
  104. UPBOARD_UP_BIT_SPI_CLK,
  105. UPBOARD_UP_BIT_I2C0_SDA,
  106. UPBOARD_UP_BIT_GPIO5,
  107. UPBOARD_UP_BIT_GPIO6,
  108. UPBOARD_UP_BIT_PWM1,
  109. UPBOARD_UP_BIT_I2S_FRM,
  110. UPBOARD_UP_BIT_GPIO26,
  111. UPBOARD_UP_BIT_UART1_TX,
  112. UPBOARD_UP_BIT_UART1_RX,
  113. UPBOARD_UP_BIT_I2S_CLK,
  114. UPBOARD_UP_BIT_GPIO23,
  115. UPBOARD_UP_BIT_GPIO24,
  116. UPBOARD_UP_BIT_GPIO25,
  117. UPBOARD_UP_BIT_SPI_CS0,
  118. UPBOARD_UP_BIT_SPI_CS1,
  119. UPBOARD_UP_BIT_I2C0_SCL,
  120. UPBOARD_UP_BIT_PWM0,
  121. UPBOARD_UP_BIT_UART1_CTS,
  122. UPBOARD_UP_BIT_I2S_DIN,
  123. UPBOARD_UP_BIT_I2S_DOUT,
  124. };
  125. static const struct pinctrl_pin_desc upboard_up_pins[] = {
  126. UPBOARD_UP_PIN_FUNC(I2C1_SDA, &upboard_i2c1_reg),
  127. UPBOARD_UP_PIN_FUNC(I2C1_SCL, &upboard_i2c1_reg),
  128. UPBOARD_UP_PIN_FUNC(ADC0, &upboard_adc0_reg),
  129. UPBOARD_UP_PIN_NAME(UART1_RTS),
  130. UPBOARD_UP_PIN_NAME(GPIO27),
  131. UPBOARD_UP_PIN_NAME(GPIO22),
  132. UPBOARD_UP_PIN_NAME(SPI_MOSI),
  133. UPBOARD_UP_PIN_NAME(SPI_MISO),
  134. UPBOARD_UP_PIN_NAME(SPI_CLK),
  135. UPBOARD_UP_PIN_FUNC(I2C0_SDA, &upboard_i2c0_reg),
  136. UPBOARD_UP_PIN_NAME(GPIO5),
  137. UPBOARD_UP_PIN_NAME(GPIO6),
  138. UPBOARD_UP_PIN_NAME(PWM1),
  139. UPBOARD_UP_PIN_NAME(I2S_FRM),
  140. UPBOARD_UP_PIN_NAME(GPIO26),
  141. UPBOARD_UP_PIN_NAME(UART1_TX),
  142. UPBOARD_UP_PIN_NAME(UART1_RX),
  143. UPBOARD_UP_PIN_NAME(I2S_CLK),
  144. UPBOARD_UP_PIN_NAME(GPIO23),
  145. UPBOARD_UP_PIN_NAME(GPIO24),
  146. UPBOARD_UP_PIN_NAME(GPIO25),
  147. UPBOARD_UP_PIN_NAME(SPI_CS0),
  148. UPBOARD_UP_PIN_NAME(SPI_CS1),
  149. UPBOARD_UP_PIN_FUNC(I2C0_SCL, &upboard_i2c0_reg),
  150. UPBOARD_UP_PIN_NAME(PWM0),
  151. UPBOARD_UP_PIN_NAME(UART1_CTS),
  152. UPBOARD_UP_PIN_NAME(I2S_DIN),
  153. UPBOARD_UP_PIN_NAME(I2S_DOUT),
  154. };
  155. static const unsigned int upboard_up_pin_header[] = {
  156. UPBOARD_UP_BIT_TO_PIN(I2C0_SDA),
  157. UPBOARD_UP_BIT_TO_PIN(I2C0_SCL),
  158. UPBOARD_UP_BIT_TO_PIN(I2C1_SDA),
  159. UPBOARD_UP_BIT_TO_PIN(I2C1_SCL),
  160. UPBOARD_UP_BIT_TO_PIN(ADC0),
  161. UPBOARD_UP_BIT_TO_PIN(GPIO5),
  162. UPBOARD_UP_BIT_TO_PIN(GPIO6),
  163. UPBOARD_UP_BIT_TO_PIN(SPI_CS1),
  164. UPBOARD_UP_BIT_TO_PIN(SPI_CS0),
  165. UPBOARD_UP_BIT_TO_PIN(SPI_MISO),
  166. UPBOARD_UP_BIT_TO_PIN(SPI_MOSI),
  167. UPBOARD_UP_BIT_TO_PIN(SPI_CLK),
  168. UPBOARD_UP_BIT_TO_PIN(PWM0),
  169. UPBOARD_UP_BIT_TO_PIN(PWM1),
  170. UPBOARD_UP_BIT_TO_PIN(UART1_TX),
  171. UPBOARD_UP_BIT_TO_PIN(UART1_RX),
  172. UPBOARD_UP_BIT_TO_PIN(UART1_CTS),
  173. UPBOARD_UP_BIT_TO_PIN(UART1_RTS),
  174. UPBOARD_UP_BIT_TO_PIN(I2S_CLK),
  175. UPBOARD_UP_BIT_TO_PIN(I2S_FRM),
  176. UPBOARD_UP_BIT_TO_PIN(I2S_DIN),
  177. UPBOARD_UP_BIT_TO_PIN(I2S_DOUT),
  178. UPBOARD_UP_BIT_TO_PIN(GPIO22),
  179. UPBOARD_UP_BIT_TO_PIN(GPIO23),
  180. UPBOARD_UP_BIT_TO_PIN(GPIO24),
  181. UPBOARD_UP_BIT_TO_PIN(GPIO25),
  182. UPBOARD_UP_BIT_TO_PIN(GPIO26),
  183. UPBOARD_UP_BIT_TO_PIN(GPIO27),
  184. };
  185. static const unsigned int upboard_up_uart1_pins[] = {
  186. UPBOARD_UP_BIT_TO_PIN(UART1_TX),
  187. UPBOARD_UP_BIT_TO_PIN(UART1_RX),
  188. UPBOARD_UP_BIT_TO_PIN(UART1_RTS),
  189. UPBOARD_UP_BIT_TO_PIN(UART1_CTS),
  190. };
  191. static const enum upboard_pin_mode upboard_up_uart1_modes[] = {
  192. UPBOARD_PIN_MODE_GPIO_OUT,
  193. UPBOARD_PIN_MODE_GPIO_IN,
  194. UPBOARD_PIN_MODE_GPIO_OUT,
  195. UPBOARD_PIN_MODE_GPIO_IN,
  196. };
  197. static_assert(ARRAY_SIZE(upboard_up_uart1_modes) == ARRAY_SIZE(upboard_up_uart1_pins));
  198. static const unsigned int upboard_up_i2c0_pins[] = {
  199. UPBOARD_UP_BIT_TO_PIN(I2C0_SCL),
  200. UPBOARD_UP_BIT_TO_PIN(I2C0_SDA),
  201. };
  202. static const unsigned int upboard_up_i2c1_pins[] = {
  203. UPBOARD_UP_BIT_TO_PIN(I2C1_SCL),
  204. UPBOARD_UP_BIT_TO_PIN(I2C1_SDA),
  205. };
  206. static const unsigned int upboard_up_spi2_pins[] = {
  207. UPBOARD_UP_BIT_TO_PIN(SPI_MOSI),
  208. UPBOARD_UP_BIT_TO_PIN(SPI_MISO),
  209. UPBOARD_UP_BIT_TO_PIN(SPI_CLK),
  210. UPBOARD_UP_BIT_TO_PIN(SPI_CS0),
  211. UPBOARD_UP_BIT_TO_PIN(SPI_CS1),
  212. };
  213. static const enum upboard_pin_mode upboard_up_spi2_modes[] = {
  214. UPBOARD_PIN_MODE_GPIO_OUT,
  215. UPBOARD_PIN_MODE_GPIO_IN,
  216. UPBOARD_PIN_MODE_GPIO_OUT,
  217. UPBOARD_PIN_MODE_GPIO_OUT,
  218. UPBOARD_PIN_MODE_GPIO_OUT,
  219. };
  220. static_assert(ARRAY_SIZE(upboard_up_spi2_modes) == ARRAY_SIZE(upboard_up_spi2_pins));
  221. static const unsigned int upboard_up_i2s0_pins[] = {
  222. UPBOARD_UP_BIT_TO_PIN(I2S_FRM),
  223. UPBOARD_UP_BIT_TO_PIN(I2S_CLK),
  224. UPBOARD_UP_BIT_TO_PIN(I2S_DIN),
  225. UPBOARD_UP_BIT_TO_PIN(I2S_DOUT),
  226. };
  227. static const enum upboard_pin_mode upboard_up_i2s0_modes[] = {
  228. UPBOARD_PIN_MODE_GPIO_OUT,
  229. UPBOARD_PIN_MODE_GPIO_OUT,
  230. UPBOARD_PIN_MODE_GPIO_IN,
  231. UPBOARD_PIN_MODE_GPIO_OUT,
  232. };
  233. static_assert(ARRAY_SIZE(upboard_up_i2s0_pins) == ARRAY_SIZE(upboard_up_i2s0_modes));
  234. static const unsigned int upboard_up_pwm0_pins[] = {
  235. UPBOARD_UP_BIT_TO_PIN(PWM0),
  236. };
  237. static const unsigned int upboard_up_pwm1_pins[] = {
  238. UPBOARD_UP_BIT_TO_PIN(PWM1),
  239. };
  240. static const unsigned int upboard_up_adc0_pins[] = {
  241. UPBOARD_UP_BIT_TO_PIN(ADC0),
  242. };
  243. #define UPBOARD_PINGROUP(n, p, m) \
  244. { \
  245. .grp = PINCTRL_PINGROUP(n, p, ARRAY_SIZE(p)), \
  246. .mode = __builtin_choose_expr( \
  247. __builtin_types_compatible_p(typeof(m), const enum upboard_pin_mode *), \
  248. 0, m), \
  249. .modes = __builtin_choose_expr( \
  250. __builtin_types_compatible_p(typeof(m), const enum upboard_pin_mode *), \
  251. m, NULL), \
  252. }
  253. static const struct upboard_pingroup upboard_up_pin_groups[] = {
  254. UPBOARD_PINGROUP("uart1_grp", upboard_up_uart1_pins, &upboard_up_uart1_modes[0]),
  255. UPBOARD_PINGROUP("i2c0_grp", upboard_up_i2c0_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  256. UPBOARD_PINGROUP("i2c1_grp", upboard_up_i2c1_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  257. UPBOARD_PINGROUP("spi2_grp", upboard_up_spi2_pins, &upboard_up_spi2_modes[0]),
  258. UPBOARD_PINGROUP("i2s0_grp", upboard_up_i2s0_pins, &upboard_up_i2s0_modes[0]),
  259. UPBOARD_PINGROUP("pwm0_grp", upboard_up_pwm0_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  260. UPBOARD_PINGROUP("pwm1_grp", upboard_up_pwm1_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  261. UPBOARD_PINGROUP("adc0_grp", upboard_up_adc0_pins, UPBOARD_PIN_MODE_GPIO_IN),
  262. };
  263. static const char * const upboard_up_uart1_groups[] = { "uart1_grp" };
  264. static const char * const upboard_up_i2c0_groups[] = { "i2c0_grp" };
  265. static const char * const upboard_up_i2c1_groups[] = { "i2c1_grp" };
  266. static const char * const upboard_up_spi2_groups[] = { "spi2_grp" };
  267. static const char * const upboard_up_i2s0_groups[] = { "i2s0_grp" };
  268. static const char * const upboard_up_pwm0_groups[] = { "pwm0_grp" };
  269. static const char * const upboard_up_pwm1_groups[] = { "pwm1_grp" };
  270. static const char * const upboard_up_adc0_groups[] = { "adc0_grp" };
  271. #define UPBOARD_FUNCTION(func, groups) PINCTRL_PINFUNCTION(func, groups, ARRAY_SIZE(groups))
  272. static const struct pinfunction upboard_up_pin_functions[] = {
  273. UPBOARD_FUNCTION("uart1", upboard_up_uart1_groups),
  274. UPBOARD_FUNCTION("i2c0", upboard_up_i2c0_groups),
  275. UPBOARD_FUNCTION("i2c1", upboard_up_i2c1_groups),
  276. UPBOARD_FUNCTION("spi2", upboard_up_spi2_groups),
  277. UPBOARD_FUNCTION("i2s0", upboard_up_i2s0_groups),
  278. UPBOARD_FUNCTION("pwm0", upboard_up_pwm0_groups),
  279. UPBOARD_FUNCTION("pwm1", upboard_up_pwm1_groups),
  280. UPBOARD_FUNCTION("adc0", upboard_up_adc0_groups),
  281. };
  282. static const struct upboard_pinctrl_data upboard_up_pinctrl_data = {
  283. .groups = &upboard_up_pin_groups[0],
  284. .ngroups = ARRAY_SIZE(upboard_up_pin_groups),
  285. .funcs = &upboard_up_pin_functions[0],
  286. .nfuncs = ARRAY_SIZE(upboard_up_pin_functions),
  287. .pin_header = &upboard_up_pin_header[0],
  288. .ngpio = ARRAY_SIZE(upboard_up_pin_header),
  289. };
  290. #define UPBOARD_UP2_BIT_TO_PIN(bit) UPBOARD_UP2_BIT_##bit
  291. #define UPBOARD_UP2_PIN_NAME(id) \
  292. { \
  293. .number = UPBOARD_UP2_BIT_##id, \
  294. .name = #id, \
  295. }
  296. #define UPBOARD_UP2_PIN_MUX(bit, data) \
  297. { \
  298. .number = UPBOARD_UP2_BIT_##bit, \
  299. .name = "PINMUX_"#bit, \
  300. .drv_data = (void *)(data), \
  301. }
  302. #define UPBOARD_UP2_PIN_FUNC(id, data) \
  303. { \
  304. .number = UPBOARD_UP2_BIT_##id, \
  305. .name = #id, \
  306. .drv_data = (void *)(data), \
  307. }
  308. enum upboard_up2_fpgabit {
  309. UPBOARD_UP2_BIT_UART1_TXD,
  310. UPBOARD_UP2_BIT_UART1_RXD,
  311. UPBOARD_UP2_BIT_UART1_RTS,
  312. UPBOARD_UP2_BIT_UART1_CTS,
  313. UPBOARD_UP2_BIT_GPIO3_ADC0,
  314. UPBOARD_UP2_BIT_GPIO5_ADC2,
  315. UPBOARD_UP2_BIT_GPIO6_ADC3,
  316. UPBOARD_UP2_BIT_GPIO11,
  317. UPBOARD_UP2_BIT_EXHAT_LVDS1n,
  318. UPBOARD_UP2_BIT_EXHAT_LVDS1p,
  319. UPBOARD_UP2_BIT_SPI2_TXD,
  320. UPBOARD_UP2_BIT_SPI2_RXD,
  321. UPBOARD_UP2_BIT_SPI2_FS1,
  322. UPBOARD_UP2_BIT_SPI2_FS0,
  323. UPBOARD_UP2_BIT_SPI2_CLK,
  324. UPBOARD_UP2_BIT_SPI1_TXD,
  325. UPBOARD_UP2_BIT_SPI1_RXD,
  326. UPBOARD_UP2_BIT_SPI1_FS1,
  327. UPBOARD_UP2_BIT_SPI1_FS0,
  328. UPBOARD_UP2_BIT_SPI1_CLK,
  329. UPBOARD_UP2_BIT_I2C0_SCL,
  330. UPBOARD_UP2_BIT_I2C0_SDA,
  331. UPBOARD_UP2_BIT_I2C1_SCL,
  332. UPBOARD_UP2_BIT_I2C1_SDA,
  333. UPBOARD_UP2_BIT_PWM1,
  334. UPBOARD_UP2_BIT_PWM0,
  335. UPBOARD_UP2_BIT_EXHAT_LVDS0n,
  336. UPBOARD_UP2_BIT_EXHAT_LVDS0p,
  337. UPBOARD_UP2_BIT_GPIO24,
  338. UPBOARD_UP2_BIT_GPIO10,
  339. UPBOARD_UP2_BIT_GPIO2,
  340. UPBOARD_UP2_BIT_GPIO1,
  341. UPBOARD_UP2_BIT_EXHAT_LVDS3n,
  342. UPBOARD_UP2_BIT_EXHAT_LVDS3p,
  343. UPBOARD_UP2_BIT_EXHAT_LVDS4n,
  344. UPBOARD_UP2_BIT_EXHAT_LVDS4p,
  345. UPBOARD_UP2_BIT_EXHAT_LVDS5n,
  346. UPBOARD_UP2_BIT_EXHAT_LVDS5p,
  347. UPBOARD_UP2_BIT_I2S_SDO,
  348. UPBOARD_UP2_BIT_I2S_SDI,
  349. UPBOARD_UP2_BIT_I2S_WS_SYNC,
  350. UPBOARD_UP2_BIT_I2S_BCLK,
  351. UPBOARD_UP2_BIT_EXHAT_LVDS6n,
  352. UPBOARD_UP2_BIT_EXHAT_LVDS6p,
  353. UPBOARD_UP2_BIT_EXHAT_LVDS7n,
  354. UPBOARD_UP2_BIT_EXHAT_LVDS7p,
  355. UPBOARD_UP2_BIT_EXHAT_LVDS2n,
  356. UPBOARD_UP2_BIT_EXHAT_LVDS2p,
  357. };
  358. static const struct pinctrl_pin_desc upboard_up2_pins[] = {
  359. UPBOARD_UP2_PIN_NAME(UART1_TXD),
  360. UPBOARD_UP2_PIN_NAME(UART1_RXD),
  361. UPBOARD_UP2_PIN_NAME(UART1_RTS),
  362. UPBOARD_UP2_PIN_NAME(UART1_CTS),
  363. UPBOARD_UP2_PIN_NAME(GPIO3_ADC0),
  364. UPBOARD_UP2_PIN_NAME(GPIO5_ADC2),
  365. UPBOARD_UP2_PIN_NAME(GPIO6_ADC3),
  366. UPBOARD_UP2_PIN_NAME(GPIO11),
  367. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS1n),
  368. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS1p),
  369. UPBOARD_UP2_PIN_NAME(SPI2_TXD),
  370. UPBOARD_UP2_PIN_NAME(SPI2_RXD),
  371. UPBOARD_UP2_PIN_NAME(SPI2_FS1),
  372. UPBOARD_UP2_PIN_NAME(SPI2_FS0),
  373. UPBOARD_UP2_PIN_NAME(SPI2_CLK),
  374. UPBOARD_UP2_PIN_NAME(SPI1_TXD),
  375. UPBOARD_UP2_PIN_NAME(SPI1_RXD),
  376. UPBOARD_UP2_PIN_NAME(SPI1_FS1),
  377. UPBOARD_UP2_PIN_NAME(SPI1_FS0),
  378. UPBOARD_UP2_PIN_NAME(SPI1_CLK),
  379. UPBOARD_UP2_PIN_MUX(I2C0_SCL, &upboard_i2c0_reg),
  380. UPBOARD_UP2_PIN_MUX(I2C0_SDA, &upboard_i2c0_reg),
  381. UPBOARD_UP2_PIN_MUX(I2C1_SCL, &upboard_i2c1_reg),
  382. UPBOARD_UP2_PIN_MUX(I2C1_SDA, &upboard_i2c1_reg),
  383. UPBOARD_UP2_PIN_NAME(PWM1),
  384. UPBOARD_UP2_PIN_NAME(PWM0),
  385. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS0n),
  386. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS0p),
  387. UPBOARD_UP2_PIN_MUX(GPIO24, &upboard_i2c0_reg),
  388. UPBOARD_UP2_PIN_MUX(GPIO10, &upboard_i2c0_reg),
  389. UPBOARD_UP2_PIN_MUX(GPIO2, &upboard_i2c1_reg),
  390. UPBOARD_UP2_PIN_MUX(GPIO1, &upboard_i2c1_reg),
  391. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS3n),
  392. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS3p),
  393. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS4n),
  394. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS4p),
  395. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS5n),
  396. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS5p),
  397. UPBOARD_UP2_PIN_NAME(I2S_SDO),
  398. UPBOARD_UP2_PIN_NAME(I2S_SDI),
  399. UPBOARD_UP2_PIN_NAME(I2S_WS_SYNC),
  400. UPBOARD_UP2_PIN_NAME(I2S_BCLK),
  401. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS6n),
  402. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS6p),
  403. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS7n),
  404. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS7p),
  405. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS2n),
  406. UPBOARD_UP2_PIN_NAME(EXHAT_LVDS2p),
  407. };
  408. static const unsigned int upboard_up2_pin_header[] = {
  409. UPBOARD_UP2_BIT_TO_PIN(GPIO10),
  410. UPBOARD_UP2_BIT_TO_PIN(GPIO24),
  411. UPBOARD_UP2_BIT_TO_PIN(GPIO1),
  412. UPBOARD_UP2_BIT_TO_PIN(GPIO2),
  413. UPBOARD_UP2_BIT_TO_PIN(GPIO3_ADC0),
  414. UPBOARD_UP2_BIT_TO_PIN(GPIO11),
  415. UPBOARD_UP2_BIT_TO_PIN(SPI2_CLK),
  416. UPBOARD_UP2_BIT_TO_PIN(SPI1_FS1),
  417. UPBOARD_UP2_BIT_TO_PIN(SPI1_FS0),
  418. UPBOARD_UP2_BIT_TO_PIN(SPI1_RXD),
  419. UPBOARD_UP2_BIT_TO_PIN(SPI1_TXD),
  420. UPBOARD_UP2_BIT_TO_PIN(SPI1_CLK),
  421. UPBOARD_UP2_BIT_TO_PIN(PWM0),
  422. UPBOARD_UP2_BIT_TO_PIN(PWM1),
  423. UPBOARD_UP2_BIT_TO_PIN(UART1_TXD),
  424. UPBOARD_UP2_BIT_TO_PIN(UART1_RXD),
  425. UPBOARD_UP2_BIT_TO_PIN(UART1_CTS),
  426. UPBOARD_UP2_BIT_TO_PIN(UART1_RTS),
  427. UPBOARD_UP2_BIT_TO_PIN(I2S_BCLK),
  428. UPBOARD_UP2_BIT_TO_PIN(I2S_WS_SYNC),
  429. UPBOARD_UP2_BIT_TO_PIN(I2S_SDI),
  430. UPBOARD_UP2_BIT_TO_PIN(I2S_SDO),
  431. UPBOARD_UP2_BIT_TO_PIN(GPIO6_ADC3),
  432. UPBOARD_UP2_BIT_TO_PIN(SPI2_FS1),
  433. UPBOARD_UP2_BIT_TO_PIN(SPI2_RXD),
  434. UPBOARD_UP2_BIT_TO_PIN(SPI2_TXD),
  435. UPBOARD_UP2_BIT_TO_PIN(SPI2_FS0),
  436. UPBOARD_UP2_BIT_TO_PIN(GPIO5_ADC2),
  437. };
  438. static const unsigned int upboard_up2_uart1_pins[] = {
  439. UPBOARD_UP2_BIT_TO_PIN(UART1_TXD),
  440. UPBOARD_UP2_BIT_TO_PIN(UART1_RXD),
  441. UPBOARD_UP2_BIT_TO_PIN(UART1_RTS),
  442. UPBOARD_UP2_BIT_TO_PIN(UART1_CTS),
  443. };
  444. static const enum upboard_pin_mode upboard_up2_uart1_modes[] = {
  445. UPBOARD_PIN_MODE_GPIO_OUT,
  446. UPBOARD_PIN_MODE_GPIO_IN,
  447. UPBOARD_PIN_MODE_GPIO_OUT,
  448. UPBOARD_PIN_MODE_GPIO_IN,
  449. };
  450. static_assert(ARRAY_SIZE(upboard_up2_uart1_modes) == ARRAY_SIZE(upboard_up2_uart1_pins));
  451. static const unsigned int upboard_up2_i2c0_pins[] = {
  452. UPBOARD_UP2_BIT_TO_PIN(I2C0_SCL),
  453. UPBOARD_UP2_BIT_TO_PIN(I2C0_SDA),
  454. UPBOARD_UP2_BIT_TO_PIN(GPIO24),
  455. UPBOARD_UP2_BIT_TO_PIN(GPIO10),
  456. };
  457. static const unsigned int upboard_up2_i2c1_pins[] = {
  458. UPBOARD_UP2_BIT_TO_PIN(I2C1_SCL),
  459. UPBOARD_UP2_BIT_TO_PIN(I2C1_SDA),
  460. UPBOARD_UP2_BIT_TO_PIN(GPIO2),
  461. UPBOARD_UP2_BIT_TO_PIN(GPIO1),
  462. };
  463. static const unsigned int upboard_up2_spi1_pins[] = {
  464. UPBOARD_UP2_BIT_TO_PIN(SPI1_TXD),
  465. UPBOARD_UP2_BIT_TO_PIN(SPI1_RXD),
  466. UPBOARD_UP2_BIT_TO_PIN(SPI1_FS1),
  467. UPBOARD_UP2_BIT_TO_PIN(SPI1_FS0),
  468. UPBOARD_UP2_BIT_TO_PIN(SPI1_CLK),
  469. };
  470. static const unsigned int upboard_up2_spi2_pins[] = {
  471. UPBOARD_UP2_BIT_TO_PIN(SPI2_TXD),
  472. UPBOARD_UP2_BIT_TO_PIN(SPI2_RXD),
  473. UPBOARD_UP2_BIT_TO_PIN(SPI2_FS1),
  474. UPBOARD_UP2_BIT_TO_PIN(SPI2_FS0),
  475. UPBOARD_UP2_BIT_TO_PIN(SPI2_CLK),
  476. };
  477. static const enum upboard_pin_mode upboard_up2_spi_modes[] = {
  478. UPBOARD_PIN_MODE_GPIO_OUT,
  479. UPBOARD_PIN_MODE_GPIO_IN,
  480. UPBOARD_PIN_MODE_GPIO_OUT,
  481. UPBOARD_PIN_MODE_GPIO_OUT,
  482. UPBOARD_PIN_MODE_GPIO_OUT,
  483. };
  484. static_assert(ARRAY_SIZE(upboard_up2_spi_modes) == ARRAY_SIZE(upboard_up2_spi1_pins));
  485. static_assert(ARRAY_SIZE(upboard_up2_spi_modes) == ARRAY_SIZE(upboard_up2_spi2_pins));
  486. static const unsigned int upboard_up2_i2s0_pins[] = {
  487. UPBOARD_UP2_BIT_TO_PIN(I2S_BCLK),
  488. UPBOARD_UP2_BIT_TO_PIN(I2S_WS_SYNC),
  489. UPBOARD_UP2_BIT_TO_PIN(I2S_SDI),
  490. UPBOARD_UP2_BIT_TO_PIN(I2S_SDO),
  491. };
  492. static const enum upboard_pin_mode upboard_up2_i2s0_modes[] = {
  493. UPBOARD_PIN_MODE_GPIO_OUT,
  494. UPBOARD_PIN_MODE_GPIO_OUT,
  495. UPBOARD_PIN_MODE_GPIO_IN,
  496. UPBOARD_PIN_MODE_GPIO_OUT,
  497. };
  498. static_assert(ARRAY_SIZE(upboard_up2_i2s0_modes) == ARRAY_SIZE(upboard_up2_i2s0_pins));
  499. static const unsigned int upboard_up2_pwm0_pins[] = {
  500. UPBOARD_UP2_BIT_TO_PIN(PWM0),
  501. };
  502. static const unsigned int upboard_up2_pwm1_pins[] = {
  503. UPBOARD_UP2_BIT_TO_PIN(PWM1),
  504. };
  505. static const unsigned int upboard_up2_adc0_pins[] = {
  506. UPBOARD_UP2_BIT_TO_PIN(GPIO3_ADC0),
  507. };
  508. static const unsigned int upboard_up2_adc2_pins[] = {
  509. UPBOARD_UP2_BIT_TO_PIN(GPIO5_ADC2),
  510. };
  511. static const unsigned int upboard_up2_adc3_pins[] = {
  512. UPBOARD_UP2_BIT_TO_PIN(GPIO6_ADC3),
  513. };
  514. static const struct upboard_pingroup upboard_up2_pin_groups[] = {
  515. UPBOARD_PINGROUP("uart1_grp", upboard_up2_uart1_pins, &upboard_up2_uart1_modes[0]),
  516. UPBOARD_PINGROUP("i2c0_grp", upboard_up2_i2c0_pins, UPBOARD_PIN_MODE_FUNCTION),
  517. UPBOARD_PINGROUP("i2c1_grp", upboard_up2_i2c1_pins, UPBOARD_PIN_MODE_FUNCTION),
  518. UPBOARD_PINGROUP("spi1_grp", upboard_up2_spi1_pins, &upboard_up2_spi_modes[0]),
  519. UPBOARD_PINGROUP("spi2_grp", upboard_up2_spi2_pins, &upboard_up2_spi_modes[0]),
  520. UPBOARD_PINGROUP("i2s0_grp", upboard_up2_i2s0_pins, &upboard_up2_i2s0_modes[0]),
  521. UPBOARD_PINGROUP("pwm0_grp", upboard_up2_pwm0_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  522. UPBOARD_PINGROUP("pwm1_grp", upboard_up2_pwm1_pins, UPBOARD_PIN_MODE_GPIO_OUT),
  523. UPBOARD_PINGROUP("adc0_grp", upboard_up2_adc0_pins, UPBOARD_PIN_MODE_GPIO_IN),
  524. UPBOARD_PINGROUP("adc2_grp", upboard_up2_adc2_pins, UPBOARD_PIN_MODE_GPIO_IN),
  525. UPBOARD_PINGROUP("adc3_grp", upboard_up2_adc3_pins, UPBOARD_PIN_MODE_GPIO_IN),
  526. };
  527. static const char * const upboard_up2_uart1_groups[] = { "uart1_grp" };
  528. static const char * const upboard_up2_i2c0_groups[] = { "i2c0_grp" };
  529. static const char * const upboard_up2_i2c1_groups[] = { "i2c1_grp" };
  530. static const char * const upboard_up2_spi1_groups[] = { "spi1_grp" };
  531. static const char * const upboard_up2_spi2_groups[] = { "spi2_grp" };
  532. static const char * const upboard_up2_i2s0_groups[] = { "i2s0_grp" };
  533. static const char * const upboard_up2_pwm0_groups[] = { "pwm0_grp" };
  534. static const char * const upboard_up2_pwm1_groups[] = { "pwm1_grp" };
  535. static const char * const upboard_up2_adc0_groups[] = { "adc0_grp" };
  536. static const char * const upboard_up2_adc2_groups[] = { "adc2_grp" };
  537. static const char * const upboard_up2_adc3_groups[] = { "adc3_grp" };
  538. static const struct pinfunction upboard_up2_pin_functions[] = {
  539. UPBOARD_FUNCTION("uart1", upboard_up2_uart1_groups),
  540. UPBOARD_FUNCTION("i2c0", upboard_up2_i2c0_groups),
  541. UPBOARD_FUNCTION("i2c1", upboard_up2_i2c1_groups),
  542. UPBOARD_FUNCTION("spi1", upboard_up2_spi1_groups),
  543. UPBOARD_FUNCTION("spi2", upboard_up2_spi2_groups),
  544. UPBOARD_FUNCTION("i2s0", upboard_up2_i2s0_groups),
  545. UPBOARD_FUNCTION("pwm0", upboard_up2_pwm0_groups),
  546. UPBOARD_FUNCTION("pwm1", upboard_up2_pwm1_groups),
  547. UPBOARD_FUNCTION("adc0", upboard_up2_adc0_groups),
  548. UPBOARD_FUNCTION("adc2", upboard_up2_adc2_groups),
  549. UPBOARD_FUNCTION("adc3", upboard_up2_adc3_groups),
  550. };
  551. static const struct upboard_pinctrl_data upboard_up2_pinctrl_data = {
  552. .groups = &upboard_up2_pin_groups[0],
  553. .ngroups = ARRAY_SIZE(upboard_up2_pin_groups),
  554. .funcs = &upboard_up2_pin_functions[0],
  555. .nfuncs = ARRAY_SIZE(upboard_up2_pin_functions),
  556. .pin_header = &upboard_up2_pin_header[0],
  557. .ngpio = ARRAY_SIZE(upboard_up2_pin_header),
  558. };
  559. static int upboard_pinctrl_set_function(struct pinctrl_dev *pctldev, unsigned int offset)
  560. {
  561. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  562. struct upboard_pin *p = &pctrl->pins[offset];
  563. int ret;
  564. if (!p->funcbit)
  565. return -EPERM;
  566. ret = regmap_field_write(p->enbit, 0);
  567. if (ret)
  568. return ret;
  569. return regmap_field_write(p->funcbit, 1);
  570. }
  571. static int upboard_pinctrl_gpio_commit_enable(struct pinctrl_dev *pctldev, unsigned int offset)
  572. {
  573. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  574. struct upboard_pin *p = &pctrl->pins[offset];
  575. int ret;
  576. if (p->funcbit) {
  577. ret = regmap_field_write(p->funcbit, 0);
  578. if (ret)
  579. return ret;
  580. }
  581. return regmap_field_write(p->enbit, 1);
  582. }
  583. static int upboard_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
  584. struct pinctrl_gpio_range *range,
  585. unsigned int offset)
  586. {
  587. return upboard_pinctrl_gpio_commit_enable(pctldev, offset);
  588. }
  589. static void upboard_pinctrl_gpio_commit_disable(struct pinctrl_dev *pctldev, unsigned int offset)
  590. {
  591. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  592. struct upboard_pin *p = &pctrl->pins[offset];
  593. regmap_field_write(p->enbit, 0);
  594. };
  595. static void upboard_pinctrl_gpio_disable_free(struct pinctrl_dev *pctldev,
  596. struct pinctrl_gpio_range *range, unsigned int offset)
  597. {
  598. return upboard_pinctrl_gpio_commit_disable(pctldev, offset);
  599. }
  600. static int upboard_pinctrl_gpio_commit_direction(struct pinctrl_dev *pctldev, unsigned int offset,
  601. bool input)
  602. {
  603. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  604. struct upboard_pin *p = &pctrl->pins[offset];
  605. return regmap_field_write(p->dirbit, input);
  606. }
  607. static int upboard_pinctrl_gpio_set_direction(struct pinctrl_dev *pctldev,
  608. struct pinctrl_gpio_range *range,
  609. unsigned int offset, bool input)
  610. {
  611. return upboard_pinctrl_gpio_commit_direction(pctldev, offset, input);
  612. }
  613. static int upboard_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
  614. unsigned int group_selector)
  615. {
  616. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  617. const struct upboard_pinctrl_data *pctrl_data = pctrl->pctrl_data;
  618. const struct upboard_pingroup *upgroups = pctrl_data->groups;
  619. struct group_desc *grp;
  620. unsigned int mode, i;
  621. int ret;
  622. grp = pinctrl_generic_get_group(pctldev, group_selector);
  623. if (!grp)
  624. return -EINVAL;
  625. for (i = 0; i < grp->grp.npins; i++) {
  626. mode = upgroups[group_selector].mode ?: upgroups[group_selector].modes[i];
  627. if (mode == UPBOARD_PIN_MODE_FUNCTION) {
  628. ret = upboard_pinctrl_set_function(pctldev, grp->grp.pins[i]);
  629. if (ret)
  630. return ret;
  631. continue;
  632. }
  633. ret = upboard_pinctrl_gpio_commit_enable(pctldev, grp->grp.pins[i]);
  634. if (ret)
  635. return ret;
  636. ret = upboard_pinctrl_gpio_commit_direction(pctldev, grp->grp.pins[i],
  637. mode == UPBOARD_PIN_MODE_GPIO_IN);
  638. if (ret)
  639. return ret;
  640. }
  641. return 0;
  642. }
  643. static const struct pinmux_ops upboard_pinmux_ops = {
  644. .get_functions_count = pinmux_generic_get_function_count,
  645. .get_function_name = pinmux_generic_get_function_name,
  646. .get_function_groups = pinmux_generic_get_function_groups,
  647. .set_mux = upboard_pinctrl_set_mux,
  648. .gpio_request_enable = upboard_pinctrl_gpio_request_enable,
  649. .gpio_disable_free = upboard_pinctrl_gpio_disable_free,
  650. .gpio_set_direction = upboard_pinctrl_gpio_set_direction,
  651. };
  652. static int upboard_pinctrl_pin_get_mode(struct pinctrl_dev *pctldev, unsigned int pin)
  653. {
  654. struct upboard_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  655. struct upboard_pin *p = &pctrl->pins[pin];
  656. unsigned int val;
  657. int ret;
  658. if (p->funcbit) {
  659. ret = regmap_field_read(p->funcbit, &val);
  660. if (ret)
  661. return ret;
  662. if (val)
  663. return UPBOARD_PIN_MODE_FUNCTION;
  664. }
  665. ret = regmap_field_read(p->enbit, &val);
  666. if (ret)
  667. return ret;
  668. if (!val)
  669. return UPBOARD_PIN_MODE_DISABLED;
  670. ret = regmap_field_read(p->dirbit, &val);
  671. if (ret)
  672. return ret;
  673. return val ? UPBOARD_PIN_MODE_GPIO_IN : UPBOARD_PIN_MODE_GPIO_OUT;
  674. }
  675. static void upboard_pinctrl_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  676. unsigned int offset)
  677. {
  678. int ret;
  679. ret = upboard_pinctrl_pin_get_mode(pctldev, offset);
  680. if (ret == UPBOARD_PIN_MODE_FUNCTION)
  681. seq_puts(s, "mode function ");
  682. else if (ret == UPBOARD_PIN_MODE_DISABLED)
  683. seq_puts(s, "HIGH-Z ");
  684. else if (ret < 0)
  685. seq_puts(s, "N/A ");
  686. else
  687. seq_printf(s, "GPIO (%s) ", str_input_output(ret == UPBOARD_PIN_MODE_GPIO_IN));
  688. }
  689. static const struct pinctrl_ops upboard_pinctrl_ops = {
  690. .get_groups_count = pinctrl_generic_get_group_count,
  691. .get_group_name = pinctrl_generic_get_group_name,
  692. .get_group_pins = pinctrl_generic_get_group_pins,
  693. .pin_dbg_show = upboard_pinctrl_dbg_show,
  694. };
  695. static int upboard_gpio_request(struct gpio_chip *gc, unsigned int offset)
  696. {
  697. struct gpiochip_fwd *fwd = gpiochip_get_data(gc);
  698. struct upboard_pinctrl *pctrl = gpiochip_fwd_get_data(fwd);
  699. unsigned int pin = pctrl->pctrl_data->pin_header[offset];
  700. struct gpio_desc *desc;
  701. int ret;
  702. ret = pinctrl_gpio_request(gc, offset);
  703. if (ret)
  704. return ret;
  705. desc = gpiod_get_index(pctrl->dev, "external", pin, 0);
  706. if (IS_ERR(desc)) {
  707. pinctrl_gpio_free(gc, offset);
  708. return PTR_ERR(desc);
  709. }
  710. return gpiochip_fwd_desc_add(fwd, desc, offset);
  711. }
  712. static void upboard_gpio_free(struct gpio_chip *gc, unsigned int offset)
  713. {
  714. struct gpiochip_fwd *fwd = gpiochip_get_data(gc);
  715. gpiochip_fwd_desc_free(fwd, offset);
  716. pinctrl_gpio_free(gc, offset);
  717. }
  718. static int upboard_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
  719. {
  720. struct gpiochip_fwd *fwd = gpiochip_get_data(gc);
  721. struct upboard_pinctrl *pctrl = gpiochip_fwd_get_data(fwd);
  722. unsigned int pin = pctrl->pctrl_data->pin_header[offset];
  723. int mode;
  724. /* If the pin is in function mode or high-z, input direction is returned */
  725. mode = upboard_pinctrl_pin_get_mode(pctrl->pctldev, pin);
  726. if (mode < 0)
  727. return mode;
  728. if (mode == UPBOARD_PIN_MODE_GPIO_OUT)
  729. return GPIO_LINE_DIRECTION_OUT;
  730. return GPIO_LINE_DIRECTION_IN;
  731. }
  732. static int upboard_gpio_direction_input(struct gpio_chip *gc, unsigned int offset)
  733. {
  734. struct gpiochip_fwd *fwd = gpiochip_get_data(gc);
  735. int ret;
  736. ret = pinctrl_gpio_direction_input(gc, offset);
  737. if (ret)
  738. return ret;
  739. return gpiochip_fwd_gpio_direction_input(fwd, offset);
  740. }
  741. static int upboard_gpio_direction_output(struct gpio_chip *gc, unsigned int offset, int value)
  742. {
  743. struct gpiochip_fwd *fwd = gpiochip_get_data(gc);
  744. int ret;
  745. ret = pinctrl_gpio_direction_output(gc, offset);
  746. if (ret)
  747. return ret;
  748. return gpiochip_fwd_gpio_direction_output(fwd, offset, value);
  749. }
  750. static int upboard_pinctrl_register_groups(struct upboard_pinctrl *pctrl)
  751. {
  752. const struct upboard_pingroup *groups = pctrl->pctrl_data->groups;
  753. size_t ngroups = pctrl->pctrl_data->ngroups;
  754. unsigned int i;
  755. int ret;
  756. for (i = 0; i < ngroups; i++) {
  757. ret = pinctrl_generic_add_group(pctrl->pctldev, groups[i].grp.name,
  758. groups[i].grp.pins, groups[i].grp.npins, pctrl);
  759. if (ret < 0)
  760. return ret;
  761. }
  762. return 0;
  763. }
  764. static int upboard_pinctrl_register_functions(struct upboard_pinctrl *pctrl)
  765. {
  766. const struct pinfunction *funcs = pctrl->pctrl_data->funcs;
  767. size_t nfuncs = pctrl->pctrl_data->nfuncs;
  768. unsigned int i;
  769. int ret;
  770. for (i = 0; i < nfuncs ; i++) {
  771. ret = pinmux_generic_add_function(pctrl->pctldev, funcs[i].name,
  772. funcs[i].groups, funcs[i].ngroups, NULL);
  773. if (ret < 0)
  774. return ret;
  775. }
  776. return 0;
  777. }
  778. static const struct pinctrl_map pinctrl_map_apl01[] = {
  779. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:00", "pwm0_grp", "pwm0"),
  780. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:00", "pwm1_grp", "pwm1"),
  781. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:00", "uart1_grp", "uart1"),
  782. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:02", "i2c0_grp", "i2c0"),
  783. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:02", "i2c1_grp", "i2c1"),
  784. PIN_MAP_MUX_GROUP_DEFAULT("upboard-pinctrl", "INT3452:01", "ssp0_grp", "ssp0"),
  785. };
  786. static const struct upboard_pinctrl_map upboard_pinctrl_map_apl01 = {
  787. .maps = &pinctrl_map_apl01[0],
  788. .nmaps = ARRAY_SIZE(pinctrl_map_apl01),
  789. };
  790. static const struct dmi_system_id dmi_platform_info[] = {
  791. {
  792. /* UP Squared */
  793. .matches = {
  794. DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AAEON"),
  795. DMI_EXACT_MATCH(DMI_BOARD_NAME, "UP-APL01"),
  796. },
  797. .driver_data = (void *)&upboard_pinctrl_map_apl01,
  798. },
  799. { }
  800. };
  801. static int upboard_pinctrl_probe(struct platform_device *pdev)
  802. {
  803. struct device *dev = &pdev->dev;
  804. struct upboard_fpga *fpga = dev_get_drvdata(dev->parent);
  805. const struct upboard_pinctrl_map *board_map;
  806. const struct dmi_system_id *dmi_id;
  807. struct pinctrl_desc *pctldesc;
  808. struct upboard_pinctrl *pctrl;
  809. struct upboard_pin *pins;
  810. struct gpiochip_fwd *fwd;
  811. struct pinctrl *pinctrl;
  812. struct gpio_chip *chip;
  813. unsigned int i;
  814. int ret;
  815. pctldesc = devm_kzalloc(dev, sizeof(*pctldesc), GFP_KERNEL);
  816. if (!pctldesc)
  817. return -ENOMEM;
  818. pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
  819. if (!pctrl)
  820. return -ENOMEM;
  821. switch (fpga->fpga_data->type) {
  822. case UPBOARD_UP_FPGA:
  823. pctldesc->pins = upboard_up_pins;
  824. pctldesc->npins = ARRAY_SIZE(upboard_up_pins);
  825. pctrl->pctrl_data = &upboard_up_pinctrl_data;
  826. break;
  827. case UPBOARD_UP2_FPGA:
  828. pctldesc->pins = upboard_up2_pins;
  829. pctldesc->npins = ARRAY_SIZE(upboard_up2_pins);
  830. pctrl->pctrl_data = &upboard_up2_pinctrl_data;
  831. break;
  832. default:
  833. return dev_err_probe(dev, -ENODEV, "Unsupported device type %d\n",
  834. fpga->fpga_data->type);
  835. }
  836. dmi_id = dmi_first_match(dmi_platform_info);
  837. if (!dmi_id)
  838. return dev_err_probe(dev, -ENODEV, "Unsupported board\n");
  839. board_map = (const struct upboard_pinctrl_map *)dmi_id->driver_data;
  840. pctldesc->name = dev_name(dev);
  841. pctldesc->owner = THIS_MODULE;
  842. pctldesc->pctlops = &upboard_pinctrl_ops;
  843. pctldesc->pmxops = &upboard_pinmux_ops;
  844. pctrl->dev = dev;
  845. pins = devm_kcalloc(dev, pctldesc->npins, sizeof(*pins), GFP_KERNEL);
  846. if (!pins)
  847. return -ENOMEM;
  848. /* Initialize pins */
  849. for (i = 0; i < pctldesc->npins; i++) {
  850. const struct pinctrl_pin_desc *pin_desc = &pctldesc->pins[i];
  851. unsigned int regoff = pin_desc->number / UPBOARD_REGISTER_SIZE;
  852. unsigned int lsb = pin_desc->number % UPBOARD_REGISTER_SIZE;
  853. struct reg_field * const fld_func = pin_desc->drv_data;
  854. struct upboard_pin *pin = &pins[i];
  855. struct reg_field fldconf = {};
  856. if (fld_func) {
  857. pin->funcbit = devm_regmap_field_alloc(dev, fpga->regmap, *fld_func);
  858. if (IS_ERR(pin->funcbit))
  859. return PTR_ERR(pin->funcbit);
  860. }
  861. fldconf.reg = UPBOARD_REG_GPIO_EN0 + regoff;
  862. fldconf.lsb = lsb;
  863. fldconf.msb = lsb;
  864. pin->enbit = devm_regmap_field_alloc(dev, fpga->regmap, fldconf);
  865. if (IS_ERR(pin->enbit))
  866. return PTR_ERR(pin->enbit);
  867. fldconf.reg = UPBOARD_REG_GPIO_DIR0 + regoff;
  868. fldconf.lsb = lsb;
  869. fldconf.msb = lsb;
  870. pin->dirbit = devm_regmap_field_alloc(dev, fpga->regmap, fldconf);
  871. if (IS_ERR(pin->dirbit))
  872. return PTR_ERR(pin->dirbit);
  873. }
  874. pctrl->pins = pins;
  875. ret = devm_pinctrl_register_and_init(dev, pctldesc, pctrl, &pctrl->pctldev);
  876. if (ret)
  877. return dev_err_probe(dev, ret, "Failed to register pinctrl\n");
  878. ret = upboard_pinctrl_register_groups(pctrl);
  879. if (ret)
  880. return dev_err_probe(dev, ret, "Failed to register groups\n");
  881. ret = upboard_pinctrl_register_functions(pctrl);
  882. if (ret)
  883. return dev_err_probe(dev, ret, "Failed to register functions\n");
  884. ret = devm_pinctrl_register_mappings(dev, board_map->maps, board_map->nmaps);
  885. if (ret)
  886. return ret;
  887. pinctrl = devm_pinctrl_get_select_default(dev);
  888. if (IS_ERR(pinctrl))
  889. return dev_err_probe(dev, PTR_ERR(pinctrl), "Failed to select pinctrl\n");
  890. ret = pinctrl_enable(pctrl->pctldev);
  891. if (ret)
  892. return ret;
  893. fwd = devm_gpiochip_fwd_alloc(dev, pctrl->pctrl_data->ngpio);
  894. if (IS_ERR(fwd))
  895. return dev_err_probe(dev, PTR_ERR(fwd), "Failed to allocate the gpiochip forwarder\n");
  896. chip = gpiochip_fwd_get_gpiochip(fwd);
  897. chip->request = upboard_gpio_request;
  898. chip->free = upboard_gpio_free;
  899. chip->get_direction = upboard_gpio_get_direction;
  900. chip->direction_output = upboard_gpio_direction_output;
  901. chip->direction_input = upboard_gpio_direction_input;
  902. ret = gpiochip_fwd_register(fwd, pctrl);
  903. if (ret)
  904. return dev_err_probe(dev, ret, "Failed to register the gpiochip forwarder\n");
  905. return gpiochip_add_sparse_pin_range(chip, dev_name(dev), 0, pctrl->pctrl_data->pin_header,
  906. pctrl->pctrl_data->ngpio);
  907. }
  908. static struct platform_driver upboard_pinctrl_driver = {
  909. .driver = {
  910. .name = "upboard-pinctrl",
  911. },
  912. .probe = upboard_pinctrl_probe,
  913. };
  914. module_platform_driver(upboard_pinctrl_driver);
  915. MODULE_AUTHOR("Thomas Richard <thomas.richard@bootlin.com");
  916. MODULE_DESCRIPTION("UP Board HAT pin controller driver");
  917. MODULE_LICENSE("GPL");
  918. MODULE_ALIAS("platform:upboard-pinctrl");
  919. MODULE_IMPORT_NS("GPIO_FORWARDER");