blob: b09b040c7561e30c4a3c9ebe23a2068712e60499 [file] [log] [blame]
Michael Bohan0ba63b82012-02-06 13:42:34 -08001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/interrupt.h>
14#include <linux/types.h>
15#include <linux/spmi.h>
16#include <linux/platform_device.h>
17#include <linux/gpio.h>
18#include <linux/slab.h>
19#include <linux/of.h>
20#include <linux/of_gpio.h>
21#include <linux/of_irq.h>
22#include <linux/qpnp/gpio.h>
23
24#include <mach/qpnp.h>
25
26#define Q_REG_ADDR(q_spec, reg_index) \
27 ((q_spec)->offset + reg_index)
28
29#define Q_REG_STATUS1 0x8
30#define Q_NUM_CTL_REGS 5
31
32/* control register base address offsets */
33#define Q_REG_IO_CTL1 0x42
34#define Q_REG_INPUT_CTL1 0x43
35#define Q_REG_OUTPUT_CTL1 0x44
36#define Q_REG_OUTPUT_CTL2 0x45
37#define Q_REG_EN_CTL1 0x46
38
39/* control register regs array indices */
40#define Q_REG_I_IO_CTL1 0
41#define Q_REG_I_INPUT_CTL1 1
42#define Q_REG_I_OUTPUT_CTL1 2
43#define Q_REG_I_OUTPUT_CTL2 3
44#define Q_REG_I_EN_CTL1 4
45
46/* control register configuration */
47#define Q_REG_VIN_SHIFT 0
48#define Q_REG_VIN_MASK 0x7
49#define Q_REG_PULL_SHIFT 4
50#define Q_REG_PULL_MASK 0x70
51#define Q_REG_INPUT_EN_SHIFT 7
52#define Q_REG_INPUT_EN_MASK 0x80
53#define Q_REG_OUT_STRENGTH_SHIFT 0
54#define Q_REG_OUT_STRENGTH_MASK 0x3
55#define Q_REG_OUT_TYPE_SHIFT 6
56#define Q_REG_OUT_TYPE_MASK 0x40
57#define Q_REG_OUT_INVERT_SHIFT 0
58#define Q_REG_OUT_INVERT_MASK 0x1
59#define Q_REG_SRC_SEL_SHIFT 1
60#define Q_REG_SRC_SEL_MASK 0xE
61#define Q_REG_OUTPUT_EN_SHIFT 7
62#define Q_REG_OUTPUT_EN_MASK 0x80
63#define Q_REG_MASTER_EN_SHIFT 7
64#define Q_REG_MASTER_EN_MASK 0x80
65
66
67struct qpnp_gpio_spec {
68 uint8_t slave; /* 0-15 */
69 uint16_t offset; /* 0-255 */
70 uint32_t gpio_chip_idx; /* offset from gpio_chip base */
71 int irq; /* logical IRQ number */
72 u8 regs[Q_NUM_CTL_REGS]; /* Control regs */
73};
74
75struct qpnp_gpio_chip {
76 struct gpio_chip gpio_chip;
77 struct spmi_device *spmi;
78 struct qpnp_gpio_spec **pmic_gpios;
79 struct qpnp_gpio_spec **chip_gpios;
80 uint32_t pmic_gpio_lowest;
81 uint32_t pmic_gpio_highest;
82 struct device_node *int_ctrl;
83 struct list_head chip_list;
84};
85
86static LIST_HEAD(qpnp_gpio_chips);
87static DEFINE_MUTEX(qpnp_gpio_chips_lock);
88
89static inline void qpnp_pmic_gpio_set_spec(struct qpnp_gpio_chip *q_chip,
90 uint32_t pmic_gpio,
91 struct qpnp_gpio_spec *spec)
92{
93 q_chip->pmic_gpios[pmic_gpio - q_chip->pmic_gpio_lowest] = spec;
94}
95
96static inline struct qpnp_gpio_spec *qpnp_pmic_gpio_get_spec(
97 struct qpnp_gpio_chip *q_chip,
98 uint32_t pmic_gpio)
99{
100 if (pmic_gpio < q_chip->pmic_gpio_lowest ||
101 pmic_gpio > q_chip->pmic_gpio_highest)
102 return NULL;
103
104 return q_chip->pmic_gpios[pmic_gpio - q_chip->pmic_gpio_lowest];
105}
106
107static inline struct qpnp_gpio_spec *qpnp_chip_gpio_get_spec(
108 struct qpnp_gpio_chip *q_chip,
109 uint32_t chip_gpio)
110{
111 if (chip_gpio > q_chip->gpio_chip.ngpio)
112 return NULL;
113
114 return q_chip->chip_gpios[chip_gpio];
115}
116
117static inline void qpnp_chip_gpio_set_spec(struct qpnp_gpio_chip *q_chip,
118 uint32_t chip_gpio,
119 struct qpnp_gpio_spec *spec)
120{
121 q_chip->chip_gpios[chip_gpio] = spec;
122}
123
124int qpnp_gpio_config(int gpio, struct qpnp_gpio_cfg *param)
125{
126 int rc, chip_offset;
127 struct qpnp_gpio_chip *q_chip;
128 struct qpnp_gpio_spec *q_spec = NULL;
129 struct gpio_chip *gpio_chip;
130
131 if (param == NULL)
132 return -EINVAL;
133
134 mutex_lock(&qpnp_gpio_chips_lock);
135 list_for_each_entry(q_chip, &qpnp_gpio_chips, chip_list) {
136 gpio_chip = &q_chip->gpio_chip;
137 if (gpio >= gpio_chip->base
138 && gpio < gpio_chip->base + gpio_chip->ngpio) {
139 chip_offset = gpio - gpio_chip->base;
140 q_spec = qpnp_chip_gpio_get_spec(q_chip, chip_offset);
141 if (WARN_ON(!q_spec)) {
142 mutex_unlock(&qpnp_gpio_chips_lock);
143 return -ENODEV;
144 }
145 break;
146 }
147 }
148 mutex_unlock(&qpnp_gpio_chips_lock);
149 if (!q_spec) {
150 pr_err("gpio %d not handled by any pmic\n", gpio);
151 return -EINVAL;
152 }
153
154 q_spec->regs[Q_REG_I_IO_CTL1] = (param->vin_sel <<
155 Q_REG_VIN_SHIFT) & Q_REG_VIN_MASK;
156 q_spec->regs[Q_REG_I_IO_CTL1] |= (param->pull <<
157 Q_REG_PULL_SHIFT) & Q_REG_PULL_MASK;
158 q_spec->regs[Q_REG_I_INPUT_CTL1] = ((param->direction &
159 QPNP_GPIO_DIR_IN) ? ((1 << Q_REG_INPUT_EN_SHIFT)) : 0);
160
161 if (param->direction & QPNP_GPIO_DIR_OUT) {
162 q_spec->regs[Q_REG_I_OUTPUT_CTL1] = (param->out_strength
163 << Q_REG_OUT_STRENGTH_SHIFT) & Q_REG_OUT_STRENGTH_MASK;
164 q_spec->regs[Q_REG_I_OUTPUT_CTL1] |= (param->output_type
165 << Q_REG_OUT_TYPE_SHIFT) & Q_REG_OUT_TYPE_MASK;
166 } else {
167 q_spec->regs[Q_REG_I_OUTPUT_CTL1] = 0;
168 }
169
170 if (param->direction & QPNP_GPIO_DIR_OUT) {
171 q_spec->regs[Q_REG_I_OUTPUT_CTL2] = (param->inv_int_pol
172 << Q_REG_OUT_INVERT_SHIFT) & Q_REG_OUT_INVERT_MASK;
173 q_spec->regs[Q_REG_I_OUTPUT_CTL2] |= (param->src_select
174 << Q_REG_SRC_SEL_SHIFT) & Q_REG_SRC_SEL_MASK;
175 q_spec->regs[Q_REG_I_OUTPUT_CTL2] |= (1 <<
176 Q_REG_OUTPUT_EN_SHIFT) & Q_REG_OUTPUT_EN_MASK;
177 } else {
178 q_spec->regs[Q_REG_I_OUTPUT_CTL2] = 0;
179 }
180
181 q_spec->regs[Q_REG_I_EN_CTL1] = (param->master_en <<
182 Q_REG_MASTER_EN_SHIFT) & Q_REG_MASTER_EN_MASK;
183
184 rc = spmi_ext_register_writel(q_chip->spmi->ctrl, q_spec->slave,
185 Q_REG_ADDR(q_spec, Q_REG_IO_CTL1),
186 &q_spec->regs[Q_REG_I_IO_CTL1], Q_NUM_CTL_REGS);
187 if (rc)
188 dev_err(&q_chip->spmi->dev, "%s: unable to write master"
189 " enable\n", __func__);
190
191 return rc;
192}
193EXPORT_SYMBOL(qpnp_gpio_config);
194
195int qpnp_gpio_map_gpio(uint16_t slave_id, uint32_t pmic_gpio)
196{
197 struct qpnp_gpio_chip *q_chip;
198 struct qpnp_gpio_spec *q_spec = NULL;
199
200 mutex_lock(&qpnp_gpio_chips_lock);
201 list_for_each_entry(q_chip, &qpnp_gpio_chips, chip_list) {
202 if (q_chip->spmi->sid != slave_id)
203 continue;
204 if (q_chip->pmic_gpio_lowest <= pmic_gpio &&
205 q_chip->pmic_gpio_highest >= pmic_gpio) {
206 q_spec = qpnp_pmic_gpio_get_spec(q_chip, pmic_gpio);
207 mutex_unlock(&qpnp_gpio_chips_lock);
208 if (WARN_ON(!q_spec))
209 return -ENODEV;
210 return q_chip->gpio_chip.base + q_spec->gpio_chip_idx;
211 }
212 }
213 mutex_unlock(&qpnp_gpio_chips_lock);
214 return -EINVAL;
215}
216EXPORT_SYMBOL(qpnp_gpio_map_gpio);
217
218static int qpnp_gpio_to_irq(struct gpio_chip *gpio_chip, unsigned offset)
219{
220 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
221 struct qpnp_gpio_spec *q_spec;
222
223 q_spec = qpnp_chip_gpio_get_spec(q_chip, offset);
224 if (!q_spec)
225 return -EINVAL;
226
227 return q_spec->irq;
228}
229
230static int qpnp_gpio_get(struct gpio_chip *gpio_chip, unsigned offset)
231{
232 int rc, ret_val;
233 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
234 struct qpnp_gpio_spec *q_spec = NULL;
235 u8 buf[1];
236
237 if (WARN_ON(!q_chip))
238 return -ENODEV;
239
240 q_spec = qpnp_chip_gpio_get_spec(q_chip, offset);
241 if (WARN_ON(!q_spec))
242 return -ENODEV;
243
244 /* gpio val is from RT status iff input is enabled */
245 if (q_spec->regs[Q_REG_I_INPUT_CTL1] & Q_REG_INPUT_EN_MASK) {
246 /* INT_RT_STS */
247 rc = spmi_ext_register_readl(q_chip->spmi->ctrl, q_spec->slave,
248 Q_REG_ADDR(q_spec, Q_REG_STATUS1),
249 &buf[0], 1);
250 return buf[0];
251
252 } else {
253 ret_val = (q_spec->regs[Q_REG_I_OUTPUT_CTL2] &
254 Q_REG_OUT_INVERT_MASK) >> Q_REG_OUT_INVERT_SHIFT;
255 return ret_val;
256 }
257
258 return 0;
259}
260
261static int __qpnp_gpio_set(struct qpnp_gpio_chip *q_chip,
262 struct qpnp_gpio_spec *q_spec, int value)
263{
264 int rc;
265
266 if (!q_chip || !q_spec)
267 return -EINVAL;
268
269 q_spec->regs[Q_REG_I_OUTPUT_CTL2] &= ~(1 << Q_REG_OUT_INVERT_SHIFT);
270
271 if (value)
272 q_spec->regs[Q_REG_I_OUTPUT_CTL2] |=
273 (1 << Q_REG_OUT_INVERT_SHIFT);
274
275 rc = spmi_ext_register_writel(q_chip->spmi->ctrl, q_spec->slave,
276 Q_REG_ADDR(q_spec, Q_REG_OUTPUT_CTL2),
277 &q_spec->regs[Q_REG_I_OUTPUT_CTL2], 1);
278 if (rc)
279 dev_err(&q_chip->spmi->dev, "%s: spmi write failed\n",
280 __func__);
281 return rc;
282}
283
284
285static void qpnp_gpio_set(struct gpio_chip *gpio_chip,
286 unsigned offset, int value)
287{
288 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
289 struct qpnp_gpio_spec *q_spec;
290
291 if (WARN_ON(!q_chip))
292 return;
293
294 q_spec = qpnp_chip_gpio_get_spec(q_chip, offset);
295 if (WARN_ON(!q_spec))
296 return;
297
298 __qpnp_gpio_set(q_chip, q_spec, value);
299}
300
301static int qpnp_gpio_set_direction(struct qpnp_gpio_chip *q_chip,
302 struct qpnp_gpio_spec *q_spec, int direction)
303{
304 int rc;
305
306 if (!q_chip || !q_spec)
307 return -EINVAL;
308
309 if (direction & QPNP_GPIO_DIR_IN) {
310 q_spec->regs[Q_REG_I_INPUT_CTL1] |=
311 (1 << Q_REG_INPUT_EN_SHIFT);
312 q_spec->regs[Q_REG_I_OUTPUT_CTL2] &=
313 ~(1 << Q_REG_OUTPUT_EN_SHIFT);
314 } else {
315 q_spec->regs[Q_REG_I_INPUT_CTL1] &=
316 ~(1 << Q_REG_INPUT_EN_SHIFT);
317 q_spec->regs[Q_REG_I_OUTPUT_CTL2] |=
318 (1 << Q_REG_OUTPUT_EN_SHIFT);
319 }
320
321 rc = spmi_ext_register_writel(q_chip->spmi->ctrl, q_spec->slave,
322 Q_REG_ADDR(q_spec, Q_REG_INPUT_CTL1),
323 &q_spec->regs[Q_REG_I_INPUT_CTL1], 3);
324 return rc;
325}
326
327static int qpnp_gpio_direction_input(struct gpio_chip *gpio_chip,
328 unsigned offset)
329{
330 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
331 struct qpnp_gpio_spec *q_spec;
332
333 if (WARN_ON(!q_chip))
334 return -ENODEV;
335
336 q_spec = qpnp_chip_gpio_get_spec(q_chip, offset);
337 if (WARN_ON(!q_spec))
338 return -ENODEV;
339
340 return qpnp_gpio_set_direction(q_chip, q_spec, QPNP_GPIO_DIR_IN);
341}
342
343static int qpnp_gpio_direction_output(struct gpio_chip *gpio_chip,
344 unsigned offset,
345 int val)
346{
347 int rc;
348 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
349 struct qpnp_gpio_spec *q_spec;
350
351 if (WARN_ON(!q_chip))
352 return -ENODEV;
353
354 q_spec = qpnp_chip_gpio_get_spec(q_chip, offset);
355 if (WARN_ON(!q_spec))
356 return -ENODEV;
357
358 rc = __qpnp_gpio_set(q_chip, q_spec, val);
359 if (rc)
360 return rc;
361
362 rc = qpnp_gpio_set_direction(q_chip, q_spec, QPNP_GPIO_DIR_OUT);
363
364 return rc;
365}
366
367static int qpnp_gpio_of_gpio_xlate(struct gpio_chip *gpio_chip,
368 struct device_node *np,
369 const void *gpio_spec, u32 *flags)
370{
371 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(gpio_chip->dev);
372 struct qpnp_gpio_spec *q_spec;
373 const __be32 *gpio = gpio_spec;
374 u32 n = be32_to_cpup(gpio);
375
376 if (WARN_ON(gpio_chip->of_gpio_n_cells < 2)) {
377 pr_err("%s: of_gpio_n_cells < 2\n", __func__);
378 return -EINVAL;
379 }
380
381 q_spec = qpnp_pmic_gpio_get_spec(q_chip, n);
382 if (!q_spec) {
383 pr_err("%s: no such PMIC gpio %u in device topology\n",
384 __func__, n);
385 return -EINVAL;
386 }
387
388 if (flags)
389 *flags = be32_to_cpu(gpio[1]);
390
391 return q_spec->gpio_chip_idx;
392}
393
394static int qpnp_gpio_config_default(struct spmi_device *spmi,
395 const __be32 *prop, int gpio)
396{
397 struct qpnp_gpio_cfg param;
398 int rc;
399
400 dev_dbg(&spmi->dev, "%s: p[0]: 0x%x p[1]: 0x%x p[2]: 0x%x p[3]:"
401 " 0x%x p[4]: 0x%x p[5]: 0x%x p[6]: 0x%x p[7]: 0x%x"
402 " p[8]: 0x%x\n", __func__,
403 be32_to_cpup(&prop[0]), be32_to_cpup(&prop[1]),
404 be32_to_cpup(&prop[2]), be32_to_cpup(&prop[3]),
405 be32_to_cpup(&prop[4]), be32_to_cpup(&prop[5]),
406 be32_to_cpup(&prop[6]), be32_to_cpup(&prop[7]),
407 be32_to_cpup(&prop[8]));
408
409 param.direction = be32_to_cpup(&prop[0]);
410 param.output_type = be32_to_cpup(&prop[1]);
411 param.output_value = be32_to_cpup(&prop[2]);
412 param.pull = be32_to_cpup(&prop[3]);
413 param.vin_sel = be32_to_cpup(&prop[4]);
414 param.out_strength = be32_to_cpup(&prop[5]);
415 param.src_select = be32_to_cpup(&prop[6]);
416 param.inv_int_pol = be32_to_cpup(&prop[7]);
417 param.master_en = be32_to_cpup(&prop[8]);
418
419 rc = qpnp_gpio_config(gpio, &param);
420 if (rc)
421 dev_err(&spmi->dev, "%s: unable to set default config for"
422 " gpio %d\n", __func__, gpio);
423 return rc;
424}
425
426static int qpnp_gpio_free_chip(struct qpnp_gpio_chip *q_chip)
427{
428 struct spmi_device *spmi = q_chip->spmi;
429 int rc, i;
430
431 if (q_chip->chip_gpios)
432 for (i = 0; i < spmi->num_dev_node; i++)
433 kfree(q_chip->chip_gpios[i]);
434
435 mutex_lock(&qpnp_gpio_chips_lock);
436 list_del(&q_chip->chip_list);
437 mutex_unlock(&qpnp_gpio_chips_lock);
438 rc = gpiochip_remove(&q_chip->gpio_chip);
439 if (rc)
440 dev_err(&q_chip->spmi->dev, "%s: unable to remove gpio\n",
441 __func__);
442 kfree(q_chip->chip_gpios);
443 kfree(q_chip->pmic_gpios);
444 kfree(q_chip);
445 return rc;
446}
447
448static int qpnp_gpio_probe(struct spmi_device *spmi)
449{
450 struct qpnp_gpio_chip *q_chip;
451 struct resource *res;
452 struct qpnp_gpio_spec *q_spec;
453 const __be32 *prop;
454 int i, rc, ret, gpio, len;
455 int lowest_gpio = INT_MAX, highest_gpio = INT_MIN;
456 u32 intspec[3];
457
458 q_chip = kzalloc(sizeof(*q_chip), GFP_KERNEL);
459 if (!q_chip) {
460 dev_err(&spmi->dev, "%s: Can't allocate gpio_chip\n",
461 __func__);
462 return -ENOMEM;
463 }
464 q_chip->spmi = spmi;
465 dev_set_drvdata(&spmi->dev, q_chip);
466
467 mutex_lock(&qpnp_gpio_chips_lock);
468 list_add(&q_chip->chip_list, &qpnp_gpio_chips);
469 mutex_unlock(&qpnp_gpio_chips_lock);
470
471 /* first scan through nodes to find the range required for allocation */
472 for (i = 0; i < spmi->num_dev_node; i++) {
473 prop = of_get_property(spmi->dev_node[i].of_node,
474 "qcom,qpnp-gpio-num", &len);
475 if (!prop) {
476 dev_err(&spmi->dev, "%s: unable to get"
477 " qcom,qpnp-gpio-num property\n", __func__);
478 ret = -EINVAL;
479 goto err_probe;
480 } else if (len != sizeof(__be32)) {
481 dev_err(&spmi->dev, "%s: Invalid qcom,qpnp-gpio-num"
482 " property\n", __func__);
483 ret = -EINVAL;
484 goto err_probe;
485 }
486
487 gpio = be32_to_cpup(prop);
488 if (gpio < lowest_gpio)
489 lowest_gpio = gpio;
490 if (gpio > highest_gpio)
491 highest_gpio = gpio;
492 }
493
494 if (highest_gpio < lowest_gpio) {
495 dev_err(&spmi->dev, "%s: no device nodes specified in"
496 " topology\n", __func__);
497 ret = -EINVAL;
498 goto err_probe;
499 } else if (lowest_gpio == 0) {
500 dev_err(&spmi->dev, "%s: 0 is not a valid PMIC GPIO\n",
501 __func__);
502 ret = -EINVAL;
503 goto err_probe;
504 }
505
506 q_chip->pmic_gpio_lowest = lowest_gpio;
507 q_chip->pmic_gpio_highest = highest_gpio;
508
509 /* allocate gpio lookup tables */
510 q_chip->pmic_gpios = kzalloc(sizeof(struct qpnp_gpio_spec *) *
511 highest_gpio - lowest_gpio + 1,
512 GFP_KERNEL);
513 q_chip->chip_gpios = kzalloc(sizeof(struct qpnp_gpio_spec *) *
514 spmi->num_dev_node, GFP_KERNEL);
515 if (!q_chip->pmic_gpios || !q_chip->chip_gpios) {
516 dev_err(&spmi->dev, "%s: unable to allocate memory\n",
517 __func__);
518 ret = -ENOMEM;
519 goto err_probe;
520 }
521
522 /* get interrupt controller device_node */
523 q_chip->int_ctrl = of_irq_find_parent(spmi->dev.of_node);
524 if (!q_chip->int_ctrl) {
525 dev_err(&spmi->dev, "%s: Can't find interrupt parent\n",
526 __func__);
527 ret = -EINVAL;
528 goto err_probe;
529 }
530
531 /* now scan through again and populate the lookup table */
532 for (i = 0; i < spmi->num_dev_node; i++) {
533 res = qpnp_get_resource(spmi, i, IORESOURCE_MEM, 0);
534 if (!res) {
535 dev_err(&spmi->dev, "%s: node %s is missing has no"
536 " base address definition\n",
537 __func__, spmi->dev_node[i].of_node->full_name);
538 }
539
540 prop = of_get_property(spmi->dev_node[i].of_node,
541 "qcom,qpnp-gpio-num", &len);
542 if (!prop) {
543 dev_err(&spmi->dev, "%s: unable to get"
544 " qcom,qpnp-gpio-num property\n", __func__);
545 ret = -EINVAL;
546 goto err_probe;
547 } else if (len != sizeof(__be32)) {
548 dev_err(&spmi->dev, "%s: Invalid qcom,qpnp-gpio-num"
549 " property\n", __func__);
550 ret = -EINVAL;
551 goto err_probe;
552 }
553 gpio = be32_to_cpup(prop);
554
555 q_spec = kzalloc(sizeof(struct qpnp_gpio_spec),
556 GFP_KERNEL);
557 if (!q_spec) {
558 dev_err(&spmi->dev, "%s: unable to allocate"
559 " memory\n",
560 __func__);
561 ret = -ENOMEM;
562 goto err_probe;
563 }
564
565 q_spec->slave = spmi->sid;
566 q_spec->offset = res->start;
567 q_spec->gpio_chip_idx = i;
568
569 /* call into irq_domain to get irq mapping */
570 intspec[0] = q_chip->spmi->sid;
571 intspec[1] = (q_spec->offset >> 8) & 0xFF;
572 intspec[2] = 0;
573 q_spec->irq = irq_create_of_mapping(q_chip->int_ctrl,
574 intspec, 3);
575 if (!q_spec->irq) {
576 dev_err(&spmi->dev, "%s: invalid irq for gpio"
577 " %u\n", __func__, gpio);
578 ret = -EINVAL;
579 goto err_probe;
580 }
581 /* initialize lookup table entries */
582 qpnp_pmic_gpio_set_spec(q_chip, gpio, q_spec);
583 qpnp_chip_gpio_set_spec(q_chip, i, q_spec);
584 }
585
586 q_chip->gpio_chip.base = -1;
587 q_chip->gpio_chip.ngpio = spmi->num_dev_node;
588 q_chip->gpio_chip.label = "qpnp-gpio";
589 q_chip->gpio_chip.direction_input = qpnp_gpio_direction_input;
590 q_chip->gpio_chip.direction_output = qpnp_gpio_direction_output;
591 q_chip->gpio_chip.to_irq = qpnp_gpio_to_irq;
592 q_chip->gpio_chip.get = qpnp_gpio_get;
593 q_chip->gpio_chip.set = qpnp_gpio_set;
594 q_chip->gpio_chip.dev = &spmi->dev;
595 q_chip->gpio_chip.of_xlate = qpnp_gpio_of_gpio_xlate;
596 q_chip->gpio_chip.of_gpio_n_cells = 2;
597 q_chip->gpio_chip.can_sleep = 0;
598
599 rc = gpiochip_add(&q_chip->gpio_chip);
600 if (rc) {
601 dev_err(&spmi->dev, "%s: Can't add gpio chip, rc = %d\n",
602 __func__, rc);
603 ret = rc;
604 goto err_probe;
605 }
606
607 /* now configure gpio defaults if they exist */
608 for (i = 0; i < spmi->num_dev_node; i++) {
609 q_spec = qpnp_chip_gpio_get_spec(q_chip, i);
610 if (WARN_ON(!q_spec))
611 return -ENODEV;
612
613 /* It's not an error to not config a default */
614 prop = of_get_property(spmi->dev_node[i].of_node,
615 "qcom,qpnp-gpio-cfg", &len);
616 /* 9 data values constitute one tuple */
617 if (prop && (len != (9 * sizeof(__be32)))) {
618 dev_err(&spmi->dev, "%s: invalid format for"
619 " qcom,qpnp-gpio-cfg property\n",
620 __func__);
621 ret = -EINVAL;
622 goto err_probe;
623 } else if (prop) {
624 rc = qpnp_gpio_config_default(spmi, prop,
625 q_chip->gpio_chip.base + i);
626 if (rc) {
627 ret = rc;
628 goto err_probe;
629 }
630 } else {
631 /* initialize with hardware defaults */
632 rc = spmi_ext_register_readl(
633 q_chip->spmi->ctrl, q_spec->slave,
634 Q_REG_ADDR(q_spec, Q_REG_IO_CTL1),
635 &q_spec->regs[Q_REG_I_IO_CTL1],
636 Q_NUM_CTL_REGS);
637 q_spec->regs[Q_REG_I_EN_CTL1] |=
638 (1 << Q_REG_MASTER_EN_SHIFT);
639 rc = spmi_ext_register_writel(
640 q_chip->spmi->ctrl, q_spec->slave,
641 Q_REG_ADDR(q_spec, Q_REG_EN_CTL1),
642 &q_spec->regs[Q_REG_EN_CTL1], 1);
643 if (rc) {
644 dev_err(&spmi->dev, "%s: spmi write"
645 " failed\n", __func__);
646 ret = rc;
647 goto err_probe;
648 }
649 }
650 }
651
652 dev_dbg(&spmi->dev, "%s: gpio_chip registered between %d-%u\n",
653 __func__, q_chip->gpio_chip.base,
654 (q_chip->gpio_chip.base + q_chip->gpio_chip.ngpio) - 1);
655 return 0;
656
657err_probe:
658 qpnp_gpio_free_chip(q_chip);
659 return ret;
660}
661
662static int qpnp_gpio_remove(struct spmi_device *spmi)
663{
664 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(&spmi->dev);
665
666 return qpnp_gpio_free_chip(q_chip);
667}
668
669static struct of_device_id spmi_match_table[] = {
670 { .compatible = "qcom,qpnp-gpio",
671 },
672 {}
673};
674
675static const struct spmi_device_id qpnp_gpio_id[] = {
676 { "qcom,qpnp-gpio", 0 },
677 { }
678};
679MODULE_DEVICE_TABLE(spmi, qpnp_gpio_id);
680
681static struct spmi_driver qpnp_gpio_driver = {
682 .driver = {
683 .name = "qcom,qpnp-gpio",
684 .of_match_table = spmi_match_table,
685 },
686 .probe = qpnp_gpio_probe,
687 .remove = qpnp_gpio_remove,
688 .id_table = qpnp_gpio_id,
689};
690
691static int __init qpnp_gpio_init(void)
692{
693 return spmi_driver_register(&qpnp_gpio_driver);
694}
695
696static void __exit qpnp_gpio_exit(void)
697{
698}
699
700MODULE_AUTHOR(
701 "Michael Bohan <mbohan@codeaurora.org>");
702MODULE_DESCRIPTION("QPNP PMIC gpio driver");
703MODULE_LICENSE("GPLv2");
704
705module_init(qpnp_gpio_init);
706module_exit(qpnp_gpio_exit);