sppctl.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * SP7021 Pin Controller Driver.
  4. * Copyright (C) Sunplus Tech / Tibbo Tech.
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/device.h>
  8. #include <linux/err.h>
  9. #include <linux/gpio/driver.h>
  10. #include <linux/init.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/of_device.h>
  14. #include <linux/overflow.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/seq_file.h>
  17. #include <linux/slab.h>
  18. #include <linux/pinctrl/pinconf.h>
  19. #include <linux/pinctrl/pinconf-generic.h>
  20. #include <linux/pinctrl/pinmux.h>
  21. #include <dt-bindings/pinctrl/sppctl-sp7021.h>
  22. #include "../core.h"
  23. #include "../pinctrl-utils.h"
  24. #include "sppctl.h"
  25. struct sppctl_gpio_chip {
  26. void __iomem *gpioxt_base; /* MASTER, OE, OUT, IN, I_INV, O_INV, OD */
  27. void __iomem *first_base; /* GPIO_FIRST */
  28. struct gpio_chip chip;
  29. spinlock_t lock; /* lock for accessing OE register */
  30. };
  31. static inline u32 sppctl_first_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  32. {
  33. return readl(spp_gchip->first_base + SPPCTL_GPIO_OFF_FIRST + off);
  34. }
  35. static inline void sppctl_first_writel(struct sppctl_gpio_chip *spp_gchip, u32 val, u32 off)
  36. {
  37. writel(val, spp_gchip->first_base + SPPCTL_GPIO_OFF_FIRST + off);
  38. }
  39. static inline u32 sppctl_gpio_master_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  40. {
  41. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_MASTER + off);
  42. }
  43. static inline void sppctl_gpio_master_writel(struct sppctl_gpio_chip *spp_gchip, u32 val,
  44. u32 off)
  45. {
  46. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_MASTER + off);
  47. }
  48. static inline u32 sppctl_gpio_oe_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  49. {
  50. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OE + off);
  51. }
  52. static inline void sppctl_gpio_oe_writel(struct sppctl_gpio_chip *spp_gchip, u32 val, u32 off)
  53. {
  54. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OE + off);
  55. }
  56. static inline void sppctl_gpio_out_writel(struct sppctl_gpio_chip *spp_gchip, u32 val, u32 off)
  57. {
  58. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OUT + off);
  59. }
  60. static inline u32 sppctl_gpio_in_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  61. {
  62. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_IN + off);
  63. }
  64. static inline u32 sppctl_gpio_iinv_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  65. {
  66. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_IINV + off);
  67. }
  68. static inline void sppctl_gpio_iinv_writel(struct sppctl_gpio_chip *spp_gchip, u32 val,
  69. u32 off)
  70. {
  71. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_IINV + off);
  72. }
  73. static inline u32 sppctl_gpio_oinv_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  74. {
  75. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OINV + off);
  76. }
  77. static inline void sppctl_gpio_oinv_writel(struct sppctl_gpio_chip *spp_gchip, u32 val,
  78. u32 off)
  79. {
  80. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OINV + off);
  81. }
  82. static inline u32 sppctl_gpio_od_readl(struct sppctl_gpio_chip *spp_gchip, u32 off)
  83. {
  84. return readl(spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OD + off);
  85. }
  86. static inline void sppctl_gpio_od_writel(struct sppctl_gpio_chip *spp_gchip, u32 val, u32 off)
  87. {
  88. writel(val, spp_gchip->gpioxt_base + SPPCTL_GPIO_OFF_OD + off);
  89. }
  90. static inline u32 sppctl_get_reg_and_bit_offset(unsigned int offset, u32 *reg_off)
  91. {
  92. u32 bit_off;
  93. /* Each register has 32 bits. */
  94. *reg_off = (offset / 32) * 4;
  95. bit_off = offset % 32;
  96. return bit_off;
  97. }
  98. static inline u32 sppctl_get_moon_reg_and_bit_offset(unsigned int offset, u32 *reg_off)
  99. {
  100. u32 bit_off;
  101. /*
  102. * Each MOON register has 32 bits. Upper 16-bit word are mask-fields.
  103. * The lower 16-bit word are the control-fields. The corresponding
  104. * bits in mask-field should be set then you can write something to
  105. * control-field.
  106. */
  107. *reg_off = (offset / 16) * 4;
  108. bit_off = offset % 16;
  109. return bit_off;
  110. }
  111. static inline u32 sppctl_prep_moon_reg_and_offset(unsigned int offset, u32 *reg_off, int val)
  112. {
  113. u32 bit_off;
  114. bit_off = sppctl_get_moon_reg_and_bit_offset(offset, reg_off);
  115. if (val)
  116. return SPPCTL_SET_MOON_REG_BIT(bit_off);
  117. else
  118. return SPPCTL_CLR_MOON_REG_BIT(bit_off);
  119. }
  120. /**
  121. * sppctl_func_set() - Set pin of fully-pinmux function.
  122. *
  123. * Mask-fields and control-fields of fully-pinmux function of SP7021 are
  124. * arranged as shown below:
  125. *
  126. * func# | register | mask-field | control-field
  127. * -------+----------+--------------+---------------
  128. * 0 | base[0] | (22 : 16) | ( 6 : 0)
  129. * 1 | base[0] | (30 : 24) | (14 : 8)
  130. * 2 | base[1] | (22 : 16) | ( 6 : 0)
  131. * 3 | baeg[1] | (30 : 24) | (14 : 8)
  132. * : | : | : | :
  133. *
  134. * where mask-fields are used to protect control-fields from write-in
  135. * accidentally. Set the corresponding bits in the mask-field before
  136. * you write a value into a control-field.
  137. *
  138. * Control-fields are used to set where the function pin is going to
  139. * be routed to.
  140. *
  141. * Note that mask-fields and control-fields of even number of 'func'
  142. * are located at bits (22:16) and (6:0), while odd number of 'func's
  143. * are located at bits (30:24) and (14:8).
  144. */
  145. static void sppctl_func_set(struct sppctl_pdata *pctl, u8 func, u8 val)
  146. {
  147. u32 reg, offset;
  148. /*
  149. * Note that upper 16-bit word are mask-fields and lower 16-bit
  150. * word are the control-fields. Set corresponding bits in mask-
  151. * field before write to a control-field.
  152. */
  153. reg = SPPCTL_FULLY_PINMUX_MASK_MASK | val;
  154. /*
  155. * MUXF_L2SW_CLK_OUT is the first fully-pinmux pin
  156. * and its register offset is 0.
  157. */
  158. func -= MUXF_L2SW_CLK_OUT;
  159. /*
  160. * Check if 'func' is an odd number or not. Mask and control-
  161. * fields of odd number 'func' is located at upper portion of
  162. * a register. Extra shift is needed.
  163. */
  164. if (func & BIT(0))
  165. reg <<= SPPCTL_FULLY_PINMUX_UPPER_SHIFT;
  166. /* Convert func# to register offset w.r.t. base register. */
  167. offset = func * 2;
  168. offset &= GENMASK(31, 2);
  169. writel(reg, pctl->moon2_base + offset);
  170. }
  171. /**
  172. * sppctl_gmx_set() - Set pin of group-pinmux.
  173. *
  174. * Mask-fields and control-fields of group-pinmux function of SP7021 are
  175. * arranged as shown below:
  176. *
  177. * register | mask-fields | control-fields
  178. * ----------+--------------+----------------
  179. * base[0] | (31 : 16) | (15 : 0)
  180. * base[1] | (31 : 24) | (15 : 0)
  181. * base[2] | (31 : 24) | (15 : 0)
  182. * : | : | :
  183. *
  184. * where mask-fields are used to protect control-fields from write-in
  185. * accidentally. Set the corresponding bits in the mask-field before
  186. * you write a value into a control-field.
  187. *
  188. * Control-fields are used to set where the function pin is going to
  189. * be routed to. A control-field consists of one or more bits.
  190. */
  191. static void sppctl_gmx_set(struct sppctl_pdata *pctl, u8 reg_off, u8 bit_off, u8 bit_sz,
  192. u8 val)
  193. {
  194. u32 mask, reg;
  195. /*
  196. * Note that upper 16-bit word are mask-fields and lower 16-bit
  197. * word are the control-fields. Set corresponding bits in mask-
  198. * field before write to a control-field.
  199. */
  200. mask = GENMASK(bit_sz - 1, 0) << SPPCTL_MOON_REG_MASK_SHIFT;
  201. reg = (mask | val) << bit_off;
  202. writel(reg, pctl->moon1_base + reg_off * 4);
  203. }
  204. /**
  205. * sppctl_first_get() - get bit of FIRST register.
  206. *
  207. * There are 4 FIRST registers. Each has 32 control-bits.
  208. * Totally, there are 4 * 32 = 128 control-bits.
  209. * Control-bits are arranged as shown below:
  210. *
  211. * registers | control-bits
  212. * -----------+--------------
  213. * first[0] | (31 : 0)
  214. * first[1] | (63 : 32)
  215. * first[2] | (95 : 64)
  216. * first[3] | (127 : 96)
  217. *
  218. * Each control-bit sets type of a GPIO pin.
  219. * 0: a fully-pinmux pin
  220. * 1: a GPIO or IOP pin
  221. */
  222. static int sppctl_first_get(struct gpio_chip *chip, unsigned int offset)
  223. {
  224. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  225. u32 reg_off, bit_off, reg;
  226. bit_off = sppctl_get_reg_and_bit_offset(offset, &reg_off);
  227. reg = sppctl_first_readl(spp_gchip, reg_off);
  228. return (reg & BIT(bit_off)) ? 1 : 0;
  229. }
  230. /**
  231. * sppctl_master_get() - get bit of MASTER register.
  232. *
  233. * There are 8 MASTER registers. Each has 16 mask-bits and 16 control-bits.
  234. * Upper 16-bit of MASTER registers are mask-bits while lower 16-bit are
  235. * control-bits. Totally, there are 128 mask-bits and 128 control-bits.
  236. * They are arranged as shown below:
  237. *
  238. * register | mask-bits | control-bits
  239. * -----------+-------------+--------------
  240. * master[0] | (15 : 0) | (15 : 0)
  241. * master[1] | (31 : 16) | (31 : 16)
  242. * master[2] | (47 : 32) | (47 : 32)
  243. * : | : | :
  244. * master[7] | (127 : 112) | (127 : 112)
  245. *
  246. * where mask-bits are used to protect control-bits from write-in
  247. * accidentally. Set the corresponding mask-bit before you write
  248. * a value into a control-bit.
  249. *
  250. * Each control-bit sets type of a GPIO pin when FIRST bit is 1.
  251. * 0: a IOP pin
  252. * 1: a GPIO pin
  253. */
  254. static int sppctl_master_get(struct gpio_chip *chip, unsigned int offset)
  255. {
  256. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  257. u32 reg_off, bit_off, reg;
  258. bit_off = sppctl_get_moon_reg_and_bit_offset(offset, &reg_off);
  259. reg = sppctl_gpio_master_readl(spp_gchip, reg_off);
  260. return (reg & BIT(bit_off)) ? 1 : 0;
  261. }
  262. static void sppctl_first_master_set(struct gpio_chip *chip, unsigned int offset,
  263. enum mux_first_reg first, enum mux_master_reg master)
  264. {
  265. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  266. u32 reg_off, bit_off, reg;
  267. enum mux_first_reg val;
  268. /* FIRST register */
  269. if (first != mux_f_keep) {
  270. bit_off = sppctl_get_reg_and_bit_offset(offset, &reg_off);
  271. reg = sppctl_first_readl(spp_gchip, reg_off);
  272. val = (reg & BIT(bit_off)) ? mux_f_gpio : mux_f_mux;
  273. if (first != val)
  274. switch (first) {
  275. case mux_f_gpio:
  276. reg |= BIT(bit_off);
  277. sppctl_first_writel(spp_gchip, reg, reg_off);
  278. break;
  279. case mux_f_mux:
  280. reg &= ~BIT(bit_off);
  281. sppctl_first_writel(spp_gchip, reg, reg_off);
  282. break;
  283. case mux_f_keep:
  284. break;
  285. }
  286. }
  287. /* MASTER register */
  288. if (master != mux_m_keep) {
  289. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, (master == mux_m_gpio));
  290. sppctl_gpio_master_writel(spp_gchip, reg, reg_off);
  291. }
  292. }
  293. static void sppctl_gpio_input_inv_set(struct gpio_chip *chip, unsigned int offset)
  294. {
  295. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  296. u32 reg_off, reg;
  297. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 1);
  298. sppctl_gpio_iinv_writel(spp_gchip, reg, reg_off);
  299. }
  300. static void sppctl_gpio_output_inv_set(struct gpio_chip *chip, unsigned int offset)
  301. {
  302. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  303. u32 reg_off, reg;
  304. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 1);
  305. sppctl_gpio_oinv_writel(spp_gchip, reg, reg_off);
  306. }
  307. static int sppctl_gpio_output_od_get(struct gpio_chip *chip, unsigned int offset)
  308. {
  309. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  310. u32 reg_off, bit_off, reg;
  311. bit_off = sppctl_get_moon_reg_and_bit_offset(offset, &reg_off);
  312. reg = sppctl_gpio_od_readl(spp_gchip, reg_off);
  313. return (reg & BIT(bit_off)) ? 1 : 0;
  314. }
  315. static void sppctl_gpio_output_od_set(struct gpio_chip *chip, unsigned int offset,
  316. unsigned int val)
  317. {
  318. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  319. u32 reg_off, reg;
  320. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, val);
  321. sppctl_gpio_od_writel(spp_gchip, reg, reg_off);
  322. }
  323. static int sppctl_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
  324. {
  325. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  326. u32 reg_off, bit_off, reg;
  327. bit_off = sppctl_get_moon_reg_and_bit_offset(offset, &reg_off);
  328. reg = sppctl_gpio_oe_readl(spp_gchip, reg_off);
  329. return (reg & BIT(bit_off)) ? 0 : 1;
  330. }
  331. static int sppctl_gpio_inv_get(struct gpio_chip *chip, unsigned int offset)
  332. {
  333. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  334. u32 reg_off, bit_off, reg;
  335. unsigned long flags;
  336. bit_off = sppctl_get_moon_reg_and_bit_offset(offset, &reg_off);
  337. spin_lock_irqsave(&spp_gchip->lock, flags);
  338. if (sppctl_gpio_get_direction(chip, offset))
  339. reg = sppctl_gpio_iinv_readl(spp_gchip, reg_off);
  340. else
  341. reg = sppctl_gpio_oinv_readl(spp_gchip, reg_off);
  342. spin_unlock_irqrestore(&spp_gchip->lock, flags);
  343. return (reg & BIT(bit_off)) ? 1 : 0;
  344. }
  345. static int sppctl_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
  346. {
  347. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  348. unsigned long flags;
  349. u32 reg_off, reg;
  350. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 0);
  351. spin_lock_irqsave(&spp_gchip->lock, flags);
  352. sppctl_gpio_oe_writel(spp_gchip, reg, reg_off);
  353. spin_unlock_irqrestore(&spp_gchip->lock, flags);
  354. return 0;
  355. }
  356. static int sppctl_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int val)
  357. {
  358. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  359. unsigned long flags;
  360. u32 reg_off, reg;
  361. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 1);
  362. spin_lock_irqsave(&spp_gchip->lock, flags);
  363. sppctl_gpio_oe_writel(spp_gchip, reg, reg_off);
  364. if (val < 0) {
  365. spin_unlock_irqrestore(&spp_gchip->lock, flags);
  366. return 0;
  367. }
  368. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, val);
  369. sppctl_gpio_out_writel(spp_gchip, reg, reg_off);
  370. spin_unlock_irqrestore(&spp_gchip->lock, flags);
  371. return 0;
  372. }
  373. static int sppctl_gpio_get(struct gpio_chip *chip, unsigned int offset)
  374. {
  375. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  376. u32 reg_off, bit_off, reg;
  377. bit_off = sppctl_get_reg_and_bit_offset(offset, &reg_off);
  378. reg = sppctl_gpio_in_readl(spp_gchip, reg_off);
  379. return (reg & BIT(bit_off)) ? 1 : 0;
  380. }
  381. static void sppctl_gpio_set(struct gpio_chip *chip, unsigned int offset, int val)
  382. {
  383. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  384. u32 reg_off, reg;
  385. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, val);
  386. sppctl_gpio_out_writel(spp_gchip, reg, reg_off);
  387. }
  388. static int sppctl_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
  389. unsigned long config)
  390. {
  391. enum pin_config_param param = pinconf_to_config_param(config);
  392. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  393. u32 reg_off, reg;
  394. switch (param) {
  395. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  396. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 1);
  397. sppctl_gpio_od_writel(spp_gchip, reg, reg_off);
  398. break;
  399. case PIN_CONFIG_INPUT_ENABLE:
  400. break;
  401. case PIN_CONFIG_OUTPUT:
  402. return sppctl_gpio_direction_output(chip, offset, 0);
  403. case PIN_CONFIG_PERSIST_STATE:
  404. return -ENOTSUPP;
  405. default:
  406. return -EINVAL;
  407. }
  408. return 0;
  409. }
  410. #ifdef CONFIG_DEBUG_FS
  411. static void sppctl_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
  412. {
  413. const char *label;
  414. int i;
  415. for (i = 0; i < chip->ngpio; i++) {
  416. label = gpiochip_is_requested(chip, i);
  417. if (!label)
  418. label = "";
  419. seq_printf(s, " gpio-%03d (%-16.16s | %-16.16s)", i + chip->base,
  420. chip->names[i], label);
  421. seq_printf(s, " %c", sppctl_gpio_get_direction(chip, i) ? 'I' : 'O');
  422. seq_printf(s, ":%d", sppctl_gpio_get(chip, i));
  423. seq_printf(s, " %s", sppctl_first_get(chip, i) ? "gpi" : "mux");
  424. seq_printf(s, " %s", sppctl_master_get(chip, i) ? "gpi" : "iop");
  425. seq_printf(s, " %s", sppctl_gpio_inv_get(chip, i) ? "inv" : " ");
  426. seq_printf(s, " %s", sppctl_gpio_output_od_get(chip, i) ? "oDr" : "");
  427. seq_puts(s, "\n");
  428. }
  429. }
  430. #endif
  431. static int sppctl_gpio_new(struct platform_device *pdev, struct sppctl_pdata *pctl)
  432. {
  433. struct sppctl_gpio_chip *spp_gchip;
  434. struct gpio_chip *gchip;
  435. int err;
  436. spp_gchip = devm_kzalloc(&pdev->dev, sizeof(*spp_gchip), GFP_KERNEL);
  437. if (!spp_gchip)
  438. return -ENOMEM;
  439. pctl->spp_gchip = spp_gchip;
  440. spp_gchip->gpioxt_base = pctl->gpioxt_base;
  441. spp_gchip->first_base = pctl->first_base;
  442. spin_lock_init(&spp_gchip->lock);
  443. gchip = &spp_gchip->chip;
  444. gchip->label = SPPCTL_MODULE_NAME;
  445. gchip->parent = &pdev->dev;
  446. gchip->owner = THIS_MODULE;
  447. gchip->request = gpiochip_generic_request;
  448. gchip->free = gpiochip_generic_free;
  449. gchip->get_direction = sppctl_gpio_get_direction;
  450. gchip->direction_input = sppctl_gpio_direction_input;
  451. gchip->direction_output = sppctl_gpio_direction_output;
  452. gchip->get = sppctl_gpio_get;
  453. gchip->set = sppctl_gpio_set;
  454. gchip->set_config = sppctl_gpio_set_config;
  455. #ifdef CONFIG_DEBUG_FS
  456. gchip->dbg_show = sppctl_gpio_dbg_show;
  457. #endif
  458. gchip->base = -1;
  459. gchip->ngpio = sppctl_gpio_list_sz;
  460. gchip->names = sppctl_gpio_list_s;
  461. gchip->of_gpio_n_cells = 2;
  462. pctl->pctl_grange.npins = gchip->ngpio;
  463. pctl->pctl_grange.name = gchip->label;
  464. pctl->pctl_grange.gc = gchip;
  465. err = devm_gpiochip_add_data(&pdev->dev, gchip, spp_gchip);
  466. if (err)
  467. return dev_err_probe(&pdev->dev, err, "Failed to add gpiochip!\n");
  468. return 0;
  469. }
  470. static int sppctl_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
  471. unsigned long *config)
  472. {
  473. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  474. unsigned int param = pinconf_to_config_param(*config);
  475. unsigned int arg;
  476. switch (param) {
  477. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  478. if (!sppctl_gpio_output_od_get(&pctl->spp_gchip->chip, pin))
  479. return -EINVAL;
  480. arg = 0;
  481. break;
  482. case PIN_CONFIG_OUTPUT:
  483. if (!sppctl_first_get(&pctl->spp_gchip->chip, pin))
  484. return -EINVAL;
  485. if (!sppctl_master_get(&pctl->spp_gchip->chip, pin))
  486. return -EINVAL;
  487. if (sppctl_gpio_get_direction(&pctl->spp_gchip->chip, pin))
  488. return -EINVAL;
  489. arg = sppctl_gpio_get(&pctl->spp_gchip->chip, pin);
  490. break;
  491. default:
  492. return -EOPNOTSUPP;
  493. }
  494. *config = pinconf_to_config_packed(param, arg);
  495. return 0;
  496. }
  497. static int sppctl_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
  498. unsigned long *configs, unsigned int num_configs)
  499. {
  500. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  501. int i;
  502. /* Special handling for IOP pins */
  503. if (configs[0] == SPPCTL_IOP_CONFIGS) {
  504. sppctl_first_master_set(&pctl->spp_gchip->chip, pin, mux_f_gpio, mux_m_iop);
  505. return 0;
  506. }
  507. for (i = 0; i < num_configs; i++) {
  508. if (configs[i] & SPPCTL_PCTL_L_OUT)
  509. sppctl_gpio_direction_output(&pctl->spp_gchip->chip, pin, 0);
  510. if (configs[i] & SPPCTL_PCTL_L_OU1)
  511. sppctl_gpio_direction_output(&pctl->spp_gchip->chip, pin, 1);
  512. if (configs[i] & SPPCTL_PCTL_L_INV)
  513. sppctl_gpio_input_inv_set(&pctl->spp_gchip->chip, pin);
  514. if (configs[i] & SPPCTL_PCTL_L_ONV)
  515. sppctl_gpio_output_inv_set(&pctl->spp_gchip->chip, pin);
  516. if (configs[i] & SPPCTL_PCTL_L_ODR)
  517. sppctl_gpio_output_od_set(&pctl->spp_gchip->chip, pin, 1);
  518. }
  519. return 0;
  520. }
  521. static const struct pinconf_ops sppctl_pconf_ops = {
  522. .is_generic = true,
  523. .pin_config_get = sppctl_pin_config_get,
  524. .pin_config_set = sppctl_pin_config_set,
  525. };
  526. static int sppctl_get_functions_count(struct pinctrl_dev *pctldev)
  527. {
  528. return sppctl_list_funcs_sz;
  529. }
  530. static const char *sppctl_get_function_name(struct pinctrl_dev *pctldev,
  531. unsigned int selector)
  532. {
  533. return sppctl_list_funcs[selector].name;
  534. }
  535. static int sppctl_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector,
  536. const char * const **groups, unsigned int *num_groups)
  537. {
  538. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  539. const struct sppctl_func *f = &sppctl_list_funcs[selector];
  540. int i;
  541. *num_groups = 0;
  542. switch (f->type) {
  543. case pinmux_type_fpmx:
  544. *num_groups = sppctl_pmux_list_sz;
  545. *groups = sppctl_pmux_list_s;
  546. break;
  547. case pinmux_type_grp:
  548. if (!f->grps)
  549. break;
  550. *num_groups = f->gnum;
  551. for (i = 0; i < pctl->unq_grps_sz; i++)
  552. if (pctl->g2fp_maps[i].f_idx == selector)
  553. break;
  554. *groups = &pctl->unq_grps[i];
  555. break;
  556. default:
  557. dev_err(pctldev->dev, "Unknown pinmux (selector: %d, type: %d)\n",
  558. selector, f->type);
  559. break;
  560. }
  561. return 0;
  562. }
  563. /**
  564. * sppctl_fully_pinmux_conv - Convert GPIO# to fully-pinmux control-field setting
  565. *
  566. * Each fully-pinmux function can be mapped to any of GPIO 8 ~ 71 by
  567. * settings its control-field. Refer to following table:
  568. *
  569. * control-field | GPIO
  570. * --------------+--------
  571. * 0 | No map
  572. * 1 | 8
  573. * 2 | 9
  574. * 3 | 10
  575. * : | :
  576. * 65 | 71
  577. */
  578. static inline int sppctl_fully_pinmux_conv(unsigned int offset)
  579. {
  580. return (offset < 8) ? 0 : offset - 7;
  581. }
  582. static int sppctl_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
  583. unsigned int group_selector)
  584. {
  585. const struct sppctl_func *f = &sppctl_list_funcs[func_selector];
  586. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  587. struct grp2fp_map g2fpm = pctl->g2fp_maps[group_selector];
  588. int i;
  589. switch (f->type) {
  590. case pinmux_type_fpmx:
  591. sppctl_first_master_set(&pctl->spp_gchip->chip, group_selector,
  592. mux_f_mux, mux_m_keep);
  593. sppctl_func_set(pctl, func_selector, sppctl_fully_pinmux_conv(group_selector));
  594. break;
  595. case pinmux_type_grp:
  596. for (i = 0; i < f->grps[g2fpm.g_idx].pnum; i++)
  597. sppctl_first_master_set(&pctl->spp_gchip->chip,
  598. f->grps[g2fpm.g_idx].pins[i],
  599. mux_f_mux, mux_m_keep);
  600. sppctl_gmx_set(pctl, f->roff, f->boff, f->blen, f->grps[g2fpm.g_idx].gval);
  601. break;
  602. default:
  603. dev_err(pctldev->dev, "Unknown pinmux type (func_selector: %d, type: %d)\n",
  604. func_selector, f->type);
  605. break;
  606. }
  607. return 0;
  608. }
  609. static int sppctl_gpio_request_enable(struct pinctrl_dev *pctldev,
  610. struct pinctrl_gpio_range *range, unsigned int offset)
  611. {
  612. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  613. int g_f, g_m;
  614. g_f = sppctl_first_get(&pctl->spp_gchip->chip, offset);
  615. g_m = sppctl_master_get(&pctl->spp_gchip->chip, offset);
  616. if (g_f == mux_f_gpio && g_m == mux_m_gpio)
  617. return 0;
  618. sppctl_first_master_set(&pctl->spp_gchip->chip, offset, mux_f_gpio, mux_m_gpio);
  619. return 0;
  620. }
  621. static const struct pinmux_ops sppctl_pinmux_ops = {
  622. .get_functions_count = sppctl_get_functions_count,
  623. .get_function_name = sppctl_get_function_name,
  624. .get_function_groups = sppctl_get_function_groups,
  625. .set_mux = sppctl_set_mux,
  626. .gpio_request_enable = sppctl_gpio_request_enable,
  627. .strict = true,
  628. };
  629. static int sppctl_get_groups_count(struct pinctrl_dev *pctldev)
  630. {
  631. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  632. return pctl->unq_grps_sz;
  633. }
  634. static const char *sppctl_get_group_name(struct pinctrl_dev *pctldev, unsigned int selector)
  635. {
  636. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  637. return pctl->unq_grps[selector];
  638. }
  639. static int sppctl_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
  640. const unsigned int **pins, unsigned int *num_pins)
  641. {
  642. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  643. struct grp2fp_map g2fpm = pctl->g2fp_maps[selector];
  644. const struct sppctl_func *f;
  645. f = &sppctl_list_funcs[g2fpm.f_idx];
  646. *num_pins = 0;
  647. /* Except group-pinmux, each group has 1 pin. */
  648. if (f->type != pinmux_type_grp) {
  649. *num_pins = 1;
  650. *pins = &sppctl_pins_gpio[selector];
  651. return 0;
  652. }
  653. /* Group-pinmux may have more than one pin. */
  654. if (!f->grps)
  655. return 0;
  656. if (f->gnum < 1)
  657. return 0;
  658. *num_pins = f->grps[g2fpm.g_idx].pnum;
  659. *pins = f->grps[g2fpm.g_idx].pins;
  660. return 0;
  661. }
  662. #ifdef CONFIG_DEBUG_FS
  663. static void sppctl_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  664. unsigned int offset)
  665. {
  666. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  667. const char *pin_type;
  668. u8 first, master;
  669. first = sppctl_first_get(&pctl->spp_gchip->chip, offset);
  670. master = sppctl_master_get(&pctl->spp_gchip->chip, offset);
  671. if (first)
  672. if (master)
  673. pin_type = "GPIO";
  674. else
  675. pin_type = " IOP";
  676. else
  677. pin_type = " MUX";
  678. seq_printf(s, " %s", pin_type);
  679. }
  680. #endif
  681. static int sppctl_dt_node_to_map(struct pinctrl_dev *pctldev, struct device_node *np_config,
  682. struct pinctrl_map **map, unsigned int *num_maps)
  683. {
  684. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  685. int nmG = of_property_count_strings(np_config, "groups");
  686. const struct sppctl_func *f = NULL;
  687. u8 pin_num, pin_type, pin_func;
  688. struct device_node *parent;
  689. unsigned long *configs;
  690. struct property *prop;
  691. const char *s_f, *s_g;
  692. const __be32 *list;
  693. u32 dt_pin, dt_fun;
  694. int i, size = 0;
  695. list = of_get_property(np_config, "sunplus,pins", &size);
  696. *num_maps = size / sizeof(*list);
  697. /*
  698. * Process property:
  699. * sunplus,pins = < u32 u32 u32 ... >;
  700. *
  701. * Each 32-bit integer defines a individual pin in which:
  702. *
  703. * Bit 32~24: defines GPIO pin number. Its range is 0 ~ 98.
  704. * Bit 23~16: defines types: (1) fully-pinmux pins
  705. * (2) IO processor pins
  706. * (3) digital GPIO pins
  707. * Bit 15~8: defines pins of peripherals (which are defined in
  708. * 'include/dt-binging/pinctrl/sppctl.h').
  709. * Bit 7~0: defines types or initial-state of digital GPIO pins.
  710. */
  711. for (i = 0; i < (*num_maps); i++) {
  712. dt_pin = be32_to_cpu(list[i]);
  713. pin_num = FIELD_GET(GENMASK(31, 24), dt_pin);
  714. if (pin_num >= sppctl_pins_all_sz) {
  715. dev_err(pctldev->dev, "Invalid pin property at index %d (0x%08x)\n",
  716. i, dt_pin);
  717. return -EINVAL;
  718. }
  719. }
  720. if (nmG <= 0)
  721. nmG = 0;
  722. *map = kcalloc(*num_maps + nmG, sizeof(**map), GFP_KERNEL);
  723. if (!(*map))
  724. return -ENOMEM;
  725. parent = of_get_parent(np_config);
  726. for (i = 0; i < (*num_maps); i++) {
  727. dt_pin = be32_to_cpu(list[i]);
  728. pin_num = FIELD_GET(GENMASK(31, 24), dt_pin);
  729. pin_type = FIELD_GET(GENMASK(23, 16), dt_pin);
  730. pin_func = FIELD_GET(GENMASK(15, 8), dt_pin);
  731. (*map)[i].name = parent->name;
  732. if (pin_type == SPPCTL_PCTL_G_GPIO) {
  733. /* A digital GPIO pin */
  734. (*map)[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
  735. (*map)[i].data.configs.num_configs = 1;
  736. (*map)[i].data.configs.group_or_pin = pin_get_name(pctldev, pin_num);
  737. configs = kmalloc(sizeof(*configs), GFP_KERNEL);
  738. if (!configs)
  739. goto sppctl_map_err;
  740. *configs = FIELD_GET(GENMASK(7, 0), dt_pin);
  741. (*map)[i].data.configs.configs = configs;
  742. dev_dbg(pctldev->dev, "%s: GPIO (%s)\n",
  743. (*map)[i].data.configs.group_or_pin,
  744. (*configs & (SPPCTL_PCTL_L_OUT | SPPCTL_PCTL_L_OU1)) ?
  745. "OUT" : "IN");
  746. } else if (pin_type == SPPCTL_PCTL_G_IOPP) {
  747. /* A IO Processor (IOP) pin */
  748. (*map)[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
  749. (*map)[i].data.configs.num_configs = 1;
  750. (*map)[i].data.configs.group_or_pin = pin_get_name(pctldev, pin_num);
  751. configs = kmalloc(sizeof(*configs), GFP_KERNEL);
  752. if (!configs)
  753. goto sppctl_map_err;
  754. *configs = SPPCTL_IOP_CONFIGS;
  755. (*map)[i].data.configs.configs = configs;
  756. dev_dbg(pctldev->dev, "%s: IOP\n",
  757. (*map)[i].data.configs.group_or_pin);
  758. } else {
  759. /* A fully-pinmux pin */
  760. (*map)[i].type = PIN_MAP_TYPE_MUX_GROUP;
  761. (*map)[i].data.mux.function = sppctl_list_funcs[pin_func].name;
  762. (*map)[i].data.mux.group = pin_get_name(pctldev, pin_num);
  763. dev_dbg(pctldev->dev, "%s: %s\n", (*map)[i].data.mux.group,
  764. (*map)[i].data.mux.function);
  765. }
  766. }
  767. /*
  768. * Process properties:
  769. * function = "xxx";
  770. * groups = "yyy";
  771. */
  772. if (nmG > 0 && of_property_read_string(np_config, "function", &s_f) == 0) {
  773. of_property_for_each_string(np_config, "groups", prop, s_g) {
  774. (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
  775. (*map)[*num_maps].data.mux.function = s_f;
  776. (*map)[*num_maps].data.mux.group = s_g;
  777. (*num_maps)++;
  778. dev_dbg(pctldev->dev, "%s: %s\n", s_f, s_g);
  779. }
  780. }
  781. /*
  782. * Process property:
  783. * sunplus,zerofunc = < u32 u32 u32 ...>
  784. */
  785. list = of_get_property(np_config, "sunplus,zerofunc", &size);
  786. if (list) {
  787. for (i = 0; i < (size / sizeof(*list)); i++) {
  788. dt_fun = be32_to_cpu(list[i]);
  789. if (dt_fun >= sppctl_list_funcs_sz) {
  790. dev_err(pctldev->dev, "Zero-func %d out of range!\n",
  791. dt_fun);
  792. continue;
  793. }
  794. f = &sppctl_list_funcs[dt_fun];
  795. switch (f->type) {
  796. case pinmux_type_fpmx:
  797. sppctl_func_set(pctl, dt_fun, 0);
  798. dev_dbg(pctldev->dev, "%s: No map\n", f->name);
  799. break;
  800. case pinmux_type_grp:
  801. sppctl_gmx_set(pctl, f->roff, f->boff, f->blen, 0);
  802. dev_dbg(pctldev->dev, "%s: No map\n", f->name);
  803. break;
  804. default:
  805. dev_err(pctldev->dev, "Wrong zero-group: %d (%s)\n",
  806. dt_fun, f->name);
  807. break;
  808. }
  809. }
  810. }
  811. of_node_put(parent);
  812. dev_dbg(pctldev->dev, "%d pins mapped\n", *num_maps);
  813. return 0;
  814. sppctl_map_err:
  815. for (i = 0; i < (*num_maps); i++)
  816. if ((*map)[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
  817. kfree((*map)[i].data.configs.configs);
  818. kfree(*map);
  819. of_node_put(parent);
  820. return -ENOMEM;
  821. }
  822. static const struct pinctrl_ops sppctl_pctl_ops = {
  823. .get_groups_count = sppctl_get_groups_count,
  824. .get_group_name = sppctl_get_group_name,
  825. .get_group_pins = sppctl_get_group_pins,
  826. #ifdef CONFIG_DEBUG_FS
  827. .pin_dbg_show = sppctl_pin_dbg_show,
  828. #endif
  829. .dt_node_to_map = sppctl_dt_node_to_map,
  830. .dt_free_map = pinctrl_utils_free_map,
  831. };
  832. static int sppctl_group_groups(struct platform_device *pdev)
  833. {
  834. struct sppctl_pdata *sppctl = platform_get_drvdata(pdev);
  835. int i, k, j;
  836. /* Calculate number of total group (GPIO + group-pinmux group). */
  837. sppctl->unq_grps_sz = sppctl_gpio_list_sz;
  838. for (i = 0; i < sppctl_list_funcs_sz; i++)
  839. if (sppctl_list_funcs[i].type == pinmux_type_grp)
  840. sppctl->unq_grps_sz += sppctl_list_funcs[i].gnum;
  841. sppctl->unq_grps = devm_kcalloc(&pdev->dev, sppctl->unq_grps_sz + 1,
  842. sizeof(*sppctl->unq_grps), GFP_KERNEL);
  843. if (!sppctl->unq_grps)
  844. return -ENOMEM;
  845. sppctl->g2fp_maps = devm_kcalloc(&pdev->dev, sppctl->unq_grps_sz + 1,
  846. sizeof(*sppctl->g2fp_maps), GFP_KERNEL);
  847. if (!sppctl->g2fp_maps)
  848. return -ENOMEM;
  849. /* Add GPIO pins. */
  850. for (i = 0; i < sppctl_gpio_list_sz; i++) {
  851. sppctl->unq_grps[i] = sppctl_gpio_list_s[i];
  852. sppctl->g2fp_maps[i].f_idx = 0;
  853. sppctl->g2fp_maps[i].g_idx = i;
  854. }
  855. /* Add group-pinmux to end of GPIO pins. */
  856. j = sppctl_gpio_list_sz;
  857. for (i = 0; i < sppctl_list_funcs_sz; i++) {
  858. if (sppctl_list_funcs[i].type != pinmux_type_grp)
  859. continue;
  860. for (k = 0; k < sppctl_list_funcs[i].gnum; k++) {
  861. sppctl->unq_grps[j] = sppctl_list_funcs[i].grps[k].name;
  862. sppctl->g2fp_maps[j].f_idx = i;
  863. sppctl->g2fp_maps[j].g_idx = k;
  864. j++;
  865. }
  866. }
  867. return 0;
  868. }
  869. static int sppctl_pinctrl_init(struct platform_device *pdev)
  870. {
  871. struct sppctl_pdata *sppctl = platform_get_drvdata(pdev);
  872. int err;
  873. sppctl->pctl_desc.owner = THIS_MODULE;
  874. sppctl->pctl_desc.name = dev_name(&pdev->dev);
  875. sppctl->pctl_desc.pins = sppctl_pins_all;
  876. sppctl->pctl_desc.npins = sppctl_pins_all_sz;
  877. sppctl->pctl_desc.pctlops = &sppctl_pctl_ops;
  878. sppctl->pctl_desc.confops = &sppctl_pconf_ops;
  879. sppctl->pctl_desc.pmxops = &sppctl_pinmux_ops;
  880. err = sppctl_group_groups(pdev);
  881. if (err)
  882. return err;
  883. err = devm_pinctrl_register_and_init(&pdev->dev, &sppctl->pctl_desc,
  884. sppctl, &sppctl->pctl_dev);
  885. if (err)
  886. return dev_err_probe(&pdev->dev, err, "Failed to register pinctrl!\n");
  887. pinctrl_enable(sppctl->pctl_dev);
  888. return 0;
  889. }
  890. static int sppctl_resource_map(struct platform_device *pdev, struct sppctl_pdata *sppctl)
  891. {
  892. sppctl->moon2_base = devm_platform_ioremap_resource_byname(pdev, "moon2");
  893. if (IS_ERR(sppctl->moon2_base))
  894. return PTR_ERR(sppctl->moon2_base);
  895. sppctl->gpioxt_base = devm_platform_ioremap_resource_byname(pdev, "gpioxt");
  896. if (IS_ERR(sppctl->gpioxt_base))
  897. return PTR_ERR(sppctl->gpioxt_base);
  898. sppctl->first_base = devm_platform_ioremap_resource_byname(pdev, "first");
  899. if (IS_ERR(sppctl->first_base))
  900. return PTR_ERR(sppctl->first_base);
  901. sppctl->moon1_base = devm_platform_ioremap_resource_byname(pdev, "moon1");
  902. if (IS_ERR(sppctl->moon1_base))
  903. return PTR_ERR(sppctl->moon1_base);
  904. return 0;
  905. }
  906. static int sppctl_probe(struct platform_device *pdev)
  907. {
  908. struct sppctl_pdata *sppctl;
  909. int ret;
  910. sppctl = devm_kzalloc(&pdev->dev, sizeof(*sppctl), GFP_KERNEL);
  911. if (!sppctl)
  912. return -ENOMEM;
  913. platform_set_drvdata(pdev, sppctl);
  914. ret = sppctl_resource_map(pdev, sppctl);
  915. if (ret)
  916. return ret;
  917. ret = sppctl_gpio_new(pdev, sppctl);
  918. if (ret)
  919. return ret;
  920. ret = sppctl_pinctrl_init(pdev);
  921. if (ret)
  922. return ret;
  923. pinctrl_add_gpio_range(sppctl->pctl_dev, &sppctl->pctl_grange);
  924. return 0;
  925. }
  926. static const struct of_device_id sppctl_match_table[] = {
  927. { .compatible = "sunplus,sp7021-pctl" },
  928. { /* sentinel */ }
  929. };
  930. static struct platform_driver sppctl_pinctrl_driver = {
  931. .driver = {
  932. .name = SPPCTL_MODULE_NAME,
  933. .of_match_table = sppctl_match_table,
  934. },
  935. .probe = sppctl_probe,
  936. };
  937. builtin_platform_driver(sppctl_pinctrl_driver)
  938. MODULE_AUTHOR("Dvorkin Dmitry <[email protected]>");
  939. MODULE_AUTHOR("Wells Lu <[email protected]>");
  940. MODULE_DESCRIPTION("Sunplus SP7021 Pin Control and GPIO driver");
  941. MODULE_LICENSE("GPL v2");