pinctrl-thunderbay.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Intel Thunder Bay SOC pinctrl/GPIO driver
  4. *
  5. * Copyright (C) 2021 Intel Corporation
  6. */
  7. #include <linux/device.h>
  8. #include <linux/err.h>
  9. #include <linux/gpio/driver.h>
  10. #include <linux/init.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/io.h>
  13. #include <linux/irq.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/of_irq.h>
  17. #include <linux/pinctrl/pinconf.h>
  18. #include <linux/pinctrl/pinconf-generic.h>
  19. #include <linux/pinctrl/pinctrl.h>
  20. #include <linux/pinctrl/pinmux.h>
  21. #include <linux/platform_device.h>
  22. #include <linux/slab.h>
  23. #include <linux/spinlock.h>
  24. #include "core.h"
  25. #include "pinconf.h"
  26. #include "pinctrl-utils.h"
  27. #include "pinmux.h"
  28. /* Bit 0:2 and 4:6 should be used for mode selection */
  29. #define THB_GPIO_PINMUX_MODE_0 0x00
  30. #define THB_GPIO_PINMUX_MODE_1 0x11
  31. #define THB_GPIO_PINMUX_MODE_2 0x22
  32. #define THB_GPIO_PINMUX_MODE_3 0x33
  33. #define THB_GPIO_PINMUX_MODE_4 0x44
  34. #define THB_GPIO_PORT_SELECT_MASK BIT(8)
  35. #define THB_GPIO_PAD_DIRECTION_MASK BIT(10)
  36. #define THB_GPIO_SPU_MASK BIT(11)
  37. #define THB_GPIO_PULL_ENABLE_MASK BIT(12)
  38. #define THB_GPIO_PULL_UP_MASK BIT(13)
  39. #define THB_GPIO_PULL_DOWN_MASK BIT(14)
  40. #define THB_GPIO_ENAQ_MASK BIT(15)
  41. /* bit 16-19: Drive Strength for the Pad */
  42. #define THB_GPIO_DRIVE_STRENGTH_MASK (0xF0000)
  43. #define THB_GPIO_SLEW_RATE_MASK BIT(20)
  44. #define THB_GPIO_SCHMITT_TRIGGER_MASK BIT(21)
  45. #define THB_GPIO_REG_OFFSET(pin_num) ((pin_num) * (0x4))
  46. #define THB_MAX_MODE_SUPPORTED (5u)
  47. #define THB_MAX_NPINS_SUPPORTED (67u)
  48. /* store Pin status */
  49. static u32 thb_pinx_status[THB_MAX_NPINS_SUPPORTED];
  50. struct thunderbay_mux_desc {
  51. u8 mode;
  52. const char *name;
  53. };
  54. #define THUNDERBAY_PIN_DESC(pin_number, pin_name, ...) { \
  55. .number = pin_number, \
  56. .name = pin_name, \
  57. .drv_data = &(struct thunderbay_mux_desc[]) { \
  58. __VA_ARGS__, { } }, \
  59. }
  60. #define THUNDERBAY_MUX(pin_mode, pin_function) { \
  61. .mode = pin_mode, \
  62. .name = pin_function, \
  63. }
  64. struct thunderbay_pin_soc {
  65. const struct pinctrl_pin_desc *pins;
  66. unsigned int npins;
  67. };
  68. /**
  69. * struct thunderbay_pinctrl - Intel Thunderbay pinctrl structure
  70. * @pctrl: Pointer to the pin controller device
  71. * @base0: First register base address
  72. * @dev: Pointer to the device structure
  73. * @chip: GPIO chip used by this pin controller
  74. * @soc: Pin control configuration data based on SoC
  75. * @ngroups: Number of pin groups available
  76. * @nfuncs: Number of pin functions available
  77. */
  78. struct thunderbay_pinctrl {
  79. struct pinctrl_dev *pctrl;
  80. void __iomem *base0;
  81. struct device *dev;
  82. struct gpio_chip chip;
  83. const struct thunderbay_pin_soc *soc;
  84. unsigned int ngroups;
  85. unsigned int nfuncs;
  86. };
  87. static const struct pinctrl_pin_desc thunderbay_pins[] = {
  88. THUNDERBAY_PIN_DESC(0, "GPIO0",
  89. THUNDERBAY_MUX(0X0, "I2C0_M0"),
  90. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  91. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  92. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  93. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  94. THUNDERBAY_PIN_DESC(1, "GPIO1",
  95. THUNDERBAY_MUX(0X0, "I2C0_M0"),
  96. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  97. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  98. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  99. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  100. THUNDERBAY_PIN_DESC(2, "GPIO2",
  101. THUNDERBAY_MUX(0X0, "I2C1_M0"),
  102. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  103. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  104. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  105. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  106. THUNDERBAY_PIN_DESC(3, "GPIO3",
  107. THUNDERBAY_MUX(0X0, "I2C1_M0"),
  108. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  109. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  110. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  111. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  112. THUNDERBAY_PIN_DESC(4, "GPIO4",
  113. THUNDERBAY_MUX(0X0, "I2C2_M0"),
  114. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  115. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  116. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  117. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  118. THUNDERBAY_PIN_DESC(5, "GPIO5",
  119. THUNDERBAY_MUX(0X0, "I2C2_M0"),
  120. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  121. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  122. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  123. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  124. THUNDERBAY_PIN_DESC(6, "GPIO6",
  125. THUNDERBAY_MUX(0X0, "I2C3_M0"),
  126. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  127. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  128. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  129. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  130. THUNDERBAY_PIN_DESC(7, "GPIO7",
  131. THUNDERBAY_MUX(0X0, "I2C3_M0"),
  132. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  133. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  134. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  135. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  136. THUNDERBAY_PIN_DESC(8, "GPIO8",
  137. THUNDERBAY_MUX(0X0, "I2C4_M0"),
  138. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  139. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  140. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  141. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  142. THUNDERBAY_PIN_DESC(9, "GPIO9",
  143. THUNDERBAY_MUX(0X0, "I2C4_M0"),
  144. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  145. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  146. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  147. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  148. THUNDERBAY_PIN_DESC(10, "GPIO10",
  149. THUNDERBAY_MUX(0X0, "UART0_M0"),
  150. THUNDERBAY_MUX(0X1, "RT0_DSU_M1"),
  151. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  152. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  153. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  154. THUNDERBAY_PIN_DESC(11, "GPIO11",
  155. THUNDERBAY_MUX(0X0, "UART0_M0"),
  156. THUNDERBAY_MUX(0X1, "RT0_DSU_M1"),
  157. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  158. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  159. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  160. THUNDERBAY_PIN_DESC(12, "GPIO12",
  161. THUNDERBAY_MUX(0X0, "UART0_M0"),
  162. THUNDERBAY_MUX(0X1, "RT1_DSU_M1"),
  163. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  164. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  165. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  166. THUNDERBAY_PIN_DESC(13, "GPIO13",
  167. THUNDERBAY_MUX(0X0, "UART0_M0"),
  168. THUNDERBAY_MUX(0X1, "RT1_DSU_M1"),
  169. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  170. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  171. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  172. THUNDERBAY_PIN_DESC(14, "GPIO14",
  173. THUNDERBAY_MUX(0X0, "UART1_M0"),
  174. THUNDERBAY_MUX(0X1, "RT2_DSU_M1"),
  175. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  176. THUNDERBAY_MUX(0X3, "TRIGGER_M3"),
  177. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  178. THUNDERBAY_PIN_DESC(15, "GPIO15",
  179. THUNDERBAY_MUX(0X0, "UART1_M0"),
  180. THUNDERBAY_MUX(0X1, "RT2_DSU_M1"),
  181. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  182. THUNDERBAY_MUX(0X3, "TRIGGER_M3"),
  183. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  184. THUNDERBAY_PIN_DESC(16, "GPIO16",
  185. THUNDERBAY_MUX(0X0, "UART1_M0"),
  186. THUNDERBAY_MUX(0X1, "RT3_DSU_M1"),
  187. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  188. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  189. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  190. THUNDERBAY_PIN_DESC(17, "GPIO17",
  191. THUNDERBAY_MUX(0X0, "UART1_M0"),
  192. THUNDERBAY_MUX(0X1, "RT3_DSU_M1"),
  193. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  194. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  195. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  196. THUNDERBAY_PIN_DESC(18, "GPIO18",
  197. THUNDERBAY_MUX(0X0, "SPI0_M0"),
  198. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  199. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  200. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  201. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  202. THUNDERBAY_PIN_DESC(19, "GPIO19",
  203. THUNDERBAY_MUX(0X0, "SPI0_M0"),
  204. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  205. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  206. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  207. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  208. THUNDERBAY_PIN_DESC(20, "GPIO20",
  209. THUNDERBAY_MUX(0X0, "SPI0_M0"),
  210. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  211. THUNDERBAY_MUX(0X2, "TPIU_TRACE_M2"),
  212. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  213. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  214. THUNDERBAY_PIN_DESC(21, "GPIO21",
  215. THUNDERBAY_MUX(0X0, "SPI0_M0"),
  216. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  217. THUNDERBAY_MUX(0X2, "TPIU_TRACE_M2"),
  218. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  219. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  220. THUNDERBAY_PIN_DESC(22, "GPIO22",
  221. THUNDERBAY_MUX(0X0, "SPI1_M0"),
  222. THUNDERBAY_MUX(0X1, "EMPTY_M0"),
  223. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  224. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  225. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  226. THUNDERBAY_PIN_DESC(23, "GPIO23",
  227. THUNDERBAY_MUX(0X0, "SPI1_M0"),
  228. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  229. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  230. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  231. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  232. THUNDERBAY_PIN_DESC(24, "GPIO24",
  233. THUNDERBAY_MUX(0X0, "SPI1_M0"),
  234. THUNDERBAY_MUX(0X1, "TPIU_TRACE_M1"),
  235. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  236. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  237. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  238. THUNDERBAY_PIN_DESC(25, "GPIO25",
  239. THUNDERBAY_MUX(0X0, "SPI1_M0"),
  240. THUNDERBAY_MUX(0X1, "TPIU_TRACE_M1"),
  241. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  242. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  243. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  244. THUNDERBAY_PIN_DESC(26, "GPIO26",
  245. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  246. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  247. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  248. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  249. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  250. THUNDERBAY_PIN_DESC(27, "GPIO27",
  251. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  252. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  253. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  254. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  255. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  256. THUNDERBAY_PIN_DESC(28, "GPIO28",
  257. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  258. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  259. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  260. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  261. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  262. THUNDERBAY_PIN_DESC(29, "GPIO29",
  263. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  264. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  265. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  266. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  267. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  268. THUNDERBAY_PIN_DESC(30, "GPIO30",
  269. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  270. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  271. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  272. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  273. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  274. THUNDERBAY_PIN_DESC(31, "GPIO31",
  275. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  276. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  277. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  278. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  279. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  280. THUNDERBAY_PIN_DESC(32, "GPIO32",
  281. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  282. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  283. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  284. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  285. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  286. THUNDERBAY_PIN_DESC(33, "GPIO33",
  287. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  288. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  289. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  290. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  291. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  292. THUNDERBAY_PIN_DESC(34, "GPIO34",
  293. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  294. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  295. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  296. THUNDERBAY_MUX(0X3, "DIG_VIEW_0"),
  297. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  298. THUNDERBAY_PIN_DESC(35, "GPIO35",
  299. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  300. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  301. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  302. THUNDERBAY_MUX(0X3, "DIG_VIEW_1"),
  303. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  304. THUNDERBAY_PIN_DESC(36, "GPIO36",
  305. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  306. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  307. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  308. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_0"),
  309. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  310. THUNDERBAY_PIN_DESC(37, "GPIO37",
  311. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  312. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  313. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  314. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_1"),
  315. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  316. THUNDERBAY_PIN_DESC(38, "GPIO38",
  317. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  318. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  319. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  320. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_2"),
  321. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  322. THUNDERBAY_PIN_DESC(39, "GPIO39",
  323. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  324. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  325. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  326. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_3"),
  327. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  328. THUNDERBAY_PIN_DESC(40, "GPIO40",
  329. THUNDERBAY_MUX(0X0, "ETHER0_M0"),
  330. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  331. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  332. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  333. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  334. THUNDERBAY_PIN_DESC(41, "GPIO41",
  335. THUNDERBAY_MUX(0X0, "POWER_INTERRUPT_MAX_PLATFORM_POWER_M0"),
  336. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  337. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  338. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  339. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  340. THUNDERBAY_PIN_DESC(42, "GPIO42",
  341. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  342. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  343. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  344. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  345. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  346. THUNDERBAY_PIN_DESC(43, "GPIO43",
  347. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  348. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  349. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  350. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  351. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  352. THUNDERBAY_PIN_DESC(44, "GPIO44",
  353. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  354. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  355. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  356. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  357. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  358. THUNDERBAY_PIN_DESC(45, "GPIO45",
  359. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  360. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  361. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  362. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  363. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  364. THUNDERBAY_PIN_DESC(46, "GPIO46",
  365. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  366. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  367. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  368. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  369. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  370. THUNDERBAY_PIN_DESC(47, "GPIO47",
  371. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  372. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  373. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  374. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  375. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  376. THUNDERBAY_PIN_DESC(48, "GPIO48",
  377. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  378. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  379. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  380. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  381. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  382. THUNDERBAY_PIN_DESC(49, "GPIO49",
  383. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  384. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  385. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  386. THUNDERBAY_MUX(0X3, "DEBUG_M3"),
  387. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  388. THUNDERBAY_PIN_DESC(50, "GPIO50",
  389. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  390. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  391. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  392. THUNDERBAY_MUX(0X3, "DIG_VIEW_0"),
  393. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  394. THUNDERBAY_PIN_DESC(51, "GPIO51",
  395. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  396. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  397. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  398. THUNDERBAY_MUX(0X3, "DIG_VIEW_1"),
  399. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  400. THUNDERBAY_PIN_DESC(52, "GPIO52",
  401. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  402. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  403. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  404. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_0"),
  405. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  406. THUNDERBAY_PIN_DESC(53, "GPIO53",
  407. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  408. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  409. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  410. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_1"),
  411. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  412. THUNDERBAY_PIN_DESC(54, "GPIO54",
  413. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  414. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  415. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  416. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_2"),
  417. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  418. THUNDERBAY_PIN_DESC(55, "GPIO55",
  419. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  420. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  421. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  422. THUNDERBAY_MUX(0X3, "CPR_IO_OUT_CLK_3"),
  423. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  424. THUNDERBAY_PIN_DESC(56, "GPIO56",
  425. THUNDERBAY_MUX(0X0, "ETHER1_M0"),
  426. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  427. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  428. THUNDERBAY_MUX(0X3, "POWER_INTERRUPT_ICCMAX_VDDD_M3"),
  429. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  430. THUNDERBAY_PIN_DESC(57, "GPIO57",
  431. THUNDERBAY_MUX(0X0, "POWER_INTERRUPT_ICCMAX_VPU_M0"),
  432. THUNDERBAY_MUX(0X1, "TPIU_DATA_M1"),
  433. THUNDERBAY_MUX(0X2, "TPIU_DATA_M2"),
  434. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  435. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  436. THUNDERBAY_PIN_DESC(58, "GPIO58",
  437. THUNDERBAY_MUX(0X0, "THERMTRIP_M0"),
  438. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  439. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  440. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  441. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  442. THUNDERBAY_PIN_DESC(59, "GPIO59",
  443. THUNDERBAY_MUX(0X0, "THERMTRIP_M0"),
  444. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  445. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  446. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  447. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  448. THUNDERBAY_PIN_DESC(60, "GPIO60",
  449. THUNDERBAY_MUX(0X0, "SMBUS_M0"),
  450. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  451. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  452. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  453. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  454. THUNDERBAY_PIN_DESC(61, "GPIO61",
  455. THUNDERBAY_MUX(0X0, "SMBUS_M0"),
  456. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  457. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  458. THUNDERBAY_MUX(0X3, "POWER_INTERRUPT_ICCMAX_VDDD_M3"),
  459. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  460. THUNDERBAY_PIN_DESC(62, "GPIO62",
  461. THUNDERBAY_MUX(0X0, "PLATFORM_RESET_M0"),
  462. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  463. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  464. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  465. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  466. THUNDERBAY_PIN_DESC(63, "GPIO63",
  467. THUNDERBAY_MUX(0X0, "PLATFORM_RESET_M0"),
  468. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  469. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  470. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  471. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  472. THUNDERBAY_PIN_DESC(64, "GPIO64",
  473. THUNDERBAY_MUX(0X0, "PLATFORM_SHUTDOWN_M0"),
  474. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  475. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  476. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  477. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  478. THUNDERBAY_PIN_DESC(65, "GPIO65",
  479. THUNDERBAY_MUX(0X0, "PLATFORM_SHUTDOWN_M0"),
  480. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  481. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  482. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  483. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  484. THUNDERBAY_PIN_DESC(66, "GPIO66",
  485. THUNDERBAY_MUX(0X0, "POWER_INTERRUPT_ICCMAX_MEDIA_M0"),
  486. THUNDERBAY_MUX(0X1, "EMPTY_M1"),
  487. THUNDERBAY_MUX(0X2, "EMPTY_M2"),
  488. THUNDERBAY_MUX(0X3, "EMPTY_M3"),
  489. THUNDERBAY_MUX(0X4, "GPIO_M4")),
  490. };
  491. static const struct thunderbay_pin_soc thunderbay_data = {
  492. .pins = thunderbay_pins,
  493. .npins = ARRAY_SIZE(thunderbay_pins),
  494. };
  495. static u32 thb_gpio_read_reg(struct gpio_chip *chip, unsigned int pinnr)
  496. {
  497. struct thunderbay_pinctrl *tpc = gpiochip_get_data(chip);
  498. return readl(tpc->base0 + THB_GPIO_REG_OFFSET(pinnr));
  499. }
  500. static u32 thb_gpio_write_reg(struct gpio_chip *chip, unsigned int pinnr, u32 value)
  501. {
  502. struct thunderbay_pinctrl *tpc = gpiochip_get_data(chip);
  503. writel(value, (tpc->base0 + THB_GPIO_REG_OFFSET(pinnr)));
  504. return 0;
  505. }
  506. static int thb_read_gpio_data(struct gpio_chip *chip, unsigned int offset, unsigned int pad_dir)
  507. {
  508. int data_offset;
  509. u32 data_reg;
  510. /* as per GPIO Spec = pad_dir 0:input, 1:output */
  511. data_offset = 0x2000u + (offset / 32);
  512. if (!pad_dir)
  513. data_offset += 4;
  514. data_reg = thb_gpio_read_reg(chip, data_offset);
  515. return data_reg & BIT(offset % 32);
  516. }
  517. static int thb_write_gpio_data(struct gpio_chip *chip, unsigned int offset, unsigned int value)
  518. {
  519. int data_offset;
  520. u32 data_reg;
  521. data_offset = 0x2000u + (offset / 32);
  522. data_reg = thb_gpio_read_reg(chip, data_offset);
  523. if (value > 0)
  524. data_reg |= BIT(offset % 32);
  525. else
  526. data_reg &= ~BIT(offset % 32);
  527. return thb_gpio_write_reg(chip, data_offset, data_reg);
  528. }
  529. static int thunderbay_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
  530. {
  531. u32 reg = thb_gpio_read_reg(chip, offset);
  532. /* Return direction only if configured as GPIO else negative error */
  533. if (reg & THB_GPIO_PORT_SELECT_MASK)
  534. return !(reg & THB_GPIO_PAD_DIRECTION_MASK);
  535. return -EINVAL;
  536. }
  537. static int thunderbay_gpio_set_direction_input(struct gpio_chip *chip, unsigned int offset)
  538. {
  539. u32 reg = thb_gpio_read_reg(chip, offset);
  540. /* set pin as input only if it is GPIO else error */
  541. if (reg & THB_GPIO_PORT_SELECT_MASK) {
  542. reg &= (~THB_GPIO_PAD_DIRECTION_MASK);
  543. thb_gpio_write_reg(chip, offset, reg);
  544. return 0;
  545. }
  546. return -EINVAL;
  547. }
  548. static void thunderbay_gpio_set_value(struct gpio_chip *chip, unsigned int offset, int value)
  549. {
  550. u32 reg = thb_gpio_read_reg(chip, offset);
  551. /* update pin value only if it is GPIO-output else error */
  552. if ((reg & THB_GPIO_PORT_SELECT_MASK) && (reg & THB_GPIO_PAD_DIRECTION_MASK))
  553. thb_write_gpio_data(chip, offset, value);
  554. }
  555. static int thunderbay_gpio_set_direction_output(struct gpio_chip *chip,
  556. unsigned int offset, int value)
  557. {
  558. u32 reg = thb_gpio_read_reg(chip, offset);
  559. /* set pin as output only if it is GPIO else error */
  560. if (reg & THB_GPIO_PORT_SELECT_MASK) {
  561. reg |= THB_GPIO_PAD_DIRECTION_MASK;
  562. thb_gpio_write_reg(chip, offset, reg);
  563. thunderbay_gpio_set_value(chip, offset, value);
  564. return 0;
  565. }
  566. return -EINVAL;
  567. }
  568. static int thunderbay_gpio_get_value(struct gpio_chip *chip, unsigned int offset)
  569. {
  570. u32 reg = thb_gpio_read_reg(chip, offset);
  571. int gpio_dir = 0;
  572. /* Read pin value only if it is GPIO else error */
  573. if (reg & THB_GPIO_PORT_SELECT_MASK) {
  574. /* 0=in, 1=out */
  575. gpio_dir = (reg & THB_GPIO_PAD_DIRECTION_MASK) > 0;
  576. /* Returns negative value when pin is configured as PORT */
  577. return thb_read_gpio_data(chip, offset, gpio_dir);
  578. }
  579. return -EINVAL;
  580. }
  581. static int thunderbay_gpiochip_probe(struct thunderbay_pinctrl *tpc)
  582. {
  583. struct gpio_chip *chip = &tpc->chip;
  584. int ret;
  585. chip->label = dev_name(tpc->dev);
  586. chip->parent = tpc->dev;
  587. chip->request = gpiochip_generic_request;
  588. chip->free = gpiochip_generic_free;
  589. chip->get_direction = thunderbay_gpio_get_direction;
  590. chip->direction_input = thunderbay_gpio_set_direction_input;
  591. chip->direction_output = thunderbay_gpio_set_direction_output;
  592. chip->get = thunderbay_gpio_get_value;
  593. chip->set = thunderbay_gpio_set_value;
  594. chip->set_config = gpiochip_generic_config;
  595. /* identifies the first GPIO number handled by this chip; or,
  596. * if negative during registration, requests dynamic ID allocation.
  597. * Please pass -1 as base to let gpiolib select the chip base in all possible cases.
  598. * We want to get rid of the static GPIO number space in the long run.
  599. */
  600. chip->base = -1;
  601. /* Number of GPIOs handled by this controller; the last GPIO handled is (base + ngpio - 1)*/
  602. chip->ngpio = THB_MAX_NPINS_SUPPORTED;
  603. /* Register/add Thunder Bay GPIO chip with Linux framework */
  604. ret = gpiochip_add_data(chip, tpc);
  605. if (ret)
  606. dev_err(tpc->dev, "Failed to add gpiochip\n");
  607. return ret;
  608. }
  609. static int thunderbay_request_gpio(struct pinctrl_dev *pctldev,
  610. struct pinctrl_gpio_range *range,
  611. unsigned int pin)
  612. {
  613. struct thunderbay_pinctrl *tpc = pinctrl_dev_get_drvdata(pctldev);
  614. struct gpio_chip *chip = &tpc->chip;
  615. u32 reg = 0;
  616. if (thb_pinx_status[pin] == 0u) {
  617. reg = thb_gpio_read_reg(chip, pin);
  618. /* Updates PIN configuration as GPIO and sets GPIO to MODE-4*/
  619. reg |= (THB_GPIO_PORT_SELECT_MASK | THB_GPIO_PINMUX_MODE_4);
  620. thb_gpio_write_reg(chip, pin, reg);
  621. /* update pin status as busy */
  622. thb_pinx_status[pin] = 1u;
  623. return 0;
  624. }
  625. return -EINVAL;
  626. }
  627. static void thunderbay_free_gpio(struct pinctrl_dev *pctldev,
  628. struct pinctrl_gpio_range *range,
  629. unsigned int pin)
  630. {
  631. struct thunderbay_pinctrl *tpc = pinctrl_dev_get_drvdata(pctldev);
  632. struct gpio_chip *chip = &tpc->chip;
  633. u32 reg = 0;
  634. if (thb_pinx_status[pin] == 1u) {
  635. reg = thb_gpio_read_reg(chip, pin);
  636. /* Updates PIN configuration from GPIO to PORT */
  637. reg &= (~THB_GPIO_PORT_SELECT_MASK);
  638. /* Change Port/gpio mode to default mode-0 */
  639. reg &= (~THB_GPIO_PINMUX_MODE_4);
  640. thb_gpio_write_reg(chip, pin, reg);
  641. /* update pin status as free */
  642. thb_pinx_status[pin] = 0u;
  643. }
  644. }
  645. static int thb_pinctrl_set_mux(struct pinctrl_dev *pctldev,
  646. unsigned int func_select, unsigned int group_select)
  647. {
  648. struct thunderbay_pinctrl *tpc = pinctrl_dev_get_drvdata(pctldev);
  649. struct gpio_chip *chip = &tpc->chip;
  650. struct function_desc *function;
  651. unsigned int i, pin_mode;
  652. struct group_desc *group;
  653. int ret = -EINVAL;
  654. u32 reg = 0u;
  655. group = pinctrl_generic_get_group(pctldev, group_select);
  656. if (!group)
  657. return -EINVAL;
  658. function = pinmux_generic_get_function(pctldev, func_select);
  659. if (!function)
  660. return -EINVAL;
  661. pin_mode = *(unsigned int *)(function->data);
  662. /* Change modes for pins in the selected group */
  663. for (i = 0; i < group->num_pins; i++) {
  664. reg = thb_gpio_read_reg(chip, group->pins[i]);
  665. switch (pin_mode) {
  666. case 0u:
  667. reg |= THB_GPIO_PINMUX_MODE_0;
  668. break;
  669. case 1u:
  670. reg |= THB_GPIO_PINMUX_MODE_1;
  671. break;
  672. case 2u:
  673. reg |= THB_GPIO_PINMUX_MODE_2;
  674. break;
  675. case 3u:
  676. reg |= THB_GPIO_PINMUX_MODE_3;
  677. break;
  678. case 4u:
  679. reg |= THB_GPIO_PINMUX_MODE_4;
  680. break;
  681. default:
  682. return -EINVAL;
  683. }
  684. ret = thb_gpio_write_reg(chip, group->pins[i], reg);
  685. if (~ret) {
  686. /* update pin status as busy */
  687. thb_pinx_status[group->pins[i]] = 1u;
  688. }
  689. }
  690. return ret;
  691. }
  692. static int thunderbay_build_groups(struct thunderbay_pinctrl *tpc)
  693. {
  694. struct group_desc *thunderbay_groups;
  695. int i;
  696. tpc->ngroups = tpc->soc->npins;
  697. thunderbay_groups = devm_kcalloc(tpc->dev, tpc->ngroups,
  698. sizeof(*thunderbay_groups), GFP_KERNEL);
  699. if (!thunderbay_groups)
  700. return -ENOMEM;
  701. for (i = 0; i < tpc->ngroups; i++) {
  702. struct group_desc *group = thunderbay_groups + i;
  703. const struct pinctrl_pin_desc *pin_info = thunderbay_pins + i;
  704. group->name = pin_info->name;
  705. group->pins = (int *)&pin_info->number;
  706. pinctrl_generic_add_group(tpc->pctrl, group->name,
  707. group->pins, 1, NULL);
  708. }
  709. return 0;
  710. }
  711. static int thunderbay_add_functions(struct thunderbay_pinctrl *tpc, struct function_desc *funcs)
  712. {
  713. int i;
  714. /* Assign the groups for each function */
  715. for (i = 0; i < tpc->nfuncs; i++) {
  716. struct function_desc *func = &funcs[i];
  717. const char **group_names;
  718. unsigned int grp_idx = 0;
  719. int j;
  720. group_names = devm_kcalloc(tpc->dev, func->num_group_names,
  721. sizeof(*group_names), GFP_KERNEL);
  722. if (!group_names)
  723. return -ENOMEM;
  724. for (j = 0; j < tpc->soc->npins; j++) {
  725. const struct pinctrl_pin_desc *pin_info = &thunderbay_pins[j];
  726. struct thunderbay_mux_desc *pin_mux;
  727. for (pin_mux = pin_info->drv_data; pin_mux->name; pin_mux++) {
  728. if (!strcmp(pin_mux->name, func->name))
  729. group_names[grp_idx++] = pin_info->name;
  730. }
  731. }
  732. func->group_names = group_names;
  733. }
  734. /* Add all functions */
  735. for (i = 0; i < tpc->nfuncs; i++) {
  736. pinmux_generic_add_function(tpc->pctrl,
  737. funcs[i].name,
  738. funcs[i].group_names,
  739. funcs[i].num_group_names,
  740. funcs[i].data);
  741. }
  742. return 0;
  743. }
  744. static int thunderbay_build_functions(struct thunderbay_pinctrl *tpc)
  745. {
  746. struct function_desc *thunderbay_funcs;
  747. void *ptr;
  748. int pin;
  749. int ret;
  750. /*
  751. * Allocate maximum possible number of functions. Assume every pin
  752. * being part of 8 (hw maximum) globally unique muxes.
  753. */
  754. tpc->nfuncs = 0;
  755. thunderbay_funcs = kcalloc(tpc->soc->npins * 8,
  756. sizeof(*thunderbay_funcs), GFP_KERNEL);
  757. if (!thunderbay_funcs)
  758. return -ENOMEM;
  759. /* Setup 1 function for each unique mux */
  760. for (pin = 0; pin < tpc->soc->npins; pin++) {
  761. const struct pinctrl_pin_desc *pin_info = thunderbay_pins + pin;
  762. struct thunderbay_mux_desc *pin_mux;
  763. for (pin_mux = pin_info->drv_data; pin_mux->name; pin_mux++) {
  764. struct function_desc *func;
  765. /* Check if we already have function for this mux */
  766. for (func = thunderbay_funcs; func->name; func++) {
  767. if (!strcmp(pin_mux->name, func->name)) {
  768. func->num_group_names++;
  769. break;
  770. }
  771. }
  772. if (!func->name) {
  773. func->name = pin_mux->name;
  774. func->num_group_names = 1;
  775. func->data = (int *)&pin_mux->mode;
  776. tpc->nfuncs++;
  777. }
  778. }
  779. }
  780. /* Reallocate memory based on actual number of functions */
  781. ptr = krealloc(thunderbay_funcs,
  782. tpc->nfuncs * sizeof(*thunderbay_funcs), GFP_KERNEL);
  783. if (!ptr)
  784. return -ENOMEM;
  785. thunderbay_funcs = ptr;
  786. ret = thunderbay_add_functions(tpc, thunderbay_funcs);
  787. kfree(thunderbay_funcs);
  788. return ret;
  789. }
  790. static int thunderbay_pinconf_set_tristate(struct thunderbay_pinctrl *tpc,
  791. unsigned int pin, u32 config)
  792. {
  793. struct gpio_chip *chip = &tpc->chip;
  794. u32 reg;
  795. reg = thb_gpio_read_reg(chip, pin);
  796. if (config > 0)
  797. reg |= THB_GPIO_ENAQ_MASK;
  798. else
  799. reg &= ~THB_GPIO_ENAQ_MASK;
  800. return thb_gpio_write_reg(chip, pin, reg);
  801. }
  802. static int thunderbay_pinconf_get_tristate(struct thunderbay_pinctrl *tpc,
  803. unsigned int pin, u32 *config)
  804. {
  805. struct gpio_chip *chip = &tpc->chip;
  806. u32 reg;
  807. reg = thb_gpio_read_reg(chip, pin);
  808. *config = (reg & THB_GPIO_ENAQ_MASK) > 0;
  809. return 0;
  810. }
  811. static int thunderbay_pinconf_set_pulldown(struct thunderbay_pinctrl *tpc,
  812. unsigned int pin, u32 config)
  813. {
  814. struct gpio_chip *chip = &tpc->chip;
  815. u32 reg;
  816. reg = thb_gpio_read_reg(chip, pin);
  817. if (config > 0)
  818. reg |= THB_GPIO_PULL_DOWN_MASK;
  819. else
  820. reg &= ~THB_GPIO_PULL_DOWN_MASK;
  821. return thb_gpio_write_reg(chip, pin, reg);
  822. }
  823. static int thunderbay_pinconf_get_pulldown(struct thunderbay_pinctrl *tpc,
  824. unsigned int pin, u32 *config)
  825. {
  826. struct gpio_chip *chip = &tpc->chip;
  827. u32 reg = 0;
  828. reg = thb_gpio_read_reg(chip, pin);
  829. *config = ((reg & THB_GPIO_PULL_DOWN_MASK) > 0) ? 1 : 0;
  830. return 0;
  831. }
  832. static int thunderbay_pinconf_set_pullup(struct thunderbay_pinctrl *tpc,
  833. unsigned int pin, u32 config)
  834. {
  835. struct gpio_chip *chip = &tpc->chip;
  836. u32 reg;
  837. reg = thb_gpio_read_reg(chip, pin);
  838. if (config > 0)
  839. reg &= ~THB_GPIO_PULL_UP_MASK;
  840. else
  841. reg |= THB_GPIO_PULL_UP_MASK;
  842. return thb_gpio_write_reg(chip, pin, reg);
  843. }
  844. static int thunderbay_pinconf_get_pullup(struct thunderbay_pinctrl *tpc,
  845. unsigned int pin, u32 *config)
  846. {
  847. struct gpio_chip *chip = &tpc->chip;
  848. u32 reg;
  849. reg = thb_gpio_read_reg(chip, pin);
  850. *config = ((reg & THB_GPIO_PULL_UP_MASK) == 0) ? 1 : 0;
  851. return 0;
  852. }
  853. static int thunderbay_pinconf_set_opendrain(struct thunderbay_pinctrl *tpc,
  854. unsigned int pin, u32 config)
  855. {
  856. struct gpio_chip *chip = &tpc->chip;
  857. u32 reg;
  858. reg = thb_gpio_read_reg(chip, pin);
  859. if (config > 0)
  860. reg &= ~THB_GPIO_PULL_ENABLE_MASK;
  861. else
  862. reg |= THB_GPIO_PULL_ENABLE_MASK;
  863. return thb_gpio_write_reg(chip, pin, reg);
  864. }
  865. static int thunderbay_pinconf_get_opendrain(struct thunderbay_pinctrl *tpc,
  866. unsigned int pin, u32 *config)
  867. {
  868. struct gpio_chip *chip = &tpc->chip;
  869. u32 reg;
  870. reg = thb_gpio_read_reg(chip, pin);
  871. *config = ((reg & THB_GPIO_PULL_ENABLE_MASK) == 0) ? 1 : 0;
  872. return 0;
  873. }
  874. static int thunderbay_pinconf_set_pushpull(struct thunderbay_pinctrl *tpc,
  875. unsigned int pin, u32 config)
  876. {
  877. struct gpio_chip *chip = &tpc->chip;
  878. u32 reg;
  879. reg = thb_gpio_read_reg(chip, pin);
  880. if (config > 0)
  881. reg |= THB_GPIO_PULL_ENABLE_MASK;
  882. else
  883. reg &= ~THB_GPIO_PULL_ENABLE_MASK;
  884. return thb_gpio_write_reg(chip, pin, reg);
  885. }
  886. static int thunderbay_pinconf_get_pushpull(struct thunderbay_pinctrl *tpc,
  887. unsigned int pin, u32 *config)
  888. {
  889. struct gpio_chip *chip = &tpc->chip;
  890. u32 reg;
  891. reg = thb_gpio_read_reg(chip, pin);
  892. *config = ((reg & THB_GPIO_PULL_ENABLE_MASK) > 0) ? 1 : 0;
  893. return 0;
  894. }
  895. static int thunderbay_pinconf_set_drivestrength(struct thunderbay_pinctrl *tpc,
  896. unsigned int pin, u32 config)
  897. {
  898. struct gpio_chip *chip = &tpc->chip;
  899. u32 reg;
  900. reg = thb_gpio_read_reg(chip, pin);
  901. /* Drive Strength: 0x0 to 0xF */
  902. if (config <= 0xF) {
  903. reg = (reg | config);
  904. return thb_gpio_write_reg(chip, pin, reg);
  905. }
  906. return -EINVAL;
  907. }
  908. static int thunderbay_pinconf_get_drivestrength(struct thunderbay_pinctrl *tpc,
  909. unsigned int pin, u32 *config)
  910. {
  911. struct gpio_chip *chip = &tpc->chip;
  912. u32 reg;
  913. reg = thb_gpio_read_reg(chip, pin);
  914. reg = (reg & THB_GPIO_DRIVE_STRENGTH_MASK) >> 16;
  915. *config = (reg > 0) ? reg : 0;
  916. return 0;
  917. }
  918. static int thunderbay_pinconf_set_schmitt(struct thunderbay_pinctrl *tpc,
  919. unsigned int pin, u32 config)
  920. {
  921. struct gpio_chip *chip = &tpc->chip;
  922. u32 reg;
  923. reg = thb_gpio_read_reg(chip, pin);
  924. if (config > 0)
  925. reg |= THB_GPIO_SCHMITT_TRIGGER_MASK;
  926. else
  927. reg &= ~THB_GPIO_SCHMITT_TRIGGER_MASK;
  928. return thb_gpio_write_reg(chip, pin, reg);
  929. }
  930. static int thunderbay_pinconf_get_schmitt(struct thunderbay_pinctrl *tpc,
  931. unsigned int pin, u32 *config)
  932. {
  933. struct gpio_chip *chip = &tpc->chip;
  934. u32 reg;
  935. reg = thb_gpio_read_reg(chip, pin);
  936. *config = ((reg & THB_GPIO_SCHMITT_TRIGGER_MASK) > 0) ? 1 : 0;
  937. return 0;
  938. }
  939. static int thunderbay_pinconf_set_slew_rate(struct thunderbay_pinctrl *tpc,
  940. unsigned int pin, u32 config)
  941. {
  942. struct gpio_chip *chip = &tpc->chip;
  943. u32 reg = 0;
  944. reg = thb_gpio_read_reg(chip, pin);
  945. if (config > 0)
  946. reg |= THB_GPIO_SLEW_RATE_MASK;
  947. else
  948. reg &= ~THB_GPIO_SLEW_RATE_MASK;
  949. return thb_gpio_write_reg(chip, pin, reg);
  950. }
  951. static int thunderbay_pinconf_get_slew_rate(struct thunderbay_pinctrl *tpc,
  952. unsigned int pin, u32 *config)
  953. {
  954. struct gpio_chip *chip = &tpc->chip;
  955. u32 reg;
  956. reg = thb_gpio_read_reg(chip, pin);
  957. *config = ((reg & THB_GPIO_SLEW_RATE_MASK) > 0) ? 1 : 0;
  958. return 0;
  959. }
  960. static int thunderbay_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  961. unsigned long *config)
  962. {
  963. struct thunderbay_pinctrl *tpc = pinctrl_dev_get_drvdata(pctldev);
  964. enum pin_config_param param = pinconf_to_config_param(*config);
  965. u32 arg;
  966. int ret;
  967. switch (param) {
  968. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  969. ret = thunderbay_pinconf_get_tristate(tpc, pin, &arg);
  970. break;
  971. case PIN_CONFIG_BIAS_PULL_DOWN:
  972. ret = thunderbay_pinconf_get_pulldown(tpc, pin, &arg);
  973. break;
  974. case PIN_CONFIG_BIAS_PULL_UP:
  975. ret = thunderbay_pinconf_get_pullup(tpc, pin, &arg);
  976. break;
  977. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  978. ret = thunderbay_pinconf_get_opendrain(tpc, pin, &arg);
  979. break;
  980. case PIN_CONFIG_DRIVE_PUSH_PULL:
  981. ret = thunderbay_pinconf_get_pushpull(tpc, pin, &arg);
  982. break;
  983. case PIN_CONFIG_DRIVE_STRENGTH:
  984. ret = thunderbay_pinconf_get_drivestrength(tpc, pin, &arg);
  985. break;
  986. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  987. ret = thunderbay_pinconf_get_schmitt(tpc, pin, &arg);
  988. break;
  989. case PIN_CONFIG_SLEW_RATE:
  990. ret = thunderbay_pinconf_get_slew_rate(tpc, pin, &arg);
  991. break;
  992. default:
  993. return -ENOTSUPP;
  994. }
  995. *config = pinconf_to_config_packed(param, arg);
  996. return ret;
  997. }
  998. static int thunderbay_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  999. unsigned long *configs, unsigned int num_configs)
  1000. {
  1001. struct thunderbay_pinctrl *tpc = pinctrl_dev_get_drvdata(pctldev);
  1002. enum pin_config_param param;
  1003. unsigned int pinconf;
  1004. int ret = 0;
  1005. u32 arg;
  1006. for (pinconf = 0; pinconf < num_configs; pinconf++) {
  1007. param = pinconf_to_config_param(configs[pinconf]);
  1008. arg = pinconf_to_config_argument(configs[pinconf]);
  1009. switch (param) {
  1010. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  1011. ret = thunderbay_pinconf_set_tristate(tpc, pin, arg);
  1012. break;
  1013. case PIN_CONFIG_BIAS_PULL_DOWN:
  1014. ret = thunderbay_pinconf_set_pulldown(tpc, pin, arg);
  1015. break;
  1016. case PIN_CONFIG_BIAS_PULL_UP:
  1017. ret = thunderbay_pinconf_set_pullup(tpc, pin, arg);
  1018. break;
  1019. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  1020. ret = thunderbay_pinconf_set_opendrain(tpc, pin, arg);
  1021. break;
  1022. case PIN_CONFIG_DRIVE_PUSH_PULL:
  1023. ret = thunderbay_pinconf_set_pushpull(tpc, pin, arg);
  1024. break;
  1025. case PIN_CONFIG_DRIVE_STRENGTH:
  1026. ret = thunderbay_pinconf_set_drivestrength(tpc, pin, arg);
  1027. break;
  1028. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  1029. ret = thunderbay_pinconf_set_schmitt(tpc, pin, arg);
  1030. break;
  1031. case PIN_CONFIG_SLEW_RATE:
  1032. ret = thunderbay_pinconf_set_slew_rate(tpc, pin, arg);
  1033. break;
  1034. default:
  1035. return -ENOTSUPP;
  1036. }
  1037. }
  1038. return ret;
  1039. }
  1040. static const struct pinctrl_ops thunderbay_pctlops = {
  1041. .get_groups_count = pinctrl_generic_get_group_count,
  1042. .get_group_name = pinctrl_generic_get_group_name,
  1043. .get_group_pins = pinctrl_generic_get_group_pins,
  1044. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  1045. .dt_free_map = pinconf_generic_dt_free_map,
  1046. };
  1047. static const struct pinmux_ops thunderbay_pmxops = {
  1048. .get_functions_count = pinmux_generic_get_function_count,
  1049. .get_function_name = pinmux_generic_get_function_name,
  1050. .get_function_groups = pinmux_generic_get_function_groups,
  1051. .set_mux = thb_pinctrl_set_mux,
  1052. .gpio_request_enable = thunderbay_request_gpio,
  1053. .gpio_disable_free = thunderbay_free_gpio,
  1054. };
  1055. static const struct pinconf_ops thunderbay_confops = {
  1056. .is_generic = true,
  1057. .pin_config_get = thunderbay_pinconf_get,
  1058. .pin_config_set = thunderbay_pinconf_set,
  1059. };
  1060. static struct pinctrl_desc thunderbay_pinctrl_desc = {
  1061. .name = "thunderbay-pinmux",
  1062. .pctlops = &thunderbay_pctlops,
  1063. .pmxops = &thunderbay_pmxops,
  1064. .confops = &thunderbay_confops,
  1065. .owner = THIS_MODULE,
  1066. };
  1067. static const struct of_device_id thunderbay_pinctrl_match[] = {
  1068. {
  1069. .compatible = "intel,thunderbay-pinctrl",
  1070. .data = &thunderbay_data
  1071. },
  1072. {}
  1073. };
  1074. static int thunderbay_pinctrl_probe(struct platform_device *pdev)
  1075. {
  1076. const struct of_device_id *of_id;
  1077. struct device *dev = &pdev->dev;
  1078. struct thunderbay_pinctrl *tpc;
  1079. int ret;
  1080. of_id = of_match_node(thunderbay_pinctrl_match, pdev->dev.of_node);
  1081. if (!of_id)
  1082. return -ENODEV;
  1083. tpc = devm_kzalloc(dev, sizeof(*tpc), GFP_KERNEL);
  1084. if (!tpc)
  1085. return -ENOMEM;
  1086. tpc->dev = dev;
  1087. tpc->soc = of_id->data;
  1088. tpc->base0 = devm_platform_ioremap_resource(pdev, 0);
  1089. if (IS_ERR(tpc->base0))
  1090. return PTR_ERR(tpc->base0);
  1091. thunderbay_pinctrl_desc.pins = tpc->soc->pins;
  1092. thunderbay_pinctrl_desc.npins = tpc->soc->npins;
  1093. /* Register pinctrl */
  1094. tpc->pctrl = devm_pinctrl_register(dev, &thunderbay_pinctrl_desc, tpc);
  1095. if (IS_ERR(tpc->pctrl))
  1096. return PTR_ERR(tpc->pctrl);
  1097. /* Setup pinmux groups */
  1098. ret = thunderbay_build_groups(tpc);
  1099. if (ret)
  1100. return ret;
  1101. /* Setup pinmux functions */
  1102. ret = thunderbay_build_functions(tpc);
  1103. if (ret)
  1104. return ret;
  1105. /* Setup GPIO */
  1106. ret = thunderbay_gpiochip_probe(tpc);
  1107. if (ret < 0)
  1108. return ret;
  1109. platform_set_drvdata(pdev, tpc);
  1110. return 0;
  1111. }
  1112. static int thunderbay_pinctrl_remove(struct platform_device *pdev)
  1113. {
  1114. /* thunderbay_pinctrl_remove function to clear the assigned memory */
  1115. return 0;
  1116. }
  1117. static struct platform_driver thunderbay_pinctrl_driver = {
  1118. .driver = {
  1119. .name = "thunderbay-pinctrl",
  1120. .of_match_table = thunderbay_pinctrl_match,
  1121. },
  1122. .probe = thunderbay_pinctrl_probe,
  1123. .remove = thunderbay_pinctrl_remove,
  1124. };
  1125. builtin_platform_driver(thunderbay_pinctrl_driver);
  1126. MODULE_AUTHOR("Lakshmi Sowjanya D <[email protected]>");
  1127. MODULE_AUTHOR("Kiran Kumar S <[email protected]>");
  1128. MODULE_DESCRIPTION("Intel Thunder Bay Pinctrl/GPIO Driver");
  1129. MODULE_LICENSE("GPL v2");