pinctrl-keembay.c 51 KB

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