pinctrl-keembay.c 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2020 Intel Corporation */
  3. #include <linux/bitfield.h>
  4. #include <linux/bitops.h>
  5. #include <linux/gpio/driver.h>
  6. #include <linux/interrupt.h>
  7. #include <linux/io.h>
  8. #include <linux/module.h>
  9. #include <linux/pinctrl/pinconf.h>
  10. #include <linux/pinctrl/pinconf-generic.h>
  11. #include <linux/pinctrl/pinctrl.h>
  12. #include <linux/pinctrl/pinmux.h>
  13. #include <linux/platform_device.h>
  14. #include "core.h"
  15. #include "pinmux.h"
  16. /* GPIO data registers' offsets */
  17. #define KEEMBAY_GPIO_DATA_OUT 0x000
  18. #define KEEMBAY_GPIO_DATA_IN 0x020
  19. #define KEEMBAY_GPIO_DATA_IN_RAW 0x040
  20. #define KEEMBAY_GPIO_DATA_HIGH 0x060
  21. #define KEEMBAY_GPIO_DATA_LOW 0x080
  22. /* GPIO Interrupt and mode registers' offsets */
  23. #define KEEMBAY_GPIO_INT_CFG 0x000
  24. #define KEEMBAY_GPIO_MODE 0x070
  25. /* GPIO mode register bit fields */
  26. #define KEEMBAY_GPIO_MODE_PULLUP_MASK GENMASK(13, 12)
  27. #define KEEMBAY_GPIO_MODE_DRIVE_MASK GENMASK(8, 7)
  28. #define KEEMBAY_GPIO_MODE_INV_MASK GENMASK(5, 4)
  29. #define KEEMBAY_GPIO_MODE_SELECT_MASK GENMASK(2, 0)
  30. #define KEEMBAY_GPIO_MODE_DIR_OVR BIT(15)
  31. #define KEEMBAY_GPIO_MODE_REN BIT(11)
  32. #define KEEMBAY_GPIO_MODE_SCHMITT_EN BIT(10)
  33. #define KEEMBAY_GPIO_MODE_SLEW_RATE BIT(9)
  34. #define KEEMBAY_GPIO_IRQ_ENABLE BIT(7)
  35. #define KEEMBAY_GPIO_MODE_DIR BIT(3)
  36. #define KEEMBAY_GPIO_MODE_DEFAULT 0x7
  37. #define KEEMBAY_GPIO_MODE_INV_VAL 0x3
  38. #define KEEMBAY_GPIO_DISABLE 0
  39. #define KEEMBAY_GPIO_PULL_UP 1
  40. #define KEEMBAY_GPIO_PULL_DOWN 2
  41. #define KEEMBAY_GPIO_BUS_HOLD 3
  42. #define KEEMBAY_GPIO_NUM_IRQ 8
  43. #define KEEMBAY_GPIO_MAX_PER_IRQ 4
  44. #define KEEMBAY_GPIO_MAX_PER_REG 32
  45. #define KEEMBAY_GPIO_MIN_STRENGTH 2
  46. #define KEEMBAY_GPIO_MAX_STRENGTH 12
  47. #define KEEMBAY_GPIO_SENSE_LOW (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING)
  48. /* GPIO reg address calculation */
  49. #define KEEMBAY_GPIO_REG_OFFSET(pin) ((pin) * 4)
  50. /**
  51. * struct keembay_mux_desc - Mux properties of each GPIO pin
  52. * @mode: Pin mode when operating in this function
  53. * @name: Pin function name
  54. */
  55. struct keembay_mux_desc {
  56. u8 mode;
  57. const char *name;
  58. };
  59. #define KEEMBAY_PIN_DESC(pin_number, pin_name, ...) { \
  60. .number = pin_number, \
  61. .name = pin_name, \
  62. .drv_data = &(struct keembay_mux_desc[]) { \
  63. __VA_ARGS__, { } }, \
  64. } \
  65. #define KEEMBAY_MUX(pin_mode, pin_function) { \
  66. .mode = pin_mode, \
  67. .name = pin_function, \
  68. } \
  69. /**
  70. * struct keembay_gpio_irq - Config of each GPIO Interrupt sources
  71. * @source: Interrupt source number (0 - 7)
  72. * @line: Actual Interrupt line number
  73. * @pins: Array of GPIO pins using this Interrupt line
  74. * @trigger: Interrupt trigger type for this line
  75. * @num_share: Number of pins currently using this Interrupt line
  76. */
  77. struct keembay_gpio_irq {
  78. unsigned int source;
  79. unsigned int line;
  80. unsigned int pins[KEEMBAY_GPIO_MAX_PER_IRQ];
  81. unsigned int trigger;
  82. unsigned int num_share;
  83. };
  84. /**
  85. * struct keembay_pinctrl - Intel Keembay pinctrl structure
  86. * @pctrl: Pointer to the pin controller device
  87. * @base0: First register base address
  88. * @base1: Second register base address
  89. * @dev: Pointer to the device structure
  90. * @chip: GPIO chip used by this pin controller
  91. * @soc: Pin control configuration data based on SoC
  92. * @lock: Spinlock to protect various gpio config register access
  93. * @ngroups: Number of pin groups available
  94. * @nfuncs: Number of pin functions available
  95. * @npins: Number of GPIO pins available
  96. * @irq: Store Interrupt source
  97. * @max_gpios_level_type: Store max level trigger type
  98. * @max_gpios_edge_type: Store max edge trigger type
  99. */
  100. struct keembay_pinctrl {
  101. struct pinctrl_dev *pctrl;
  102. void __iomem *base0;
  103. void __iomem *base1;
  104. struct device *dev;
  105. struct gpio_chip chip;
  106. const struct keembay_pin_soc *soc;
  107. raw_spinlock_t lock;
  108. unsigned int ngroups;
  109. unsigned int nfuncs;
  110. unsigned int npins;
  111. struct keembay_gpio_irq irq[KEEMBAY_GPIO_NUM_IRQ];
  112. int max_gpios_level_type;
  113. int max_gpios_edge_type;
  114. };
  115. /**
  116. * struct keembay_pin_soc - Pin control config data based on SoC
  117. * @pins: Pin description structure
  118. */
  119. struct keembay_pin_soc {
  120. const struct pinctrl_pin_desc *pins;
  121. };
  122. struct keembay_pinfunction {
  123. struct pinfunction func;
  124. u8 mux_mode;
  125. };
  126. static const struct pinctrl_pin_desc keembay_pins[] = {
  127. KEEMBAY_PIN_DESC(0, "GPIO0",
  128. KEEMBAY_MUX(0x0, "I2S0_M0"),
  129. KEEMBAY_MUX(0x1, "SD0_M1"),
  130. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  131. KEEMBAY_MUX(0x3, "I2C0_M3"),
  132. KEEMBAY_MUX(0x4, "CAM_M4"),
  133. KEEMBAY_MUX(0x5, "ETH_M5"),
  134. KEEMBAY_MUX(0x6, "LCD_M6"),
  135. KEEMBAY_MUX(0x7, "GPIO_M7")),
  136. KEEMBAY_PIN_DESC(1, "GPIO1",
  137. KEEMBAY_MUX(0x0, "I2S0_M0"),
  138. KEEMBAY_MUX(0x1, "SD0_M1"),
  139. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  140. KEEMBAY_MUX(0x3, "I2C0_M3"),
  141. KEEMBAY_MUX(0x4, "CAM_M4"),
  142. KEEMBAY_MUX(0x5, "ETH_M5"),
  143. KEEMBAY_MUX(0x6, "LCD_M6"),
  144. KEEMBAY_MUX(0x7, "GPIO_M7")),
  145. KEEMBAY_PIN_DESC(2, "GPIO2",
  146. KEEMBAY_MUX(0x0, "I2S0_M0"),
  147. KEEMBAY_MUX(0x1, "I2S0_M1"),
  148. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  149. KEEMBAY_MUX(0x3, "I2C1_M3"),
  150. KEEMBAY_MUX(0x4, "CAM_M4"),
  151. KEEMBAY_MUX(0x5, "ETH_M5"),
  152. KEEMBAY_MUX(0x6, "LCD_M6"),
  153. KEEMBAY_MUX(0x7, "GPIO_M7")),
  154. KEEMBAY_PIN_DESC(3, "GPIO3",
  155. KEEMBAY_MUX(0x0, "I2S0_M0"),
  156. KEEMBAY_MUX(0x1, "I2S0_M1"),
  157. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  158. KEEMBAY_MUX(0x3, "I2C1_M3"),
  159. KEEMBAY_MUX(0x4, "CAM_M4"),
  160. KEEMBAY_MUX(0x5, "ETH_M5"),
  161. KEEMBAY_MUX(0x6, "LCD_M6"),
  162. KEEMBAY_MUX(0x7, "GPIO_M7")),
  163. KEEMBAY_PIN_DESC(4, "GPIO4",
  164. KEEMBAY_MUX(0x0, "I2S0_M0"),
  165. KEEMBAY_MUX(0x1, "I2S0_M1"),
  166. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  167. KEEMBAY_MUX(0x3, "I2C2_M3"),
  168. KEEMBAY_MUX(0x4, "CAM_M4"),
  169. KEEMBAY_MUX(0x5, "ETH_M5"),
  170. KEEMBAY_MUX(0x6, "LCD_M6"),
  171. KEEMBAY_MUX(0x7, "GPIO_M7")),
  172. KEEMBAY_PIN_DESC(5, "GPIO5",
  173. KEEMBAY_MUX(0x0, "I2S0_M0"),
  174. KEEMBAY_MUX(0x1, "I2S0_M1"),
  175. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  176. KEEMBAY_MUX(0x3, "I2C2_M3"),
  177. KEEMBAY_MUX(0x4, "CAM_M4"),
  178. KEEMBAY_MUX(0x5, "ETH_M5"),
  179. KEEMBAY_MUX(0x6, "LCD_M6"),
  180. KEEMBAY_MUX(0x7, "GPIO_M7")),
  181. KEEMBAY_PIN_DESC(6, "GPIO6",
  182. KEEMBAY_MUX(0x0, "I2S1_M0"),
  183. KEEMBAY_MUX(0x1, "SD0_M1"),
  184. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  185. KEEMBAY_MUX(0x3, "I2C3_M3"),
  186. KEEMBAY_MUX(0x4, "CAM_M4"),
  187. KEEMBAY_MUX(0x5, "ETH_M5"),
  188. KEEMBAY_MUX(0x6, "LCD_M6"),
  189. KEEMBAY_MUX(0x7, "GPIO_M7")),
  190. KEEMBAY_PIN_DESC(7, "GPIO7",
  191. KEEMBAY_MUX(0x0, "I2S1_M0"),
  192. KEEMBAY_MUX(0x1, "SD0_M1"),
  193. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  194. KEEMBAY_MUX(0x3, "I2C3_M3"),
  195. KEEMBAY_MUX(0x4, "CAM_M4"),
  196. KEEMBAY_MUX(0x5, "ETH_M5"),
  197. KEEMBAY_MUX(0x6, "LCD_M6"),
  198. KEEMBAY_MUX(0x7, "GPIO_M7")),
  199. KEEMBAY_PIN_DESC(8, "GPIO8",
  200. KEEMBAY_MUX(0x0, "I2S1_M0"),
  201. KEEMBAY_MUX(0x1, "I2S1_M1"),
  202. KEEMBAY_MUX(0x2, "SLVDS0_M2"),
  203. KEEMBAY_MUX(0x3, "UART0_M3"),
  204. KEEMBAY_MUX(0x4, "CAM_M4"),
  205. KEEMBAY_MUX(0x5, "ETH_M5"),
  206. KEEMBAY_MUX(0x6, "LCD_M6"),
  207. KEEMBAY_MUX(0x7, "GPIO_M7")),
  208. KEEMBAY_PIN_DESC(9, "GPIO9",
  209. KEEMBAY_MUX(0x0, "I2S1_M0"),
  210. KEEMBAY_MUX(0x1, "I2S1_M1"),
  211. KEEMBAY_MUX(0x2, "PWM_M2"),
  212. KEEMBAY_MUX(0x3, "UART0_M3"),
  213. KEEMBAY_MUX(0x4, "CAM_M4"),
  214. KEEMBAY_MUX(0x5, "ETH_M5"),
  215. KEEMBAY_MUX(0x6, "LCD_M6"),
  216. KEEMBAY_MUX(0x7, "GPIO_M7")),
  217. KEEMBAY_PIN_DESC(10, "GPIO10",
  218. KEEMBAY_MUX(0x0, "I2S2_M0"),
  219. KEEMBAY_MUX(0x1, "SD0_M1"),
  220. KEEMBAY_MUX(0x2, "PWM_M2"),
  221. KEEMBAY_MUX(0x3, "UART0_M3"),
  222. KEEMBAY_MUX(0x4, "CAM_M4"),
  223. KEEMBAY_MUX(0x5, "ETH_M5"),
  224. KEEMBAY_MUX(0x6, "LCD_M6"),
  225. KEEMBAY_MUX(0x7, "GPIO_M7")),
  226. KEEMBAY_PIN_DESC(11, "GPIO11",
  227. KEEMBAY_MUX(0x0, "I2S2_M0"),
  228. KEEMBAY_MUX(0x1, "SD0_M1"),
  229. KEEMBAY_MUX(0x2, "PWM_M2"),
  230. KEEMBAY_MUX(0x3, "UART0_M3"),
  231. KEEMBAY_MUX(0x4, "CAM_M4"),
  232. KEEMBAY_MUX(0x5, "ETH_M5"),
  233. KEEMBAY_MUX(0x6, "LCD_M6"),
  234. KEEMBAY_MUX(0x7, "GPIO_M7")),
  235. KEEMBAY_PIN_DESC(12, "GPIO12",
  236. KEEMBAY_MUX(0x0, "I2S2_M0"),
  237. KEEMBAY_MUX(0x1, "I2S2_M1"),
  238. KEEMBAY_MUX(0x2, "PWM_M2"),
  239. KEEMBAY_MUX(0x3, "SPI0_M3"),
  240. KEEMBAY_MUX(0x4, "CAM_M4"),
  241. KEEMBAY_MUX(0x5, "ETH_M5"),
  242. KEEMBAY_MUX(0x6, "LCD_M6"),
  243. KEEMBAY_MUX(0x7, "GPIO_M7")),
  244. KEEMBAY_PIN_DESC(13, "GPIO13",
  245. KEEMBAY_MUX(0x0, "I2S2_M0"),
  246. KEEMBAY_MUX(0x1, "I2S2_M1"),
  247. KEEMBAY_MUX(0x2, "PWM_M2"),
  248. KEEMBAY_MUX(0x3, "SPI0_M3"),
  249. KEEMBAY_MUX(0x4, "CAM_M4"),
  250. KEEMBAY_MUX(0x5, "ETH_M5"),
  251. KEEMBAY_MUX(0x6, "LCD_M6"),
  252. KEEMBAY_MUX(0x7, "GPIO_M7")),
  253. KEEMBAY_PIN_DESC(14, "GPIO14",
  254. KEEMBAY_MUX(0x0, "UART0_M0"),
  255. KEEMBAY_MUX(0x1, "I2S3_M1"),
  256. KEEMBAY_MUX(0x2, "PWM_M2"),
  257. KEEMBAY_MUX(0x3, "SD1_M3"),
  258. KEEMBAY_MUX(0x4, "CAM_M4"),
  259. KEEMBAY_MUX(0x5, "ETH_M5"),
  260. KEEMBAY_MUX(0x6, "LCD_M6"),
  261. KEEMBAY_MUX(0x7, "GPIO_M7")),
  262. KEEMBAY_PIN_DESC(15, "GPIO15",
  263. KEEMBAY_MUX(0x0, "UART0_M0"),
  264. KEEMBAY_MUX(0x1, "I2S3_M1"),
  265. KEEMBAY_MUX(0x2, "UART0_M2"),
  266. KEEMBAY_MUX(0x3, "SD1_M3"),
  267. KEEMBAY_MUX(0x4, "CAM_M4"),
  268. KEEMBAY_MUX(0x5, "SPI1_M5"),
  269. KEEMBAY_MUX(0x6, "LCD_M6"),
  270. KEEMBAY_MUX(0x7, "GPIO_M7")),
  271. KEEMBAY_PIN_DESC(16, "GPIO16",
  272. KEEMBAY_MUX(0x0, "UART0_M0"),
  273. KEEMBAY_MUX(0x1, "I2S3_M1"),
  274. KEEMBAY_MUX(0x2, "UART0_M2"),
  275. KEEMBAY_MUX(0x3, "SD1_M3"),
  276. KEEMBAY_MUX(0x4, "CAM_M4"),
  277. KEEMBAY_MUX(0x5, "SPI1_M5"),
  278. KEEMBAY_MUX(0x6, "LCD_M6"),
  279. KEEMBAY_MUX(0x7, "GPIO_M7")),
  280. KEEMBAY_PIN_DESC(17, "GPIO17",
  281. KEEMBAY_MUX(0x0, "UART0_M0"),
  282. KEEMBAY_MUX(0x1, "I2S3_M1"),
  283. KEEMBAY_MUX(0x2, "I2S3_M2"),
  284. KEEMBAY_MUX(0x3, "SD1_M3"),
  285. KEEMBAY_MUX(0x4, "CAM_M4"),
  286. KEEMBAY_MUX(0x5, "SPI1_M5"),
  287. KEEMBAY_MUX(0x6, "LCD_M6"),
  288. KEEMBAY_MUX(0x7, "GPIO_M7")),
  289. KEEMBAY_PIN_DESC(18, "GPIO18",
  290. KEEMBAY_MUX(0x0, "UART1_M0"),
  291. KEEMBAY_MUX(0x1, "SPI0_M1"),
  292. KEEMBAY_MUX(0x2, "I2S3_M2"),
  293. KEEMBAY_MUX(0x3, "SD1_M3"),
  294. KEEMBAY_MUX(0x4, "CAM_M4"),
  295. KEEMBAY_MUX(0x5, "SPI1_M5"),
  296. KEEMBAY_MUX(0x6, "LCD_M6"),
  297. KEEMBAY_MUX(0x7, "GPIO_M7")),
  298. KEEMBAY_PIN_DESC(19, "GPIO19",
  299. KEEMBAY_MUX(0x0, "UART1_M0"),
  300. KEEMBAY_MUX(0x1, "LCD_M1"),
  301. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  302. KEEMBAY_MUX(0x3, "SD1_M3"),
  303. KEEMBAY_MUX(0x4, "CAM_M4"),
  304. KEEMBAY_MUX(0x5, "SPI1_M5"),
  305. KEEMBAY_MUX(0x6, "LCD_M6"),
  306. KEEMBAY_MUX(0x7, "GPIO_M7")),
  307. KEEMBAY_PIN_DESC(20, "GPIO20",
  308. KEEMBAY_MUX(0x0, "UART1_M0"),
  309. KEEMBAY_MUX(0x1, "LCD_M1"),
  310. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  311. KEEMBAY_MUX(0x3, "CPR_M3"),
  312. KEEMBAY_MUX(0x4, "CAM_M4"),
  313. KEEMBAY_MUX(0x5, "SPI1_M5"),
  314. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  315. KEEMBAY_MUX(0x7, "GPIO_M7")),
  316. KEEMBAY_PIN_DESC(21, "GPIO21",
  317. KEEMBAY_MUX(0x0, "UART1_M0"),
  318. KEEMBAY_MUX(0x1, "LCD_M1"),
  319. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  320. KEEMBAY_MUX(0x3, "CPR_M3"),
  321. KEEMBAY_MUX(0x4, "CAM_M4"),
  322. KEEMBAY_MUX(0x5, "I3C0_M5"),
  323. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  324. KEEMBAY_MUX(0x7, "GPIO_M7")),
  325. KEEMBAY_PIN_DESC(22, "GPIO22",
  326. KEEMBAY_MUX(0x0, "I2C0_M0"),
  327. KEEMBAY_MUX(0x1, "UART2_M1"),
  328. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  329. KEEMBAY_MUX(0x3, "CPR_M3"),
  330. KEEMBAY_MUX(0x4, "CAM_M4"),
  331. KEEMBAY_MUX(0x5, "I3C0_M5"),
  332. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  333. KEEMBAY_MUX(0x7, "GPIO_M7")),
  334. KEEMBAY_PIN_DESC(23, "GPIO23",
  335. KEEMBAY_MUX(0x0, "I2C0_M0"),
  336. KEEMBAY_MUX(0x1, "UART2_M1"),
  337. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  338. KEEMBAY_MUX(0x3, "CPR_M3"),
  339. KEEMBAY_MUX(0x4, "CAM_M4"),
  340. KEEMBAY_MUX(0x5, "I3C1_M5"),
  341. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  342. KEEMBAY_MUX(0x7, "GPIO_M7")),
  343. KEEMBAY_PIN_DESC(24, "GPIO24",
  344. KEEMBAY_MUX(0x0, "I2C1_M0"),
  345. KEEMBAY_MUX(0x1, "UART2_M1"),
  346. KEEMBAY_MUX(0x2, "DEBUG_M2"),
  347. KEEMBAY_MUX(0x3, "CPR_M3"),
  348. KEEMBAY_MUX(0x4, "CAM_M4"),
  349. KEEMBAY_MUX(0x5, "I3C1_M5"),
  350. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  351. KEEMBAY_MUX(0x7, "GPIO_M7")),
  352. KEEMBAY_PIN_DESC(25, "GPIO25",
  353. KEEMBAY_MUX(0x0, "I2C1_M0"),
  354. KEEMBAY_MUX(0x1, "UART2_M1"),
  355. KEEMBAY_MUX(0x2, "SPI0_M2"),
  356. KEEMBAY_MUX(0x3, "CPR_M3"),
  357. KEEMBAY_MUX(0x4, "CAM_M4"),
  358. KEEMBAY_MUX(0x5, "I3C2_M5"),
  359. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  360. KEEMBAY_MUX(0x7, "GPIO_M7")),
  361. KEEMBAY_PIN_DESC(26, "GPIO26",
  362. KEEMBAY_MUX(0x0, "SPI0_M0"),
  363. KEEMBAY_MUX(0x1, "I2C2_M1"),
  364. KEEMBAY_MUX(0x2, "UART0_M2"),
  365. KEEMBAY_MUX(0x3, "DSU_M3"),
  366. KEEMBAY_MUX(0x4, "CAM_M4"),
  367. KEEMBAY_MUX(0x5, "I3C2_M5"),
  368. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  369. KEEMBAY_MUX(0x7, "GPIO_M7")),
  370. KEEMBAY_PIN_DESC(27, "GPIO27",
  371. KEEMBAY_MUX(0x0, "SPI0_M0"),
  372. KEEMBAY_MUX(0x1, "I2C2_M1"),
  373. KEEMBAY_MUX(0x2, "UART0_M2"),
  374. KEEMBAY_MUX(0x3, "DSU_M3"),
  375. KEEMBAY_MUX(0x4, "CAM_M4"),
  376. KEEMBAY_MUX(0x5, "I3C0_M5"),
  377. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  378. KEEMBAY_MUX(0x7, "GPIO_M7")),
  379. KEEMBAY_PIN_DESC(28, "GPIO28",
  380. KEEMBAY_MUX(0x0, "SPI0_M0"),
  381. KEEMBAY_MUX(0x1, "I2C3_M1"),
  382. KEEMBAY_MUX(0x2, "UART0_M2"),
  383. KEEMBAY_MUX(0x3, "PWM_M3"),
  384. KEEMBAY_MUX(0x4, "CAM_M4"),
  385. KEEMBAY_MUX(0x5, "I3C1_M5"),
  386. KEEMBAY_MUX(0x6, "SLVDS0_M6"),
  387. KEEMBAY_MUX(0x7, "GPIO_M7")),
  388. KEEMBAY_PIN_DESC(29, "GPIO29",
  389. KEEMBAY_MUX(0x0, "SPI0_M0"),
  390. KEEMBAY_MUX(0x1, "I2C3_M1"),
  391. KEEMBAY_MUX(0x2, "UART0_M2"),
  392. KEEMBAY_MUX(0x3, "PWM_M3"),
  393. KEEMBAY_MUX(0x4, "CAM_M4"),
  394. KEEMBAY_MUX(0x5, "I3C2_M5"),
  395. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  396. KEEMBAY_MUX(0x7, "GPIO_M7")),
  397. KEEMBAY_PIN_DESC(30, "GPIO30",
  398. KEEMBAY_MUX(0x0, "SPI0_M0"),
  399. KEEMBAY_MUX(0x1, "I2S0_M1"),
  400. KEEMBAY_MUX(0x2, "I2C4_M2"),
  401. KEEMBAY_MUX(0x3, "PWM_M3"),
  402. KEEMBAY_MUX(0x4, "CAM_M4"),
  403. KEEMBAY_MUX(0x5, "LCD_M5"),
  404. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  405. KEEMBAY_MUX(0x7, "GPIO_M7")),
  406. KEEMBAY_PIN_DESC(31, "GPIO31",
  407. KEEMBAY_MUX(0x0, "SPI0_M0"),
  408. KEEMBAY_MUX(0x1, "I2S0_M1"),
  409. KEEMBAY_MUX(0x2, "I2C4_M2"),
  410. KEEMBAY_MUX(0x3, "PWM_M3"),
  411. KEEMBAY_MUX(0x4, "CAM_M4"),
  412. KEEMBAY_MUX(0x5, "UART1_M5"),
  413. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  414. KEEMBAY_MUX(0x7, "GPIO_M7")),
  415. KEEMBAY_PIN_DESC(32, "GPIO32",
  416. KEEMBAY_MUX(0x0, "SD0_M0"),
  417. KEEMBAY_MUX(0x1, "SPI0_M1"),
  418. KEEMBAY_MUX(0x2, "UART1_M2"),
  419. KEEMBAY_MUX(0x3, "PWM_M3"),
  420. KEEMBAY_MUX(0x4, "CAM_M4"),
  421. KEEMBAY_MUX(0x5, "PCIE_M5"),
  422. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  423. KEEMBAY_MUX(0x7, "GPIO_M7")),
  424. KEEMBAY_PIN_DESC(33, "GPIO33",
  425. KEEMBAY_MUX(0x0, "SD0_M0"),
  426. KEEMBAY_MUX(0x1, "SPI0_M1"),
  427. KEEMBAY_MUX(0x2, "UART1_M2"),
  428. KEEMBAY_MUX(0x3, "PWM_M3"),
  429. KEEMBAY_MUX(0x4, "CAM_M4"),
  430. KEEMBAY_MUX(0x5, "PCIE_M5"),
  431. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  432. KEEMBAY_MUX(0x7, "GPIO_M7")),
  433. KEEMBAY_PIN_DESC(34, "GPIO34",
  434. KEEMBAY_MUX(0x0, "SD0_M0"),
  435. KEEMBAY_MUX(0x1, "SPI0_M1"),
  436. KEEMBAY_MUX(0x2, "I2C0_M2"),
  437. KEEMBAY_MUX(0x3, "UART1_M3"),
  438. KEEMBAY_MUX(0x4, "CAM_M4"),
  439. KEEMBAY_MUX(0x5, "I2S0_M5"),
  440. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  441. KEEMBAY_MUX(0x7, "GPIO_M7")),
  442. KEEMBAY_PIN_DESC(35, "GPIO35",
  443. KEEMBAY_MUX(0x0, "SD0_M0"),
  444. KEEMBAY_MUX(0x1, "PCIE_M1"),
  445. KEEMBAY_MUX(0x2, "I2C0_M2"),
  446. KEEMBAY_MUX(0x3, "UART1_M3"),
  447. KEEMBAY_MUX(0x4, "CAM_M4"),
  448. KEEMBAY_MUX(0x5, "I2S0_M5"),
  449. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  450. KEEMBAY_MUX(0x7, "GPIO_M7")),
  451. KEEMBAY_PIN_DESC(36, "GPIO36",
  452. KEEMBAY_MUX(0x0, "SD0_M0"),
  453. KEEMBAY_MUX(0x1, "SPI3_M1"),
  454. KEEMBAY_MUX(0x2, "I2C1_M2"),
  455. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  456. KEEMBAY_MUX(0x4, "CAM_M4"),
  457. KEEMBAY_MUX(0x5, "I2S0_M5"),
  458. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  459. KEEMBAY_MUX(0x7, "GPIO_M7")),
  460. KEEMBAY_PIN_DESC(37, "GPIO37",
  461. KEEMBAY_MUX(0x0, "SD0_M0"),
  462. KEEMBAY_MUX(0x1, "SPI3_M1"),
  463. KEEMBAY_MUX(0x2, "I2C1_M2"),
  464. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  465. KEEMBAY_MUX(0x4, "CAM_M4"),
  466. KEEMBAY_MUX(0x5, "I2S0_M5"),
  467. KEEMBAY_MUX(0x6, "SLVDS1_M6"),
  468. KEEMBAY_MUX(0x7, "GPIO_M7")),
  469. KEEMBAY_PIN_DESC(38, "GPIO38",
  470. KEEMBAY_MUX(0x0, "I3C1_M0"),
  471. KEEMBAY_MUX(0x1, "SPI3_M1"),
  472. KEEMBAY_MUX(0x2, "UART3_M2"),
  473. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  474. KEEMBAY_MUX(0x4, "CAM_M4"),
  475. KEEMBAY_MUX(0x5, "LCD_M5"),
  476. KEEMBAY_MUX(0x6, "I2C2_M6"),
  477. KEEMBAY_MUX(0x7, "GPIO_M7")),
  478. KEEMBAY_PIN_DESC(39, "GPIO39",
  479. KEEMBAY_MUX(0x0, "I3C1_M0"),
  480. KEEMBAY_MUX(0x1, "SPI3_M1"),
  481. KEEMBAY_MUX(0x2, "UART3_M2"),
  482. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  483. KEEMBAY_MUX(0x4, "CAM_M4"),
  484. KEEMBAY_MUX(0x5, "LCD_M5"),
  485. KEEMBAY_MUX(0x6, "I2C2_M6"),
  486. KEEMBAY_MUX(0x7, "GPIO_M7")),
  487. KEEMBAY_PIN_DESC(40, "GPIO40",
  488. KEEMBAY_MUX(0x0, "I2S2_M0"),
  489. KEEMBAY_MUX(0x1, "SPI3_M1"),
  490. KEEMBAY_MUX(0x2, "UART3_M2"),
  491. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  492. KEEMBAY_MUX(0x4, "CAM_M4"),
  493. KEEMBAY_MUX(0x5, "LCD_M5"),
  494. KEEMBAY_MUX(0x6, "I2C3_M6"),
  495. KEEMBAY_MUX(0x7, "GPIO_M7")),
  496. KEEMBAY_PIN_DESC(41, "GPIO41",
  497. KEEMBAY_MUX(0x0, "ETH_M0"),
  498. KEEMBAY_MUX(0x1, "SPI3_M1"),
  499. KEEMBAY_MUX(0x2, "SPI3_M2"),
  500. KEEMBAY_MUX(0x3, "DEBUG_M3"),
  501. KEEMBAY_MUX(0x4, "CAM_M4"),
  502. KEEMBAY_MUX(0x5, "LCD_M5"),
  503. KEEMBAY_MUX(0x6, "I2C3_M6"),
  504. KEEMBAY_MUX(0x7, "GPIO_M7")),
  505. KEEMBAY_PIN_DESC(42, "GPIO42",
  506. KEEMBAY_MUX(0x0, "ETH_M0"),
  507. KEEMBAY_MUX(0x1, "SD1_M1"),
  508. KEEMBAY_MUX(0x2, "SPI3_M2"),
  509. KEEMBAY_MUX(0x3, "CPR_M3"),
  510. KEEMBAY_MUX(0x4, "CAM_M4"),
  511. KEEMBAY_MUX(0x5, "LCD_M5"),
  512. KEEMBAY_MUX(0x6, "I2C4_M6"),
  513. KEEMBAY_MUX(0x7, "GPIO_M7")),
  514. KEEMBAY_PIN_DESC(43, "GPIO43",
  515. KEEMBAY_MUX(0x0, "ETH_M0"),
  516. KEEMBAY_MUX(0x1, "SD1_M1"),
  517. KEEMBAY_MUX(0x2, "SPI3_M2"),
  518. KEEMBAY_MUX(0x3, "CPR_M3"),
  519. KEEMBAY_MUX(0x4, "I2S0_M4"),
  520. KEEMBAY_MUX(0x5, "LCD_M5"),
  521. KEEMBAY_MUX(0x6, "I2C4_M6"),
  522. KEEMBAY_MUX(0x7, "GPIO_M7")),
  523. KEEMBAY_PIN_DESC(44, "GPIO44",
  524. KEEMBAY_MUX(0x0, "ETH_M0"),
  525. KEEMBAY_MUX(0x1, "SD1_M1"),
  526. KEEMBAY_MUX(0x2, "SPI0_M2"),
  527. KEEMBAY_MUX(0x3, "CPR_M3"),
  528. KEEMBAY_MUX(0x4, "I2S0_M4"),
  529. KEEMBAY_MUX(0x5, "LCD_M5"),
  530. KEEMBAY_MUX(0x6, "CAM_M6"),
  531. KEEMBAY_MUX(0x7, "GPIO_M7")),
  532. KEEMBAY_PIN_DESC(45, "GPIO45",
  533. KEEMBAY_MUX(0x0, "ETH_M0"),
  534. KEEMBAY_MUX(0x1, "SD1_M1"),
  535. KEEMBAY_MUX(0x2, "SPI0_M2"),
  536. KEEMBAY_MUX(0x3, "CPR_M3"),
  537. KEEMBAY_MUX(0x4, "I2S0_M4"),
  538. KEEMBAY_MUX(0x5, "LCD_M5"),
  539. KEEMBAY_MUX(0x6, "CAM_M6"),
  540. KEEMBAY_MUX(0x7, "GPIO_M7")),
  541. KEEMBAY_PIN_DESC(46, "GPIO46",
  542. KEEMBAY_MUX(0x0, "ETH_M0"),
  543. KEEMBAY_MUX(0x1, "SD1_M1"),
  544. KEEMBAY_MUX(0x2, "SPI0_M2"),
  545. KEEMBAY_MUX(0x3, "TPIU_M3"),
  546. KEEMBAY_MUX(0x4, "I2S0_M4"),
  547. KEEMBAY_MUX(0x5, "LCD_M5"),
  548. KEEMBAY_MUX(0x6, "CAM_M6"),
  549. KEEMBAY_MUX(0x7, "GPIO_M7")),
  550. KEEMBAY_PIN_DESC(47, "GPIO47",
  551. KEEMBAY_MUX(0x0, "ETH_M0"),
  552. KEEMBAY_MUX(0x1, "SD1_M1"),
  553. KEEMBAY_MUX(0x2, "SPI0_M2"),
  554. KEEMBAY_MUX(0x3, "TPIU_M3"),
  555. KEEMBAY_MUX(0x4, "I2S0_M4"),
  556. KEEMBAY_MUX(0x5, "LCD_M5"),
  557. KEEMBAY_MUX(0x6, "CAM_M6"),
  558. KEEMBAY_MUX(0x7, "GPIO_M7")),
  559. KEEMBAY_PIN_DESC(48, "GPIO48",
  560. KEEMBAY_MUX(0x0, "ETH_M0"),
  561. KEEMBAY_MUX(0x1, "SPI2_M1"),
  562. KEEMBAY_MUX(0x2, "UART2_M2"),
  563. KEEMBAY_MUX(0x3, "TPIU_M3"),
  564. KEEMBAY_MUX(0x4, "I2S0_M4"),
  565. KEEMBAY_MUX(0x5, "LCD_M5"),
  566. KEEMBAY_MUX(0x6, "CAM_M6"),
  567. KEEMBAY_MUX(0x7, "GPIO_M7")),
  568. KEEMBAY_PIN_DESC(49, "GPIO49",
  569. KEEMBAY_MUX(0x0, "ETH_M0"),
  570. KEEMBAY_MUX(0x1, "SPI2_M1"),
  571. KEEMBAY_MUX(0x2, "UART2_M2"),
  572. KEEMBAY_MUX(0x3, "TPIU_M3"),
  573. KEEMBAY_MUX(0x4, "I2S1_M4"),
  574. KEEMBAY_MUX(0x5, "LCD_M5"),
  575. KEEMBAY_MUX(0x6, "CAM_M6"),
  576. KEEMBAY_MUX(0x7, "GPIO_M7")),
  577. KEEMBAY_PIN_DESC(50, "GPIO50",
  578. KEEMBAY_MUX(0x0, "ETH_M0"),
  579. KEEMBAY_MUX(0x1, "SPI2_M1"),
  580. KEEMBAY_MUX(0x2, "UART2_M2"),
  581. KEEMBAY_MUX(0x3, "TPIU_M3"),
  582. KEEMBAY_MUX(0x4, "I2S1_M4"),
  583. KEEMBAY_MUX(0x5, "LCD_M5"),
  584. KEEMBAY_MUX(0x6, "CAM_M6"),
  585. KEEMBAY_MUX(0x7, "GPIO_M7")),
  586. KEEMBAY_PIN_DESC(51, "GPIO51",
  587. KEEMBAY_MUX(0x0, "ETH_M0"),
  588. KEEMBAY_MUX(0x1, "SPI2_M1"),
  589. KEEMBAY_MUX(0x2, "UART2_M2"),
  590. KEEMBAY_MUX(0x3, "TPIU_M3"),
  591. KEEMBAY_MUX(0x4, "I2S1_M4"),
  592. KEEMBAY_MUX(0x5, "LCD_M5"),
  593. KEEMBAY_MUX(0x6, "CAM_M6"),
  594. KEEMBAY_MUX(0x7, "GPIO_M7")),
  595. KEEMBAY_PIN_DESC(52, "GPIO52",
  596. KEEMBAY_MUX(0x0, "ETH_M0"),
  597. KEEMBAY_MUX(0x1, "SPI2_M1"),
  598. KEEMBAY_MUX(0x2, "SD0_M2"),
  599. KEEMBAY_MUX(0x3, "TPIU_M3"),
  600. KEEMBAY_MUX(0x4, "I2S1_M4"),
  601. KEEMBAY_MUX(0x5, "LCD_M5"),
  602. KEEMBAY_MUX(0x6, "CAM_M6"),
  603. KEEMBAY_MUX(0x7, "GPIO_M7")),
  604. KEEMBAY_PIN_DESC(53, "GPIO53",
  605. KEEMBAY_MUX(0x0, "ETH_M0"),
  606. KEEMBAY_MUX(0x1, "SPI2_M1"),
  607. KEEMBAY_MUX(0x2, "SD0_M2"),
  608. KEEMBAY_MUX(0x3, "TPIU_M3"),
  609. KEEMBAY_MUX(0x4, "I2S2_M4"),
  610. KEEMBAY_MUX(0x5, "LCD_M5"),
  611. KEEMBAY_MUX(0x6, "CAM_M6"),
  612. KEEMBAY_MUX(0x7, "GPIO_M7")),
  613. KEEMBAY_PIN_DESC(54, "GPIO54",
  614. KEEMBAY_MUX(0x0, "ETH_M0"),
  615. KEEMBAY_MUX(0x1, "SPI2_M1"),
  616. KEEMBAY_MUX(0x2, "SD0_M2"),
  617. KEEMBAY_MUX(0x3, "TPIU_M3"),
  618. KEEMBAY_MUX(0x4, "I2S2_M4"),
  619. KEEMBAY_MUX(0x5, "LCD_M5"),
  620. KEEMBAY_MUX(0x6, "CAM_M6"),
  621. KEEMBAY_MUX(0x7, "GPIO_M7")),
  622. KEEMBAY_PIN_DESC(55, "GPIO55",
  623. KEEMBAY_MUX(0x0, "ETH_M0"),
  624. KEEMBAY_MUX(0x1, "SPI2_M1"),
  625. KEEMBAY_MUX(0x2, "SD1_M2"),
  626. KEEMBAY_MUX(0x3, "TPIU_M3"),
  627. KEEMBAY_MUX(0x4, "I2S2_M4"),
  628. KEEMBAY_MUX(0x5, "LCD_M5"),
  629. KEEMBAY_MUX(0x6, "CAM_M6"),
  630. KEEMBAY_MUX(0x7, "GPIO_M7")),
  631. KEEMBAY_PIN_DESC(56, "GPIO56",
  632. KEEMBAY_MUX(0x0, "ETH_M0"),
  633. KEEMBAY_MUX(0x1, "SPI2_M1"),
  634. KEEMBAY_MUX(0x2, "SD1_M2"),
  635. KEEMBAY_MUX(0x3, "TPIU_M3"),
  636. KEEMBAY_MUX(0x4, "I2S2_M4"),
  637. KEEMBAY_MUX(0x5, "LCD_M5"),
  638. KEEMBAY_MUX(0x6, "CAM_M6"),
  639. KEEMBAY_MUX(0x7, "GPIO_M7")),
  640. KEEMBAY_PIN_DESC(57, "GPIO57",
  641. KEEMBAY_MUX(0x0, "SPI1_M0"),
  642. KEEMBAY_MUX(0x1, "I2S1_M1"),
  643. KEEMBAY_MUX(0x2, "SD1_M2"),
  644. KEEMBAY_MUX(0x3, "TPIU_M3"),
  645. KEEMBAY_MUX(0x4, "UART0_M4"),
  646. KEEMBAY_MUX(0x5, "LCD_M5"),
  647. KEEMBAY_MUX(0x6, "CAM_M6"),
  648. KEEMBAY_MUX(0x7, "GPIO_M7")),
  649. KEEMBAY_PIN_DESC(58, "GPIO58",
  650. KEEMBAY_MUX(0x0, "SPI1_M0"),
  651. KEEMBAY_MUX(0x1, "ETH_M1"),
  652. KEEMBAY_MUX(0x2, "SD0_M2"),
  653. KEEMBAY_MUX(0x3, "TPIU_M3"),
  654. KEEMBAY_MUX(0x4, "UART0_M4"),
  655. KEEMBAY_MUX(0x5, "LCD_M5"),
  656. KEEMBAY_MUX(0x6, "CAM_M6"),
  657. KEEMBAY_MUX(0x7, "GPIO_M7")),
  658. KEEMBAY_PIN_DESC(59, "GPIO59",
  659. KEEMBAY_MUX(0x0, "SPI1_M0"),
  660. KEEMBAY_MUX(0x1, "ETH_M1"),
  661. KEEMBAY_MUX(0x2, "SD0_M2"),
  662. KEEMBAY_MUX(0x3, "TPIU_M3"),
  663. KEEMBAY_MUX(0x4, "UART0_M4"),
  664. KEEMBAY_MUX(0x5, "LCD_M5"),
  665. KEEMBAY_MUX(0x6, "CAM_M6"),
  666. KEEMBAY_MUX(0x7, "GPIO_M7")),
  667. KEEMBAY_PIN_DESC(60, "GPIO60",
  668. KEEMBAY_MUX(0x0, "SPI1_M0"),
  669. KEEMBAY_MUX(0x1, "ETH_M1"),
  670. KEEMBAY_MUX(0x2, "I3C1_M2"),
  671. KEEMBAY_MUX(0x3, "TPIU_M3"),
  672. KEEMBAY_MUX(0x4, "UART0_M4"),
  673. KEEMBAY_MUX(0x5, "LCD_M5"),
  674. KEEMBAY_MUX(0x6, "CAM_M6"),
  675. KEEMBAY_MUX(0x7, "GPIO_M7")),
  676. KEEMBAY_PIN_DESC(61, "GPIO61",
  677. KEEMBAY_MUX(0x0, "SPI1_M0"),
  678. KEEMBAY_MUX(0x1, "ETH_M1"),
  679. KEEMBAY_MUX(0x2, "SD0_M2"),
  680. KEEMBAY_MUX(0x3, "TPIU_M3"),
  681. KEEMBAY_MUX(0x4, "UART1_M4"),
  682. KEEMBAY_MUX(0x5, "LCD_M5"),
  683. KEEMBAY_MUX(0x6, "CAM_M6"),
  684. KEEMBAY_MUX(0x7, "GPIO_M7")),
  685. KEEMBAY_PIN_DESC(62, "GPIO62",
  686. KEEMBAY_MUX(0x0, "SPI1_M0"),
  687. KEEMBAY_MUX(0x1, "ETH_M1"),
  688. KEEMBAY_MUX(0x2, "SD1_M2"),
  689. KEEMBAY_MUX(0x3, "TPIU_M3"),
  690. KEEMBAY_MUX(0x4, "UART1_M4"),
  691. KEEMBAY_MUX(0x5, "LCD_M5"),
  692. KEEMBAY_MUX(0x6, "CAM_M6"),
  693. KEEMBAY_MUX(0x7, "GPIO_M7")),
  694. KEEMBAY_PIN_DESC(63, "GPIO63",
  695. KEEMBAY_MUX(0x0, "I2S1_M0"),
  696. KEEMBAY_MUX(0x1, "SPI1_M1"),
  697. KEEMBAY_MUX(0x2, "SD1_M2"),
  698. KEEMBAY_MUX(0x3, "TPIU_M3"),
  699. KEEMBAY_MUX(0x4, "UART1_M4"),
  700. KEEMBAY_MUX(0x5, "LCD_M5"),
  701. KEEMBAY_MUX(0x6, "CAM_M6"),
  702. KEEMBAY_MUX(0x7, "GPIO_M7")),
  703. KEEMBAY_PIN_DESC(64, "GPIO64",
  704. KEEMBAY_MUX(0x0, "I2S2_M0"),
  705. KEEMBAY_MUX(0x1, "SPI1_M1"),
  706. KEEMBAY_MUX(0x2, "ETH_M2"),
  707. KEEMBAY_MUX(0x3, "TPIU_M3"),
  708. KEEMBAY_MUX(0x4, "UART1_M4"),
  709. KEEMBAY_MUX(0x5, "LCD_M5"),
  710. KEEMBAY_MUX(0x6, "CAM_M6"),
  711. KEEMBAY_MUX(0x7, "GPIO_M7")),
  712. KEEMBAY_PIN_DESC(65, "GPIO65",
  713. KEEMBAY_MUX(0x0, "I3C0_M0"),
  714. KEEMBAY_MUX(0x1, "SPI1_M1"),
  715. KEEMBAY_MUX(0x2, "SD1_M2"),
  716. KEEMBAY_MUX(0x3, "TPIU_M3"),
  717. KEEMBAY_MUX(0x4, "SPI0_M4"),
  718. KEEMBAY_MUX(0x5, "LCD_M5"),
  719. KEEMBAY_MUX(0x6, "CAM_M6"),
  720. KEEMBAY_MUX(0x7, "GPIO_M7")),
  721. KEEMBAY_PIN_DESC(66, "GPIO66",
  722. KEEMBAY_MUX(0x0, "I3C0_M0"),
  723. KEEMBAY_MUX(0x1, "ETH_M1"),
  724. KEEMBAY_MUX(0x2, "I2C0_M2"),
  725. KEEMBAY_MUX(0x3, "TPIU_M3"),
  726. KEEMBAY_MUX(0x4, "SPI0_M4"),
  727. KEEMBAY_MUX(0x5, "LCD_M5"),
  728. KEEMBAY_MUX(0x6, "CAM_M6"),
  729. KEEMBAY_MUX(0x7, "GPIO_M7")),
  730. KEEMBAY_PIN_DESC(67, "GPIO67",
  731. KEEMBAY_MUX(0x0, "I3C1_M0"),
  732. KEEMBAY_MUX(0x1, "ETH_M1"),
  733. KEEMBAY_MUX(0x2, "I2C0_M2"),
  734. KEEMBAY_MUX(0x3, "TPIU_M3"),
  735. KEEMBAY_MUX(0x4, "SPI0_M4"),
  736. KEEMBAY_MUX(0x5, "LCD_M5"),
  737. KEEMBAY_MUX(0x6, "I2S3_M6"),
  738. KEEMBAY_MUX(0x7, "GPIO_M7")),
  739. KEEMBAY_PIN_DESC(68, "GPIO68",
  740. KEEMBAY_MUX(0x0, "I3C1_M0"),
  741. KEEMBAY_MUX(0x1, "ETH_M1"),
  742. KEEMBAY_MUX(0x2, "I2C1_M2"),
  743. KEEMBAY_MUX(0x3, "TPIU_M3"),
  744. KEEMBAY_MUX(0x4, "SPI0_M4"),
  745. KEEMBAY_MUX(0x5, "LCD_M5"),
  746. KEEMBAY_MUX(0x6, "I2S3_M6"),
  747. KEEMBAY_MUX(0x7, "GPIO_M7")),
  748. KEEMBAY_PIN_DESC(69, "GPIO69",
  749. KEEMBAY_MUX(0x0, "I3C2_M0"),
  750. KEEMBAY_MUX(0x1, "ETH_M1"),
  751. KEEMBAY_MUX(0x2, "I2C1_M2"),
  752. KEEMBAY_MUX(0x3, "TPIU_M3"),
  753. KEEMBAY_MUX(0x4, "SPI0_M4"),
  754. KEEMBAY_MUX(0x5, "LCD_M5"),
  755. KEEMBAY_MUX(0x6, "I2S3_M6"),
  756. KEEMBAY_MUX(0x7, "GPIO_M7")),
  757. KEEMBAY_PIN_DESC(70, "GPIO70",
  758. KEEMBAY_MUX(0x0, "I3C2_M0"),
  759. KEEMBAY_MUX(0x1, "ETH_M1"),
  760. KEEMBAY_MUX(0x2, "SPI0_M2"),
  761. KEEMBAY_MUX(0x3, "TPIU_M3"),
  762. KEEMBAY_MUX(0x4, "SD0_M4"),
  763. KEEMBAY_MUX(0x5, "LCD_M5"),
  764. KEEMBAY_MUX(0x6, "I2S3_M6"),
  765. KEEMBAY_MUX(0x7, "GPIO_M7")),
  766. KEEMBAY_PIN_DESC(71, "GPIO71",
  767. KEEMBAY_MUX(0x0, "I3C0_M0"),
  768. KEEMBAY_MUX(0x1, "ETH_M1"),
  769. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  770. KEEMBAY_MUX(0x3, "TPIU_M3"),
  771. KEEMBAY_MUX(0x4, "SD0_M4"),
  772. KEEMBAY_MUX(0x5, "LCD_M5"),
  773. KEEMBAY_MUX(0x6, "I2S3_M6"),
  774. KEEMBAY_MUX(0x7, "GPIO_M7")),
  775. KEEMBAY_PIN_DESC(72, "GPIO72",
  776. KEEMBAY_MUX(0x0, "I3C1_M0"),
  777. KEEMBAY_MUX(0x1, "ETH_M1"),
  778. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  779. KEEMBAY_MUX(0x3, "TPIU_M3"),
  780. KEEMBAY_MUX(0x4, "SD0_M4"),
  781. KEEMBAY_MUX(0x5, "LCD_M5"),
  782. KEEMBAY_MUX(0x6, "UART2_M6"),
  783. KEEMBAY_MUX(0x7, "GPIO_M7")),
  784. KEEMBAY_PIN_DESC(73, "GPIO73",
  785. KEEMBAY_MUX(0x0, "I3C2_M0"),
  786. KEEMBAY_MUX(0x1, "ETH_M1"),
  787. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  788. KEEMBAY_MUX(0x3, "TPIU_M3"),
  789. KEEMBAY_MUX(0x4, "SD0_M4"),
  790. KEEMBAY_MUX(0x5, "LCD_M5"),
  791. KEEMBAY_MUX(0x6, "UART2_M6"),
  792. KEEMBAY_MUX(0x7, "GPIO_M7")),
  793. KEEMBAY_PIN_DESC(74, "GPIO74",
  794. KEEMBAY_MUX(0x0, "I3C0_M0"),
  795. KEEMBAY_MUX(0x1, "ETH_M1"),
  796. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  797. KEEMBAY_MUX(0x3, "TPIU_M3"),
  798. KEEMBAY_MUX(0x4, "SD0_M4"),
  799. KEEMBAY_MUX(0x5, "LCD_M5"),
  800. KEEMBAY_MUX(0x6, "UART2_M6"),
  801. KEEMBAY_MUX(0x7, "GPIO_M7")),
  802. KEEMBAY_PIN_DESC(75, "GPIO75",
  803. KEEMBAY_MUX(0x0, "I3C0_M0"),
  804. KEEMBAY_MUX(0x1, "ETH_M1"),
  805. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  806. KEEMBAY_MUX(0x3, "TPIU_M3"),
  807. KEEMBAY_MUX(0x4, "SD0_M4"),
  808. KEEMBAY_MUX(0x5, "LCD_M5"),
  809. KEEMBAY_MUX(0x6, "UART2_M6"),
  810. KEEMBAY_MUX(0x7, "GPIO_M7")),
  811. KEEMBAY_PIN_DESC(76, "GPIO76",
  812. KEEMBAY_MUX(0x0, "I2C2_M0"),
  813. KEEMBAY_MUX(0x1, "I3C0_M1"),
  814. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  815. KEEMBAY_MUX(0x3, "TPIU_M3"),
  816. KEEMBAY_MUX(0x4, "ETH_M4"),
  817. KEEMBAY_MUX(0x5, "LCD_M5"),
  818. KEEMBAY_MUX(0x6, "UART3_M6"),
  819. KEEMBAY_MUX(0x7, "GPIO_M7")),
  820. KEEMBAY_PIN_DESC(77, "GPIO77",
  821. KEEMBAY_MUX(0x0, "PCIE_M0"),
  822. KEEMBAY_MUX(0x1, "I3C1_M1"),
  823. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  824. KEEMBAY_MUX(0x3, "TPIU_M3"),
  825. KEEMBAY_MUX(0x4, "I3C2_M4"),
  826. KEEMBAY_MUX(0x5, "LCD_M5"),
  827. KEEMBAY_MUX(0x6, "UART3_M6"),
  828. KEEMBAY_MUX(0x7, "GPIO_M7")),
  829. KEEMBAY_PIN_DESC(78, "GPIO78",
  830. KEEMBAY_MUX(0x0, "PCIE_M0"),
  831. KEEMBAY_MUX(0x1, "I3C2_M1"),
  832. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  833. KEEMBAY_MUX(0x3, "TPIU_M3"),
  834. KEEMBAY_MUX(0x4, "I3C2_M4"),
  835. KEEMBAY_MUX(0x5, "LCD_M5"),
  836. KEEMBAY_MUX(0x6, "UART3_M6"),
  837. KEEMBAY_MUX(0x7, "GPIO_M7")),
  838. KEEMBAY_PIN_DESC(79, "GPIO79",
  839. KEEMBAY_MUX(0x0, "PCIE_M0"),
  840. KEEMBAY_MUX(0x1, "I2C2_M1"),
  841. KEEMBAY_MUX(0x2, "SLVDS1_M2"),
  842. KEEMBAY_MUX(0x3, "TPIU_M3"),
  843. KEEMBAY_MUX(0x4, "I3C2_M4"),
  844. KEEMBAY_MUX(0x5, "LCD_M5"),
  845. KEEMBAY_MUX(0x6, "UART3_M6"),
  846. KEEMBAY_MUX(0x7, "GPIO_M7")),
  847. };
  848. static inline u32 keembay_read_reg(void __iomem *base, unsigned int pin)
  849. {
  850. return readl(base + KEEMBAY_GPIO_REG_OFFSET(pin));
  851. }
  852. static inline u32 keembay_read_gpio_reg(void __iomem *base, unsigned int pin)
  853. {
  854. return keembay_read_reg(base, pin / KEEMBAY_GPIO_MAX_PER_REG);
  855. }
  856. static inline u32 keembay_read_pin(void __iomem *base, unsigned int pin)
  857. {
  858. u32 val = keembay_read_gpio_reg(base, pin);
  859. return !!(val & BIT(pin % KEEMBAY_GPIO_MAX_PER_REG));
  860. }
  861. static inline void keembay_write_reg(u32 val, void __iomem *base, unsigned int pin)
  862. {
  863. writel(val, base + KEEMBAY_GPIO_REG_OFFSET(pin));
  864. }
  865. static inline void keembay_write_gpio_reg(u32 val, void __iomem *base, unsigned int pin)
  866. {
  867. keembay_write_reg(val, base, pin / KEEMBAY_GPIO_MAX_PER_REG);
  868. }
  869. static void keembay_gpio_invert(struct keembay_pinctrl *kpc, unsigned int pin)
  870. {
  871. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  872. /*
  873. * This IP doesn't support the falling edge and low level interrupt
  874. * trigger. Invert API is used to mimic the falling edge and low
  875. * level support
  876. */
  877. val |= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, KEEMBAY_GPIO_MODE_INV_VAL);
  878. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  879. }
  880. static void keembay_gpio_restore_default(struct keembay_pinctrl *kpc, unsigned int pin)
  881. {
  882. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  883. val &= FIELD_PREP(KEEMBAY_GPIO_MODE_INV_MASK, 0);
  884. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  885. }
  886. static int keembay_request_gpio(struct pinctrl_dev *pctldev,
  887. struct pinctrl_gpio_range *range, unsigned int pin)
  888. {
  889. struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
  890. unsigned int val;
  891. if (pin >= kpc->npins)
  892. return -EINVAL;
  893. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  894. val = FIELD_GET(KEEMBAY_GPIO_MODE_SELECT_MASK, val);
  895. /* As per Pin Mux Map, Modes 0 to 6 are for peripherals */
  896. if (val != KEEMBAY_GPIO_MODE_DEFAULT)
  897. return -EBUSY;
  898. return 0;
  899. }
  900. static int keembay_set_mux(struct pinctrl_dev *pctldev, unsigned int fun_sel,
  901. unsigned int grp_sel)
  902. {
  903. struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
  904. const struct function_desc *func;
  905. struct group_desc *grp;
  906. unsigned int val;
  907. u8 pin_mode;
  908. int pin;
  909. grp = pinctrl_generic_get_group(pctldev, grp_sel);
  910. if (!grp)
  911. return -EINVAL;
  912. func = pinmux_generic_get_function(pctldev, fun_sel);
  913. if (!func)
  914. return -EINVAL;
  915. /* Change modes for pins in the selected group */
  916. pin = *grp->grp.pins;
  917. pin_mode = *(u8 *)(func->data);
  918. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  919. val = u32_replace_bits(val, pin_mode, KEEMBAY_GPIO_MODE_SELECT_MASK);
  920. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  921. return 0;
  922. }
  923. static u32 keembay_pinconf_get_pull(struct keembay_pinctrl *kpc, unsigned int pin)
  924. {
  925. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  926. return FIELD_GET(KEEMBAY_GPIO_MODE_PULLUP_MASK, val);
  927. }
  928. static int keembay_pinconf_set_pull(struct keembay_pinctrl *kpc, unsigned int pin,
  929. unsigned int pull)
  930. {
  931. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  932. val = u32_replace_bits(val, pull, KEEMBAY_GPIO_MODE_PULLUP_MASK);
  933. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  934. return 0;
  935. }
  936. static int keembay_pinconf_get_drive(struct keembay_pinctrl *kpc, unsigned int pin)
  937. {
  938. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  939. val = FIELD_GET(KEEMBAY_GPIO_MODE_DRIVE_MASK, val) * 4;
  940. if (val)
  941. return val;
  942. return KEEMBAY_GPIO_MIN_STRENGTH;
  943. }
  944. static int keembay_pinconf_set_drive(struct keembay_pinctrl *kpc, unsigned int pin,
  945. unsigned int drive)
  946. {
  947. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  948. unsigned int strength = clamp_val(drive, KEEMBAY_GPIO_MIN_STRENGTH,
  949. KEEMBAY_GPIO_MAX_STRENGTH) / 4;
  950. val = u32_replace_bits(val, strength, KEEMBAY_GPIO_MODE_DRIVE_MASK);
  951. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  952. return 0;
  953. }
  954. static int keembay_pinconf_get_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin)
  955. {
  956. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  957. return !!(val & KEEMBAY_GPIO_MODE_SLEW_RATE);
  958. }
  959. static int keembay_pinconf_set_slew_rate(struct keembay_pinctrl *kpc, unsigned int pin,
  960. unsigned int slew_rate)
  961. {
  962. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  963. if (slew_rate)
  964. val |= KEEMBAY_GPIO_MODE_SLEW_RATE;
  965. else
  966. val &= ~KEEMBAY_GPIO_MODE_SLEW_RATE;
  967. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  968. return 0;
  969. }
  970. static int keembay_pinconf_get_schmitt(struct keembay_pinctrl *kpc, unsigned int pin)
  971. {
  972. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  973. return !!(val & KEEMBAY_GPIO_MODE_SCHMITT_EN);
  974. }
  975. static int keembay_pinconf_set_schmitt(struct keembay_pinctrl *kpc, unsigned int pin,
  976. unsigned int schmitt_en)
  977. {
  978. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  979. if (schmitt_en)
  980. val |= KEEMBAY_GPIO_MODE_SCHMITT_EN;
  981. else
  982. val &= ~KEEMBAY_GPIO_MODE_SCHMITT_EN;
  983. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  984. return 0;
  985. }
  986. static int keembay_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  987. unsigned long *cfg)
  988. {
  989. struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
  990. unsigned int param = pinconf_to_config_param(*cfg);
  991. unsigned int val;
  992. if (pin >= kpc->npins)
  993. return -EINVAL;
  994. switch (param) {
  995. case PIN_CONFIG_BIAS_DISABLE:
  996. if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_DISABLE)
  997. return -EINVAL;
  998. break;
  999. case PIN_CONFIG_BIAS_PULL_UP:
  1000. if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_UP)
  1001. return -EINVAL;
  1002. break;
  1003. case PIN_CONFIG_BIAS_PULL_DOWN:
  1004. if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_PULL_DOWN)
  1005. return -EINVAL;
  1006. break;
  1007. case PIN_CONFIG_BIAS_BUS_HOLD:
  1008. if (keembay_pinconf_get_pull(kpc, pin) != KEEMBAY_GPIO_BUS_HOLD)
  1009. return -EINVAL;
  1010. break;
  1011. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  1012. if (!keembay_pinconf_get_schmitt(kpc, pin))
  1013. return -EINVAL;
  1014. break;
  1015. case PIN_CONFIG_SLEW_RATE:
  1016. val = keembay_pinconf_get_slew_rate(kpc, pin);
  1017. *cfg = pinconf_to_config_packed(param, val);
  1018. break;
  1019. case PIN_CONFIG_DRIVE_STRENGTH:
  1020. val = keembay_pinconf_get_drive(kpc, pin);
  1021. *cfg = pinconf_to_config_packed(param, val);
  1022. break;
  1023. default:
  1024. return -ENOTSUPP;
  1025. }
  1026. return 0;
  1027. }
  1028. static int keembay_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  1029. unsigned long *cfg, unsigned int num_configs)
  1030. {
  1031. struct keembay_pinctrl *kpc = pinctrl_dev_get_drvdata(pctldev);
  1032. enum pin_config_param param;
  1033. unsigned int arg, i;
  1034. int ret = 0;
  1035. if (pin >= kpc->npins)
  1036. return -EINVAL;
  1037. for (i = 0; i < num_configs; i++) {
  1038. param = pinconf_to_config_param(cfg[i]);
  1039. arg = pinconf_to_config_argument(cfg[i]);
  1040. switch (param) {
  1041. case PIN_CONFIG_BIAS_DISABLE:
  1042. ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_DISABLE);
  1043. break;
  1044. case PIN_CONFIG_BIAS_PULL_UP:
  1045. ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_UP);
  1046. break;
  1047. case PIN_CONFIG_BIAS_PULL_DOWN:
  1048. ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_PULL_DOWN);
  1049. break;
  1050. case PIN_CONFIG_BIAS_BUS_HOLD:
  1051. ret = keembay_pinconf_set_pull(kpc, pin, KEEMBAY_GPIO_BUS_HOLD);
  1052. break;
  1053. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  1054. ret = keembay_pinconf_set_schmitt(kpc, pin, arg);
  1055. break;
  1056. case PIN_CONFIG_SLEW_RATE:
  1057. ret = keembay_pinconf_set_slew_rate(kpc, pin, arg);
  1058. break;
  1059. case PIN_CONFIG_DRIVE_STRENGTH:
  1060. ret = keembay_pinconf_set_drive(kpc, pin, arg);
  1061. break;
  1062. default:
  1063. return -ENOTSUPP;
  1064. }
  1065. if (ret)
  1066. return ret;
  1067. }
  1068. return ret;
  1069. }
  1070. static const struct pinctrl_ops keembay_pctlops = {
  1071. .get_groups_count = pinctrl_generic_get_group_count,
  1072. .get_group_name = pinctrl_generic_get_group_name,
  1073. .get_group_pins = pinctrl_generic_get_group_pins,
  1074. .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
  1075. .dt_free_map = pinconf_generic_dt_free_map,
  1076. };
  1077. static const struct pinmux_ops keembay_pmxops = {
  1078. .get_functions_count = pinmux_generic_get_function_count,
  1079. .get_function_name = pinmux_generic_get_function_name,
  1080. .get_function_groups = pinmux_generic_get_function_groups,
  1081. .gpio_request_enable = keembay_request_gpio,
  1082. .set_mux = keembay_set_mux,
  1083. };
  1084. static const struct pinconf_ops keembay_confops = {
  1085. .is_generic = true,
  1086. .pin_config_get = keembay_pinconf_get,
  1087. .pin_config_set = keembay_pinconf_set,
  1088. };
  1089. static struct pinctrl_desc keembay_pinctrl_desc = {
  1090. .name = "keembay-pinmux",
  1091. .pctlops = &keembay_pctlops,
  1092. .pmxops = &keembay_pmxops,
  1093. .confops = &keembay_confops,
  1094. .owner = THIS_MODULE,
  1095. };
  1096. static int keembay_gpio_get(struct gpio_chip *gc, unsigned int pin)
  1097. {
  1098. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1099. unsigned int val, offset;
  1100. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1101. offset = (val & KEEMBAY_GPIO_MODE_DIR) ? KEEMBAY_GPIO_DATA_IN : KEEMBAY_GPIO_DATA_OUT;
  1102. return keembay_read_pin(kpc->base0 + offset, pin);
  1103. }
  1104. static int keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
  1105. {
  1106. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1107. unsigned int reg_val;
  1108. reg_val = keembay_read_gpio_reg(kpc->base0 + KEEMBAY_GPIO_DATA_OUT, pin);
  1109. if (val)
  1110. keembay_write_gpio_reg(reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
  1111. kpc->base0 + KEEMBAY_GPIO_DATA_HIGH, pin);
  1112. else
  1113. keembay_write_gpio_reg(~reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
  1114. kpc->base0 + KEEMBAY_GPIO_DATA_LOW, pin);
  1115. return 0;
  1116. }
  1117. static int keembay_gpio_get_direction(struct gpio_chip *gc, unsigned int pin)
  1118. {
  1119. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1120. unsigned int val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1121. return !!(val & KEEMBAY_GPIO_MODE_DIR);
  1122. }
  1123. static int keembay_gpio_set_direction_in(struct gpio_chip *gc, unsigned int pin)
  1124. {
  1125. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1126. unsigned int val;
  1127. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1128. val |= KEEMBAY_GPIO_MODE_DIR;
  1129. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1130. return 0;
  1131. }
  1132. static int keembay_gpio_set_direction_out(struct gpio_chip *gc,
  1133. unsigned int pin, int value)
  1134. {
  1135. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1136. unsigned int val;
  1137. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1138. val &= ~KEEMBAY_GPIO_MODE_DIR;
  1139. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
  1140. return keembay_gpio_set(gc, pin, value);
  1141. }
  1142. static void keembay_gpio_irq_handler(struct irq_desc *desc)
  1143. {
  1144. struct gpio_chip *gc = irq_desc_get_handler_data(desc);
  1145. unsigned int kmb_irq = irq_desc_get_irq(desc);
  1146. unsigned long reg, clump = 0, bit = 0;
  1147. struct irq_chip *parent_chip;
  1148. struct keembay_pinctrl *kpc;
  1149. unsigned int src, pin, val;
  1150. /* Identify GPIO interrupt number from GIC interrupt number */
  1151. for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
  1152. if (kmb_irq == gc->irq.parents[src])
  1153. break;
  1154. }
  1155. if (src == KEEMBAY_GPIO_NUM_IRQ)
  1156. return;
  1157. parent_chip = irq_desc_get_chip(desc);
  1158. kpc = gpiochip_get_data(gc);
  1159. chained_irq_enter(parent_chip, desc);
  1160. reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1161. /*
  1162. * Each Interrupt line can be shared by up to 4 GPIO pins. Enable bit
  1163. * and input values were checked to identify the source of the
  1164. * Interrupt. The checked enable bit positions are 7, 15, 23 and 31.
  1165. */
  1166. for_each_set_clump8(bit, clump, &reg, BITS_PER_TYPE(typeof(reg))) {
  1167. pin = clump & ~KEEMBAY_GPIO_IRQ_ENABLE;
  1168. val = keembay_read_pin(kpc->base0 + KEEMBAY_GPIO_DATA_IN, pin);
  1169. kmb_irq = irq_find_mapping(gc->irq.domain, pin);
  1170. /* Checks if the interrupt is enabled */
  1171. if (val && (clump & KEEMBAY_GPIO_IRQ_ENABLE))
  1172. generic_handle_irq(kmb_irq);
  1173. }
  1174. chained_irq_exit(parent_chip, desc);
  1175. }
  1176. static void keembay_gpio_clear_irq(struct irq_data *data, unsigned long pos,
  1177. u32 src, irq_hw_number_t pin)
  1178. {
  1179. struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
  1180. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1181. unsigned long trig = irqd_get_trigger_type(data);
  1182. struct keembay_gpio_irq *irq = &kpc->irq[src];
  1183. unsigned long val;
  1184. /* Check if the value of pos/KEEMBAY_GPIO_NUM_IRQ is in valid range. */
  1185. if ((pos / KEEMBAY_GPIO_NUM_IRQ) >= KEEMBAY_GPIO_MAX_PER_IRQ)
  1186. return;
  1187. /* Retains val register as it handles other interrupts as well. */
  1188. val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1189. bitmap_set_value8(&val, 0, pos);
  1190. keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1191. irq->num_share--;
  1192. irq->pins[pos / KEEMBAY_GPIO_NUM_IRQ] = 0;
  1193. if (trig & IRQ_TYPE_LEVEL_MASK)
  1194. keembay_gpio_restore_default(kpc, pin);
  1195. if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
  1196. kpc->max_gpios_level_type++;
  1197. else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
  1198. kpc->max_gpios_edge_type++;
  1199. }
  1200. static int keembay_find_free_slot(struct keembay_pinctrl *kpc, unsigned int src)
  1201. {
  1202. unsigned long val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1203. return bitmap_find_free_region(&val, KEEMBAY_GPIO_MAX_PER_REG, 3) / KEEMBAY_GPIO_NUM_IRQ;
  1204. }
  1205. static int keembay_find_free_src(struct keembay_pinctrl *kpc, unsigned int trig)
  1206. {
  1207. int src, type = 0;
  1208. if (trig & IRQ_TYPE_LEVEL_MASK)
  1209. type = IRQ_TYPE_LEVEL_HIGH;
  1210. else if (trig & IRQ_TYPE_EDGE_BOTH)
  1211. type = IRQ_TYPE_EDGE_RISING;
  1212. for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
  1213. if (kpc->irq[src].trigger != type)
  1214. continue;
  1215. if (!keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src) ||
  1216. kpc->irq[src].num_share < KEEMBAY_GPIO_MAX_PER_IRQ)
  1217. return src;
  1218. }
  1219. return -EBUSY;
  1220. }
  1221. static void keembay_gpio_set_irq(struct keembay_pinctrl *kpc, int src,
  1222. int slot, irq_hw_number_t pin)
  1223. {
  1224. unsigned long val = pin | KEEMBAY_GPIO_IRQ_ENABLE;
  1225. struct keembay_gpio_irq *irq = &kpc->irq[src];
  1226. unsigned long flags, reg;
  1227. raw_spin_lock_irqsave(&kpc->lock, flags);
  1228. reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1229. bitmap_set_value8(&reg, val, slot * 8);
  1230. keembay_write_reg(reg, kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1231. raw_spin_unlock_irqrestore(&kpc->lock, flags);
  1232. if (irq->trigger == IRQ_TYPE_LEVEL_HIGH)
  1233. kpc->max_gpios_level_type--;
  1234. else if (irq->trigger == IRQ_TYPE_EDGE_RISING)
  1235. kpc->max_gpios_edge_type--;
  1236. irq->source = src;
  1237. irq->pins[slot] = pin;
  1238. irq->num_share++;
  1239. }
  1240. static void keembay_gpio_irq_enable(struct irq_data *data)
  1241. {
  1242. struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
  1243. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1244. unsigned int trig = irqd_get_trigger_type(data);
  1245. irq_hw_number_t pin = irqd_to_hwirq(data);
  1246. int src, slot;
  1247. /* Check which Interrupt source and slot is available */
  1248. src = keembay_find_free_src(kpc, trig);
  1249. slot = keembay_find_free_slot(kpc, src);
  1250. if (src < 0 || slot < 0)
  1251. return;
  1252. if (trig & KEEMBAY_GPIO_SENSE_LOW)
  1253. keembay_gpio_invert(kpc, pin);
  1254. keembay_gpio_set_irq(kpc, src, slot, pin);
  1255. }
  1256. static void keembay_gpio_irq_ack(struct irq_data *data)
  1257. {
  1258. /*
  1259. * The keembay_gpio_irq_ack function is needed to handle_edge_irq.
  1260. * IRQ ack is not possible from the SOC perspective. The IP by itself
  1261. * is used for handling interrupts which do not come in short-time and
  1262. * not used as protocol or communication interrupts. All the interrupts
  1263. * are threaded IRQ interrupts. But this function is expected to be
  1264. * present as the gpio IP is registered with irq framework. Otherwise
  1265. * handle_edge_irq() fails.
  1266. */
  1267. }
  1268. static void keembay_gpio_irq_disable(struct irq_data *data)
  1269. {
  1270. struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
  1271. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1272. irq_hw_number_t pin = irqd_to_hwirq(data);
  1273. unsigned long reg, clump = 0, pos = 0;
  1274. unsigned int src;
  1275. for (src = 0; src < KEEMBAY_GPIO_NUM_IRQ; src++) {
  1276. reg = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_INT_CFG, src);
  1277. for_each_set_clump8(pos, clump, &reg, BITS_PER_TYPE(typeof(reg))) {
  1278. if ((clump & ~KEEMBAY_GPIO_IRQ_ENABLE) == pin) {
  1279. keembay_gpio_clear_irq(data, pos, src, pin);
  1280. return;
  1281. }
  1282. }
  1283. }
  1284. }
  1285. static int keembay_gpio_irq_set_type(struct irq_data *data, unsigned int type)
  1286. {
  1287. struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
  1288. struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
  1289. /* Change EDGE_BOTH as EDGE_RISING in order to claim the IRQ for power button */
  1290. if (!kpc->max_gpios_edge_type && (type & IRQ_TYPE_EDGE_BOTH))
  1291. type = IRQ_TYPE_EDGE_RISING;
  1292. if (!kpc->max_gpios_level_type && (type & IRQ_TYPE_LEVEL_MASK))
  1293. type = IRQ_TYPE_NONE;
  1294. if (type & IRQ_TYPE_EDGE_BOTH)
  1295. irq_set_handler_locked(data, handle_edge_irq);
  1296. else if (type & IRQ_TYPE_LEVEL_MASK)
  1297. irq_set_handler_locked(data, handle_level_irq);
  1298. else
  1299. return -EINVAL;
  1300. return 0;
  1301. }
  1302. static int keembay_gpio_add_pin_ranges(struct gpio_chip *chip)
  1303. {
  1304. struct keembay_pinctrl *kpc = gpiochip_get_data(chip);
  1305. int ret;
  1306. ret = gpiochip_add_pin_range(chip, dev_name(kpc->dev), 0, 0, chip->ngpio);
  1307. if (ret)
  1308. dev_err_probe(kpc->dev, ret, "failed to add GPIO pin range\n");
  1309. return ret;
  1310. }
  1311. static struct irq_chip keembay_gpio_irqchip = {
  1312. .name = "keembay-gpio",
  1313. .irq_enable = keembay_gpio_irq_enable,
  1314. .irq_disable = keembay_gpio_irq_disable,
  1315. .irq_set_type = keembay_gpio_irq_set_type,
  1316. .irq_ack = keembay_gpio_irq_ack,
  1317. };
  1318. static int keembay_gpiochip_probe(struct keembay_pinctrl *kpc,
  1319. struct platform_device *pdev)
  1320. {
  1321. unsigned int i, level_line = 0, edge_line = 0;
  1322. struct gpio_chip *gc = &kpc->chip;
  1323. struct gpio_irq_chip *girq;
  1324. /* Setup GPIO IRQ chip */
  1325. girq = &kpc->chip.irq;
  1326. girq->chip = &keembay_gpio_irqchip;
  1327. girq->parent_handler = keembay_gpio_irq_handler;
  1328. girq->num_parents = KEEMBAY_GPIO_NUM_IRQ;
  1329. girq->parents = devm_kcalloc(kpc->dev, girq->num_parents,
  1330. sizeof(*girq->parents), GFP_KERNEL);
  1331. if (!girq->parents)
  1332. return -ENOMEM;
  1333. /* Setup GPIO chip */
  1334. gc->label = dev_name(kpc->dev);
  1335. gc->parent = kpc->dev;
  1336. gc->request = gpiochip_generic_request;
  1337. gc->free = gpiochip_generic_free;
  1338. gc->get_direction = keembay_gpio_get_direction;
  1339. gc->direction_input = keembay_gpio_set_direction_in;
  1340. gc->direction_output = keembay_gpio_set_direction_out;
  1341. gc->get = keembay_gpio_get;
  1342. gc->set = keembay_gpio_set;
  1343. gc->set_config = gpiochip_generic_config;
  1344. gc->base = -1;
  1345. gc->ngpio = kpc->npins;
  1346. gc->add_pin_ranges = keembay_gpio_add_pin_ranges;
  1347. for (i = 0; i < KEEMBAY_GPIO_NUM_IRQ; i++) {
  1348. struct keembay_gpio_irq *kmb_irq = &kpc->irq[i];
  1349. int irq;
  1350. irq = platform_get_irq_optional(pdev, i);
  1351. if (irq <= 0)
  1352. continue;
  1353. girq->parents[i] = irq;
  1354. kmb_irq->line = girq->parents[i];
  1355. kmb_irq->source = i;
  1356. kmb_irq->trigger = irq_get_trigger_type(girq->parents[i]);
  1357. kmb_irq->num_share = 0;
  1358. if (kmb_irq->trigger == IRQ_TYPE_LEVEL_HIGH)
  1359. level_line++;
  1360. else
  1361. edge_line++;
  1362. }
  1363. kpc->max_gpios_level_type = level_line * KEEMBAY_GPIO_MAX_PER_IRQ;
  1364. kpc->max_gpios_edge_type = edge_line * KEEMBAY_GPIO_MAX_PER_IRQ;
  1365. girq->default_type = IRQ_TYPE_NONE;
  1366. girq->handler = handle_bad_irq;
  1367. return devm_gpiochip_add_data(kpc->dev, gc, kpc);
  1368. }
  1369. static int keembay_build_groups(struct keembay_pinctrl *kpc)
  1370. {
  1371. struct pingroup *grp;
  1372. unsigned int i;
  1373. kpc->ngroups = kpc->npins;
  1374. grp = devm_kcalloc(kpc->dev, kpc->ngroups, sizeof(*grp), GFP_KERNEL);
  1375. if (!grp)
  1376. return -ENOMEM;
  1377. /* Each pin is categorised as one group */
  1378. for (i = 0; i < kpc->ngroups; i++) {
  1379. const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
  1380. struct pingroup *kmb_grp = grp + i;
  1381. kmb_grp->name = pdesc->name;
  1382. kmb_grp->pins = (int *)&pdesc->number;
  1383. pinctrl_generic_add_group(kpc->pctrl, kmb_grp->name,
  1384. kmb_grp->pins, 1, NULL);
  1385. }
  1386. return 0;
  1387. }
  1388. static int keembay_pinctrl_reg(struct keembay_pinctrl *kpc, struct device *dev)
  1389. {
  1390. int ret;
  1391. keembay_pinctrl_desc.pins = keembay_pins;
  1392. ret = of_property_read_u32(dev->of_node, "ngpios", &kpc->npins);
  1393. if (ret < 0)
  1394. return ret;
  1395. keembay_pinctrl_desc.npins = kpc->npins;
  1396. kpc->pctrl = devm_pinctrl_register(kpc->dev, &keembay_pinctrl_desc, kpc);
  1397. return PTR_ERR_OR_ZERO(kpc->pctrl);
  1398. }
  1399. static int keembay_add_functions(struct keembay_pinctrl *kpc,
  1400. struct keembay_pinfunction *functions)
  1401. {
  1402. unsigned int i;
  1403. /* Assign the groups for each function */
  1404. for (i = 0; i < kpc->nfuncs; i++) {
  1405. struct keembay_pinfunction *func = &functions[i];
  1406. const char **group_names;
  1407. unsigned int grp_idx = 0;
  1408. int j;
  1409. group_names = devm_kcalloc(kpc->dev, func->func.ngroups,
  1410. sizeof(*group_names), GFP_KERNEL);
  1411. if (!group_names)
  1412. return -ENOMEM;
  1413. for (j = 0; j < kpc->npins; j++) {
  1414. const struct pinctrl_pin_desc *pdesc = &keembay_pins[j];
  1415. struct keembay_mux_desc *mux;
  1416. for (mux = pdesc->drv_data; mux->name; mux++) {
  1417. if (!strcmp(mux->name, func->func.name))
  1418. group_names[grp_idx++] = pdesc->name;
  1419. }
  1420. }
  1421. func->func.groups = group_names;
  1422. }
  1423. /* Add all functions */
  1424. for (i = 0; i < kpc->nfuncs; i++)
  1425. pinmux_generic_add_pinfunction(kpc->pctrl, &functions[i].func,
  1426. &functions[i].mux_mode);
  1427. return 0;
  1428. }
  1429. static int keembay_build_functions(struct keembay_pinctrl *kpc)
  1430. {
  1431. struct keembay_pinfunction *keembay_funcs, *new_funcs;
  1432. int i;
  1433. /*
  1434. * Allocate maximum possible number of functions. Assume every pin
  1435. * being part of 8 (hw maximum) globally unique muxes.
  1436. */
  1437. kpc->nfuncs = 0;
  1438. keembay_funcs = devm_kcalloc(kpc->dev, kpc->npins * 8,
  1439. sizeof(*keembay_funcs), GFP_KERNEL);
  1440. if (!keembay_funcs)
  1441. return -ENOMEM;
  1442. /* Setup 1 function for each unique mux */
  1443. for (i = 0; i < kpc->npins; i++) {
  1444. const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
  1445. struct keembay_mux_desc *mux;
  1446. for (mux = pdesc->drv_data; mux->name; mux++) {
  1447. struct keembay_pinfunction *fdesc;
  1448. /* Check if we already have function for this mux */
  1449. for (fdesc = keembay_funcs; fdesc->func.name; fdesc++) {
  1450. if (!strcmp(mux->name, fdesc->func.name)) {
  1451. fdesc->func.ngroups++;
  1452. break;
  1453. }
  1454. }
  1455. /* Setup new function for this mux we didn't see before */
  1456. if (!fdesc->func.name) {
  1457. fdesc->func.name = mux->name;
  1458. fdesc->func.ngroups = 1;
  1459. fdesc->mux_mode = mux->mode;
  1460. kpc->nfuncs++;
  1461. }
  1462. }
  1463. }
  1464. /* Reallocate memory based on actual number of functions */
  1465. new_funcs = devm_krealloc_array(kpc->dev, keembay_funcs,
  1466. kpc->nfuncs, sizeof(*new_funcs),
  1467. GFP_KERNEL);
  1468. if (!new_funcs)
  1469. return -ENOMEM;
  1470. return keembay_add_functions(kpc, new_funcs);
  1471. }
  1472. static const struct keembay_pin_soc keembay_data = {
  1473. .pins = keembay_pins,
  1474. };
  1475. static const struct of_device_id keembay_pinctrl_match[] = {
  1476. { .compatible = "intel,keembay-pinctrl", .data = &keembay_data },
  1477. { }
  1478. };
  1479. MODULE_DEVICE_TABLE(of, keembay_pinctrl_match);
  1480. static int keembay_pinctrl_probe(struct platform_device *pdev)
  1481. {
  1482. struct device *dev = &pdev->dev;
  1483. struct keembay_pinctrl *kpc;
  1484. int ret;
  1485. kpc = devm_kzalloc(dev, sizeof(*kpc), GFP_KERNEL);
  1486. if (!kpc)
  1487. return -ENOMEM;
  1488. kpc->dev = dev;
  1489. kpc->soc = device_get_match_data(dev);
  1490. kpc->base0 = devm_platform_ioremap_resource(pdev, 0);
  1491. if (IS_ERR(kpc->base0))
  1492. return PTR_ERR(kpc->base0);
  1493. kpc->base1 = devm_platform_ioremap_resource(pdev, 1);
  1494. if (IS_ERR(kpc->base1))
  1495. return PTR_ERR(kpc->base1);
  1496. raw_spin_lock_init(&kpc->lock);
  1497. ret = keembay_pinctrl_reg(kpc, dev);
  1498. if (ret)
  1499. return ret;
  1500. ret = keembay_build_groups(kpc);
  1501. if (ret)
  1502. return ret;
  1503. ret = keembay_build_functions(kpc);
  1504. if (ret)
  1505. return ret;
  1506. ret = keembay_gpiochip_probe(kpc, pdev);
  1507. if (ret)
  1508. return ret;
  1509. platform_set_drvdata(pdev, kpc);
  1510. return 0;
  1511. }
  1512. static struct platform_driver keembay_pinctrl_driver = {
  1513. .probe = keembay_pinctrl_probe,
  1514. .driver = {
  1515. .name = "keembay-pinctrl",
  1516. .of_match_table = keembay_pinctrl_match,
  1517. },
  1518. };
  1519. module_platform_driver(keembay_pinctrl_driver);
  1520. MODULE_AUTHOR("Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>");
  1521. MODULE_AUTHOR("Vijayakannan Ayyathurai <vijayakannan.ayyathurai@intel.com>");
  1522. MODULE_AUTHOR("Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>");
  1523. MODULE_DESCRIPTION("Intel Keem Bay SoC pinctrl/GPIO driver");
  1524. MODULE_LICENSE("GPL");