pinctrl-spmi-gpio.c 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  1. /*
  2. * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13. #include <linux/gpio/driver.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/of_irq.h>
  17. #include <linux/pinctrl/pinconf-generic.h>
  18. #include <linux/pinctrl/pinconf.h>
  19. #include <linux/pinctrl/pinmux.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/regmap.h>
  22. #include <linux/slab.h>
  23. #include <linux/types.h>
  24. #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
  25. #include "../core.h"
  26. #include "../pinctrl-utils.h"
  27. #define PMIC_GPIO_ADDRESS_RANGE 0x100
  28. /* type and subtype registers base address offsets */
  29. #define PMIC_GPIO_REG_TYPE 0x4
  30. #define PMIC_GPIO_REG_SUBTYPE 0x5
  31. /* GPIO peripheral type and subtype out_values */
  32. #define PMIC_GPIO_TYPE 0x10
  33. #define PMIC_GPIO_SUBTYPE_GPIO_4CH 0x1
  34. #define PMIC_GPIO_SUBTYPE_GPIOC_4CH 0x5
  35. #define PMIC_GPIO_SUBTYPE_GPIO_8CH 0x9
  36. #define PMIC_GPIO_SUBTYPE_GPIOC_8CH 0xd
  37. #define PMIC_GPIO_SUBTYPE_GPIO_LV 0x10
  38. #define PMIC_GPIO_SUBTYPE_GPIO_MV 0x11
  39. #define PMIC_MPP_REG_RT_STS 0x10
  40. #define PMIC_MPP_REG_RT_STS_VAL_MASK 0x1
  41. /* control register base address offsets */
  42. #define PMIC_GPIO_REG_MODE_CTL 0x40
  43. #define PMIC_GPIO_REG_DIG_VIN_CTL 0x41
  44. #define PMIC_GPIO_REG_DIG_PULL_CTL 0x42
  45. #define PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL 0x44
  46. #define PMIC_GPIO_REG_DIG_IN_CTL 0x43
  47. #define PMIC_GPIO_REG_DIG_OUT_CTL 0x45
  48. #define PMIC_GPIO_REG_EN_CTL 0x46
  49. #define PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL 0x4A
  50. /* PMIC_GPIO_REG_MODE_CTL */
  51. #define PMIC_GPIO_REG_MODE_VALUE_SHIFT 0x1
  52. #define PMIC_GPIO_REG_MODE_FUNCTION_SHIFT 1
  53. #define PMIC_GPIO_REG_MODE_FUNCTION_MASK 0x7
  54. #define PMIC_GPIO_REG_MODE_DIR_SHIFT 4
  55. #define PMIC_GPIO_REG_MODE_DIR_MASK 0x7
  56. #define PMIC_GPIO_MODE_DIGITAL_INPUT 0
  57. #define PMIC_GPIO_MODE_DIGITAL_OUTPUT 1
  58. #define PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT 2
  59. #define PMIC_GPIO_MODE_ANALOG_PASS_THRU 3
  60. #define PMIC_GPIO_REG_LV_MV_MODE_DIR_MASK 0x3
  61. /* PMIC_GPIO_REG_DIG_VIN_CTL */
  62. #define PMIC_GPIO_REG_VIN_SHIFT 0
  63. #define PMIC_GPIO_REG_VIN_MASK 0x7
  64. /* PMIC_GPIO_REG_DIG_PULL_CTL */
  65. #define PMIC_GPIO_REG_PULL_SHIFT 0
  66. #define PMIC_GPIO_REG_PULL_MASK 0x7
  67. #define PMIC_GPIO_PULL_DOWN 4
  68. #define PMIC_GPIO_PULL_DISABLE 5
  69. /* PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL for LV/MV */
  70. #define PMIC_GPIO_LV_MV_OUTPUT_INVERT 0x80
  71. #define PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT 7
  72. #define PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK 0xF
  73. /* PMIC_GPIO_REG_DIG_IN_CTL */
  74. #define PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN 0x80
  75. #define PMIC_GPIO_LV_MV_DIG_IN_DTEST_SEL_MASK 0x7
  76. #define PMIC_GPIO_DIG_IN_DTEST_SEL_MASK 0xf
  77. /* PMIC_GPIO_REG_DIG_OUT_CTL */
  78. #define PMIC_GPIO_REG_OUT_STRENGTH_SHIFT 0
  79. #define PMIC_GPIO_REG_OUT_STRENGTH_MASK 0x3
  80. #define PMIC_GPIO_REG_OUT_TYPE_SHIFT 4
  81. #define PMIC_GPIO_REG_OUT_TYPE_MASK 0x3
  82. /*
  83. * Output type - indicates pin should be configured as push-pull,
  84. * open drain or open source.
  85. */
  86. #define PMIC_GPIO_OUT_BUF_CMOS 0
  87. #define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS 1
  88. #define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS 2
  89. /* PMIC_GPIO_REG_EN_CTL */
  90. #define PMIC_GPIO_REG_MASTER_EN_SHIFT 7
  91. #define PMIC_GPIO_PHYSICAL_OFFSET 1
  92. /* PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL */
  93. #define PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK 0x3
  94. /* Qualcomm specific pin configurations */
  95. #define PMIC_GPIO_CONF_PULL_UP (PIN_CONFIG_END + 1)
  96. #define PMIC_GPIO_CONF_STRENGTH (PIN_CONFIG_END + 2)
  97. #define PMIC_GPIO_CONF_ATEST (PIN_CONFIG_END + 3)
  98. #define PMIC_GPIO_CONF_ANALOG_PASS (PIN_CONFIG_END + 4)
  99. #define PMIC_GPIO_CONF_DTEST_BUFFER (PIN_CONFIG_END + 5)
  100. /* The index of each function in pmic_gpio_functions[] array */
  101. enum pmic_gpio_func_index {
  102. PMIC_GPIO_FUNC_INDEX_NORMAL,
  103. PMIC_GPIO_FUNC_INDEX_PAIRED,
  104. PMIC_GPIO_FUNC_INDEX_FUNC1,
  105. PMIC_GPIO_FUNC_INDEX_FUNC2,
  106. PMIC_GPIO_FUNC_INDEX_FUNC3,
  107. PMIC_GPIO_FUNC_INDEX_FUNC4,
  108. PMIC_GPIO_FUNC_INDEX_DTEST1,
  109. PMIC_GPIO_FUNC_INDEX_DTEST2,
  110. PMIC_GPIO_FUNC_INDEX_DTEST3,
  111. PMIC_GPIO_FUNC_INDEX_DTEST4,
  112. };
  113. /**
  114. * struct pmic_gpio_pad - keep current GPIO settings
  115. * @base: Address base in SPMI device.
  116. * @irq: IRQ number which this GPIO generate.
  117. * @is_enabled: Set to false when GPIO should be put in high Z state.
  118. * @out_value: Cached pin output value
  119. * @have_buffer: Set to true if GPIO output could be configured in push-pull,
  120. * open-drain or open-source mode.
  121. * @output_enabled: Set to true if GPIO output logic is enabled.
  122. * @input_enabled: Set to true if GPIO input buffer logic is enabled.
  123. * @analog_pass: Set to true if GPIO is in analog-pass-through mode.
  124. * @lv_mv_type: Set to true if GPIO subtype is GPIO_LV(0x10) or GPIO_MV(0x11).
  125. * @num_sources: Number of power-sources supported by this GPIO.
  126. * @power_source: Current power-source used.
  127. * @buffer_type: Push-pull, open-drain or open-source.
  128. * @pullup: Constant current which flow trough GPIO output buffer.
  129. * @strength: No, Low, Medium, High
  130. * @function: See pmic_gpio_functions[]
  131. * @atest: the ATEST selection for GPIO analog-pass-through mode
  132. * @dtest_buffer: the DTEST buffer selection for digital input mode.
  133. */
  134. struct pmic_gpio_pad {
  135. u16 base;
  136. int irq;
  137. bool is_enabled;
  138. bool out_value;
  139. bool have_buffer;
  140. bool output_enabled;
  141. bool input_enabled;
  142. bool analog_pass;
  143. bool lv_mv_type;
  144. unsigned int num_sources;
  145. unsigned int power_source;
  146. unsigned int buffer_type;
  147. unsigned int pullup;
  148. unsigned int strength;
  149. unsigned int function;
  150. unsigned int atest;
  151. unsigned int dtest_buffer;
  152. };
  153. struct pmic_gpio_state {
  154. struct device *dev;
  155. struct regmap *map;
  156. struct pinctrl_dev *ctrl;
  157. struct gpio_chip chip;
  158. };
  159. static const struct pinconf_generic_params pmic_gpio_bindings[] = {
  160. {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
  161. {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
  162. {"qcom,atest", PMIC_GPIO_CONF_ATEST, 0},
  163. {"qcom,analog-pass", PMIC_GPIO_CONF_ANALOG_PASS, 0},
  164. {"qcom,dtest-buffer", PMIC_GPIO_CONF_DTEST_BUFFER, 0},
  165. };
  166. #ifdef CONFIG_DEBUG_FS
  167. static const struct pin_config_item pmic_conf_items[ARRAY_SIZE(pmic_gpio_bindings)] = {
  168. PCONFDUMP(PMIC_GPIO_CONF_PULL_UP, "pull up strength", NULL, true),
  169. PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
  170. PCONFDUMP(PMIC_GPIO_CONF_ATEST, "atest", NULL, true),
  171. PCONFDUMP(PMIC_GPIO_CONF_ANALOG_PASS, "analog-pass", NULL, true),
  172. PCONFDUMP(PMIC_GPIO_CONF_DTEST_BUFFER, "dtest-buffer", NULL, true),
  173. };
  174. #endif
  175. static const char *const pmic_gpio_groups[] = {
  176. "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
  177. "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
  178. "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
  179. "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
  180. "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
  181. };
  182. static const char *const pmic_gpio_functions[] = {
  183. [PMIC_GPIO_FUNC_INDEX_NORMAL] = PMIC_GPIO_FUNC_NORMAL,
  184. [PMIC_GPIO_FUNC_INDEX_PAIRED] = PMIC_GPIO_FUNC_PAIRED,
  185. [PMIC_GPIO_FUNC_INDEX_FUNC1] = PMIC_GPIO_FUNC_FUNC1,
  186. [PMIC_GPIO_FUNC_INDEX_FUNC2] = PMIC_GPIO_FUNC_FUNC2,
  187. [PMIC_GPIO_FUNC_INDEX_FUNC3] = PMIC_GPIO_FUNC_FUNC3,
  188. [PMIC_GPIO_FUNC_INDEX_FUNC4] = PMIC_GPIO_FUNC_FUNC4,
  189. [PMIC_GPIO_FUNC_INDEX_DTEST1] = PMIC_GPIO_FUNC_DTEST1,
  190. [PMIC_GPIO_FUNC_INDEX_DTEST2] = PMIC_GPIO_FUNC_DTEST2,
  191. [PMIC_GPIO_FUNC_INDEX_DTEST3] = PMIC_GPIO_FUNC_DTEST3,
  192. [PMIC_GPIO_FUNC_INDEX_DTEST4] = PMIC_GPIO_FUNC_DTEST4,
  193. };
  194. static int pmic_gpio_read(struct pmic_gpio_state *state,
  195. struct pmic_gpio_pad *pad, unsigned int addr)
  196. {
  197. unsigned int val;
  198. int ret;
  199. ret = regmap_read(state->map, pad->base + addr, &val);
  200. if (ret < 0)
  201. dev_err(state->dev, "read 0x%x failed\n", addr);
  202. else
  203. ret = val;
  204. return ret;
  205. }
  206. static int pmic_gpio_write(struct pmic_gpio_state *state,
  207. struct pmic_gpio_pad *pad, unsigned int addr,
  208. unsigned int val)
  209. {
  210. int ret;
  211. ret = regmap_write(state->map, pad->base + addr, val);
  212. if (ret < 0)
  213. dev_err(state->dev, "write 0x%x failed\n", addr);
  214. return ret;
  215. }
  216. static int pmic_gpio_get_groups_count(struct pinctrl_dev *pctldev)
  217. {
  218. /* Every PIN is a group */
  219. return pctldev->desc->npins;
  220. }
  221. static const char *pmic_gpio_get_group_name(struct pinctrl_dev *pctldev,
  222. unsigned pin)
  223. {
  224. return pctldev->desc->pins[pin].name;
  225. }
  226. static int pmic_gpio_get_group_pins(struct pinctrl_dev *pctldev, unsigned pin,
  227. const unsigned **pins, unsigned *num_pins)
  228. {
  229. *pins = &pctldev->desc->pins[pin].number;
  230. *num_pins = 1;
  231. return 0;
  232. }
  233. static const struct pinctrl_ops pmic_gpio_pinctrl_ops = {
  234. .get_groups_count = pmic_gpio_get_groups_count,
  235. .get_group_name = pmic_gpio_get_group_name,
  236. .get_group_pins = pmic_gpio_get_group_pins,
  237. .dt_node_to_map = pinconf_generic_dt_node_to_map_group,
  238. .dt_free_map = pinctrl_utils_free_map,
  239. };
  240. static int pmic_gpio_get_functions_count(struct pinctrl_dev *pctldev)
  241. {
  242. return ARRAY_SIZE(pmic_gpio_functions);
  243. }
  244. static const char *pmic_gpio_get_function_name(struct pinctrl_dev *pctldev,
  245. unsigned function)
  246. {
  247. return pmic_gpio_functions[function];
  248. }
  249. static int pmic_gpio_get_function_groups(struct pinctrl_dev *pctldev,
  250. unsigned function,
  251. const char *const **groups,
  252. unsigned *const num_qgroups)
  253. {
  254. *groups = pmic_gpio_groups;
  255. *num_qgroups = pctldev->desc->npins;
  256. return 0;
  257. }
  258. static int pmic_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned function,
  259. unsigned pin)
  260. {
  261. struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
  262. struct pmic_gpio_pad *pad;
  263. unsigned int val;
  264. int ret;
  265. if (function > PMIC_GPIO_FUNC_INDEX_DTEST4) {
  266. pr_err("function: %d is not defined\n", function);
  267. return -EINVAL;
  268. }
  269. pad = pctldev->desc->pins[pin].drv_data;
  270. /*
  271. * Non-LV/MV subtypes only support 2 special functions,
  272. * offsetting the dtestx function values by 2
  273. */
  274. if (!pad->lv_mv_type) {
  275. if (function == PMIC_GPIO_FUNC_INDEX_FUNC3 ||
  276. function == PMIC_GPIO_FUNC_INDEX_FUNC4) {
  277. pr_err("LV/MV subtype doesn't have func3/func4\n");
  278. return -EINVAL;
  279. }
  280. if (function >= PMIC_GPIO_FUNC_INDEX_DTEST1)
  281. function -= (PMIC_GPIO_FUNC_INDEX_DTEST1 -
  282. PMIC_GPIO_FUNC_INDEX_FUNC3);
  283. }
  284. pad->function = function;
  285. if (pad->analog_pass)
  286. val = PMIC_GPIO_MODE_ANALOG_PASS_THRU;
  287. else if (pad->output_enabled && pad->input_enabled)
  288. val = PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT;
  289. else if (pad->output_enabled)
  290. val = PMIC_GPIO_MODE_DIGITAL_OUTPUT;
  291. else
  292. val = PMIC_GPIO_MODE_DIGITAL_INPUT;
  293. if (pad->lv_mv_type) {
  294. ret = pmic_gpio_write(state, pad,
  295. PMIC_GPIO_REG_MODE_CTL, val);
  296. if (ret < 0)
  297. return ret;
  298. val = pad->atest - 1;
  299. ret = pmic_gpio_write(state, pad,
  300. PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL, val);
  301. if (ret < 0)
  302. return ret;
  303. val = pad->out_value
  304. << PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT;
  305. val |= pad->function
  306. & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
  307. ret = pmic_gpio_write(state, pad,
  308. PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL, val);
  309. if (ret < 0)
  310. return ret;
  311. } else {
  312. val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
  313. val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
  314. val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
  315. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
  316. if (ret < 0)
  317. return ret;
  318. }
  319. val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT;
  320. return pmic_gpio_write(state, pad, PMIC_GPIO_REG_EN_CTL, val);
  321. }
  322. static const struct pinmux_ops pmic_gpio_pinmux_ops = {
  323. .get_functions_count = pmic_gpio_get_functions_count,
  324. .get_function_name = pmic_gpio_get_function_name,
  325. .get_function_groups = pmic_gpio_get_function_groups,
  326. .set_mux = pmic_gpio_set_mux,
  327. };
  328. static int pmic_gpio_config_get(struct pinctrl_dev *pctldev,
  329. unsigned int pin, unsigned long *config)
  330. {
  331. unsigned param = pinconf_to_config_param(*config);
  332. struct pmic_gpio_pad *pad;
  333. unsigned arg;
  334. pad = pctldev->desc->pins[pin].drv_data;
  335. switch (param) {
  336. case PIN_CONFIG_DRIVE_PUSH_PULL:
  337. if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS)
  338. return -EINVAL;
  339. arg = 1;
  340. break;
  341. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  342. if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS)
  343. return -EINVAL;
  344. arg = 1;
  345. break;
  346. case PIN_CONFIG_DRIVE_OPEN_SOURCE:
  347. if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS)
  348. return -EINVAL;
  349. arg = 1;
  350. break;
  351. case PIN_CONFIG_BIAS_PULL_DOWN:
  352. if (pad->pullup != PMIC_GPIO_PULL_DOWN)
  353. return -EINVAL;
  354. arg = 1;
  355. break;
  356. case PIN_CONFIG_BIAS_DISABLE:
  357. if (pad->pullup != PMIC_GPIO_PULL_DISABLE)
  358. return -EINVAL;
  359. arg = 1;
  360. break;
  361. case PIN_CONFIG_BIAS_PULL_UP:
  362. if (pad->pullup != PMIC_GPIO_PULL_UP_30)
  363. return -EINVAL;
  364. arg = 1;
  365. break;
  366. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  367. if (pad->is_enabled)
  368. return -EINVAL;
  369. arg = 1;
  370. break;
  371. case PIN_CONFIG_POWER_SOURCE:
  372. arg = pad->power_source;
  373. break;
  374. case PIN_CONFIG_INPUT_ENABLE:
  375. if (!pad->input_enabled)
  376. return -EINVAL;
  377. arg = 1;
  378. break;
  379. case PIN_CONFIG_OUTPUT:
  380. arg = pad->out_value;
  381. break;
  382. case PMIC_GPIO_CONF_PULL_UP:
  383. arg = pad->pullup;
  384. break;
  385. case PMIC_GPIO_CONF_STRENGTH:
  386. arg = pad->strength;
  387. break;
  388. case PMIC_GPIO_CONF_ATEST:
  389. arg = pad->atest;
  390. break;
  391. case PMIC_GPIO_CONF_ANALOG_PASS:
  392. arg = pad->analog_pass;
  393. break;
  394. case PMIC_GPIO_CONF_DTEST_BUFFER:
  395. arg = pad->dtest_buffer;
  396. break;
  397. default:
  398. return -EINVAL;
  399. }
  400. *config = pinconf_to_config_packed(param, arg);
  401. return 0;
  402. }
  403. static int pmic_gpio_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
  404. unsigned long *configs, unsigned nconfs)
  405. {
  406. struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
  407. struct pmic_gpio_pad *pad;
  408. unsigned param, arg;
  409. unsigned int val;
  410. int i, ret;
  411. pad = pctldev->desc->pins[pin].drv_data;
  412. pad->is_enabled = true;
  413. for (i = 0; i < nconfs; i++) {
  414. param = pinconf_to_config_param(configs[i]);
  415. arg = pinconf_to_config_argument(configs[i]);
  416. switch (param) {
  417. case PIN_CONFIG_DRIVE_PUSH_PULL:
  418. pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS;
  419. break;
  420. case PIN_CONFIG_DRIVE_OPEN_DRAIN:
  421. if (!pad->have_buffer)
  422. return -EINVAL;
  423. pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS;
  424. break;
  425. case PIN_CONFIG_DRIVE_OPEN_SOURCE:
  426. if (!pad->have_buffer)
  427. return -EINVAL;
  428. pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS;
  429. break;
  430. case PIN_CONFIG_BIAS_DISABLE:
  431. pad->pullup = PMIC_GPIO_PULL_DISABLE;
  432. break;
  433. case PIN_CONFIG_BIAS_PULL_UP:
  434. pad->pullup = PMIC_GPIO_PULL_UP_30;
  435. break;
  436. case PIN_CONFIG_BIAS_PULL_DOWN:
  437. if (arg)
  438. pad->pullup = PMIC_GPIO_PULL_DOWN;
  439. else
  440. pad->pullup = PMIC_GPIO_PULL_DISABLE;
  441. break;
  442. case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
  443. pad->is_enabled = false;
  444. break;
  445. case PIN_CONFIG_POWER_SOURCE:
  446. if (arg >= pad->num_sources)
  447. return -EINVAL;
  448. pad->power_source = arg;
  449. break;
  450. case PIN_CONFIG_INPUT_ENABLE:
  451. pad->input_enabled = arg ? true : false;
  452. break;
  453. case PIN_CONFIG_OUTPUT:
  454. pad->output_enabled = true;
  455. pad->out_value = arg;
  456. break;
  457. case PMIC_GPIO_CONF_PULL_UP:
  458. if (arg > PMIC_GPIO_PULL_UP_1P5_30)
  459. return -EINVAL;
  460. pad->pullup = arg;
  461. break;
  462. case PMIC_GPIO_CONF_STRENGTH:
  463. if (arg > PMIC_GPIO_STRENGTH_LOW)
  464. return -EINVAL;
  465. pad->strength = arg;
  466. break;
  467. case PMIC_GPIO_CONF_ATEST:
  468. if (!pad->lv_mv_type || arg > 4)
  469. return -EINVAL;
  470. pad->atest = arg;
  471. break;
  472. case PMIC_GPIO_CONF_ANALOG_PASS:
  473. if (!pad->lv_mv_type)
  474. return -EINVAL;
  475. pad->analog_pass = true;
  476. break;
  477. case PMIC_GPIO_CONF_DTEST_BUFFER:
  478. if (arg > 4)
  479. return -EINVAL;
  480. pad->dtest_buffer = arg;
  481. break;
  482. default:
  483. return -EINVAL;
  484. }
  485. }
  486. val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT;
  487. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL, val);
  488. if (ret < 0)
  489. return ret;
  490. val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT;
  491. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL, val);
  492. if (ret < 0)
  493. return ret;
  494. val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT;
  495. val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
  496. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL, val);
  497. if (ret < 0)
  498. return ret;
  499. if (pad->dtest_buffer == 0) {
  500. val = 0;
  501. } else {
  502. if (pad->lv_mv_type) {
  503. val = pad->dtest_buffer - 1;
  504. val |= PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN;
  505. } else {
  506. val = BIT(pad->dtest_buffer - 1);
  507. }
  508. }
  509. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_IN_CTL, val);
  510. if (ret < 0)
  511. return ret;
  512. if (pad->analog_pass)
  513. val = PMIC_GPIO_MODE_ANALOG_PASS_THRU;
  514. else if (pad->output_enabled && pad->input_enabled)
  515. val = PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT;
  516. else if (pad->output_enabled)
  517. val = PMIC_GPIO_MODE_DIGITAL_OUTPUT;
  518. else
  519. val = PMIC_GPIO_MODE_DIGITAL_INPUT;
  520. if (pad->lv_mv_type) {
  521. ret = pmic_gpio_write(state, pad,
  522. PMIC_GPIO_REG_MODE_CTL, val);
  523. if (ret < 0)
  524. return ret;
  525. val = pad->atest - 1;
  526. ret = pmic_gpio_write(state, pad,
  527. PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL, val);
  528. if (ret < 0)
  529. return ret;
  530. val = pad->out_value
  531. << PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT;
  532. val |= pad->function
  533. & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
  534. ret = pmic_gpio_write(state, pad,
  535. PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL, val);
  536. if (ret < 0)
  537. return ret;
  538. } else {
  539. val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
  540. val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
  541. val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
  542. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
  543. if (ret < 0)
  544. return ret;
  545. }
  546. val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT;
  547. ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_EN_CTL, val);
  548. return ret;
  549. }
  550. static void pmic_gpio_config_dbg_show(struct pinctrl_dev *pctldev,
  551. struct seq_file *s, unsigned pin)
  552. {
  553. struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
  554. struct pmic_gpio_pad *pad;
  555. int ret, val, function;
  556. static const char *const biases[] = {
  557. "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
  558. "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
  559. };
  560. static const char *const buffer_types[] = {
  561. "push-pull", "open-drain", "open-source"
  562. };
  563. static const char *const strengths[] = {
  564. "no", "high", "medium", "low"
  565. };
  566. pad = pctldev->desc->pins[pin].drv_data;
  567. seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET);
  568. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_EN_CTL);
  569. if (val < 0 || !(val >> PMIC_GPIO_REG_MASTER_EN_SHIFT)) {
  570. seq_puts(s, " ---");
  571. } else {
  572. if (pad->input_enabled) {
  573. ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
  574. if (ret < 0)
  575. return;
  576. ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
  577. pad->out_value = ret;
  578. }
  579. /*
  580. * For the non-LV/MV subtypes only 2 special functions are
  581. * available, offsetting the dtest function values by 2.
  582. */
  583. function = pad->function;
  584. if (!pad->lv_mv_type &&
  585. pad->function >= PMIC_GPIO_FUNC_INDEX_FUNC3)
  586. function += PMIC_GPIO_FUNC_INDEX_DTEST1 -
  587. PMIC_GPIO_FUNC_INDEX_FUNC3;
  588. if (pad->analog_pass)
  589. seq_puts(s, " analog-pass");
  590. else
  591. seq_printf(s, " %-4s",
  592. pad->output_enabled ? "out" : "in");
  593. seq_printf(s, " %-7s", pmic_gpio_functions[function]);
  594. seq_printf(s, " vin-%d", pad->power_source);
  595. seq_printf(s, " %-27s", biases[pad->pullup]);
  596. seq_printf(s, " %-10s", buffer_types[pad->buffer_type]);
  597. seq_printf(s, " %-4s", pad->out_value ? "high" : "low");
  598. seq_printf(s, " %-7s", strengths[pad->strength]);
  599. seq_printf(s, " atest-%d", pad->atest);
  600. seq_printf(s, " dtest-%d", pad->dtest_buffer);
  601. }
  602. }
  603. static const struct pinconf_ops pmic_gpio_pinconf_ops = {
  604. .is_generic = true,
  605. .pin_config_group_get = pmic_gpio_config_get,
  606. .pin_config_group_set = pmic_gpio_config_set,
  607. .pin_config_group_dbg_show = pmic_gpio_config_dbg_show,
  608. };
  609. static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
  610. {
  611. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  612. unsigned long config;
  613. config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1);
  614. return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
  615. }
  616. static int pmic_gpio_direction_output(struct gpio_chip *chip,
  617. unsigned pin, int val)
  618. {
  619. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  620. unsigned long config;
  621. config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val);
  622. return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
  623. }
  624. static int pmic_gpio_get(struct gpio_chip *chip, unsigned pin)
  625. {
  626. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  627. struct pmic_gpio_pad *pad;
  628. int ret;
  629. pad = state->ctrl->desc->pins[pin].drv_data;
  630. if (!pad->is_enabled)
  631. return -EINVAL;
  632. if (pad->input_enabled) {
  633. ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
  634. if (ret < 0)
  635. return ret;
  636. pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK;
  637. }
  638. return !!pad->out_value;
  639. }
  640. static void pmic_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
  641. {
  642. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  643. unsigned long config;
  644. config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value);
  645. pmic_gpio_config_set(state->ctrl, pin, &config, 1);
  646. }
  647. static int pmic_gpio_of_xlate(struct gpio_chip *chip,
  648. const struct of_phandle_args *gpio_desc,
  649. u32 *flags)
  650. {
  651. if (chip->of_gpio_n_cells < 2)
  652. return -EINVAL;
  653. if (flags)
  654. *flags = gpio_desc->args[1];
  655. return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET;
  656. }
  657. static int pmic_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
  658. {
  659. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  660. struct pmic_gpio_pad *pad;
  661. pad = state->ctrl->desc->pins[pin].drv_data;
  662. return pad->irq;
  663. }
  664. static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
  665. {
  666. struct pmic_gpio_state *state = gpiochip_get_data(chip);
  667. unsigned i;
  668. for (i = 0; i < chip->ngpio; i++) {
  669. pmic_gpio_config_dbg_show(state->ctrl, s, i);
  670. seq_puts(s, "\n");
  671. }
  672. }
  673. static const struct gpio_chip pmic_gpio_gpio_template = {
  674. .direction_input = pmic_gpio_direction_input,
  675. .direction_output = pmic_gpio_direction_output,
  676. .get = pmic_gpio_get,
  677. .set = pmic_gpio_set,
  678. .request = gpiochip_generic_request,
  679. .free = gpiochip_generic_free,
  680. .of_xlate = pmic_gpio_of_xlate,
  681. .to_irq = pmic_gpio_to_irq,
  682. .dbg_show = pmic_gpio_dbg_show,
  683. };
  684. static int pmic_gpio_populate(struct pmic_gpio_state *state,
  685. struct pmic_gpio_pad *pad)
  686. {
  687. int type, subtype, val, dir;
  688. type = pmic_gpio_read(state, pad, PMIC_GPIO_REG_TYPE);
  689. if (type < 0)
  690. return type;
  691. if (type != PMIC_GPIO_TYPE) {
  692. dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n",
  693. type, pad->base);
  694. return -ENODEV;
  695. }
  696. subtype = pmic_gpio_read(state, pad, PMIC_GPIO_REG_SUBTYPE);
  697. if (subtype < 0)
  698. return subtype;
  699. switch (subtype) {
  700. case PMIC_GPIO_SUBTYPE_GPIO_4CH:
  701. pad->have_buffer = true;
  702. case PMIC_GPIO_SUBTYPE_GPIOC_4CH:
  703. pad->num_sources = 4;
  704. break;
  705. case PMIC_GPIO_SUBTYPE_GPIO_8CH:
  706. pad->have_buffer = true;
  707. case PMIC_GPIO_SUBTYPE_GPIOC_8CH:
  708. pad->num_sources = 8;
  709. break;
  710. case PMIC_GPIO_SUBTYPE_GPIO_LV:
  711. pad->num_sources = 1;
  712. pad->have_buffer = true;
  713. pad->lv_mv_type = true;
  714. break;
  715. case PMIC_GPIO_SUBTYPE_GPIO_MV:
  716. pad->num_sources = 2;
  717. pad->have_buffer = true;
  718. pad->lv_mv_type = true;
  719. break;
  720. default:
  721. dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype);
  722. return -ENODEV;
  723. }
  724. if (pad->lv_mv_type) {
  725. val = pmic_gpio_read(state, pad,
  726. PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL);
  727. if (val < 0)
  728. return val;
  729. pad->out_value = !!(val & PMIC_GPIO_LV_MV_OUTPUT_INVERT);
  730. pad->function = val & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
  731. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
  732. if (val < 0)
  733. return val;
  734. dir = val & PMIC_GPIO_REG_LV_MV_MODE_DIR_MASK;
  735. } else {
  736. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
  737. if (val < 0)
  738. return val;
  739. pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
  740. dir = val >> PMIC_GPIO_REG_MODE_DIR_SHIFT;
  741. dir &= PMIC_GPIO_REG_MODE_DIR_MASK;
  742. pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
  743. pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK;
  744. }
  745. switch (dir) {
  746. case PMIC_GPIO_MODE_DIGITAL_INPUT:
  747. pad->input_enabled = true;
  748. pad->output_enabled = false;
  749. break;
  750. case PMIC_GPIO_MODE_DIGITAL_OUTPUT:
  751. pad->input_enabled = false;
  752. pad->output_enabled = true;
  753. break;
  754. case PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT:
  755. pad->input_enabled = true;
  756. pad->output_enabled = true;
  757. break;
  758. case PMIC_GPIO_MODE_ANALOG_PASS_THRU:
  759. if (!pad->lv_mv_type)
  760. return -ENODEV;
  761. pad->analog_pass = true;
  762. break;
  763. default:
  764. dev_err(state->dev, "unknown GPIO direction\n");
  765. return -ENODEV;
  766. }
  767. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL);
  768. if (val < 0)
  769. return val;
  770. pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT;
  771. pad->power_source &= PMIC_GPIO_REG_VIN_MASK;
  772. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL);
  773. if (val < 0)
  774. return val;
  775. pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT;
  776. pad->pullup &= PMIC_GPIO_REG_PULL_MASK;
  777. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_IN_CTL);
  778. if (val < 0)
  779. return val;
  780. if (pad->lv_mv_type && (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN))
  781. pad->dtest_buffer =
  782. (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_SEL_MASK) + 1;
  783. else if (!pad->lv_mv_type)
  784. pad->dtest_buffer = ffs(val);
  785. else
  786. pad->dtest_buffer = 0;
  787. val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL);
  788. if (val < 0)
  789. return val;
  790. pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
  791. pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK;
  792. pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT;
  793. pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK;
  794. if (pad->lv_mv_type) {
  795. val = pmic_gpio_read(state, pad,
  796. PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL);
  797. if (val < 0)
  798. return val;
  799. pad->atest = (val & PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK) + 1;
  800. }
  801. /* Pin could be disabled with PIN_CONFIG_BIAS_HIGH_IMPEDANCE */
  802. pad->is_enabled = true;
  803. return 0;
  804. }
  805. static int pmic_gpio_probe(struct platform_device *pdev)
  806. {
  807. struct device *dev = &pdev->dev;
  808. struct pinctrl_pin_desc *pindesc;
  809. struct pinctrl_desc *pctrldesc;
  810. struct pmic_gpio_pad *pad, *pads;
  811. struct pmic_gpio_state *state;
  812. int ret, npins, i;
  813. u32 reg;
  814. ret = of_property_read_u32(dev->of_node, "reg", &reg);
  815. if (ret < 0) {
  816. dev_err(dev, "missing base address");
  817. return ret;
  818. }
  819. npins = platform_irq_count(pdev);
  820. if (!npins)
  821. return -EINVAL;
  822. if (npins < 0)
  823. return npins;
  824. BUG_ON(npins > ARRAY_SIZE(pmic_gpio_groups));
  825. state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
  826. if (!state)
  827. return -ENOMEM;
  828. platform_set_drvdata(pdev, state);
  829. state->dev = &pdev->dev;
  830. state->map = dev_get_regmap(dev->parent, NULL);
  831. pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL);
  832. if (!pindesc)
  833. return -ENOMEM;
  834. pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL);
  835. if (!pads)
  836. return -ENOMEM;
  837. pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL);
  838. if (!pctrldesc)
  839. return -ENOMEM;
  840. pctrldesc->pctlops = &pmic_gpio_pinctrl_ops;
  841. pctrldesc->pmxops = &pmic_gpio_pinmux_ops;
  842. pctrldesc->confops = &pmic_gpio_pinconf_ops;
  843. pctrldesc->owner = THIS_MODULE;
  844. pctrldesc->name = dev_name(dev);
  845. pctrldesc->pins = pindesc;
  846. pctrldesc->npins = npins;
  847. pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings);
  848. pctrldesc->custom_params = pmic_gpio_bindings;
  849. #ifdef CONFIG_DEBUG_FS
  850. pctrldesc->custom_conf_items = pmic_conf_items;
  851. #endif
  852. for (i = 0; i < npins; i++, pindesc++) {
  853. pad = &pads[i];
  854. pindesc->drv_data = pad;
  855. pindesc->number = i;
  856. pindesc->name = pmic_gpio_groups[i];
  857. pad->irq = platform_get_irq(pdev, i);
  858. if (pad->irq < 0)
  859. return pad->irq;
  860. pad->base = reg + i * PMIC_GPIO_ADDRESS_RANGE;
  861. ret = pmic_gpio_populate(state, pad);
  862. if (ret < 0)
  863. return ret;
  864. }
  865. state->chip = pmic_gpio_gpio_template;
  866. state->chip.parent = dev;
  867. state->chip.base = -1;
  868. state->chip.ngpio = npins;
  869. state->chip.label = dev_name(dev);
  870. state->chip.of_gpio_n_cells = 2;
  871. state->chip.can_sleep = false;
  872. state->ctrl = devm_pinctrl_register(dev, pctrldesc, state);
  873. if (IS_ERR(state->ctrl))
  874. return PTR_ERR(state->ctrl);
  875. ret = gpiochip_add_data(&state->chip, state);
  876. if (ret) {
  877. dev_err(state->dev, "can't add gpio chip\n");
  878. return ret;
  879. }
  880. ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, npins);
  881. if (ret) {
  882. dev_err(dev, "failed to add pin range\n");
  883. goto err_range;
  884. }
  885. return 0;
  886. err_range:
  887. gpiochip_remove(&state->chip);
  888. return ret;
  889. }
  890. static int pmic_gpio_remove(struct platform_device *pdev)
  891. {
  892. struct pmic_gpio_state *state = platform_get_drvdata(pdev);
  893. gpiochip_remove(&state->chip);
  894. return 0;
  895. }
  896. static const struct of_device_id pmic_gpio_of_match[] = {
  897. { .compatible = "qcom,pm8916-gpio" }, /* 4 GPIO's */
  898. { .compatible = "qcom,pm8941-gpio" }, /* 36 GPIO's */
  899. { .compatible = "qcom,pm8994-gpio" }, /* 22 GPIO's */
  900. { .compatible = "qcom,pmi8994-gpio" }, /* 10 GPIO's */
  901. { .compatible = "qcom,pma8084-gpio" }, /* 22 GPIO's */
  902. { .compatible = "qcom,spmi-gpio" }, /* Generic */
  903. { },
  904. };
  905. MODULE_DEVICE_TABLE(of, pmic_gpio_of_match);
  906. static struct platform_driver pmic_gpio_driver = {
  907. .driver = {
  908. .name = "qcom-spmi-gpio",
  909. .of_match_table = pmic_gpio_of_match,
  910. },
  911. .probe = pmic_gpio_probe,
  912. .remove = pmic_gpio_remove,
  913. };
  914. module_platform_driver(pmic_gpio_driver);
  915. MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
  916. MODULE_DESCRIPTION("Qualcomm SPMI PMIC GPIO pin control driver");
  917. MODULE_ALIAS("platform:qcom-spmi-gpio");
  918. MODULE_LICENSE("GPL v2");