blob: 90cc798fb602ee10bb670c904afa88c8a0634209 [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) {
Michael Bohan13cbc592012-04-12 15:41:39 -0700171 q_spec->regs[Q_REG_I_OUTPUT_CTL2] = (param->output_value
Michael Bohan0ba63b82012-02-06 13:42:34 -0800172 << 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]:"
Michael Bohan13cbc592012-04-12 15:41:39 -0700401 " 0x%x p[4]: 0x%x p[5]: 0x%x p[6]: 0x%x p[7]: 0x%x\n", __func__,
Michael Bohan0ba63b82012-02-06 13:42:34 -0800402 be32_to_cpup(&prop[0]), be32_to_cpup(&prop[1]),
403 be32_to_cpup(&prop[2]), be32_to_cpup(&prop[3]),
404 be32_to_cpup(&prop[4]), be32_to_cpup(&prop[5]),
Michael Bohan13cbc592012-04-12 15:41:39 -0700405 be32_to_cpup(&prop[6]), be32_to_cpup(&prop[7]));
Michael Bohan0ba63b82012-02-06 13:42:34 -0800406
407 param.direction = be32_to_cpup(&prop[0]);
408 param.output_type = be32_to_cpup(&prop[1]);
409 param.output_value = be32_to_cpup(&prop[2]);
410 param.pull = be32_to_cpup(&prop[3]);
411 param.vin_sel = be32_to_cpup(&prop[4]);
412 param.out_strength = be32_to_cpup(&prop[5]);
413 param.src_select = be32_to_cpup(&prop[6]);
Michael Bohan13cbc592012-04-12 15:41:39 -0700414 param.master_en = be32_to_cpup(&prop[7]);
Michael Bohan0ba63b82012-02-06 13:42:34 -0800415
416 rc = qpnp_gpio_config(gpio, &param);
417 if (rc)
418 dev_err(&spmi->dev, "%s: unable to set default config for"
419 " gpio %d\n", __func__, gpio);
420 return rc;
421}
422
423static int qpnp_gpio_free_chip(struct qpnp_gpio_chip *q_chip)
424{
425 struct spmi_device *spmi = q_chip->spmi;
426 int rc, i;
427
428 if (q_chip->chip_gpios)
429 for (i = 0; i < spmi->num_dev_node; i++)
430 kfree(q_chip->chip_gpios[i]);
431
432 mutex_lock(&qpnp_gpio_chips_lock);
433 list_del(&q_chip->chip_list);
434 mutex_unlock(&qpnp_gpio_chips_lock);
435 rc = gpiochip_remove(&q_chip->gpio_chip);
436 if (rc)
437 dev_err(&q_chip->spmi->dev, "%s: unable to remove gpio\n",
438 __func__);
439 kfree(q_chip->chip_gpios);
440 kfree(q_chip->pmic_gpios);
441 kfree(q_chip);
442 return rc;
443}
444
445static int qpnp_gpio_probe(struct spmi_device *spmi)
446{
447 struct qpnp_gpio_chip *q_chip;
448 struct resource *res;
449 struct qpnp_gpio_spec *q_spec;
450 const __be32 *prop;
451 int i, rc, ret, gpio, len;
452 int lowest_gpio = INT_MAX, highest_gpio = INT_MIN;
453 u32 intspec[3];
454
455 q_chip = kzalloc(sizeof(*q_chip), GFP_KERNEL);
456 if (!q_chip) {
457 dev_err(&spmi->dev, "%s: Can't allocate gpio_chip\n",
458 __func__);
459 return -ENOMEM;
460 }
461 q_chip->spmi = spmi;
462 dev_set_drvdata(&spmi->dev, q_chip);
463
464 mutex_lock(&qpnp_gpio_chips_lock);
465 list_add(&q_chip->chip_list, &qpnp_gpio_chips);
466 mutex_unlock(&qpnp_gpio_chips_lock);
467
468 /* first scan through nodes to find the range required for allocation */
469 for (i = 0; i < spmi->num_dev_node; i++) {
470 prop = of_get_property(spmi->dev_node[i].of_node,
471 "qcom,qpnp-gpio-num", &len);
472 if (!prop) {
473 dev_err(&spmi->dev, "%s: unable to get"
474 " qcom,qpnp-gpio-num property\n", __func__);
475 ret = -EINVAL;
476 goto err_probe;
477 } else if (len != sizeof(__be32)) {
478 dev_err(&spmi->dev, "%s: Invalid qcom,qpnp-gpio-num"
479 " property\n", __func__);
480 ret = -EINVAL;
481 goto err_probe;
482 }
483
484 gpio = be32_to_cpup(prop);
485 if (gpio < lowest_gpio)
486 lowest_gpio = gpio;
487 if (gpio > highest_gpio)
488 highest_gpio = gpio;
489 }
490
491 if (highest_gpio < lowest_gpio) {
492 dev_err(&spmi->dev, "%s: no device nodes specified in"
493 " topology\n", __func__);
494 ret = -EINVAL;
495 goto err_probe;
496 } else if (lowest_gpio == 0) {
497 dev_err(&spmi->dev, "%s: 0 is not a valid PMIC GPIO\n",
498 __func__);
499 ret = -EINVAL;
500 goto err_probe;
501 }
502
503 q_chip->pmic_gpio_lowest = lowest_gpio;
504 q_chip->pmic_gpio_highest = highest_gpio;
505
506 /* allocate gpio lookup tables */
507 q_chip->pmic_gpios = kzalloc(sizeof(struct qpnp_gpio_spec *) *
508 highest_gpio - lowest_gpio + 1,
509 GFP_KERNEL);
510 q_chip->chip_gpios = kzalloc(sizeof(struct qpnp_gpio_spec *) *
511 spmi->num_dev_node, GFP_KERNEL);
512 if (!q_chip->pmic_gpios || !q_chip->chip_gpios) {
513 dev_err(&spmi->dev, "%s: unable to allocate memory\n",
514 __func__);
515 ret = -ENOMEM;
516 goto err_probe;
517 }
518
519 /* get interrupt controller device_node */
520 q_chip->int_ctrl = of_irq_find_parent(spmi->dev.of_node);
521 if (!q_chip->int_ctrl) {
522 dev_err(&spmi->dev, "%s: Can't find interrupt parent\n",
523 __func__);
524 ret = -EINVAL;
525 goto err_probe;
526 }
527
528 /* now scan through again and populate the lookup table */
529 for (i = 0; i < spmi->num_dev_node; i++) {
530 res = qpnp_get_resource(spmi, i, IORESOURCE_MEM, 0);
531 if (!res) {
532 dev_err(&spmi->dev, "%s: node %s is missing has no"
533 " base address definition\n",
534 __func__, spmi->dev_node[i].of_node->full_name);
535 }
536
537 prop = of_get_property(spmi->dev_node[i].of_node,
538 "qcom,qpnp-gpio-num", &len);
539 if (!prop) {
540 dev_err(&spmi->dev, "%s: unable to get"
541 " qcom,qpnp-gpio-num property\n", __func__);
542 ret = -EINVAL;
543 goto err_probe;
544 } else if (len != sizeof(__be32)) {
545 dev_err(&spmi->dev, "%s: Invalid qcom,qpnp-gpio-num"
546 " property\n", __func__);
547 ret = -EINVAL;
548 goto err_probe;
549 }
550 gpio = be32_to_cpup(prop);
551
552 q_spec = kzalloc(sizeof(struct qpnp_gpio_spec),
553 GFP_KERNEL);
554 if (!q_spec) {
555 dev_err(&spmi->dev, "%s: unable to allocate"
556 " memory\n",
557 __func__);
558 ret = -ENOMEM;
559 goto err_probe;
560 }
561
562 q_spec->slave = spmi->sid;
563 q_spec->offset = res->start;
564 q_spec->gpio_chip_idx = i;
565
566 /* call into irq_domain to get irq mapping */
567 intspec[0] = q_chip->spmi->sid;
568 intspec[1] = (q_spec->offset >> 8) & 0xFF;
569 intspec[2] = 0;
570 q_spec->irq = irq_create_of_mapping(q_chip->int_ctrl,
571 intspec, 3);
572 if (!q_spec->irq) {
573 dev_err(&spmi->dev, "%s: invalid irq for gpio"
574 " %u\n", __func__, gpio);
575 ret = -EINVAL;
576 goto err_probe;
577 }
578 /* initialize lookup table entries */
579 qpnp_pmic_gpio_set_spec(q_chip, gpio, q_spec);
580 qpnp_chip_gpio_set_spec(q_chip, i, q_spec);
581 }
582
583 q_chip->gpio_chip.base = -1;
584 q_chip->gpio_chip.ngpio = spmi->num_dev_node;
585 q_chip->gpio_chip.label = "qpnp-gpio";
586 q_chip->gpio_chip.direction_input = qpnp_gpio_direction_input;
587 q_chip->gpio_chip.direction_output = qpnp_gpio_direction_output;
588 q_chip->gpio_chip.to_irq = qpnp_gpio_to_irq;
589 q_chip->gpio_chip.get = qpnp_gpio_get;
590 q_chip->gpio_chip.set = qpnp_gpio_set;
591 q_chip->gpio_chip.dev = &spmi->dev;
592 q_chip->gpio_chip.of_xlate = qpnp_gpio_of_gpio_xlate;
593 q_chip->gpio_chip.of_gpio_n_cells = 2;
594 q_chip->gpio_chip.can_sleep = 0;
595
596 rc = gpiochip_add(&q_chip->gpio_chip);
597 if (rc) {
598 dev_err(&spmi->dev, "%s: Can't add gpio chip, rc = %d\n",
599 __func__, rc);
600 ret = rc;
601 goto err_probe;
602 }
603
604 /* now configure gpio defaults if they exist */
605 for (i = 0; i < spmi->num_dev_node; i++) {
606 q_spec = qpnp_chip_gpio_get_spec(q_chip, i);
607 if (WARN_ON(!q_spec))
608 return -ENODEV;
609
610 /* It's not an error to not config a default */
611 prop = of_get_property(spmi->dev_node[i].of_node,
612 "qcom,qpnp-gpio-cfg", &len);
Michael Bohan13cbc592012-04-12 15:41:39 -0700613 /* 8 data values constitute one tuple */
614 if (prop && (len != (8 * sizeof(__be32)))) {
Michael Bohan0ba63b82012-02-06 13:42:34 -0800615 dev_err(&spmi->dev, "%s: invalid format for"
616 " qcom,qpnp-gpio-cfg property\n",
617 __func__);
618 ret = -EINVAL;
619 goto err_probe;
620 } else if (prop) {
621 rc = qpnp_gpio_config_default(spmi, prop,
622 q_chip->gpio_chip.base + i);
623 if (rc) {
624 ret = rc;
625 goto err_probe;
626 }
627 } else {
628 /* initialize with hardware defaults */
629 rc = spmi_ext_register_readl(
630 q_chip->spmi->ctrl, q_spec->slave,
631 Q_REG_ADDR(q_spec, Q_REG_IO_CTL1),
632 &q_spec->regs[Q_REG_I_IO_CTL1],
633 Q_NUM_CTL_REGS);
634 q_spec->regs[Q_REG_I_EN_CTL1] |=
635 (1 << Q_REG_MASTER_EN_SHIFT);
636 rc = spmi_ext_register_writel(
637 q_chip->spmi->ctrl, q_spec->slave,
638 Q_REG_ADDR(q_spec, Q_REG_EN_CTL1),
639 &q_spec->regs[Q_REG_EN_CTL1], 1);
640 if (rc) {
641 dev_err(&spmi->dev, "%s: spmi write"
642 " failed\n", __func__);
643 ret = rc;
644 goto err_probe;
645 }
646 }
647 }
648
649 dev_dbg(&spmi->dev, "%s: gpio_chip registered between %d-%u\n",
650 __func__, q_chip->gpio_chip.base,
651 (q_chip->gpio_chip.base + q_chip->gpio_chip.ngpio) - 1);
652 return 0;
653
654err_probe:
655 qpnp_gpio_free_chip(q_chip);
656 return ret;
657}
658
659static int qpnp_gpio_remove(struct spmi_device *spmi)
660{
661 struct qpnp_gpio_chip *q_chip = dev_get_drvdata(&spmi->dev);
662
663 return qpnp_gpio_free_chip(q_chip);
664}
665
666static struct of_device_id spmi_match_table[] = {
667 { .compatible = "qcom,qpnp-gpio",
668 },
669 {}
670};
671
672static const struct spmi_device_id qpnp_gpio_id[] = {
673 { "qcom,qpnp-gpio", 0 },
674 { }
675};
676MODULE_DEVICE_TABLE(spmi, qpnp_gpio_id);
677
678static struct spmi_driver qpnp_gpio_driver = {
679 .driver = {
680 .name = "qcom,qpnp-gpio",
681 .of_match_table = spmi_match_table,
682 },
683 .probe = qpnp_gpio_probe,
684 .remove = qpnp_gpio_remove,
685 .id_table = qpnp_gpio_id,
686};
687
688static int __init qpnp_gpio_init(void)
689{
690 return spmi_driver_register(&qpnp_gpio_driver);
691}
692
693static void __exit qpnp_gpio_exit(void)
694{
695}
696
Michael Bohan0ba63b82012-02-06 13:42:34 -0800697MODULE_DESCRIPTION("QPNP PMIC gpio driver");
Michael Bohan7f0cc9d2012-04-16 17:16:09 -0700698MODULE_LICENSE("GPL v2");
Michael Bohan0ba63b82012-02-06 13:42:34 -0800699
700module_init(qpnp_gpio_init);
701module_exit(qpnp_gpio_exit);