Merge remote-tracking branches 'asoc/fix/tlv320aic3x' and 'asoc/fix/wm8962' into...
[linux-drm-fsl-dcu.git] / drivers / pinctrl / qcom / pinctrl-ssbi-gpio.c
1 /*
2  * Copyright (c) 2015, Sony Mobile Communications AB.
3  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 and
7  * only version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  */
14
15 #include <linux/module.h>
16 #include <linux/platform_device.h>
17 #include <linux/pinctrl/pinctrl.h>
18 #include <linux/pinctrl/pinmux.h>
19 #include <linux/pinctrl/pinconf.h>
20 #include <linux/pinctrl/pinconf-generic.h>
21 #include <linux/slab.h>
22 #include <linux/regmap.h>
23 #include <linux/gpio.h>
24 #include <linux/interrupt.h>
25 #include <linux/of_device.h>
26
27 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
28
29 #include "../core.h"
30 #include "../pinctrl-utils.h"
31
32 /* mode */
33 #define PM8XXX_GPIO_MODE_ENABLED        BIT(0)
34 #define PM8XXX_GPIO_MODE_INPUT          0
35 #define PM8XXX_GPIO_MODE_OUTPUT         2
36
37 /* output buffer */
38 #define PM8XXX_GPIO_PUSH_PULL           0
39 #define PM8XXX_GPIO_OPEN_DRAIN          1
40
41 /* bias */
42 #define PM8XXX_GPIO_BIAS_PU_30          0
43 #define PM8XXX_GPIO_BIAS_PU_1P5         1
44 #define PM8XXX_GPIO_BIAS_PU_31P5        2
45 #define PM8XXX_GPIO_BIAS_PU_1P5_30      3
46 #define PM8XXX_GPIO_BIAS_PD             4
47 #define PM8XXX_GPIO_BIAS_NP             5
48
49 /* GPIO registers */
50 #define SSBI_REG_ADDR_GPIO_BASE         0x150
51 #define SSBI_REG_ADDR_GPIO(n)           (SSBI_REG_ADDR_GPIO_BASE + n)
52
53 #define PM8XXX_BANK_WRITE               BIT(7)
54
55 #define PM8XXX_MAX_GPIOS               44
56
57 /* custom pinconf parameters */
58 #define PM8XXX_QCOM_DRIVE_STRENGH      (PIN_CONFIG_END + 1)
59 #define PM8XXX_QCOM_PULL_UP_STRENGTH   (PIN_CONFIG_END + 2)
60
61 /**
62  * struct pm8xxx_pin_data - dynamic configuration for a pin
63  * @reg:               address of the control register
64  * @irq:               IRQ from the PMIC interrupt controller
65  * @power_source:      logical selected voltage source, mapping in static data
66  *                     is used translate to register values
67  * @mode:              operating mode for the pin (input/output)
68  * @open_drain:        output buffer configured as open-drain (vs push-pull)
69  * @output_value:      configured output value
70  * @bias:              register view of configured bias
71  * @pull_up_strength:  placeholder for selected pull up strength
72  *                     only used to configure bias when pull up is selected
73  * @output_strength:   selector of output-strength
74  * @disable:           pin disabled / configured as tristate
75  * @function:          pinmux selector
76  * @inverted:          pin logic is inverted
77  */
78 struct pm8xxx_pin_data {
79         unsigned reg;
80         int irq;
81         u8 power_source;
82         u8 mode;
83         bool open_drain;
84         bool output_value;
85         u8 bias;
86         u8 pull_up_strength;
87         u8 output_strength;
88         bool disable;
89         u8 function;
90         bool inverted;
91 };
92
93 struct pm8xxx_gpio {
94         struct device *dev;
95         struct regmap *regmap;
96         struct pinctrl_dev *pctrl;
97         struct gpio_chip chip;
98
99         struct pinctrl_desc desc;
100         unsigned npins;
101 };
102
103 static const struct pinconf_generic_params pm8xxx_gpio_bindings[] = {
104         {"qcom,drive-strength",         PM8XXX_QCOM_DRIVE_STRENGH,      0},
105         {"qcom,pull-up-strength",       PM8XXX_QCOM_PULL_UP_STRENGTH,   0},
106 };
107
108 #ifdef CONFIG_DEBUG_FS
109 static const struct pin_config_item pm8xxx_conf_items[ARRAY_SIZE(pm8xxx_gpio_bindings)] = {
110         PCONFDUMP(PM8XXX_QCOM_DRIVE_STRENGH, "drive-strength", NULL, true),
111         PCONFDUMP(PM8XXX_QCOM_PULL_UP_STRENGTH,  "pull up strength", NULL, true),
112 };
113 #endif
114
115 static const char * const pm8xxx_groups[PM8XXX_MAX_GPIOS] = {
116         "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
117         "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
118         "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
119         "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
120         "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
121         "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
122         "gpio44",
123 };
124
125 static const char * const pm8xxx_gpio_functions[] = {
126         PMIC_GPIO_FUNC_NORMAL, PMIC_GPIO_FUNC_PAIRED,
127         PMIC_GPIO_FUNC_FUNC1, PMIC_GPIO_FUNC_FUNC2,
128         PMIC_GPIO_FUNC_DTEST1, PMIC_GPIO_FUNC_DTEST2,
129         PMIC_GPIO_FUNC_DTEST3, PMIC_GPIO_FUNC_DTEST4,
130 };
131
132 static int pm8xxx_read_bank(struct pm8xxx_gpio *pctrl,
133                             struct pm8xxx_pin_data *pin, int bank)
134 {
135         unsigned int val = bank << 4;
136         int ret;
137
138         ret = regmap_write(pctrl->regmap, pin->reg, val);
139         if (ret) {
140                 dev_err(pctrl->dev, "failed to select bank %d\n", bank);
141                 return ret;
142         }
143
144         ret = regmap_read(pctrl->regmap, pin->reg, &val);
145         if (ret) {
146                 dev_err(pctrl->dev, "failed to read register %d\n", bank);
147                 return ret;
148         }
149
150         return val;
151 }
152
153 static int pm8xxx_write_bank(struct pm8xxx_gpio *pctrl,
154                              struct pm8xxx_pin_data *pin,
155                              int bank,
156                              u8 val)
157 {
158         int ret;
159
160         val |= PM8XXX_BANK_WRITE;
161         val |= bank << 4;
162
163         ret = regmap_write(pctrl->regmap, pin->reg, val);
164         if (ret)
165                 dev_err(pctrl->dev, "failed to write register\n");
166
167         return ret;
168 }
169
170 static int pm8xxx_get_groups_count(struct pinctrl_dev *pctldev)
171 {
172         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
173
174         return pctrl->npins;
175 }
176
177 static const char *pm8xxx_get_group_name(struct pinctrl_dev *pctldev,
178                                          unsigned group)
179 {
180         return pm8xxx_groups[group];
181 }
182
183
184 static int pm8xxx_get_group_pins(struct pinctrl_dev *pctldev,
185                                  unsigned group,
186                                  const unsigned **pins,
187                                  unsigned *num_pins)
188 {
189         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
190
191         *pins = &pctrl->desc.pins[group].number;
192         *num_pins = 1;
193
194         return 0;
195 }
196
197 static const struct pinctrl_ops pm8xxx_pinctrl_ops = {
198         .get_groups_count       = pm8xxx_get_groups_count,
199         .get_group_name         = pm8xxx_get_group_name,
200         .get_group_pins         = pm8xxx_get_group_pins,
201         .dt_node_to_map         = pinconf_generic_dt_node_to_map_group,
202         .dt_free_map            = pinctrl_utils_dt_free_map,
203 };
204
205 static int pm8xxx_get_functions_count(struct pinctrl_dev *pctldev)
206 {
207         return ARRAY_SIZE(pm8xxx_gpio_functions);
208 }
209
210 static const char *pm8xxx_get_function_name(struct pinctrl_dev *pctldev,
211                                             unsigned function)
212 {
213         return pm8xxx_gpio_functions[function];
214 }
215
216 static int pm8xxx_get_function_groups(struct pinctrl_dev *pctldev,
217                                       unsigned function,
218                                       const char * const **groups,
219                                       unsigned * const num_groups)
220 {
221         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
222
223         *groups = pm8xxx_groups;
224         *num_groups = pctrl->npins;
225         return 0;
226 }
227
228 static int pm8xxx_pinmux_set_mux(struct pinctrl_dev *pctldev,
229                                  unsigned function,
230                                  unsigned group)
231 {
232         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
233         struct pm8xxx_pin_data *pin = pctrl->desc.pins[group].drv_data;
234         u8 val;
235
236         pin->function = function;
237         val = pin->function << 1;
238
239         pm8xxx_write_bank(pctrl, pin, 4, val);
240
241         return 0;
242 }
243
244 static const struct pinmux_ops pm8xxx_pinmux_ops = {
245         .get_functions_count    = pm8xxx_get_functions_count,
246         .get_function_name      = pm8xxx_get_function_name,
247         .get_function_groups    = pm8xxx_get_function_groups,
248         .set_mux                = pm8xxx_pinmux_set_mux,
249 };
250
251 static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
252                                  unsigned int offset,
253                                  unsigned long *config)
254 {
255         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
256         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
257         unsigned param = pinconf_to_config_param(*config);
258         unsigned arg;
259
260         switch (param) {
261         case PIN_CONFIG_BIAS_DISABLE:
262                 arg = pin->bias == PM8XXX_GPIO_BIAS_NP;
263                 break;
264         case PIN_CONFIG_BIAS_PULL_DOWN:
265                 arg = pin->bias == PM8XXX_GPIO_BIAS_PD;
266                 break;
267         case PIN_CONFIG_BIAS_PULL_UP:
268                 arg = pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30;
269                 break;
270         case PM8XXX_QCOM_PULL_UP_STRENGTH:
271                 arg = pin->pull_up_strength;
272                 break;
273         case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
274                 arg = pin->disable;
275                 break;
276         case PIN_CONFIG_INPUT_ENABLE:
277                 arg = pin->mode == PM8XXX_GPIO_MODE_INPUT;
278                 break;
279         case PIN_CONFIG_OUTPUT:
280                 if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT)
281                         arg = pin->output_value;
282                 else
283                         arg = 0;
284                 break;
285         case PIN_CONFIG_POWER_SOURCE:
286                 arg = pin->power_source;
287                 break;
288         case PM8XXX_QCOM_DRIVE_STRENGH:
289                 arg = pin->output_strength;
290                 break;
291         case PIN_CONFIG_DRIVE_PUSH_PULL:
292                 arg = !pin->open_drain;
293                 break;
294         case PIN_CONFIG_DRIVE_OPEN_DRAIN:
295                 arg = pin->open_drain;
296                 break;
297         default:
298                 return -EINVAL;
299         }
300
301         *config = pinconf_to_config_packed(param, arg);
302
303         return 0;
304 }
305
306 static int pm8xxx_pin_config_set(struct pinctrl_dev *pctldev,
307                                  unsigned int offset,
308                                  unsigned long *configs,
309                                  unsigned num_configs)
310 {
311         struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
312         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
313         unsigned param;
314         unsigned arg;
315         unsigned i;
316         u8 banks = 0;
317         u8 val;
318
319         for (i = 0; i < num_configs; i++) {
320                 param = pinconf_to_config_param(configs[i]);
321                 arg = pinconf_to_config_argument(configs[i]);
322
323                 switch (param) {
324                 case PIN_CONFIG_BIAS_DISABLE:
325                         pin->bias = PM8XXX_GPIO_BIAS_NP;
326                         banks |= BIT(2);
327                         pin->disable = 0;
328                         banks |= BIT(3);
329                         break;
330                 case PIN_CONFIG_BIAS_PULL_DOWN:
331                         pin->bias = PM8XXX_GPIO_BIAS_PD;
332                         banks |= BIT(2);
333                         pin->disable = 0;
334                         banks |= BIT(3);
335                         break;
336                 case PM8XXX_QCOM_PULL_UP_STRENGTH:
337                         if (arg > PM8XXX_GPIO_BIAS_PU_1P5_30) {
338                                 dev_err(pctrl->dev, "invalid pull-up strength\n");
339                                 return -EINVAL;
340                         }
341                         pin->pull_up_strength = arg;
342                         /* FALLTHROUGH */
343                 case PIN_CONFIG_BIAS_PULL_UP:
344                         pin->bias = pin->pull_up_strength;
345                         banks |= BIT(2);
346                         pin->disable = 0;
347                         banks |= BIT(3);
348                         break;
349                 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
350                         pin->disable = 1;
351                         banks |= BIT(3);
352                         break;
353                 case PIN_CONFIG_INPUT_ENABLE:
354                         pin->mode = PM8XXX_GPIO_MODE_INPUT;
355                         banks |= BIT(0) | BIT(1);
356                         break;
357                 case PIN_CONFIG_OUTPUT:
358                         pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
359                         pin->output_value = !!arg;
360                         banks |= BIT(0) | BIT(1);
361                         break;
362                 case PIN_CONFIG_POWER_SOURCE:
363                         pin->power_source = arg;
364                         banks |= BIT(0);
365                         break;
366                 case PM8XXX_QCOM_DRIVE_STRENGH:
367                         if (arg > PMIC_GPIO_STRENGTH_LOW) {
368                                 dev_err(pctrl->dev, "invalid drive strength\n");
369                                 return -EINVAL;
370                         }
371                         pin->output_strength = arg;
372                         banks |= BIT(3);
373                         break;
374                 case PIN_CONFIG_DRIVE_PUSH_PULL:
375                         pin->open_drain = 0;
376                         banks |= BIT(1);
377                         break;
378                 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
379                         pin->open_drain = 1;
380                         banks |= BIT(1);
381                         break;
382                 default:
383                         dev_err(pctrl->dev,
384                                 "unsupported config parameter: %x\n",
385                                 param);
386                         return -EINVAL;
387                 }
388         }
389
390         if (banks & BIT(0)) {
391                 val = pin->power_source << 1;
392                 val |= PM8XXX_GPIO_MODE_ENABLED;
393                 pm8xxx_write_bank(pctrl, pin, 0, val);
394         }
395
396         if (banks & BIT(1)) {
397                 val = pin->mode << 2;
398                 val |= pin->open_drain << 1;
399                 val |= pin->output_value;
400                 pm8xxx_write_bank(pctrl, pin, 1, val);
401         }
402
403         if (banks & BIT(2)) {
404                 val = pin->bias << 1;
405                 pm8xxx_write_bank(pctrl, pin, 2, val);
406         }
407
408         if (banks & BIT(3)) {
409                 val = pin->output_strength << 2;
410                 val |= pin->disable;
411                 pm8xxx_write_bank(pctrl, pin, 3, val);
412         }
413
414         if (banks & BIT(4)) {
415                 val = pin->function << 1;
416                 pm8xxx_write_bank(pctrl, pin, 4, val);
417         }
418
419         if (banks & BIT(5)) {
420                 val = 0;
421                 if (!pin->inverted)
422                         val |= BIT(3);
423                 pm8xxx_write_bank(pctrl, pin, 5, val);
424         }
425
426         return 0;
427 }
428
429 static const struct pinconf_ops pm8xxx_pinconf_ops = {
430         .is_generic = true,
431         .pin_config_group_get = pm8xxx_pin_config_get,
432         .pin_config_group_set = pm8xxx_pin_config_set,
433 };
434
435 static struct pinctrl_desc pm8xxx_pinctrl_desc = {
436         .name = "pm8xxx_gpio",
437         .pctlops = &pm8xxx_pinctrl_ops,
438         .pmxops = &pm8xxx_pinmux_ops,
439         .confops = &pm8xxx_pinconf_ops,
440         .owner = THIS_MODULE,
441 };
442
443 static int pm8xxx_gpio_direction_input(struct gpio_chip *chip,
444                                        unsigned offset)
445 {
446         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
447         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
448         u8 val;
449
450         pin->mode = PM8XXX_GPIO_MODE_INPUT;
451         val = pin->mode << 2;
452
453         pm8xxx_write_bank(pctrl, pin, 1, val);
454
455         return 0;
456 }
457
458 static int pm8xxx_gpio_direction_output(struct gpio_chip *chip,
459                                         unsigned offset,
460                                         int value)
461 {
462         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
463         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
464         u8 val;
465
466         pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
467         pin->output_value = !!value;
468
469         val = pin->mode << 2;
470         val |= pin->open_drain << 1;
471         val |= pin->output_value;
472
473         pm8xxx_write_bank(pctrl, pin, 1, val);
474
475         return 0;
476 }
477
478 static int pm8xxx_gpio_get(struct gpio_chip *chip, unsigned offset)
479 {
480         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
481         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
482         bool state;
483         int ret;
484
485         if (pin->mode == PM8XXX_GPIO_MODE_OUTPUT) {
486                 ret = pin->output_value;
487         } else {
488                 ret = irq_get_irqchip_state(pin->irq, IRQCHIP_STATE_LINE_LEVEL, &state);
489                 if (!ret)
490                         ret = !!state;
491         }
492
493         return ret;
494 }
495
496 static void pm8xxx_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
497 {
498         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
499         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
500         u8 val;
501
502         pin->output_value = !!value;
503
504         val = pin->mode << 2;
505         val |= pin->open_drain << 1;
506         val |= pin->output_value;
507
508         pm8xxx_write_bank(pctrl, pin, 1, val);
509 }
510
511 static int pm8xxx_gpio_of_xlate(struct gpio_chip *chip,
512                                 const struct of_phandle_args *gpio_desc,
513                                 u32 *flags)
514 {
515         if (chip->of_gpio_n_cells < 2)
516                 return -EINVAL;
517
518         if (flags)
519                 *flags = gpio_desc->args[1];
520
521         return gpio_desc->args[0] - 1;
522 }
523
524
525 static int pm8xxx_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
526 {
527         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
528         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
529
530         return pin->irq;
531 }
532
533 #ifdef CONFIG_DEBUG_FS
534 #include <linux/seq_file.h>
535
536 static void pm8xxx_gpio_dbg_show_one(struct seq_file *s,
537                                   struct pinctrl_dev *pctldev,
538                                   struct gpio_chip *chip,
539                                   unsigned offset,
540                                   unsigned gpio)
541 {
542         struct pm8xxx_gpio *pctrl = container_of(chip, struct pm8xxx_gpio, chip);
543         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
544
545         static const char * const modes[] = {
546                 "in", "both", "out", "off"
547         };
548         static const char * const biases[] = {
549                 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
550                 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
551         };
552         static const char * const buffer_types[] = {
553                 "push-pull", "open-drain"
554         };
555         static const char * const strengths[] = {
556                 "no", "high", "medium", "low"
557         };
558
559         seq_printf(s, " gpio%-2d:", offset + 1);
560         if (pin->disable) {
561                 seq_puts(s, " ---");
562         } else {
563                 seq_printf(s, " %-4s", modes[pin->mode]);
564                 seq_printf(s, " %-7s", pm8xxx_gpio_functions[pin->function]);
565                 seq_printf(s, " VIN%d", pin->power_source);
566                 seq_printf(s, " %-27s", biases[pin->bias]);
567                 seq_printf(s, " %-10s", buffer_types[pin->open_drain]);
568                 seq_printf(s, " %-4s", pin->output_value ? "high" : "low");
569                 seq_printf(s, " %-7s", strengths[pin->output_strength]);
570                 if (pin->inverted)
571                         seq_puts(s, " inverted");
572         }
573 }
574
575 static void pm8xxx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
576 {
577         unsigned gpio = chip->base;
578         unsigned i;
579
580         for (i = 0; i < chip->ngpio; i++, gpio++) {
581                 pm8xxx_gpio_dbg_show_one(s, NULL, chip, i, gpio);
582                 seq_puts(s, "\n");
583         }
584 }
585
586 #else
587 #define msm_gpio_dbg_show NULL
588 #endif
589
590 static struct gpio_chip pm8xxx_gpio_template = {
591         .direction_input = pm8xxx_gpio_direction_input,
592         .direction_output = pm8xxx_gpio_direction_output,
593         .get = pm8xxx_gpio_get,
594         .set = pm8xxx_gpio_set,
595         .of_xlate = pm8xxx_gpio_of_xlate,
596         .to_irq = pm8xxx_gpio_to_irq,
597         .dbg_show = pm8xxx_gpio_dbg_show,
598         .owner = THIS_MODULE,
599 };
600
601 static int pm8xxx_pin_populate(struct pm8xxx_gpio *pctrl,
602                                struct pm8xxx_pin_data *pin)
603 {
604         int val;
605
606         val = pm8xxx_read_bank(pctrl, pin, 0);
607         if (val < 0)
608                 return val;
609
610         pin->power_source = (val >> 1) & 0x7;
611
612         val = pm8xxx_read_bank(pctrl, pin, 1);
613         if (val < 0)
614                 return val;
615
616         pin->mode = (val >> 2) & 0x3;
617         pin->open_drain = !!(val & BIT(1));
618         pin->output_value = val & BIT(0);
619
620         val = pm8xxx_read_bank(pctrl, pin, 2);
621         if (val < 0)
622                 return val;
623
624         pin->bias = (val >> 1) & 0x7;
625         if (pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30)
626                 pin->pull_up_strength = pin->bias;
627         else
628                 pin->pull_up_strength = PM8XXX_GPIO_BIAS_PU_30;
629
630         val = pm8xxx_read_bank(pctrl, pin, 3);
631         if (val < 0)
632                 return val;
633
634         pin->output_strength = (val >> 2) & 0x3;
635         pin->disable = val & BIT(0);
636
637         val = pm8xxx_read_bank(pctrl, pin, 4);
638         if (val < 0)
639                 return val;
640
641         pin->function = (val >> 1) & 0x7;
642
643         val = pm8xxx_read_bank(pctrl, pin, 5);
644         if (val < 0)
645                 return val;
646
647         pin->inverted = !(val & BIT(3));
648
649         return 0;
650 }
651
652 static const struct of_device_id pm8xxx_gpio_of_match[] = {
653         { .compatible = "qcom,pm8018-gpio", .data = (void *)6 },
654         { .compatible = "qcom,pm8038-gpio", .data = (void *)12 },
655         { .compatible = "qcom,pm8058-gpio", .data = (void *)40 },
656         { .compatible = "qcom,pm8917-gpio", .data = (void *)38 },
657         { .compatible = "qcom,pm8921-gpio", .data = (void *)44 },
658         { },
659 };
660 MODULE_DEVICE_TABLE(of, pm8xxx_gpio_of_match);
661
662 static int pm8xxx_gpio_probe(struct platform_device *pdev)
663 {
664         struct pm8xxx_pin_data *pin_data;
665         struct pinctrl_pin_desc *pins;
666         struct pm8xxx_gpio *pctrl;
667         int ret;
668         int i;
669
670         pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
671         if (!pctrl)
672                 return -ENOMEM;
673
674         pctrl->dev = &pdev->dev;
675         pctrl->npins = (unsigned)of_device_get_match_data(&pdev->dev);
676
677         pctrl->regmap = dev_get_regmap(pdev->dev.parent, NULL);
678         if (!pctrl->regmap) {
679                 dev_err(&pdev->dev, "parent regmap unavailable\n");
680                 return -ENXIO;
681         }
682
683         pctrl->desc = pm8xxx_pinctrl_desc;
684         pctrl->desc.npins = pctrl->npins;
685
686         pins = devm_kcalloc(&pdev->dev,
687                             pctrl->desc.npins,
688                             sizeof(struct pinctrl_pin_desc),
689                             GFP_KERNEL);
690         if (!pins)
691                 return -ENOMEM;
692
693         pin_data = devm_kcalloc(&pdev->dev,
694                                 pctrl->desc.npins,
695                                 sizeof(struct pm8xxx_pin_data),
696                                 GFP_KERNEL);
697         if (!pin_data)
698                 return -ENOMEM;
699
700         for (i = 0; i < pctrl->desc.npins; i++) {
701                 pin_data[i].reg = SSBI_REG_ADDR_GPIO(i);
702                 pin_data[i].irq = platform_get_irq(pdev, i);
703                 if (pin_data[i].irq < 0) {
704                         dev_err(&pdev->dev,
705                                 "missing interrupts for pin %d\n", i);
706                         return pin_data[i].irq;
707                 }
708
709                 ret = pm8xxx_pin_populate(pctrl, &pin_data[i]);
710                 if (ret)
711                         return ret;
712
713                 pins[i].number = i;
714                 pins[i].name = pm8xxx_groups[i];
715                 pins[i].drv_data = &pin_data[i];
716         }
717         pctrl->desc.pins = pins;
718
719         pctrl->desc.num_custom_params = ARRAY_SIZE(pm8xxx_gpio_bindings);
720         pctrl->desc.custom_params = pm8xxx_gpio_bindings;
721 #ifdef CONFIG_DEBUG_FS
722         pctrl->desc.custom_conf_items = pm8xxx_conf_items;
723 #endif
724
725         pctrl->pctrl = pinctrl_register(&pctrl->desc, &pdev->dev, pctrl);
726         if (IS_ERR(pctrl->pctrl)) {
727                 dev_err(&pdev->dev, "couldn't register pm8xxx gpio driver\n");
728                 return PTR_ERR(pctrl->pctrl);
729         }
730
731         pctrl->chip = pm8xxx_gpio_template;
732         pctrl->chip.base = -1;
733         pctrl->chip.dev = &pdev->dev;
734         pctrl->chip.of_node = pdev->dev.of_node;
735         pctrl->chip.of_gpio_n_cells = 2;
736         pctrl->chip.label = dev_name(pctrl->dev);
737         pctrl->chip.ngpio = pctrl->npins;
738         ret = gpiochip_add(&pctrl->chip);
739         if (ret) {
740                 dev_err(&pdev->dev, "failed register gpiochip\n");
741                 goto unregister_pinctrl;
742         }
743
744         ret = gpiochip_add_pin_range(&pctrl->chip,
745                                      dev_name(pctrl->dev),
746                                      0, 0, pctrl->chip.ngpio);
747         if (ret) {
748                 dev_err(pctrl->dev, "failed to add pin range\n");
749                 goto unregister_gpiochip;
750         }
751
752         platform_set_drvdata(pdev, pctrl);
753
754         dev_dbg(&pdev->dev, "Qualcomm pm8xxx gpio driver probed\n");
755
756         return 0;
757
758 unregister_gpiochip:
759         gpiochip_remove(&pctrl->chip);
760
761 unregister_pinctrl:
762         pinctrl_unregister(pctrl->pctrl);
763
764         return ret;
765 }
766
767 static int pm8xxx_gpio_remove(struct platform_device *pdev)
768 {
769         struct pm8xxx_gpio *pctrl = platform_get_drvdata(pdev);
770
771         gpiochip_remove(&pctrl->chip);
772
773         pinctrl_unregister(pctrl->pctrl);
774
775         return 0;
776 }
777
778 static struct platform_driver pm8xxx_gpio_driver = {
779         .driver = {
780                 .name = "qcom-ssbi-gpio",
781                 .of_match_table = pm8xxx_gpio_of_match,
782         },
783         .probe = pm8xxx_gpio_probe,
784         .remove = pm8xxx_gpio_remove,
785 };
786
787 module_platform_driver(pm8xxx_gpio_driver);
788
789 MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
790 MODULE_DESCRIPTION("Qualcomm PM8xxx GPIO driver");
791 MODULE_LICENSE("GPL v2");