sppctl.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * SP7021 Pin Controller Driver.
  4. * Copyright (C) Sunplus Tech / Tibbo Tech.
  5. */
  6. #include <linux/cleanup.h>
  7. #include <linux/bitfield.h>
  8. #include <linux/device.h>
  9. #include <linux/err.h>
  10. #include <linux/gpio/driver.h>
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/of.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 int 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. return 0;
  388. }
  389. static int sppctl_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
  390. unsigned long config)
  391. {
  392. enum pin_config_param param = pinconf_to_config_param(config);
  393. struct sppctl_gpio_chip *spp_gchip = gpiochip_get_data(chip);
  394. u32 reg_off, reg;
  395. switch (param) {
  396. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  397. reg = sppctl_prep_moon_reg_and_offset(offset, &reg_off, 1);
  398. sppctl_gpio_od_writel(spp_gchip, reg, reg_off);
  399. break;
  400. case PIN_CONFIG_INPUT_ENABLE:
  401. break;
  402. case PIN_CONFIG_LEVEL:
  403. return sppctl_gpio_direction_output(chip, offset, 0);
  404. case PIN_CONFIG_PERSIST_STATE:
  405. return -ENOTSUPP;
  406. default:
  407. return -EINVAL;
  408. }
  409. return 0;
  410. }
  411. static void sppctl_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
  412. {
  413. int i;
  414. for (i = 0; i < chip->ngpio; i++) {
  415. char *label __free(kfree) = gpiochip_dup_line_label(chip, i);
  416. if (IS_ERR(label))
  417. continue;
  418. seq_printf(s, " gpio-%03d (%-16.16s | %-16.16s)", i + chip->base,
  419. chip->names[i], label ?: "");
  420. seq_printf(s, " %c", sppctl_gpio_get_direction(chip, i) ? 'I' : 'O');
  421. seq_printf(s, ":%d", sppctl_gpio_get(chip, i));
  422. seq_printf(s, " %s", sppctl_first_get(chip, i) ? "gpi" : "mux");
  423. seq_printf(s, " %s", sppctl_master_get(chip, i) ? "gpi" : "iop");
  424. seq_printf(s, " %s", sppctl_gpio_inv_get(chip, i) ? "inv" : " ");
  425. seq_printf(s, " %s", sppctl_gpio_output_od_get(chip, i) ? "oDr" : "");
  426. seq_puts(s, "\n");
  427. }
  428. }
  429. static int sppctl_gpio_new(struct platform_device *pdev, struct sppctl_pdata *pctl)
  430. {
  431. struct sppctl_gpio_chip *spp_gchip;
  432. struct gpio_chip *gchip;
  433. int err;
  434. spp_gchip = devm_kzalloc(&pdev->dev, sizeof(*spp_gchip), GFP_KERNEL);
  435. if (!spp_gchip)
  436. return -ENOMEM;
  437. pctl->spp_gchip = spp_gchip;
  438. spp_gchip->gpioxt_base = pctl->gpioxt_base;
  439. spp_gchip->first_base = pctl->first_base;
  440. spin_lock_init(&spp_gchip->lock);
  441. gchip = &spp_gchip->chip;
  442. gchip->label = SPPCTL_MODULE_NAME;
  443. gchip->parent = &pdev->dev;
  444. gchip->owner = THIS_MODULE;
  445. gchip->request = gpiochip_generic_request;
  446. gchip->free = gpiochip_generic_free;
  447. gchip->get_direction = sppctl_gpio_get_direction;
  448. gchip->direction_input = sppctl_gpio_direction_input;
  449. gchip->direction_output = sppctl_gpio_direction_output;
  450. gchip->get = sppctl_gpio_get;
  451. gchip->set = sppctl_gpio_set;
  452. gchip->set_config = sppctl_gpio_set_config;
  453. gchip->dbg_show = IS_ENABLED(CONFIG_DEBUG_FS) ?
  454. sppctl_gpio_dbg_show : NULL;
  455. gchip->base = -1;
  456. gchip->ngpio = sppctl_gpio_list_sz;
  457. gchip->names = sppctl_gpio_list_s;
  458. pctl->pctl_grange.npins = gchip->ngpio;
  459. pctl->pctl_grange.name = gchip->label;
  460. pctl->pctl_grange.gc = gchip;
  461. err = devm_gpiochip_add_data(&pdev->dev, gchip, spp_gchip);
  462. if (err)
  463. return dev_err_probe(&pdev->dev, err, "Failed to add gpiochip!\n");
  464. return 0;
  465. }
  466. static int sppctl_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
  467. unsigned long *config)
  468. {
  469. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  470. unsigned int param = pinconf_to_config_param(*config);
  471. unsigned int arg;
  472. switch (param) {
  473. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  474. if (!sppctl_gpio_output_od_get(&pctl->spp_gchip->chip, pin))
  475. return -EINVAL;
  476. arg = 0;
  477. break;
  478. case PIN_CONFIG_LEVEL:
  479. if (!sppctl_first_get(&pctl->spp_gchip->chip, pin))
  480. return -EINVAL;
  481. if (!sppctl_master_get(&pctl->spp_gchip->chip, pin))
  482. return -EINVAL;
  483. if (sppctl_gpio_get_direction(&pctl->spp_gchip->chip, pin))
  484. return -EINVAL;
  485. arg = sppctl_gpio_get(&pctl->spp_gchip->chip, pin);
  486. break;
  487. default:
  488. return -EOPNOTSUPP;
  489. }
  490. *config = pinconf_to_config_packed(param, arg);
  491. return 0;
  492. }
  493. static int sppctl_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
  494. unsigned long *configs, unsigned int num_configs)
  495. {
  496. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  497. int i;
  498. /* Special handling for IOP pins */
  499. if (configs[0] == SPPCTL_IOP_CONFIGS) {
  500. sppctl_first_master_set(&pctl->spp_gchip->chip, pin, mux_f_gpio, mux_m_iop);
  501. return 0;
  502. }
  503. for (i = 0; i < num_configs; i++) {
  504. if (configs[i] & SPPCTL_PCTL_L_OUT)
  505. sppctl_gpio_direction_output(&pctl->spp_gchip->chip, pin, 0);
  506. if (configs[i] & SPPCTL_PCTL_L_OU1)
  507. sppctl_gpio_direction_output(&pctl->spp_gchip->chip, pin, 1);
  508. if (configs[i] & SPPCTL_PCTL_L_INV)
  509. sppctl_gpio_input_inv_set(&pctl->spp_gchip->chip, pin);
  510. if (configs[i] & SPPCTL_PCTL_L_ONV)
  511. sppctl_gpio_output_inv_set(&pctl->spp_gchip->chip, pin);
  512. if (configs[i] & SPPCTL_PCTL_L_ODR)
  513. sppctl_gpio_output_od_set(&pctl->spp_gchip->chip, pin, 1);
  514. }
  515. return 0;
  516. }
  517. static const struct pinconf_ops sppctl_pconf_ops = {
  518. .is_generic = true,
  519. .pin_config_get = sppctl_pin_config_get,
  520. .pin_config_set = sppctl_pin_config_set,
  521. };
  522. static int sppctl_get_functions_count(struct pinctrl_dev *pctldev)
  523. {
  524. return sppctl_list_funcs_sz;
  525. }
  526. static const char *sppctl_get_function_name(struct pinctrl_dev *pctldev,
  527. unsigned int selector)
  528. {
  529. return sppctl_list_funcs[selector].name;
  530. }
  531. static int sppctl_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector,
  532. const char * const **groups, unsigned int *num_groups)
  533. {
  534. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  535. const struct sppctl_func *f = &sppctl_list_funcs[selector];
  536. int i;
  537. *num_groups = 0;
  538. switch (f->type) {
  539. case pinmux_type_fpmx:
  540. *num_groups = sppctl_pmux_list_sz;
  541. *groups = sppctl_pmux_list_s;
  542. break;
  543. case pinmux_type_grp:
  544. if (!f->grps)
  545. break;
  546. *num_groups = f->gnum;
  547. for (i = 0; i < pctl->unq_grps_sz; i++)
  548. if (pctl->g2fp_maps[i].f_idx == selector)
  549. break;
  550. *groups = &pctl->unq_grps[i];
  551. break;
  552. default:
  553. dev_err(pctldev->dev, "Unknown pinmux (selector: %d, type: %d)\n",
  554. selector, f->type);
  555. break;
  556. }
  557. return 0;
  558. }
  559. /**
  560. * sppctl_fully_pinmux_conv - Convert GPIO# to fully-pinmux control-field setting
  561. *
  562. * Each fully-pinmux function can be mapped to any of GPIO 8 ~ 71 by
  563. * settings its control-field. Refer to following table:
  564. *
  565. * control-field | GPIO
  566. * --------------+--------
  567. * 0 | No map
  568. * 1 | 8
  569. * 2 | 9
  570. * 3 | 10
  571. * : | :
  572. * 65 | 71
  573. */
  574. static inline int sppctl_fully_pinmux_conv(unsigned int offset)
  575. {
  576. return (offset < 8) ? 0 : offset - 7;
  577. }
  578. static int sppctl_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
  579. unsigned int group_selector)
  580. {
  581. const struct sppctl_func *f = &sppctl_list_funcs[func_selector];
  582. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  583. struct grp2fp_map g2fpm = pctl->g2fp_maps[group_selector];
  584. int i;
  585. switch (f->type) {
  586. case pinmux_type_fpmx:
  587. sppctl_first_master_set(&pctl->spp_gchip->chip, group_selector,
  588. mux_f_mux, mux_m_keep);
  589. sppctl_func_set(pctl, func_selector, sppctl_fully_pinmux_conv(group_selector));
  590. break;
  591. case pinmux_type_grp:
  592. for (i = 0; i < f->grps[g2fpm.g_idx].pnum; i++)
  593. sppctl_first_master_set(&pctl->spp_gchip->chip,
  594. f->grps[g2fpm.g_idx].pins[i],
  595. mux_f_mux, mux_m_keep);
  596. sppctl_gmx_set(pctl, f->roff, f->boff, f->blen, f->grps[g2fpm.g_idx].gval);
  597. break;
  598. default:
  599. dev_err(pctldev->dev, "Unknown pinmux type (func_selector: %d, type: %d)\n",
  600. func_selector, f->type);
  601. break;
  602. }
  603. return 0;
  604. }
  605. static int sppctl_gpio_request_enable(struct pinctrl_dev *pctldev,
  606. struct pinctrl_gpio_range *range, unsigned int offset)
  607. {
  608. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  609. int g_f, g_m;
  610. g_f = sppctl_first_get(&pctl->spp_gchip->chip, offset);
  611. g_m = sppctl_master_get(&pctl->spp_gchip->chip, offset);
  612. if (g_f == mux_f_gpio && g_m == mux_m_gpio)
  613. return 0;
  614. sppctl_first_master_set(&pctl->spp_gchip->chip, offset, mux_f_gpio, mux_m_gpio);
  615. return 0;
  616. }
  617. static const struct pinmux_ops sppctl_pinmux_ops = {
  618. .get_functions_count = sppctl_get_functions_count,
  619. .get_function_name = sppctl_get_function_name,
  620. .get_function_groups = sppctl_get_function_groups,
  621. .set_mux = sppctl_set_mux,
  622. .gpio_request_enable = sppctl_gpio_request_enable,
  623. .strict = true,
  624. };
  625. static int sppctl_get_groups_count(struct pinctrl_dev *pctldev)
  626. {
  627. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  628. return pctl->unq_grps_sz;
  629. }
  630. static const char *sppctl_get_group_name(struct pinctrl_dev *pctldev, unsigned int selector)
  631. {
  632. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  633. return pctl->unq_grps[selector];
  634. }
  635. static int sppctl_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
  636. const unsigned int **pins, unsigned int *num_pins)
  637. {
  638. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  639. struct grp2fp_map g2fpm = pctl->g2fp_maps[selector];
  640. const struct sppctl_func *f;
  641. f = &sppctl_list_funcs[g2fpm.f_idx];
  642. *num_pins = 0;
  643. /* Except group-pinmux, each group has 1 pin. */
  644. if (f->type != pinmux_type_grp) {
  645. *num_pins = 1;
  646. *pins = &sppctl_pins_gpio[selector];
  647. return 0;
  648. }
  649. /* Group-pinmux may have more than one pin. */
  650. if (!f->grps)
  651. return 0;
  652. if (f->gnum < 1)
  653. return 0;
  654. *num_pins = f->grps[g2fpm.g_idx].pnum;
  655. *pins = f->grps[g2fpm.g_idx].pins;
  656. return 0;
  657. }
  658. #ifdef CONFIG_DEBUG_FS
  659. static void sppctl_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
  660. unsigned int offset)
  661. {
  662. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  663. const char *pin_type;
  664. u8 first, master;
  665. first = sppctl_first_get(&pctl->spp_gchip->chip, offset);
  666. master = sppctl_master_get(&pctl->spp_gchip->chip, offset);
  667. if (first)
  668. if (master)
  669. pin_type = "GPIO";
  670. else
  671. pin_type = " IOP";
  672. else
  673. pin_type = " MUX";
  674. seq_printf(s, " %s", pin_type);
  675. }
  676. #endif
  677. static int sppctl_dt_node_to_map(struct pinctrl_dev *pctldev, struct device_node *np_config,
  678. struct pinctrl_map **map, unsigned int *num_maps)
  679. {
  680. struct sppctl_pdata *pctl = pinctrl_dev_get_drvdata(pctldev);
  681. int nmG = of_property_count_strings(np_config, "groups");
  682. const struct sppctl_func *f = NULL;
  683. u8 pin_num, pin_type, pin_func;
  684. struct device_node *parent;
  685. unsigned long *configs;
  686. struct property *prop;
  687. const char *s_f, *s_g;
  688. const __be32 *list;
  689. u32 dt_pin, dt_fun;
  690. int i, size = 0;
  691. list = of_get_property(np_config, "sunplus,pins", &size);
  692. *num_maps = size / sizeof(*list);
  693. /*
  694. * Process property:
  695. * sunplus,pins = < u32 u32 u32 ... >;
  696. *
  697. * Each 32-bit integer defines a individual pin in which:
  698. *
  699. * Bit 32~24: defines GPIO pin number. Its range is 0 ~ 98.
  700. * Bit 23~16: defines types: (1) fully-pinmux pins
  701. * (2) IO processor pins
  702. * (3) digital GPIO pins
  703. * Bit 15~8: defines pins of peripherals (which are defined in
  704. * 'include/dt-binging/pinctrl/sppctl.h').
  705. * Bit 7~0: defines types or initial-state of digital GPIO pins.
  706. */
  707. for (i = 0; i < (*num_maps); i++) {
  708. dt_pin = be32_to_cpu(list[i]);
  709. pin_num = FIELD_GET(GENMASK(31, 24), dt_pin);
  710. if (pin_num >= sppctl_pins_all_sz) {
  711. dev_err(pctldev->dev, "Invalid pin property at index %d (0x%08x)\n",
  712. i, dt_pin);
  713. return -EINVAL;
  714. }
  715. }
  716. if (nmG <= 0)
  717. nmG = 0;
  718. *map = kzalloc_objs(**map, *num_maps + nmG);
  719. if (!(*map))
  720. return -ENOMEM;
  721. parent = of_get_parent(np_config);
  722. for (i = 0; i < (*num_maps); i++) {
  723. dt_pin = be32_to_cpu(list[i]);
  724. pin_num = FIELD_GET(GENMASK(31, 24), dt_pin);
  725. pin_type = FIELD_GET(GENMASK(23, 16), dt_pin);
  726. pin_func = FIELD_GET(GENMASK(15, 8), dt_pin);
  727. (*map)[i].name = parent->name;
  728. if (pin_type == SPPCTL_PCTL_G_GPIO) {
  729. /* A digital GPIO pin */
  730. (*map)[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
  731. (*map)[i].data.configs.num_configs = 1;
  732. (*map)[i].data.configs.group_or_pin = pin_get_name(pctldev, pin_num);
  733. configs = kmalloc_obj(*configs);
  734. if (!configs)
  735. goto sppctl_map_err;
  736. *configs = FIELD_GET(GENMASK(7, 0), dt_pin);
  737. (*map)[i].data.configs.configs = configs;
  738. dev_dbg(pctldev->dev, "%s: GPIO (%s)\n",
  739. (*map)[i].data.configs.group_or_pin,
  740. (*configs & (SPPCTL_PCTL_L_OUT | SPPCTL_PCTL_L_OU1)) ?
  741. "OUT" : "IN");
  742. } else if (pin_type == SPPCTL_PCTL_G_IOPP) {
  743. /* A IO Processor (IOP) pin */
  744. (*map)[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
  745. (*map)[i].data.configs.num_configs = 1;
  746. (*map)[i].data.configs.group_or_pin = pin_get_name(pctldev, pin_num);
  747. configs = kmalloc_obj(*configs);
  748. if (!configs)
  749. goto sppctl_map_err;
  750. *configs = SPPCTL_IOP_CONFIGS;
  751. (*map)[i].data.configs.configs = configs;
  752. dev_dbg(pctldev->dev, "%s: IOP\n",
  753. (*map)[i].data.configs.group_or_pin);
  754. } else {
  755. /* A fully-pinmux pin */
  756. (*map)[i].type = PIN_MAP_TYPE_MUX_GROUP;
  757. (*map)[i].data.mux.function = sppctl_list_funcs[pin_func].name;
  758. (*map)[i].data.mux.group = pin_get_name(pctldev, pin_num);
  759. dev_dbg(pctldev->dev, "%s: %s\n", (*map)[i].data.mux.group,
  760. (*map)[i].data.mux.function);
  761. }
  762. }
  763. /*
  764. * Process properties:
  765. * function = "xxx";
  766. * groups = "yyy";
  767. */
  768. if (nmG > 0 && of_property_read_string(np_config, "function", &s_f) == 0) {
  769. of_property_for_each_string(np_config, "groups", prop, s_g) {
  770. (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
  771. (*map)[*num_maps].data.mux.function = s_f;
  772. (*map)[*num_maps].data.mux.group = s_g;
  773. (*num_maps)++;
  774. dev_dbg(pctldev->dev, "%s: %s\n", s_f, s_g);
  775. }
  776. }
  777. /*
  778. * Process property:
  779. * sunplus,zerofunc = < u32 u32 u32 ...>
  780. */
  781. list = of_get_property(np_config, "sunplus,zerofunc", &size);
  782. if (list) {
  783. for (i = 0; i < (size / sizeof(*list)); i++) {
  784. dt_fun = be32_to_cpu(list[i]);
  785. if (dt_fun >= sppctl_list_funcs_sz) {
  786. dev_err(pctldev->dev, "Zero-func %d out of range!\n",
  787. dt_fun);
  788. continue;
  789. }
  790. f = &sppctl_list_funcs[dt_fun];
  791. switch (f->type) {
  792. case pinmux_type_fpmx:
  793. sppctl_func_set(pctl, dt_fun, 0);
  794. dev_dbg(pctldev->dev, "%s: No map\n", f->name);
  795. break;
  796. case pinmux_type_grp:
  797. sppctl_gmx_set(pctl, f->roff, f->boff, f->blen, 0);
  798. dev_dbg(pctldev->dev, "%s: No map\n", f->name);
  799. break;
  800. default:
  801. dev_err(pctldev->dev, "Wrong zero-group: %d (%s)\n",
  802. dt_fun, f->name);
  803. break;
  804. }
  805. }
  806. }
  807. of_node_put(parent);
  808. dev_dbg(pctldev->dev, "%d pins mapped\n", *num_maps);
  809. return 0;
  810. sppctl_map_err:
  811. for (i = 0; i < (*num_maps); i++)
  812. if ((*map)[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
  813. kfree((*map)[i].data.configs.configs);
  814. kfree(*map);
  815. of_node_put(parent);
  816. return -ENOMEM;
  817. }
  818. static const struct pinctrl_ops sppctl_pctl_ops = {
  819. .get_groups_count = sppctl_get_groups_count,
  820. .get_group_name = sppctl_get_group_name,
  821. .get_group_pins = sppctl_get_group_pins,
  822. #ifdef CONFIG_DEBUG_FS
  823. .pin_dbg_show = sppctl_pin_dbg_show,
  824. #endif
  825. .dt_node_to_map = sppctl_dt_node_to_map,
  826. .dt_free_map = pinctrl_utils_free_map,
  827. };
  828. static int sppctl_group_groups(struct platform_device *pdev)
  829. {
  830. struct sppctl_pdata *sppctl = platform_get_drvdata(pdev);
  831. int i, k, j;
  832. /* Calculate number of total group (GPIO + group-pinmux group). */
  833. sppctl->unq_grps_sz = sppctl_gpio_list_sz;
  834. for (i = 0; i < sppctl_list_funcs_sz; i++)
  835. if (sppctl_list_funcs[i].type == pinmux_type_grp)
  836. sppctl->unq_grps_sz += sppctl_list_funcs[i].gnum;
  837. sppctl->unq_grps = devm_kcalloc(&pdev->dev, sppctl->unq_grps_sz + 1,
  838. sizeof(*sppctl->unq_grps), GFP_KERNEL);
  839. if (!sppctl->unq_grps)
  840. return -ENOMEM;
  841. sppctl->g2fp_maps = devm_kcalloc(&pdev->dev, sppctl->unq_grps_sz + 1,
  842. sizeof(*sppctl->g2fp_maps), GFP_KERNEL);
  843. if (!sppctl->g2fp_maps)
  844. return -ENOMEM;
  845. /* Add GPIO pins. */
  846. for (i = 0; i < sppctl_gpio_list_sz; i++) {
  847. sppctl->unq_grps[i] = sppctl_gpio_list_s[i];
  848. sppctl->g2fp_maps[i].f_idx = 0;
  849. sppctl->g2fp_maps[i].g_idx = i;
  850. }
  851. /* Add group-pinmux to end of GPIO pins. */
  852. j = sppctl_gpio_list_sz;
  853. for (i = 0; i < sppctl_list_funcs_sz; i++) {
  854. if (sppctl_list_funcs[i].type != pinmux_type_grp)
  855. continue;
  856. for (k = 0; k < sppctl_list_funcs[i].gnum; k++) {
  857. sppctl->unq_grps[j] = sppctl_list_funcs[i].grps[k].name;
  858. sppctl->g2fp_maps[j].f_idx = i;
  859. sppctl->g2fp_maps[j].g_idx = k;
  860. j++;
  861. }
  862. }
  863. return 0;
  864. }
  865. static int sppctl_pinctrl_init(struct platform_device *pdev)
  866. {
  867. struct sppctl_pdata *sppctl = platform_get_drvdata(pdev);
  868. int err;
  869. sppctl->pctl_desc.owner = THIS_MODULE;
  870. sppctl->pctl_desc.name = dev_name(&pdev->dev);
  871. sppctl->pctl_desc.pins = sppctl_pins_all;
  872. sppctl->pctl_desc.npins = sppctl_pins_all_sz;
  873. sppctl->pctl_desc.pctlops = &sppctl_pctl_ops;
  874. sppctl->pctl_desc.confops = &sppctl_pconf_ops;
  875. sppctl->pctl_desc.pmxops = &sppctl_pinmux_ops;
  876. err = sppctl_group_groups(pdev);
  877. if (err)
  878. return err;
  879. err = devm_pinctrl_register_and_init(&pdev->dev, &sppctl->pctl_desc,
  880. sppctl, &sppctl->pctl_dev);
  881. if (err)
  882. return dev_err_probe(&pdev->dev, err, "Failed to register pinctrl!\n");
  883. pinctrl_enable(sppctl->pctl_dev);
  884. return 0;
  885. }
  886. static int sppctl_resource_map(struct platform_device *pdev, struct sppctl_pdata *sppctl)
  887. {
  888. sppctl->moon2_base = devm_platform_ioremap_resource_byname(pdev, "moon2");
  889. if (IS_ERR(sppctl->moon2_base))
  890. return PTR_ERR(sppctl->moon2_base);
  891. sppctl->gpioxt_base = devm_platform_ioremap_resource_byname(pdev, "gpioxt");
  892. if (IS_ERR(sppctl->gpioxt_base))
  893. return PTR_ERR(sppctl->gpioxt_base);
  894. sppctl->first_base = devm_platform_ioremap_resource_byname(pdev, "first");
  895. if (IS_ERR(sppctl->first_base))
  896. return PTR_ERR(sppctl->first_base);
  897. sppctl->moon1_base = devm_platform_ioremap_resource_byname(pdev, "moon1");
  898. if (IS_ERR(sppctl->moon1_base))
  899. return PTR_ERR(sppctl->moon1_base);
  900. return 0;
  901. }
  902. static int sppctl_probe(struct platform_device *pdev)
  903. {
  904. struct sppctl_pdata *sppctl;
  905. int ret;
  906. sppctl = devm_kzalloc(&pdev->dev, sizeof(*sppctl), GFP_KERNEL);
  907. if (!sppctl)
  908. return -ENOMEM;
  909. platform_set_drvdata(pdev, sppctl);
  910. ret = sppctl_resource_map(pdev, sppctl);
  911. if (ret)
  912. return ret;
  913. ret = sppctl_gpio_new(pdev, sppctl);
  914. if (ret)
  915. return ret;
  916. ret = sppctl_pinctrl_init(pdev);
  917. if (ret)
  918. return ret;
  919. pinctrl_add_gpio_range(sppctl->pctl_dev, &sppctl->pctl_grange);
  920. return 0;
  921. }
  922. static const struct of_device_id sppctl_match_table[] = {
  923. { .compatible = "sunplus,sp7021-pctl" },
  924. { /* sentinel */ }
  925. };
  926. static struct platform_driver sppctl_pinctrl_driver = {
  927. .driver = {
  928. .name = SPPCTL_MODULE_NAME,
  929. .of_match_table = sppctl_match_table,
  930. },
  931. .probe = sppctl_probe,
  932. };
  933. builtin_platform_driver(sppctl_pinctrl_driver)
  934. MODULE_AUTHOR("Dvorkin Dmitry <dvorkin@tibbo.com>");
  935. MODULE_AUTHOR("Wells Lu <wellslutw@gmail.com>");
  936. MODULE_DESCRIPTION("Sunplus SP7021 Pin Control and GPIO driver");
  937. MODULE_LICENSE("GPL v2");