pinctrl: remove all usage of gpio_remove ret val in driver/pinctl
[deliverable/linux.git] / drivers / pinctrl / pinctrl-baytrail.c
CommitLineData
a5d811bb
MN
1/*
2 * Pinctrl GPIO driver for Intel Baytrail
3 * Copyright (c) 2012-2013, Intel Corporation.
4 *
5 * Author: Mathias Nyman <mathias.nyman@linux.intel.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms and conditions of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/init.h>
25#include <linux/types.h>
26#include <linux/bitops.h>
27#include <linux/interrupt.h>
28#include <linux/irq.h>
29#include <linux/gpio.h>
30#include <linux/irqdomain.h>
31#include <linux/acpi.h>
a5d811bb
MN
32#include <linux/platform_device.h>
33#include <linux/seq_file.h>
34#include <linux/io.h>
35#include <linux/pm_runtime.h>
36#include <linux/pinctrl/pinctrl.h>
37
38/* memory mapped register offsets */
39#define BYT_CONF0_REG 0x000
40#define BYT_CONF1_REG 0x004
41#define BYT_VAL_REG 0x008
42#define BYT_DFT_REG 0x00c
43#define BYT_INT_STAT_REG 0x800
44
45/* BYT_CONF0_REG register bits */
3ff95885 46#define BYT_IODEN BIT(31)
ff998356 47#define BYT_DIRECT_IRQ_EN BIT(27)
a5d811bb
MN
48#define BYT_TRIG_NEG BIT(26)
49#define BYT_TRIG_POS BIT(25)
50#define BYT_TRIG_LVL BIT(24)
3ff95885
MW
51#define BYT_PULL_STR_SHIFT 9
52#define BYT_PULL_STR_MASK (3 << BYT_PULL_STR_SHIFT)
53#define BYT_PULL_STR_2K (0 << BYT_PULL_STR_SHIFT)
54#define BYT_PULL_STR_10K (1 << BYT_PULL_STR_SHIFT)
55#define BYT_PULL_STR_20K (2 << BYT_PULL_STR_SHIFT)
56#define BYT_PULL_STR_40K (3 << BYT_PULL_STR_SHIFT)
57#define BYT_PULL_ASSIGN_SHIFT 7
58#define BYT_PULL_ASSIGN_MASK (3 << BYT_PULL_ASSIGN_SHIFT)
59#define BYT_PULL_ASSIGN_UP (1 << BYT_PULL_ASSIGN_SHIFT)
60#define BYT_PULL_ASSIGN_DOWN (2 << BYT_PULL_ASSIGN_SHIFT)
a5d811bb
MN
61#define BYT_PIN_MUX 0x07
62
63/* BYT_VAL_REG register bits */
64#define BYT_INPUT_EN BIT(2) /* 0: input enabled (active low)*/
65#define BYT_OUTPUT_EN BIT(1) /* 0: output enabled (active low)*/
66#define BYT_LEVEL BIT(0)
67
68#define BYT_DIR_MASK (BIT(1) | BIT(2))
69#define BYT_TRIG_MASK (BIT(26) | BIT(25) | BIT(24))
70
71#define BYT_NGPIO_SCORE 102
72#define BYT_NGPIO_NCORE 28
73#define BYT_NGPIO_SUS 44
74
42bd0070
CKH
75#define BYT_SCORE_ACPI_UID "1"
76#define BYT_NCORE_ACPI_UID "2"
77#define BYT_SUS_ACPI_UID "3"
78
a5d811bb
MN
79/*
80 * Baytrail gpio controller consist of three separate sub-controllers called
81 * SCORE, NCORE and SUS. The sub-controllers are identified by their acpi UID.
82 *
83 * GPIO numbering is _not_ ordered meaning that gpio # 0 in ACPI namespace does
84 * _not_ correspond to the first gpio register at controller's gpio base.
85 * There is no logic or pattern in mapping gpio numbers to registers (pads) so
86 * each sub-controller needs to have its own mapping table
87 */
88
89/* score_pins[gpio_nr] = pad_nr */
90
91static unsigned const score_pins[BYT_NGPIO_SCORE] = {
92 85, 89, 93, 96, 99, 102, 98, 101, 34, 37,
93 36, 38, 39, 35, 40, 84, 62, 61, 64, 59,
94 54, 56, 60, 55, 63, 57, 51, 50, 53, 47,
95 52, 49, 48, 43, 46, 41, 45, 42, 58, 44,
96 95, 105, 70, 68, 67, 66, 69, 71, 65, 72,
97 86, 90, 88, 92, 103, 77, 79, 83, 78, 81,
98 80, 82, 13, 12, 15, 14, 17, 18, 19, 16,
99 2, 1, 0, 4, 6, 7, 9, 8, 33, 32,
100 31, 30, 29, 27, 25, 28, 26, 23, 21, 20,
101 24, 22, 5, 3, 10, 11, 106, 87, 91, 104,
102 97, 100,
103};
104
105static unsigned const ncore_pins[BYT_NGPIO_NCORE] = {
106 19, 18, 17, 20, 21, 22, 24, 25, 23, 16,
107 14, 15, 12, 26, 27, 1, 4, 8, 11, 0,
108 3, 6, 10, 13, 2, 5, 9, 7,
109};
110
111static unsigned const sus_pins[BYT_NGPIO_SUS] = {
112 29, 33, 30, 31, 32, 34, 36, 35, 38, 37,
113 18, 7, 11, 20, 17, 1, 8, 10, 19, 12,
114 0, 2, 23, 39, 28, 27, 22, 21, 24, 25,
115 26, 51, 56, 54, 49, 55, 48, 57, 50, 58,
116 52, 53, 59, 40,
117};
118
119static struct pinctrl_gpio_range byt_ranges[] = {
120 {
42bd0070 121 .name = BYT_SCORE_ACPI_UID, /* match with acpi _UID in probe */
a5d811bb
MN
122 .npins = BYT_NGPIO_SCORE,
123 .pins = score_pins,
124 },
125 {
42bd0070 126 .name = BYT_NCORE_ACPI_UID,
a5d811bb
MN
127 .npins = BYT_NGPIO_NCORE,
128 .pins = ncore_pins,
129 },
130 {
42bd0070 131 .name = BYT_SUS_ACPI_UID,
a5d811bb
MN
132 .npins = BYT_NGPIO_SUS,
133 .pins = sus_pins,
134 },
135 {
136 },
137};
138
139struct byt_gpio {
140 struct gpio_chip chip;
141 struct irq_domain *domain;
142 struct platform_device *pdev;
143 spinlock_t lock;
144 void __iomem *reg_base;
145 struct pinctrl_gpio_range *range;
146};
147
17e52464
AS
148#define to_byt_gpio(c) container_of(c, struct byt_gpio, chip)
149
a5d811bb
MN
150static void __iomem *byt_gpio_reg(struct gpio_chip *chip, unsigned offset,
151 int reg)
152{
17e52464 153 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb 154 u32 reg_offset;
a5d811bb
MN
155
156 if (reg == BYT_INT_STAT_REG)
157 reg_offset = (offset / 32) * 4;
158 else
159 reg_offset = vg->range->pins[offset] * 16;
160
9c5b6557 161 return vg->reg_base + reg_offset + reg;
a5d811bb
MN
162}
163
42bd0070
CKH
164static bool is_special_pin(struct byt_gpio *vg, unsigned offset)
165{
166 /* SCORE pin 92-93 */
167 if (!strcmp(vg->range->name, BYT_SCORE_ACPI_UID) &&
168 offset >= 92 && offset <= 93)
169 return true;
170
171 /* SUS pin 11-21 */
172 if (!strcmp(vg->range->name, BYT_SUS_ACPI_UID) &&
173 offset >= 11 && offset <= 21)
174 return true;
175
176 return false;
177}
178
a5d811bb
MN
179static int byt_gpio_request(struct gpio_chip *chip, unsigned offset)
180{
17e52464 181 struct byt_gpio *vg = to_byt_gpio(chip);
42bd0070
CKH
182 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_CONF0_REG);
183 u32 value;
184 bool special;
185
186 /*
187 * In most cases, func pin mux 000 means GPIO function.
188 * But, some pins may have func pin mux 001 represents
189 * GPIO function. Only allow user to export pin with
190 * func pin mux preset as GPIO function by BIOS/FW.
191 */
192 value = readl(reg) & BYT_PIN_MUX;
193 special = is_special_pin(vg, offset);
194 if ((special && value != 1) || (!special && value)) {
195 dev_err(&vg->pdev->dev,
196 "pin %u cannot be used as GPIO.\n", offset);
197 return -EINVAL;
198 }
a5d811bb
MN
199
200 pm_runtime_get(&vg->pdev->dev);
201
202 return 0;
203}
204
205static void byt_gpio_free(struct gpio_chip *chip, unsigned offset)
206{
17e52464 207 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb
MN
208 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
209 u32 value;
210
211 /* clear interrupt triggering */
212 value = readl(reg);
213 value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
214 writel(value, reg);
215
216 pm_runtime_put(&vg->pdev->dev);
217}
218
219static int byt_irq_type(struct irq_data *d, unsigned type)
220{
221 struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
222 u32 offset = irqd_to_hwirq(d);
223 u32 value;
224 unsigned long flags;
225 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
226
227 if (offset >= vg->chip.ngpio)
228 return -EINVAL;
229
230 spin_lock_irqsave(&vg->lock, flags);
231 value = readl(reg);
232
233 /* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits
234 * are used to indicate high and low level triggering
235 */
236 value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
237
238 switch (type) {
239 case IRQ_TYPE_LEVEL_HIGH:
240 value |= BYT_TRIG_LVL;
241 case IRQ_TYPE_EDGE_RISING:
242 value |= BYT_TRIG_POS;
243 break;
244 case IRQ_TYPE_LEVEL_LOW:
245 value |= BYT_TRIG_LVL;
246 case IRQ_TYPE_EDGE_FALLING:
247 value |= BYT_TRIG_NEG;
248 break;
249 case IRQ_TYPE_EDGE_BOTH:
250 value |= (BYT_TRIG_NEG | BYT_TRIG_POS);
251 break;
252 }
253 writel(value, reg);
254
255 spin_unlock_irqrestore(&vg->lock, flags);
256
257 return 0;
258}
259
260static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
261{
262 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
263 return readl(reg) & BYT_LEVEL;
264}
265
266static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
267{
17e52464 268 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb
MN
269 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
270 unsigned long flags;
271 u32 old_val;
272
273 spin_lock_irqsave(&vg->lock, flags);
274
275 old_val = readl(reg);
276
277 if (value)
278 writel(old_val | BYT_LEVEL, reg);
279 else
280 writel(old_val & ~BYT_LEVEL, reg);
281
282 spin_unlock_irqrestore(&vg->lock, flags);
283}
284
285static int byt_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
286{
17e52464 287 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb
MN
288 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
289 unsigned long flags;
290 u32 value;
291
292 spin_lock_irqsave(&vg->lock, flags);
293
294 value = readl(reg) | BYT_DIR_MASK;
496940c1 295 value &= ~BYT_INPUT_EN; /* active low */
a5d811bb
MN
296 writel(value, reg);
297
298 spin_unlock_irqrestore(&vg->lock, flags);
299
300 return 0;
301}
302
303static int byt_gpio_direction_output(struct gpio_chip *chip,
304 unsigned gpio, int value)
305{
17e52464 306 struct byt_gpio *vg = to_byt_gpio(chip);
ff998356 307 void __iomem *conf_reg = byt_gpio_reg(chip, gpio, BYT_CONF0_REG);
a5d811bb
MN
308 void __iomem *reg = byt_gpio_reg(chip, gpio, BYT_VAL_REG);
309 unsigned long flags;
310 u32 reg_val;
311
312 spin_lock_irqsave(&vg->lock, flags);
313
ff998356
EE
314 /*
315 * Before making any direction modifications, do a check if gpio
316 * is set for direct IRQ. On baytrail, setting GPIO to output does
317 * not make sense, so let's at least warn the caller before they shoot
318 * themselves in the foot.
319 */
320 WARN(readl(conf_reg) & BYT_DIRECT_IRQ_EN,
321 "Potential Error: Setting GPIO with direct_irq_en to output");
322
496940c1
AS
323 reg_val = readl(reg) | BYT_DIR_MASK;
324 reg_val &= ~BYT_OUTPUT_EN;
325
326 if (value)
327 writel(reg_val | BYT_LEVEL, reg);
328 else
329 writel(reg_val & ~BYT_LEVEL, reg);
a5d811bb
MN
330
331 spin_unlock_irqrestore(&vg->lock, flags);
332
333 return 0;
334}
335
336static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
337{
17e52464 338 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb
MN
339 int i;
340 unsigned long flags;
341 u32 conf0, val, offs;
342
343 spin_lock_irqsave(&vg->lock, flags);
344
345 for (i = 0; i < vg->chip.ngpio; i++) {
3ff95885
MW
346 const char *pull_str = NULL;
347 const char *pull = NULL;
a4d8d6da 348 const char *label;
a5d811bb
MN
349 offs = vg->range->pins[i] * 16;
350 conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);
351 val = readl(vg->reg_base + offs + BYT_VAL_REG);
352
a4d8d6da
MN
353 label = gpiochip_is_requested(chip, i);
354 if (!label)
355 label = "Unrequested";
356
3ff95885
MW
357 switch (conf0 & BYT_PULL_ASSIGN_MASK) {
358 case BYT_PULL_ASSIGN_UP:
359 pull = "up";
360 break;
361 case BYT_PULL_ASSIGN_DOWN:
362 pull = "down";
363 break;
364 }
365
366 switch (conf0 & BYT_PULL_STR_MASK) {
367 case BYT_PULL_STR_2K:
368 pull_str = "2k";
369 break;
370 case BYT_PULL_STR_10K:
371 pull_str = "10k";
372 break;
373 case BYT_PULL_STR_20K:
374 pull_str = "20k";
375 break;
376 case BYT_PULL_STR_40K:
377 pull_str = "40k";
378 break;
379 }
380
a5d811bb 381 seq_printf(s,
3ff95885 382 " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s",
a5d811bb 383 i,
a4d8d6da 384 label,
a5d811bb
MN
385 val & BYT_INPUT_EN ? " " : "in",
386 val & BYT_OUTPUT_EN ? " " : "out",
387 val & BYT_LEVEL ? "hi" : "lo",
388 vg->range->pins[i], offs,
389 conf0 & 0x7,
3ff95885
MW
390 conf0 & BYT_TRIG_NEG ? " fall" : " ",
391 conf0 & BYT_TRIG_POS ? " rise" : " ",
392 conf0 & BYT_TRIG_LVL ? " level" : " ");
393
394 if (pull && pull_str)
395 seq_printf(s, " %-4s %-3s", pull, pull_str);
396 else
397 seq_puts(s, " ");
398
399 if (conf0 & BYT_IODEN)
400 seq_puts(s, " open-drain");
401
402 seq_puts(s, "\n");
a5d811bb
MN
403 }
404 spin_unlock_irqrestore(&vg->lock, flags);
405}
406
407static int byt_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
408{
17e52464 409 struct byt_gpio *vg = to_byt_gpio(chip);
a5d811bb
MN
410 return irq_create_mapping(vg->domain, offset);
411}
412
413static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
414{
415 struct irq_data *data = irq_desc_get_irq_data(desc);
416 struct byt_gpio *vg = irq_data_get_irq_handler_data(data);
417 struct irq_chip *chip = irq_data_get_irq_chip(data);
418 u32 base, pin, mask;
419 void __iomem *reg;
420 u32 pending;
421 unsigned virq;
422 int looplimit = 0;
423
424 /* check from GPIO controller which pin triggered the interrupt */
425 for (base = 0; base < vg->chip.ngpio; base += 32) {
426
427 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
428
429 while ((pending = readl(reg))) {
430 pin = __ffs(pending);
431 mask = BIT(pin);
432 /* Clear before handling so we can't lose an edge */
433 writel(mask, reg);
434
435 virq = irq_find_mapping(vg->domain, base + pin);
436 generic_handle_irq(virq);
437
438 /* In case bios or user sets triggering incorretly a pin
439 * might remain in "interrupt triggered" state.
440 */
441 if (looplimit++ > 32) {
442 dev_err(&vg->pdev->dev,
443 "Gpio %d interrupt flood, disabling\n",
444 base + pin);
445
446 reg = byt_gpio_reg(&vg->chip, base + pin,
447 BYT_CONF0_REG);
448 mask = readl(reg);
449 mask &= ~(BYT_TRIG_NEG | BYT_TRIG_POS |
450 BYT_TRIG_LVL);
451 writel(mask, reg);
452 mask = readl(reg); /* flush */
453 break;
454 }
455 }
456 }
457 chip->irq_eoi(data);
458}
459
460static void byt_irq_unmask(struct irq_data *d)
461{
462}
463
464static void byt_irq_mask(struct irq_data *d)
465{
466}
467
57ef0428 468static int byt_irq_reqres(struct irq_data *d)
1d2d8ce6
LW
469{
470 struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
471
57ef0428 472 if (gpio_lock_as_irq(&vg->chip, irqd_to_hwirq(d))) {
1d2d8ce6
LW
473 dev_err(vg->chip.dev,
474 "unable to lock HW IRQ %lu for IRQ\n",
475 irqd_to_hwirq(d));
57ef0428
LW
476 return -EINVAL;
477 }
1d2d8ce6
LW
478 return 0;
479}
480
57ef0428 481static void byt_irq_relres(struct irq_data *d)
1d2d8ce6
LW
482{
483 struct byt_gpio *vg = irq_data_get_irq_chip_data(d);
484
1d2d8ce6
LW
485 gpio_unlock_as_irq(&vg->chip, irqd_to_hwirq(d));
486}
487
a5d811bb
MN
488static struct irq_chip byt_irqchip = {
489 .name = "BYT-GPIO",
490 .irq_mask = byt_irq_mask,
491 .irq_unmask = byt_irq_unmask,
492 .irq_set_type = byt_irq_type,
57ef0428
LW
493 .irq_request_resources = byt_irq_reqres,
494 .irq_release_resources = byt_irq_relres,
a5d811bb
MN
495};
496
497static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
498{
499 void __iomem *reg;
500 u32 base, value;
501
502 /* clear interrupt status trigger registers */
503 for (base = 0; base < vg->chip.ngpio; base += 32) {
504 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
505 writel(0xffffffff, reg);
506 /* make sure trigger bits are cleared, if not then a pin
507 might be misconfigured in bios */
508 value = readl(reg);
509 if (value)
510 dev_err(&vg->pdev->dev,
511 "GPIO interrupt error, pins misconfigured\n");
512 }
513}
514
515static int byt_gpio_irq_map(struct irq_domain *d, unsigned int virq,
516 irq_hw_number_t hw)
517{
518 struct byt_gpio *vg = d->host_data;
519
520 irq_set_chip_and_handler_name(virq, &byt_irqchip, handle_simple_irq,
521 "demux");
522 irq_set_chip_data(virq, vg);
523 irq_set_irq_type(virq, IRQ_TYPE_NONE);
524
525 return 0;
526}
527
528static const struct irq_domain_ops byt_gpio_irq_ops = {
529 .map = byt_gpio_irq_map,
530};
531
532static int byt_gpio_probe(struct platform_device *pdev)
533{
534 struct byt_gpio *vg;
535 struct gpio_chip *gc;
536 struct resource *mem_rc, *irq_rc;
537 struct device *dev = &pdev->dev;
538 struct acpi_device *acpi_dev;
539 struct pinctrl_gpio_range *range;
540 acpi_handle handle = ACPI_HANDLE(dev);
541 unsigned hwirq;
542 int ret;
543
544 if (acpi_bus_get_device(handle, &acpi_dev))
545 return -ENODEV;
546
547 vg = devm_kzalloc(dev, sizeof(struct byt_gpio), GFP_KERNEL);
548 if (!vg) {
549 dev_err(&pdev->dev, "can't allocate byt_gpio chip data\n");
550 return -ENOMEM;
551 }
552
553 for (range = byt_ranges; range->name; range++) {
554 if (!strcmp(acpi_dev->pnp.unique_id, range->name)) {
555 vg->chip.ngpio = range->npins;
556 vg->range = range;
557 break;
558 }
559 }
560
561 if (!vg->chip.ngpio || !vg->range)
562 return -ENODEV;
563
564 vg->pdev = pdev;
565 platform_set_drvdata(pdev, vg);
566
567 mem_rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
568 vg->reg_base = devm_ioremap_resource(dev, mem_rc);
569 if (IS_ERR(vg->reg_base))
570 return PTR_ERR(vg->reg_base);
571
572 spin_lock_init(&vg->lock);
573
574 gc = &vg->chip;
575 gc->label = dev_name(&pdev->dev);
576 gc->owner = THIS_MODULE;
577 gc->request = byt_gpio_request;
578 gc->free = byt_gpio_free;
579 gc->direction_input = byt_gpio_direction_input;
580 gc->direction_output = byt_gpio_direction_output;
581 gc->get = byt_gpio_get;
582 gc->set = byt_gpio_set;
583 gc->dbg_show = byt_gpio_dbg_show;
584 gc->base = -1;
9fb1f39e 585 gc->can_sleep = false;
a5d811bb
MN
586 gc->dev = dev;
587
a5d811bb
MN
588 /* set up interrupts */
589 irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
590 if (irq_rc && irq_rc->start) {
591 hwirq = irq_rc->start;
592 gc->to_irq = byt_gpio_to_irq;
593
594 vg->domain = irq_domain_add_linear(NULL, gc->ngpio,
595 &byt_gpio_irq_ops, vg);
596 if (!vg->domain)
597 return -ENXIO;
598
599 byt_gpio_irq_init_hw(vg);
600
601 irq_set_handler_data(hwirq, vg);
602 irq_set_chained_handler(hwirq, byt_gpio_irq_handler);
a5d811bb
MN
603 }
604
605a7bca
JY
605 ret = gpiochip_add(gc);
606 if (ret) {
607 dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
608 return ret;
609 }
610
a5d811bb
MN
611 pm_runtime_enable(dev);
612
613 return 0;
614}
615
616static int byt_gpio_runtime_suspend(struct device *dev)
617{
618 return 0;
619}
620
621static int byt_gpio_runtime_resume(struct device *dev)
622{
623 return 0;
624}
625
626static const struct dev_pm_ops byt_gpio_pm_ops = {
627 .runtime_suspend = byt_gpio_runtime_suspend,
628 .runtime_resume = byt_gpio_runtime_resume,
629};
630
631static const struct acpi_device_id byt_gpio_acpi_match[] = {
632 { "INT33B2", 0 },
20482d32 633 { "INT33FC", 0 },
a5d811bb
MN
634 { }
635};
636MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match);
637
638static int byt_gpio_remove(struct platform_device *pdev)
639{
640 struct byt_gpio *vg = platform_get_drvdata(pdev);
ec243320 641
a5d811bb 642 pm_runtime_disable(&pdev->dev);
b4e7c55d 643 gpiochip_remove(&vg->chip);
a5d811bb
MN
644
645 return 0;
646}
647
648static struct platform_driver byt_gpio_driver = {
649 .probe = byt_gpio_probe,
650 .remove = byt_gpio_remove,
651 .driver = {
652 .name = "byt_gpio",
653 .owner = THIS_MODULE,
654 .pm = &byt_gpio_pm_ops,
655 .acpi_match_table = ACPI_PTR(byt_gpio_acpi_match),
656 },
657};
658
659static int __init byt_gpio_init(void)
660{
661 return platform_driver_register(&byt_gpio_driver);
662}
663
664subsys_initcall(byt_gpio_init);
This page took 0.095476 seconds and 5 git commands to generate.