1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2012-2014, 2016-2021 The Linux Foundation. All rights reserved.
4 */
5
6 #include <linux/gpio/driver.h>
7 #include <linux/interrupt.h>
8 #include <linux/module.h>
9 #include <linux/of.h>
10 #include <linux/of_irq.h>
11 #include <linux/pinctrl/pinconf-generic.h>
12 #include <linux/pinctrl/pinconf.h>
13 #include <linux/pinctrl/pinmux.h>
14 #include <linux/platform_device.h>
15 #include <linux/regmap.h>
16 #include <linux/slab.h>
17 #include <linux/spmi.h>
18 #include <linux/types.h>
19
20 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
21
22 #include "../core.h"
23 #include "../pinctrl-utils.h"
24
25 #define PMIC_GPIO_ADDRESS_RANGE 0x100
26
27 /* type and subtype registers base address offsets */
28 #define PMIC_GPIO_REG_TYPE 0x4
29 #define PMIC_GPIO_REG_SUBTYPE 0x5
30
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
40 #define PMIC_MPP_REG_RT_STS 0x10
41 #define PMIC_MPP_REG_RT_STS_VAL_MASK 0x1
42
43 /* control register base address offsets */
44 #define PMIC_GPIO_REG_MODE_CTL 0x40
45 #define PMIC_GPIO_REG_DIG_VIN_CTL 0x41
46 #define PMIC_GPIO_REG_DIG_PULL_CTL 0x42
47 #define PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL 0x44
48 #define PMIC_GPIO_REG_DIG_IN_CTL 0x43
49 #define PMIC_GPIO_REG_DIG_OUT_CTL 0x45
50 #define PMIC_GPIO_REG_EN_CTL 0x46
51 #define PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL 0x4A
52
53 /* PMIC_GPIO_REG_MODE_CTL */
54 #define PMIC_GPIO_REG_MODE_VALUE_SHIFT 0x1
55 #define PMIC_GPIO_REG_MODE_FUNCTION_SHIFT 1
56 #define PMIC_GPIO_REG_MODE_FUNCTION_MASK 0x7
57 #define PMIC_GPIO_REG_MODE_DIR_SHIFT 4
58 #define PMIC_GPIO_REG_MODE_DIR_MASK 0x7
59
60 #define PMIC_GPIO_MODE_DIGITAL_INPUT 0
61 #define PMIC_GPIO_MODE_DIGITAL_OUTPUT 1
62 #define PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT 2
63 #define PMIC_GPIO_MODE_ANALOG_PASS_THRU 3
64 #define PMIC_GPIO_REG_LV_MV_MODE_DIR_MASK 0x3
65
66 /* PMIC_GPIO_REG_DIG_VIN_CTL */
67 #define PMIC_GPIO_REG_VIN_SHIFT 0
68 #define PMIC_GPIO_REG_VIN_MASK 0x7
69
70 /* PMIC_GPIO_REG_DIG_PULL_CTL */
71 #define PMIC_GPIO_REG_PULL_SHIFT 0
72 #define PMIC_GPIO_REG_PULL_MASK 0x7
73
74 #define PMIC_GPIO_PULL_DOWN 4
75 #define PMIC_GPIO_PULL_DISABLE 5
76
77 /* PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL for LV/MV */
78 #define PMIC_GPIO_LV_MV_OUTPUT_INVERT 0x80
79 #define PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT 7
80 #define PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK 0xF
81
82 /* PMIC_GPIO_REG_DIG_IN_CTL */
83 #define PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN 0x80
84 #define PMIC_GPIO_LV_MV_DIG_IN_DTEST_SEL_MASK 0x7
85 #define PMIC_GPIO_DIG_IN_DTEST_SEL_MASK 0xf
86
87 /* PMIC_GPIO_REG_DIG_OUT_CTL */
88 #define PMIC_GPIO_REG_OUT_STRENGTH_SHIFT 0
89 #define PMIC_GPIO_REG_OUT_STRENGTH_MASK 0x3
90 #define PMIC_GPIO_REG_OUT_TYPE_SHIFT 4
91 #define PMIC_GPIO_REG_OUT_TYPE_MASK 0x3
92
93 /*
94 * Output type - indicates pin should be configured as push-pull,
95 * open drain or open source.
96 */
97 #define PMIC_GPIO_OUT_BUF_CMOS 0
98 #define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS 1
99 #define PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS 2
100
101 /* PMIC_GPIO_REG_EN_CTL */
102 #define PMIC_GPIO_REG_MASTER_EN_SHIFT 7
103
104 #define PMIC_GPIO_PHYSICAL_OFFSET 1
105
106 /* PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL */
107 #define PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK 0x3
108
109 /* Qualcomm specific pin configurations */
110 #define PMIC_GPIO_CONF_PULL_UP (PIN_CONFIG_END + 1)
111 #define PMIC_GPIO_CONF_STRENGTH (PIN_CONFIG_END + 2)
112 #define PMIC_GPIO_CONF_ATEST (PIN_CONFIG_END + 3)
113 #define PMIC_GPIO_CONF_ANALOG_PASS (PIN_CONFIG_END + 4)
114 #define PMIC_GPIO_CONF_DTEST_BUFFER (PIN_CONFIG_END + 5)
115
116 /* The index of each function in pmic_gpio_functions[] array */
117 enum pmic_gpio_func_index {
118 PMIC_GPIO_FUNC_INDEX_NORMAL,
119 PMIC_GPIO_FUNC_INDEX_PAIRED,
120 PMIC_GPIO_FUNC_INDEX_FUNC1,
121 PMIC_GPIO_FUNC_INDEX_FUNC2,
122 PMIC_GPIO_FUNC_INDEX_FUNC3,
123 PMIC_GPIO_FUNC_INDEX_FUNC4,
124 PMIC_GPIO_FUNC_INDEX_DTEST1,
125 PMIC_GPIO_FUNC_INDEX_DTEST2,
126 PMIC_GPIO_FUNC_INDEX_DTEST3,
127 PMIC_GPIO_FUNC_INDEX_DTEST4,
128 };
129
130 /**
131 * struct pmic_gpio_pad - keep current GPIO settings
132 * @base: Address base in SPMI device.
133 * @is_enabled: Set to false when GPIO should be put in high Z state.
134 * @out_value: Cached pin output value
135 * @have_buffer: Set to true if GPIO output could be configured in push-pull,
136 * open-drain or open-source mode.
137 * @output_enabled: Set to true if GPIO output logic is enabled.
138 * @input_enabled: Set to true if GPIO input buffer logic is enabled.
139 * @analog_pass: Set to true if GPIO is in analog-pass-through mode.
140 * @lv_mv_type: Set to true if GPIO subtype is GPIO_LV(0x10) or GPIO_MV(0x11).
141 * @num_sources: Number of power-sources supported by this GPIO.
142 * @power_source: Current power-source used.
143 * @buffer_type: Push-pull, open-drain or open-source.
144 * @pullup: Constant current which flow trough GPIO output buffer.
145 * @strength: No, Low, Medium, High
146 * @function: See pmic_gpio_functions[]
147 * @atest: the ATEST selection for GPIO analog-pass-through mode
148 * @dtest_buffer: the DTEST buffer selection for digital input mode.
149 */
150 struct pmic_gpio_pad {
151 u16 base;
152 bool is_enabled;
153 bool out_value;
154 bool have_buffer;
155 bool output_enabled;
156 bool input_enabled;
157 bool analog_pass;
158 bool lv_mv_type;
159 unsigned int num_sources;
160 unsigned int power_source;
161 unsigned int buffer_type;
162 unsigned int pullup;
163 unsigned int strength;
164 unsigned int function;
165 unsigned int atest;
166 unsigned int dtest_buffer;
167 };
168
169 struct pmic_gpio_state {
170 struct device *dev;
171 struct regmap *map;
172 struct pinctrl_dev *ctrl;
173 struct gpio_chip chip;
174 struct irq_chip irq;
175 u8 usid;
176 u8 pid_base;
177 };
178
179 static const struct pinconf_generic_params pmic_gpio_bindings[] = {
180 {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
181 {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
182 {"qcom,atest", PMIC_GPIO_CONF_ATEST, 0},
183 {"qcom,analog-pass", PMIC_GPIO_CONF_ANALOG_PASS, 0},
184 {"qcom,dtest-buffer", PMIC_GPIO_CONF_DTEST_BUFFER, 0},
185 };
186
187 #ifdef CONFIG_DEBUG_FS
188 static const struct pin_config_item pmic_conf_items[ARRAY_SIZE(pmic_gpio_bindings)] = {
189 PCONFDUMP(PMIC_GPIO_CONF_PULL_UP, "pull up strength", NULL, true),
190 PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
191 PCONFDUMP(PMIC_GPIO_CONF_ATEST, "atest", NULL, true),
192 PCONFDUMP(PMIC_GPIO_CONF_ANALOG_PASS, "analog-pass", NULL, true),
193 PCONFDUMP(PMIC_GPIO_CONF_DTEST_BUFFER, "dtest-buffer", NULL, true),
194 };
195 #endif
196
197 static const char *const pmic_gpio_groups[] = {
198 "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
199 "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
200 "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
201 "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
202 "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
203 };
204
205 static const char *const pmic_gpio_functions[] = {
206 [PMIC_GPIO_FUNC_INDEX_NORMAL] = PMIC_GPIO_FUNC_NORMAL,
207 [PMIC_GPIO_FUNC_INDEX_PAIRED] = PMIC_GPIO_FUNC_PAIRED,
208 [PMIC_GPIO_FUNC_INDEX_FUNC1] = PMIC_GPIO_FUNC_FUNC1,
209 [PMIC_GPIO_FUNC_INDEX_FUNC2] = PMIC_GPIO_FUNC_FUNC2,
210 [PMIC_GPIO_FUNC_INDEX_FUNC3] = PMIC_GPIO_FUNC_FUNC3,
211 [PMIC_GPIO_FUNC_INDEX_FUNC4] = PMIC_GPIO_FUNC_FUNC4,
212 [PMIC_GPIO_FUNC_INDEX_DTEST1] = PMIC_GPIO_FUNC_DTEST1,
213 [PMIC_GPIO_FUNC_INDEX_DTEST2] = PMIC_GPIO_FUNC_DTEST2,
214 [PMIC_GPIO_FUNC_INDEX_DTEST3] = PMIC_GPIO_FUNC_DTEST3,
215 [PMIC_GPIO_FUNC_INDEX_DTEST4] = PMIC_GPIO_FUNC_DTEST4,
216 };
217
pmic_gpio_read(struct pmic_gpio_state * state,struct pmic_gpio_pad * pad,unsigned int addr)218 static int pmic_gpio_read(struct pmic_gpio_state *state,
219 struct pmic_gpio_pad *pad, unsigned int addr)
220 {
221 unsigned int val;
222 int ret;
223
224 ret = regmap_read(state->map, pad->base + addr, &val);
225 if (ret < 0)
226 dev_err(state->dev, "read 0x%x failed\n", addr);
227 else
228 ret = val;
229
230 return ret;
231 }
232
pmic_gpio_write(struct pmic_gpio_state * state,struct pmic_gpio_pad * pad,unsigned int addr,unsigned int val)233 static int pmic_gpio_write(struct pmic_gpio_state *state,
234 struct pmic_gpio_pad *pad, unsigned int addr,
235 unsigned int val)
236 {
237 int ret;
238
239 ret = regmap_write(state->map, pad->base + addr, val);
240 if (ret < 0)
241 dev_err(state->dev, "write 0x%x failed\n", addr);
242
243 return ret;
244 }
245
pmic_gpio_get_groups_count(struct pinctrl_dev * pctldev)246 static int pmic_gpio_get_groups_count(struct pinctrl_dev *pctldev)
247 {
248 /* Every PIN is a group */
249 return pctldev->desc->npins;
250 }
251
pmic_gpio_get_group_name(struct pinctrl_dev * pctldev,unsigned pin)252 static const char *pmic_gpio_get_group_name(struct pinctrl_dev *pctldev,
253 unsigned pin)
254 {
255 return pctldev->desc->pins[pin].name;
256 }
257
pmic_gpio_get_group_pins(struct pinctrl_dev * pctldev,unsigned pin,const unsigned ** pins,unsigned * num_pins)258 static int pmic_gpio_get_group_pins(struct pinctrl_dev *pctldev, unsigned pin,
259 const unsigned **pins, unsigned *num_pins)
260 {
261 *pins = &pctldev->desc->pins[pin].number;
262 *num_pins = 1;
263 return 0;
264 }
265
266 static const struct pinctrl_ops pmic_gpio_pinctrl_ops = {
267 .get_groups_count = pmic_gpio_get_groups_count,
268 .get_group_name = pmic_gpio_get_group_name,
269 .get_group_pins = pmic_gpio_get_group_pins,
270 .dt_node_to_map = pinconf_generic_dt_node_to_map_group,
271 .dt_free_map = pinctrl_utils_free_map,
272 };
273
pmic_gpio_get_functions_count(struct pinctrl_dev * pctldev)274 static int pmic_gpio_get_functions_count(struct pinctrl_dev *pctldev)
275 {
276 return ARRAY_SIZE(pmic_gpio_functions);
277 }
278
pmic_gpio_get_function_name(struct pinctrl_dev * pctldev,unsigned function)279 static const char *pmic_gpio_get_function_name(struct pinctrl_dev *pctldev,
280 unsigned function)
281 {
282 return pmic_gpio_functions[function];
283 }
284
pmic_gpio_get_function_groups(struct pinctrl_dev * pctldev,unsigned function,const char * const ** groups,unsigned * const num_qgroups)285 static int pmic_gpio_get_function_groups(struct pinctrl_dev *pctldev,
286 unsigned function,
287 const char *const **groups,
288 unsigned *const num_qgroups)
289 {
290 *groups = pmic_gpio_groups;
291 *num_qgroups = pctldev->desc->npins;
292 return 0;
293 }
294
pmic_gpio_set_mux(struct pinctrl_dev * pctldev,unsigned function,unsigned pin)295 static int pmic_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned function,
296 unsigned pin)
297 {
298 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
299 struct pmic_gpio_pad *pad;
300 unsigned int val;
301 int ret;
302
303 if (function > PMIC_GPIO_FUNC_INDEX_DTEST4) {
304 pr_err("function: %d is not defined\n", function);
305 return -EINVAL;
306 }
307
308 pad = pctldev->desc->pins[pin].drv_data;
309 /*
310 * Non-LV/MV subtypes only support 2 special functions,
311 * offsetting the dtestx function values by 2
312 */
313 if (!pad->lv_mv_type) {
314 if (function == PMIC_GPIO_FUNC_INDEX_FUNC3 ||
315 function == PMIC_GPIO_FUNC_INDEX_FUNC4) {
316 pr_err("LV/MV subtype doesn't have func3/func4\n");
317 return -EINVAL;
318 }
319 if (function >= PMIC_GPIO_FUNC_INDEX_DTEST1)
320 function -= (PMIC_GPIO_FUNC_INDEX_DTEST1 -
321 PMIC_GPIO_FUNC_INDEX_FUNC3);
322 }
323
324 pad->function = function;
325
326 if (pad->analog_pass)
327 val = PMIC_GPIO_MODE_ANALOG_PASS_THRU;
328 else if (pad->output_enabled && pad->input_enabled)
329 val = PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT;
330 else if (pad->output_enabled)
331 val = PMIC_GPIO_MODE_DIGITAL_OUTPUT;
332 else
333 val = PMIC_GPIO_MODE_DIGITAL_INPUT;
334
335 if (pad->lv_mv_type) {
336 ret = pmic_gpio_write(state, pad,
337 PMIC_GPIO_REG_MODE_CTL, val);
338 if (ret < 0)
339 return ret;
340
341 val = pad->atest - 1;
342 ret = pmic_gpio_write(state, pad,
343 PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL, val);
344 if (ret < 0)
345 return ret;
346
347 val = pad->out_value
348 << PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT;
349 val |= pad->function
350 & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
351 ret = pmic_gpio_write(state, pad,
352 PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL, val);
353 if (ret < 0)
354 return ret;
355 } else {
356 val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
357 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
358 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
359
360 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
361 if (ret < 0)
362 return ret;
363 }
364
365 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT;
366
367 return pmic_gpio_write(state, pad, PMIC_GPIO_REG_EN_CTL, val);
368 }
369
370 static const struct pinmux_ops pmic_gpio_pinmux_ops = {
371 .get_functions_count = pmic_gpio_get_functions_count,
372 .get_function_name = pmic_gpio_get_function_name,
373 .get_function_groups = pmic_gpio_get_function_groups,
374 .set_mux = pmic_gpio_set_mux,
375 };
376
pmic_gpio_config_get(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * config)377 static int pmic_gpio_config_get(struct pinctrl_dev *pctldev,
378 unsigned int pin, unsigned long *config)
379 {
380 unsigned param = pinconf_to_config_param(*config);
381 struct pmic_gpio_pad *pad;
382 unsigned arg;
383
384 pad = pctldev->desc->pins[pin].drv_data;
385
386 switch (param) {
387 case PIN_CONFIG_DRIVE_PUSH_PULL:
388 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS)
389 return -EINVAL;
390 arg = 1;
391 break;
392 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
393 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS)
394 return -EINVAL;
395 arg = 1;
396 break;
397 case PIN_CONFIG_DRIVE_OPEN_SOURCE:
398 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS)
399 return -EINVAL;
400 arg = 1;
401 break;
402 case PIN_CONFIG_BIAS_PULL_DOWN:
403 if (pad->pullup != PMIC_GPIO_PULL_DOWN)
404 return -EINVAL;
405 arg = 1;
406 break;
407 case PIN_CONFIG_BIAS_DISABLE:
408 if (pad->pullup != PMIC_GPIO_PULL_DISABLE)
409 return -EINVAL;
410 arg = 1;
411 break;
412 case PIN_CONFIG_BIAS_PULL_UP:
413 if (pad->pullup != PMIC_GPIO_PULL_UP_30)
414 return -EINVAL;
415 arg = 1;
416 break;
417 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
418 if (pad->is_enabled)
419 return -EINVAL;
420 arg = 1;
421 break;
422 case PIN_CONFIG_POWER_SOURCE:
423 arg = pad->power_source;
424 break;
425 case PIN_CONFIG_INPUT_ENABLE:
426 if (!pad->input_enabled)
427 return -EINVAL;
428 arg = 1;
429 break;
430 case PIN_CONFIG_OUTPUT:
431 arg = pad->out_value;
432 break;
433 case PMIC_GPIO_CONF_PULL_UP:
434 arg = pad->pullup;
435 break;
436 case PMIC_GPIO_CONF_STRENGTH:
437 arg = pad->strength;
438 break;
439 case PMIC_GPIO_CONF_ATEST:
440 arg = pad->atest;
441 break;
442 case PMIC_GPIO_CONF_ANALOG_PASS:
443 arg = pad->analog_pass;
444 break;
445 case PMIC_GPIO_CONF_DTEST_BUFFER:
446 arg = pad->dtest_buffer;
447 break;
448 default:
449 return -EINVAL;
450 }
451
452 *config = pinconf_to_config_packed(param, arg);
453 return 0;
454 }
455
pmic_gpio_config_set(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * configs,unsigned nconfs)456 static int pmic_gpio_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
457 unsigned long *configs, unsigned nconfs)
458 {
459 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
460 struct pmic_gpio_pad *pad;
461 unsigned param, arg;
462 unsigned int val;
463 int i, ret;
464
465 pad = pctldev->desc->pins[pin].drv_data;
466
467 pad->is_enabled = true;
468 for (i = 0; i < nconfs; i++) {
469 param = pinconf_to_config_param(configs[i]);
470 arg = pinconf_to_config_argument(configs[i]);
471
472 switch (param) {
473 case PIN_CONFIG_DRIVE_PUSH_PULL:
474 pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS;
475 break;
476 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
477 if (!pad->have_buffer)
478 return -EINVAL;
479 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS;
480 break;
481 case PIN_CONFIG_DRIVE_OPEN_SOURCE:
482 if (!pad->have_buffer)
483 return -EINVAL;
484 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS;
485 break;
486 case PIN_CONFIG_BIAS_DISABLE:
487 pad->pullup = PMIC_GPIO_PULL_DISABLE;
488 break;
489 case PIN_CONFIG_BIAS_PULL_UP:
490 pad->pullup = PMIC_GPIO_PULL_UP_30;
491 break;
492 case PIN_CONFIG_BIAS_PULL_DOWN:
493 if (arg)
494 pad->pullup = PMIC_GPIO_PULL_DOWN;
495 else
496 pad->pullup = PMIC_GPIO_PULL_DISABLE;
497 break;
498 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
499 pad->is_enabled = false;
500 break;
501 case PIN_CONFIG_POWER_SOURCE:
502 if (arg >= pad->num_sources)
503 return -EINVAL;
504 pad->power_source = arg;
505 break;
506 case PIN_CONFIG_INPUT_ENABLE:
507 pad->input_enabled = arg ? true : false;
508 break;
509 case PIN_CONFIG_OUTPUT:
510 pad->output_enabled = true;
511 pad->out_value = arg;
512 break;
513 case PMIC_GPIO_CONF_PULL_UP:
514 if (arg > PMIC_GPIO_PULL_UP_1P5_30)
515 return -EINVAL;
516 pad->pullup = arg;
517 break;
518 case PMIC_GPIO_CONF_STRENGTH:
519 if (arg > PMIC_GPIO_STRENGTH_LOW)
520 return -EINVAL;
521 pad->strength = arg;
522 break;
523 case PMIC_GPIO_CONF_ATEST:
524 if (!pad->lv_mv_type || arg > 4)
525 return -EINVAL;
526 pad->atest = arg;
527 break;
528 case PMIC_GPIO_CONF_ANALOG_PASS:
529 if (!pad->lv_mv_type)
530 return -EINVAL;
531 pad->analog_pass = true;
532 break;
533 case PMIC_GPIO_CONF_DTEST_BUFFER:
534 if (arg > 4)
535 return -EINVAL;
536 pad->dtest_buffer = arg;
537 break;
538 default:
539 return -EINVAL;
540 }
541 }
542
543 val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT;
544
545 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL, val);
546 if (ret < 0)
547 return ret;
548
549 val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT;
550
551 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL, val);
552 if (ret < 0)
553 return ret;
554
555 val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT;
556 val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
557
558 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL, val);
559 if (ret < 0)
560 return ret;
561
562 if (pad->dtest_buffer == 0) {
563 val = 0;
564 } else {
565 if (pad->lv_mv_type) {
566 val = pad->dtest_buffer - 1;
567 val |= PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN;
568 } else {
569 val = BIT(pad->dtest_buffer - 1);
570 }
571 }
572 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_DIG_IN_CTL, val);
573 if (ret < 0)
574 return ret;
575
576 if (pad->analog_pass)
577 val = PMIC_GPIO_MODE_ANALOG_PASS_THRU;
578 else if (pad->output_enabled && pad->input_enabled)
579 val = PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT;
580 else if (pad->output_enabled)
581 val = PMIC_GPIO_MODE_DIGITAL_OUTPUT;
582 else
583 val = PMIC_GPIO_MODE_DIGITAL_INPUT;
584
585 if (pad->lv_mv_type) {
586 ret = pmic_gpio_write(state, pad,
587 PMIC_GPIO_REG_MODE_CTL, val);
588 if (ret < 0)
589 return ret;
590
591 val = pad->atest - 1;
592 ret = pmic_gpio_write(state, pad,
593 PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL, val);
594 if (ret < 0)
595 return ret;
596
597 val = pad->out_value
598 << PMIC_GPIO_LV_MV_OUTPUT_INVERT_SHIFT;
599 val |= pad->function
600 & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
601 ret = pmic_gpio_write(state, pad,
602 PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL, val);
603 if (ret < 0)
604 return ret;
605 } else {
606 val = val << PMIC_GPIO_REG_MODE_DIR_SHIFT;
607 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
608 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
609
610 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_MODE_CTL, val);
611 if (ret < 0)
612 return ret;
613 }
614
615 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT;
616
617 ret = pmic_gpio_write(state, pad, PMIC_GPIO_REG_EN_CTL, val);
618
619 return ret;
620 }
621
pmic_gpio_config_dbg_show(struct pinctrl_dev * pctldev,struct seq_file * s,unsigned pin)622 static void pmic_gpio_config_dbg_show(struct pinctrl_dev *pctldev,
623 struct seq_file *s, unsigned pin)
624 {
625 struct pmic_gpio_state *state = pinctrl_dev_get_drvdata(pctldev);
626 struct pmic_gpio_pad *pad;
627 int ret, val, function;
628
629 static const char *const biases[] = {
630 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
631 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
632 };
633 static const char *const buffer_types[] = {
634 "push-pull", "open-drain", "open-source"
635 };
636 static const char *const strengths[] = {
637 "no", "high", "medium", "low"
638 };
639
640 pad = pctldev->desc->pins[pin].drv_data;
641
642 seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET);
643
644 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_EN_CTL);
645
646 if (val < 0 || !(val >> PMIC_GPIO_REG_MASTER_EN_SHIFT)) {
647 seq_puts(s, " ---");
648 } else {
649 if (pad->input_enabled) {
650 ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
651 if (ret < 0)
652 return;
653
654 ret &= PMIC_MPP_REG_RT_STS_VAL_MASK;
655 pad->out_value = ret;
656 }
657 /*
658 * For the non-LV/MV subtypes only 2 special functions are
659 * available, offsetting the dtest function values by 2.
660 */
661 function = pad->function;
662 if (!pad->lv_mv_type &&
663 pad->function >= PMIC_GPIO_FUNC_INDEX_FUNC3)
664 function += PMIC_GPIO_FUNC_INDEX_DTEST1 -
665 PMIC_GPIO_FUNC_INDEX_FUNC3;
666
667 if (pad->analog_pass)
668 seq_puts(s, " analog-pass");
669 else
670 seq_printf(s, " %-4s",
671 pad->output_enabled ? "out" : "in");
672 seq_printf(s, " %-4s", pad->out_value ? "high" : "low");
673 seq_printf(s, " %-7s", pmic_gpio_functions[function]);
674 seq_printf(s, " vin-%d", pad->power_source);
675 seq_printf(s, " %-27s", biases[pad->pullup]);
676 seq_printf(s, " %-10s", buffer_types[pad->buffer_type]);
677 seq_printf(s, " %-7s", strengths[pad->strength]);
678 seq_printf(s, " atest-%d", pad->atest);
679 seq_printf(s, " dtest-%d", pad->dtest_buffer);
680 }
681 }
682
683 static const struct pinconf_ops pmic_gpio_pinconf_ops = {
684 .is_generic = true,
685 .pin_config_group_get = pmic_gpio_config_get,
686 .pin_config_group_set = pmic_gpio_config_set,
687 .pin_config_group_dbg_show = pmic_gpio_config_dbg_show,
688 };
689
pmic_gpio_direction_input(struct gpio_chip * chip,unsigned pin)690 static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
691 {
692 struct pmic_gpio_state *state = gpiochip_get_data(chip);
693 unsigned long config;
694
695 config = pinconf_to_config_packed(PIN_CONFIG_INPUT_ENABLE, 1);
696
697 return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
698 }
699
pmic_gpio_direction_output(struct gpio_chip * chip,unsigned pin,int val)700 static int pmic_gpio_direction_output(struct gpio_chip *chip,
701 unsigned pin, int val)
702 {
703 struct pmic_gpio_state *state = gpiochip_get_data(chip);
704 unsigned long config;
705
706 config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, val);
707
708 return pmic_gpio_config_set(state->ctrl, pin, &config, 1);
709 }
710
pmic_gpio_get(struct gpio_chip * chip,unsigned pin)711 static int pmic_gpio_get(struct gpio_chip *chip, unsigned pin)
712 {
713 struct pmic_gpio_state *state = gpiochip_get_data(chip);
714 struct pmic_gpio_pad *pad;
715 int ret;
716
717 pad = state->ctrl->desc->pins[pin].drv_data;
718
719 if (!pad->is_enabled)
720 return -EINVAL;
721
722 if (pad->input_enabled) {
723 ret = pmic_gpio_read(state, pad, PMIC_MPP_REG_RT_STS);
724 if (ret < 0)
725 return ret;
726
727 pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK;
728 }
729
730 return !!pad->out_value;
731 }
732
pmic_gpio_set(struct gpio_chip * chip,unsigned pin,int value)733 static void pmic_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
734 {
735 struct pmic_gpio_state *state = gpiochip_get_data(chip);
736 unsigned long config;
737
738 config = pinconf_to_config_packed(PIN_CONFIG_OUTPUT, value);
739
740 pmic_gpio_config_set(state->ctrl, pin, &config, 1);
741 }
742
pmic_gpio_of_xlate(struct gpio_chip * chip,const struct of_phandle_args * gpio_desc,u32 * flags)743 static int pmic_gpio_of_xlate(struct gpio_chip *chip,
744 const struct of_phandle_args *gpio_desc,
745 u32 *flags)
746 {
747 if (chip->of_gpio_n_cells < 2)
748 return -EINVAL;
749
750 if (flags)
751 *flags = gpio_desc->args[1];
752
753 return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET;
754 }
755
pmic_gpio_dbg_show(struct seq_file * s,struct gpio_chip * chip)756 static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
757 {
758 struct pmic_gpio_state *state = gpiochip_get_data(chip);
759 unsigned i;
760
761 for (i = 0; i < chip->ngpio; i++) {
762 pmic_gpio_config_dbg_show(state->ctrl, s, i);
763 seq_puts(s, "\n");
764 }
765 }
766
767 static const struct gpio_chip pmic_gpio_gpio_template = {
768 .direction_input = pmic_gpio_direction_input,
769 .direction_output = pmic_gpio_direction_output,
770 .get = pmic_gpio_get,
771 .set = pmic_gpio_set,
772 .request = gpiochip_generic_request,
773 .free = gpiochip_generic_free,
774 .of_xlate = pmic_gpio_of_xlate,
775 .dbg_show = pmic_gpio_dbg_show,
776 };
777
pmic_gpio_populate(struct pmic_gpio_state * state,struct pmic_gpio_pad * pad)778 static int pmic_gpio_populate(struct pmic_gpio_state *state,
779 struct pmic_gpio_pad *pad)
780 {
781 int type, subtype, val, dir;
782
783 type = pmic_gpio_read(state, pad, PMIC_GPIO_REG_TYPE);
784 if (type < 0)
785 return type;
786
787 if (type != PMIC_GPIO_TYPE) {
788 dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n",
789 type, pad->base);
790 return -ENODEV;
791 }
792
793 subtype = pmic_gpio_read(state, pad, PMIC_GPIO_REG_SUBTYPE);
794 if (subtype < 0)
795 return subtype;
796
797 switch (subtype) {
798 case PMIC_GPIO_SUBTYPE_GPIO_4CH:
799 pad->have_buffer = true;
800 fallthrough;
801 case PMIC_GPIO_SUBTYPE_GPIOC_4CH:
802 pad->num_sources = 4;
803 break;
804 case PMIC_GPIO_SUBTYPE_GPIO_8CH:
805 pad->have_buffer = true;
806 fallthrough;
807 case PMIC_GPIO_SUBTYPE_GPIOC_8CH:
808 pad->num_sources = 8;
809 break;
810 case PMIC_GPIO_SUBTYPE_GPIO_LV:
811 pad->num_sources = 1;
812 pad->have_buffer = true;
813 pad->lv_mv_type = true;
814 break;
815 case PMIC_GPIO_SUBTYPE_GPIO_MV:
816 pad->num_sources = 2;
817 pad->have_buffer = true;
818 pad->lv_mv_type = true;
819 break;
820 default:
821 dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype);
822 return -ENODEV;
823 }
824
825 if (pad->lv_mv_type) {
826 val = pmic_gpio_read(state, pad,
827 PMIC_GPIO_REG_LV_MV_DIG_OUT_SOURCE_CTL);
828 if (val < 0)
829 return val;
830
831 pad->out_value = !!(val & PMIC_GPIO_LV_MV_OUTPUT_INVERT);
832 pad->function = val & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK;
833
834 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
835 if (val < 0)
836 return val;
837
838 dir = val & PMIC_GPIO_REG_LV_MV_MODE_DIR_MASK;
839 } else {
840 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_MODE_CTL);
841 if (val < 0)
842 return val;
843
844 pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT;
845
846 dir = val >> PMIC_GPIO_REG_MODE_DIR_SHIFT;
847 dir &= PMIC_GPIO_REG_MODE_DIR_MASK;
848 pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT;
849 pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK;
850 }
851
852 switch (dir) {
853 case PMIC_GPIO_MODE_DIGITAL_INPUT:
854 pad->input_enabled = true;
855 pad->output_enabled = false;
856 break;
857 case PMIC_GPIO_MODE_DIGITAL_OUTPUT:
858 pad->input_enabled = false;
859 pad->output_enabled = true;
860 break;
861 case PMIC_GPIO_MODE_DIGITAL_INPUT_OUTPUT:
862 pad->input_enabled = true;
863 pad->output_enabled = true;
864 break;
865 case PMIC_GPIO_MODE_ANALOG_PASS_THRU:
866 if (!pad->lv_mv_type)
867 return -ENODEV;
868 pad->analog_pass = true;
869 break;
870 default:
871 dev_err(state->dev, "unknown GPIO direction\n");
872 return -ENODEV;
873 }
874
875 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_VIN_CTL);
876 if (val < 0)
877 return val;
878
879 pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT;
880 pad->power_source &= PMIC_GPIO_REG_VIN_MASK;
881
882 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_PULL_CTL);
883 if (val < 0)
884 return val;
885
886 pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT;
887 pad->pullup &= PMIC_GPIO_REG_PULL_MASK;
888
889 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_IN_CTL);
890 if (val < 0)
891 return val;
892
893 if (pad->lv_mv_type && (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN))
894 pad->dtest_buffer =
895 (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_SEL_MASK) + 1;
896 else if (!pad->lv_mv_type)
897 pad->dtest_buffer = ffs(val);
898 else
899 pad->dtest_buffer = 0;
900
901 val = pmic_gpio_read(state, pad, PMIC_GPIO_REG_DIG_OUT_CTL);
902 if (val < 0)
903 return val;
904
905 pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT;
906 pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK;
907
908 pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT;
909 pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK;
910
911 if (pad->lv_mv_type) {
912 val = pmic_gpio_read(state, pad,
913 PMIC_GPIO_REG_LV_MV_ANA_PASS_THRU_SEL);
914 if (val < 0)
915 return val;
916 pad->atest = (val & PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK) + 1;
917 }
918
919 /* Pin could be disabled with PIN_CONFIG_BIAS_HIGH_IMPEDANCE */
920 pad->is_enabled = true;
921 return 0;
922 }
923
pmic_gpio_domain_translate(struct irq_domain * domain,struct irq_fwspec * fwspec,unsigned long * hwirq,unsigned int * type)924 static int pmic_gpio_domain_translate(struct irq_domain *domain,
925 struct irq_fwspec *fwspec,
926 unsigned long *hwirq,
927 unsigned int *type)
928 {
929 struct pmic_gpio_state *state = container_of(domain->host_data,
930 struct pmic_gpio_state,
931 chip);
932
933 if (fwspec->param_count != 2 ||
934 fwspec->param[0] < 1 || fwspec->param[0] > state->chip.ngpio)
935 return -EINVAL;
936
937 *hwirq = fwspec->param[0] - PMIC_GPIO_PHYSICAL_OFFSET;
938 *type = fwspec->param[1];
939
940 return 0;
941 }
942
pmic_gpio_child_offset_to_irq(struct gpio_chip * chip,unsigned int offset)943 static unsigned int pmic_gpio_child_offset_to_irq(struct gpio_chip *chip,
944 unsigned int offset)
945 {
946 return offset + PMIC_GPIO_PHYSICAL_OFFSET;
947 }
948
pmic_gpio_child_to_parent_hwirq(struct gpio_chip * chip,unsigned int child_hwirq,unsigned int child_type,unsigned int * parent_hwirq,unsigned int * parent_type)949 static int pmic_gpio_child_to_parent_hwirq(struct gpio_chip *chip,
950 unsigned int child_hwirq,
951 unsigned int child_type,
952 unsigned int *parent_hwirq,
953 unsigned int *parent_type)
954 {
955 struct pmic_gpio_state *state = gpiochip_get_data(chip);
956
957 *parent_hwirq = child_hwirq + state->pid_base;
958 *parent_type = child_type;
959
960 return 0;
961 }
962
pmic_gpio_populate_parent_fwspec(struct gpio_chip * chip,unsigned int parent_hwirq,unsigned int parent_type)963 static void *pmic_gpio_populate_parent_fwspec(struct gpio_chip *chip,
964 unsigned int parent_hwirq,
965 unsigned int parent_type)
966 {
967 struct pmic_gpio_state *state = gpiochip_get_data(chip);
968 struct irq_fwspec *fwspec;
969
970 fwspec = kzalloc(sizeof(*fwspec), GFP_KERNEL);
971 if (!fwspec)
972 return NULL;
973
974 fwspec->fwnode = chip->irq.parent_domain->fwnode;
975
976 fwspec->param_count = 4;
977 fwspec->param[0] = state->usid;
978 fwspec->param[1] = parent_hwirq;
979 /* param[2] must be left as 0 */
980 fwspec->param[3] = parent_type;
981
982 return fwspec;
983 }
984
pmic_gpio_probe(struct platform_device * pdev)985 static int pmic_gpio_probe(struct platform_device *pdev)
986 {
987 struct irq_domain *parent_domain;
988 struct device_node *parent_node;
989 struct device *dev = &pdev->dev;
990 struct pinctrl_pin_desc *pindesc;
991 struct pinctrl_desc *pctrldesc;
992 struct pmic_gpio_pad *pad, *pads;
993 struct pmic_gpio_state *state;
994 struct gpio_irq_chip *girq;
995 const struct spmi_device *parent_spmi_dev;
996 int ret, npins, i;
997 u32 reg;
998
999 ret = of_property_read_u32(dev->of_node, "reg", ®);
1000 if (ret < 0) {
1001 dev_err(dev, "missing base address");
1002 return ret;
1003 }
1004
1005 npins = (uintptr_t) device_get_match_data(&pdev->dev);
1006
1007 state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
1008 if (!state)
1009 return -ENOMEM;
1010
1011 platform_set_drvdata(pdev, state);
1012
1013 state->dev = &pdev->dev;
1014 state->map = dev_get_regmap(dev->parent, NULL);
1015 parent_spmi_dev = to_spmi_device(dev->parent);
1016 state->usid = parent_spmi_dev->usid;
1017 state->pid_base = reg >> 8;
1018
1019 pindesc = devm_kcalloc(dev, npins, sizeof(*pindesc), GFP_KERNEL);
1020 if (!pindesc)
1021 return -ENOMEM;
1022
1023 pads = devm_kcalloc(dev, npins, sizeof(*pads), GFP_KERNEL);
1024 if (!pads)
1025 return -ENOMEM;
1026
1027 pctrldesc = devm_kzalloc(dev, sizeof(*pctrldesc), GFP_KERNEL);
1028 if (!pctrldesc)
1029 return -ENOMEM;
1030
1031 pctrldesc->pctlops = &pmic_gpio_pinctrl_ops;
1032 pctrldesc->pmxops = &pmic_gpio_pinmux_ops;
1033 pctrldesc->confops = &pmic_gpio_pinconf_ops;
1034 pctrldesc->owner = THIS_MODULE;
1035 pctrldesc->name = dev_name(dev);
1036 pctrldesc->pins = pindesc;
1037 pctrldesc->npins = npins;
1038 pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings);
1039 pctrldesc->custom_params = pmic_gpio_bindings;
1040 #ifdef CONFIG_DEBUG_FS
1041 pctrldesc->custom_conf_items = pmic_conf_items;
1042 #endif
1043
1044 for (i = 0; i < npins; i++, pindesc++) {
1045 pad = &pads[i];
1046 pindesc->drv_data = pad;
1047 pindesc->number = i;
1048 pindesc->name = pmic_gpio_groups[i];
1049
1050 pad->base = reg + i * PMIC_GPIO_ADDRESS_RANGE;
1051
1052 ret = pmic_gpio_populate(state, pad);
1053 if (ret < 0)
1054 return ret;
1055 }
1056
1057 state->chip = pmic_gpio_gpio_template;
1058 state->chip.parent = dev;
1059 state->chip.base = -1;
1060 state->chip.ngpio = npins;
1061 state->chip.label = dev_name(dev);
1062 state->chip.of_gpio_n_cells = 2;
1063 state->chip.can_sleep = false;
1064
1065 state->ctrl = devm_pinctrl_register(dev, pctrldesc, state);
1066 if (IS_ERR(state->ctrl))
1067 return PTR_ERR(state->ctrl);
1068
1069 parent_node = of_irq_find_parent(state->dev->of_node);
1070 if (!parent_node)
1071 return -ENXIO;
1072
1073 parent_domain = irq_find_host(parent_node);
1074 of_node_put(parent_node);
1075 if (!parent_domain)
1076 return -ENXIO;
1077
1078 state->irq.name = "spmi-gpio",
1079 state->irq.irq_ack = irq_chip_ack_parent,
1080 state->irq.irq_mask = irq_chip_mask_parent,
1081 state->irq.irq_unmask = irq_chip_unmask_parent,
1082 state->irq.irq_set_type = irq_chip_set_type_parent,
1083 state->irq.irq_set_wake = irq_chip_set_wake_parent,
1084 state->irq.flags = IRQCHIP_MASK_ON_SUSPEND,
1085
1086 girq = &state->chip.irq;
1087 girq->chip = &state->irq;
1088 girq->default_type = IRQ_TYPE_NONE;
1089 girq->handler = handle_level_irq;
1090 girq->fwnode = of_node_to_fwnode(state->dev->of_node);
1091 girq->parent_domain = parent_domain;
1092 girq->child_to_parent_hwirq = pmic_gpio_child_to_parent_hwirq;
1093 girq->populate_parent_alloc_arg = pmic_gpio_populate_parent_fwspec;
1094 girq->child_offset_to_irq = pmic_gpio_child_offset_to_irq;
1095 girq->child_irq_domain_ops.translate = pmic_gpio_domain_translate;
1096
1097 ret = gpiochip_add_data(&state->chip, state);
1098 if (ret) {
1099 dev_err(state->dev, "can't add gpio chip\n");
1100 return ret;
1101 }
1102
1103 /*
1104 * For DeviceTree-supported systems, the gpio core checks the
1105 * pinctrl's device node for the "gpio-ranges" property.
1106 * If it is present, it takes care of adding the pin ranges
1107 * for the driver. In this case the driver can skip ahead.
1108 *
1109 * In order to remain compatible with older, existing DeviceTree
1110 * files which don't set the "gpio-ranges" property or systems that
1111 * utilize ACPI the driver has to call gpiochip_add_pin_range().
1112 */
1113 if (!of_property_read_bool(dev->of_node, "gpio-ranges")) {
1114 ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0,
1115 npins);
1116 if (ret) {
1117 dev_err(dev, "failed to add pin range\n");
1118 goto err_range;
1119 }
1120 }
1121
1122 return 0;
1123
1124 err_range:
1125 gpiochip_remove(&state->chip);
1126 return ret;
1127 }
1128
pmic_gpio_remove(struct platform_device * pdev)1129 static int pmic_gpio_remove(struct platform_device *pdev)
1130 {
1131 struct pmic_gpio_state *state = platform_get_drvdata(pdev);
1132
1133 gpiochip_remove(&state->chip);
1134 return 0;
1135 }
1136
1137 static const struct of_device_id pmic_gpio_of_match[] = {
1138 /* pm660 has 13 GPIOs with holes on 1, 5, 6, 7, 8 and 10 */
1139 { .compatible = "qcom,pm660-gpio", .data = (void *) 13 },
1140 /* pm660l has 12 GPIOs with holes on 1, 2, 10, 11 and 12 */
1141 { .compatible = "qcom,pm660l-gpio", .data = (void *) 12 },
1142 { .compatible = "qcom,pm6150-gpio", .data = (void *) 10 },
1143 { .compatible = "qcom,pm6150l-gpio", .data = (void *) 12 },
1144 { .compatible = "qcom,pm7325-gpio", .data = (void *) 10 },
1145 { .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
1146 { .compatible = "qcom,pm8008-gpio", .data = (void *) 2 },
1147 /* pm8150 has 10 GPIOs with holes on 2, 5, 7 and 8 */
1148 { .compatible = "qcom,pm8150-gpio", .data = (void *) 10 },
1149 { .compatible = "qcom,pmc8180-gpio", .data = (void *) 10 },
1150 /* pm8150b has 12 GPIOs with holes on 3, r and 7 */
1151 { .compatible = "qcom,pm8150b-gpio", .data = (void *) 12 },
1152 /* pm8150l has 12 GPIOs with holes on 7 */
1153 { .compatible = "qcom,pm8150l-gpio", .data = (void *) 12 },
1154 { .compatible = "qcom,pmc8180c-gpio", .data = (void *) 12 },
1155 { .compatible = "qcom,pm8350-gpio", .data = (void *) 10 },
1156 { .compatible = "qcom,pm8350b-gpio", .data = (void *) 8 },
1157 { .compatible = "qcom,pm8350c-gpio", .data = (void *) 9 },
1158 { .compatible = "qcom,pm8916-gpio", .data = (void *) 4 },
1159 { .compatible = "qcom,pm8941-gpio", .data = (void *) 36 },
1160 /* pm8950 has 8 GPIOs with holes on 3 */
1161 { .compatible = "qcom,pm8950-gpio", .data = (void *) 8 },
1162 { .compatible = "qcom,pm8994-gpio", .data = (void *) 22 },
1163 { .compatible = "qcom,pm8998-gpio", .data = (void *) 26 },
1164 { .compatible = "qcom,pma8084-gpio", .data = (void *) 22 },
1165 { .compatible = "qcom,pmi8950-gpio", .data = (void *) 2 },
1166 { .compatible = "qcom,pmi8994-gpio", .data = (void *) 10 },
1167 { .compatible = "qcom,pmi8998-gpio", .data = (void *) 14 },
1168 { .compatible = "qcom,pmk8350-gpio", .data = (void *) 4 },
1169 { .compatible = "qcom,pmm8155au-gpio", .data = (void *) 10 },
1170 { .compatible = "qcom,pmr735a-gpio", .data = (void *) 4 },
1171 { .compatible = "qcom,pmr735b-gpio", .data = (void *) 4 },
1172 /* pms405 has 12 GPIOs with holes on 1, 9, and 10 */
1173 { .compatible = "qcom,pms405-gpio", .data = (void *) 12 },
1174 /* pmx55 has 11 GPIOs with holes on 3, 7, 10, 11 */
1175 { .compatible = "qcom,pmx55-gpio", .data = (void *) 11 },
1176 { },
1177 };
1178
1179 MODULE_DEVICE_TABLE(of, pmic_gpio_of_match);
1180
1181 static struct platform_driver pmic_gpio_driver = {
1182 .driver = {
1183 .name = "qcom-spmi-gpio",
1184 .of_match_table = pmic_gpio_of_match,
1185 },
1186 .probe = pmic_gpio_probe,
1187 .remove = pmic_gpio_remove,
1188 };
1189
1190 module_platform_driver(pmic_gpio_driver);
1191
1192 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
1193 MODULE_DESCRIPTION("Qualcomm SPMI PMIC GPIO pin control driver");
1194 MODULE_ALIAS("platform:qcom-spmi-gpio");
1195 MODULE_LICENSE("GPL v2");
1196