blob: 9dc38140194bf8a8f6e4765ea9c790e112beaa31 [file] [log] [blame]
Mathias Nymana5d811b2013-06-18 14:33:02 +03001/*
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>
Mathias Nymana5d811b2013-06-18 14:33:02 +030028#include <linux/gpio.h>
Mathias Nymana5d811b2013-06-18 14:33:02 +030029#include <linux/acpi.h>
Mathias Nymana5d811b2013-06-18 14:33:02 +030030#include <linux/platform_device.h>
31#include <linux/seq_file.h>
32#include <linux/io.h>
33#include <linux/pm_runtime.h>
34#include <linux/pinctrl/pinctrl.h>
35
36/* memory mapped register offsets */
37#define BYT_CONF0_REG 0x000
38#define BYT_CONF1_REG 0x004
39#define BYT_VAL_REG 0x008
40#define BYT_DFT_REG 0x00c
41#define BYT_INT_STAT_REG 0x800
42
43/* BYT_CONF0_REG register bits */
Mika Westerberg3ff95882014-05-16 12:18:29 +030044#define BYT_IODEN BIT(31)
Eric Ernstff998352014-06-12 11:06:20 -070045#define BYT_DIRECT_IRQ_EN BIT(27)
Mathias Nymana5d811b2013-06-18 14:33:02 +030046#define BYT_TRIG_NEG BIT(26)
47#define BYT_TRIG_POS BIT(25)
48#define BYT_TRIG_LVL BIT(24)
Mika Westerberg3ff95882014-05-16 12:18:29 +030049#define BYT_PULL_STR_SHIFT 9
50#define BYT_PULL_STR_MASK (3 << BYT_PULL_STR_SHIFT)
51#define BYT_PULL_STR_2K (0 << BYT_PULL_STR_SHIFT)
52#define BYT_PULL_STR_10K (1 << BYT_PULL_STR_SHIFT)
53#define BYT_PULL_STR_20K (2 << BYT_PULL_STR_SHIFT)
54#define BYT_PULL_STR_40K (3 << BYT_PULL_STR_SHIFT)
55#define BYT_PULL_ASSIGN_SHIFT 7
56#define BYT_PULL_ASSIGN_MASK (3 << BYT_PULL_ASSIGN_SHIFT)
57#define BYT_PULL_ASSIGN_UP (1 << BYT_PULL_ASSIGN_SHIFT)
58#define BYT_PULL_ASSIGN_DOWN (2 << BYT_PULL_ASSIGN_SHIFT)
Mathias Nymana5d811b2013-06-18 14:33:02 +030059#define BYT_PIN_MUX 0x07
60
61/* BYT_VAL_REG register bits */
62#define BYT_INPUT_EN BIT(2) /* 0: input enabled (active low)*/
63#define BYT_OUTPUT_EN BIT(1) /* 0: output enabled (active low)*/
64#define BYT_LEVEL BIT(0)
65
66#define BYT_DIR_MASK (BIT(1) | BIT(2))
67#define BYT_TRIG_MASK (BIT(26) | BIT(25) | BIT(24))
68
69#define BYT_NGPIO_SCORE 102
70#define BYT_NGPIO_NCORE 28
71#define BYT_NGPIO_SUS 44
72
Chew, Kean Ho42bd0072014-03-06 21:59:49 +080073#define BYT_SCORE_ACPI_UID "1"
74#define BYT_NCORE_ACPI_UID "2"
75#define BYT_SUS_ACPI_UID "3"
76
Mathias Nymana5d811b2013-06-18 14:33:02 +030077/*
78 * Baytrail gpio controller consist of three separate sub-controllers called
79 * SCORE, NCORE and SUS. The sub-controllers are identified by their acpi UID.
80 *
81 * GPIO numbering is _not_ ordered meaning that gpio # 0 in ACPI namespace does
82 * _not_ correspond to the first gpio register at controller's gpio base.
83 * There is no logic or pattern in mapping gpio numbers to registers (pads) so
84 * each sub-controller needs to have its own mapping table
85 */
86
87/* score_pins[gpio_nr] = pad_nr */
88
89static unsigned const score_pins[BYT_NGPIO_SCORE] = {
90 85, 89, 93, 96, 99, 102, 98, 101, 34, 37,
91 36, 38, 39, 35, 40, 84, 62, 61, 64, 59,
92 54, 56, 60, 55, 63, 57, 51, 50, 53, 47,
93 52, 49, 48, 43, 46, 41, 45, 42, 58, 44,
94 95, 105, 70, 68, 67, 66, 69, 71, 65, 72,
95 86, 90, 88, 92, 103, 77, 79, 83, 78, 81,
96 80, 82, 13, 12, 15, 14, 17, 18, 19, 16,
97 2, 1, 0, 4, 6, 7, 9, 8, 33, 32,
98 31, 30, 29, 27, 25, 28, 26, 23, 21, 20,
99 24, 22, 5, 3, 10, 11, 106, 87, 91, 104,
100 97, 100,
101};
102
103static unsigned const ncore_pins[BYT_NGPIO_NCORE] = {
104 19, 18, 17, 20, 21, 22, 24, 25, 23, 16,
105 14, 15, 12, 26, 27, 1, 4, 8, 11, 0,
106 3, 6, 10, 13, 2, 5, 9, 7,
107};
108
109static unsigned const sus_pins[BYT_NGPIO_SUS] = {
110 29, 33, 30, 31, 32, 34, 36, 35, 38, 37,
111 18, 7, 11, 20, 17, 1, 8, 10, 19, 12,
112 0, 2, 23, 39, 28, 27, 22, 21, 24, 25,
113 26, 51, 56, 54, 49, 55, 48, 57, 50, 58,
114 52, 53, 59, 40,
115};
116
117static struct pinctrl_gpio_range byt_ranges[] = {
118 {
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800119 .name = BYT_SCORE_ACPI_UID, /* match with acpi _UID in probe */
Mathias Nymana5d811b2013-06-18 14:33:02 +0300120 .npins = BYT_NGPIO_SCORE,
121 .pins = score_pins,
122 },
123 {
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800124 .name = BYT_NCORE_ACPI_UID,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300125 .npins = BYT_NGPIO_NCORE,
126 .pins = ncore_pins,
127 },
128 {
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800129 .name = BYT_SUS_ACPI_UID,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300130 .npins = BYT_NGPIO_SUS,
131 .pins = sus_pins,
132 },
133 {
134 },
135};
136
137struct byt_gpio {
138 struct gpio_chip chip;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300139 struct platform_device *pdev;
140 spinlock_t lock;
141 void __iomem *reg_base;
142 struct pinctrl_gpio_range *range;
143};
144
Andy Shevchenko17e52462013-07-10 14:55:39 +0300145#define to_byt_gpio(c) container_of(c, struct byt_gpio, chip)
146
Mathias Nymana5d811b2013-06-18 14:33:02 +0300147static void __iomem *byt_gpio_reg(struct gpio_chip *chip, unsigned offset,
148 int reg)
149{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300150 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300151 u32 reg_offset;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300152
153 if (reg == BYT_INT_STAT_REG)
154 reg_offset = (offset / 32) * 4;
155 else
156 reg_offset = vg->range->pins[offset] * 16;
157
Andy Shevchenko9c5b6552013-07-10 14:55:38 +0300158 return vg->reg_base + reg_offset + reg;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300159}
160
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800161static bool is_special_pin(struct byt_gpio *vg, unsigned offset)
162{
163 /* SCORE pin 92-93 */
164 if (!strcmp(vg->range->name, BYT_SCORE_ACPI_UID) &&
165 offset >= 92 && offset <= 93)
166 return true;
167
168 /* SUS pin 11-21 */
169 if (!strcmp(vg->range->name, BYT_SUS_ACPI_UID) &&
170 offset >= 11 && offset <= 21)
171 return true;
172
173 return false;
174}
175
Mathias Nymana5d811b2013-06-18 14:33:02 +0300176static int byt_gpio_request(struct gpio_chip *chip, unsigned offset)
177{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300178 struct byt_gpio *vg = to_byt_gpio(chip);
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800179 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_CONF0_REG);
180 u32 value;
181 bool special;
182
183 /*
184 * In most cases, func pin mux 000 means GPIO function.
185 * But, some pins may have func pin mux 001 represents
186 * GPIO function. Only allow user to export pin with
187 * func pin mux preset as GPIO function by BIOS/FW.
188 */
189 value = readl(reg) & BYT_PIN_MUX;
190 special = is_special_pin(vg, offset);
191 if ((special && value != 1) || (!special && value)) {
192 dev_err(&vg->pdev->dev,
193 "pin %u cannot be used as GPIO.\n", offset);
194 return -EINVAL;
195 }
Mathias Nymana5d811b2013-06-18 14:33:02 +0300196
197 pm_runtime_get(&vg->pdev->dev);
198
199 return 0;
200}
201
202static void byt_gpio_free(struct gpio_chip *chip, unsigned offset)
203{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300204 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300205 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
206 u32 value;
207
208 /* clear interrupt triggering */
209 value = readl(reg);
210 value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
211 writel(value, reg);
212
213 pm_runtime_put(&vg->pdev->dev);
214}
215
216static int byt_irq_type(struct irq_data *d, unsigned type)
217{
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300218 struct byt_gpio *vg = to_byt_gpio(irq_data_get_irq_chip_data(d));
Mathias Nymana5d811b2013-06-18 14:33:02 +0300219 u32 offset = irqd_to_hwirq(d);
220 u32 value;
221 unsigned long flags;
222 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
223
224 if (offset >= vg->chip.ngpio)
225 return -EINVAL;
226
227 spin_lock_irqsave(&vg->lock, flags);
228 value = readl(reg);
229
Loic Poulain3a71c052014-09-26 16:14:51 +0200230 WARN(value & BYT_DIRECT_IRQ_EN,
231 "Bad pad config for io mode, force direct_irq_en bit clearing");
232
Mathias Nymana5d811b2013-06-18 14:33:02 +0300233 /* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits
234 * are used to indicate high and low level triggering
235 */
Loic Poulain3a71c052014-09-26 16:14:51 +0200236 value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG |
237 BYT_TRIG_LVL);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300238
239 switch (type) {
240 case IRQ_TYPE_LEVEL_HIGH:
241 value |= BYT_TRIG_LVL;
242 case IRQ_TYPE_EDGE_RISING:
243 value |= BYT_TRIG_POS;
244 break;
245 case IRQ_TYPE_LEVEL_LOW:
246 value |= BYT_TRIG_LVL;
247 case IRQ_TYPE_EDGE_FALLING:
248 value |= BYT_TRIG_NEG;
249 break;
250 case IRQ_TYPE_EDGE_BOTH:
251 value |= (BYT_TRIG_NEG | BYT_TRIG_POS);
252 break;
253 }
254 writel(value, reg);
255
256 spin_unlock_irqrestore(&vg->lock, flags);
257
258 return 0;
259}
260
261static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
262{
263 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
264 return readl(reg) & BYT_LEVEL;
265}
266
267static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
268{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300269 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300270 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
271 unsigned long flags;
272 u32 old_val;
273
274 spin_lock_irqsave(&vg->lock, flags);
275
276 old_val = readl(reg);
277
278 if (value)
279 writel(old_val | BYT_LEVEL, reg);
280 else
281 writel(old_val & ~BYT_LEVEL, reg);
282
283 spin_unlock_irqrestore(&vg->lock, flags);
284}
285
286static int byt_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
287{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300288 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300289 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
290 unsigned long flags;
291 u32 value;
292
293 spin_lock_irqsave(&vg->lock, flags);
294
295 value = readl(reg) | BYT_DIR_MASK;
Andy Shevchenko496940c2013-07-10 14:55:40 +0300296 value &= ~BYT_INPUT_EN; /* active low */
Mathias Nymana5d811b2013-06-18 14:33:02 +0300297 writel(value, reg);
298
299 spin_unlock_irqrestore(&vg->lock, flags);
300
301 return 0;
302}
303
304static int byt_gpio_direction_output(struct gpio_chip *chip,
305 unsigned gpio, int value)
306{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300307 struct byt_gpio *vg = to_byt_gpio(chip);
Eric Ernstff998352014-06-12 11:06:20 -0700308 void __iomem *conf_reg = byt_gpio_reg(chip, gpio, BYT_CONF0_REG);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300309 void __iomem *reg = byt_gpio_reg(chip, gpio, BYT_VAL_REG);
310 unsigned long flags;
311 u32 reg_val;
312
313 spin_lock_irqsave(&vg->lock, flags);
314
Eric Ernstff998352014-06-12 11:06:20 -0700315 /*
316 * Before making any direction modifications, do a check if gpio
317 * is set for direct IRQ. On baytrail, setting GPIO to output does
318 * not make sense, so let's at least warn the caller before they shoot
319 * themselves in the foot.
320 */
321 WARN(readl(conf_reg) & BYT_DIRECT_IRQ_EN,
322 "Potential Error: Setting GPIO with direct_irq_en to output");
323
Andy Shevchenko496940c2013-07-10 14:55:40 +0300324 reg_val = readl(reg) | BYT_DIR_MASK;
David Cohend90c3382014-10-14 10:54:37 -0700325 reg_val &= ~(BYT_OUTPUT_EN | BYT_INPUT_EN);
Andy Shevchenko496940c2013-07-10 14:55:40 +0300326
327 if (value)
328 writel(reg_val | BYT_LEVEL, reg);
329 else
330 writel(reg_val & ~BYT_LEVEL, reg);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300331
332 spin_unlock_irqrestore(&vg->lock, flags);
333
334 return 0;
335}
336
337static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
338{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300339 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300340 int i;
341 unsigned long flags;
342 u32 conf0, val, offs;
343
344 spin_lock_irqsave(&vg->lock, flags);
345
346 for (i = 0; i < vg->chip.ngpio; i++) {
Mika Westerberg3ff95882014-05-16 12:18:29 +0300347 const char *pull_str = NULL;
348 const char *pull = NULL;
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200349 const char *label;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300350 offs = vg->range->pins[i] * 16;
351 conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);
352 val = readl(vg->reg_base + offs + BYT_VAL_REG);
353
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200354 label = gpiochip_is_requested(chip, i);
355 if (!label)
356 label = "Unrequested";
357
Mika Westerberg3ff95882014-05-16 12:18:29 +0300358 switch (conf0 & BYT_PULL_ASSIGN_MASK) {
359 case BYT_PULL_ASSIGN_UP:
360 pull = "up";
361 break;
362 case BYT_PULL_ASSIGN_DOWN:
363 pull = "down";
364 break;
365 }
366
367 switch (conf0 & BYT_PULL_STR_MASK) {
368 case BYT_PULL_STR_2K:
369 pull_str = "2k";
370 break;
371 case BYT_PULL_STR_10K:
372 pull_str = "10k";
373 break;
374 case BYT_PULL_STR_20K:
375 pull_str = "20k";
376 break;
377 case BYT_PULL_STR_40K:
378 pull_str = "40k";
379 break;
380 }
381
Mathias Nymana5d811b2013-06-18 14:33:02 +0300382 seq_printf(s,
Mika Westerberg3ff95882014-05-16 12:18:29 +0300383 " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s",
Mathias Nymana5d811b2013-06-18 14:33:02 +0300384 i,
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200385 label,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300386 val & BYT_INPUT_EN ? " " : "in",
387 val & BYT_OUTPUT_EN ? " " : "out",
388 val & BYT_LEVEL ? "hi" : "lo",
389 vg->range->pins[i], offs,
390 conf0 & 0x7,
Mika Westerberg3ff95882014-05-16 12:18:29 +0300391 conf0 & BYT_TRIG_NEG ? " fall" : " ",
392 conf0 & BYT_TRIG_POS ? " rise" : " ",
393 conf0 & BYT_TRIG_LVL ? " level" : " ");
394
395 if (pull && pull_str)
396 seq_printf(s, " %-4s %-3s", pull, pull_str);
397 else
398 seq_puts(s, " ");
399
400 if (conf0 & BYT_IODEN)
401 seq_puts(s, " open-drain");
402
403 seq_puts(s, "\n");
Mathias Nymana5d811b2013-06-18 14:33:02 +0300404 }
405 spin_unlock_irqrestore(&vg->lock, flags);
406}
407
Mathias Nymana5d811b2013-06-18 14:33:02 +0300408static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
409{
410 struct irq_data *data = irq_desc_get_irq_data(desc);
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300411 struct byt_gpio *vg = to_byt_gpio(irq_desc_get_handler_data(desc));
Mathias Nymana5d811b2013-06-18 14:33:02 +0300412 struct irq_chip *chip = irq_data_get_irq_chip(data);
413 u32 base, pin, mask;
414 void __iomem *reg;
415 u32 pending;
416 unsigned virq;
417 int looplimit = 0;
418
419 /* check from GPIO controller which pin triggered the interrupt */
420 for (base = 0; base < vg->chip.ngpio; base += 32) {
421
422 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
423
424 while ((pending = readl(reg))) {
425 pin = __ffs(pending);
426 mask = BIT(pin);
427 /* Clear before handling so we can't lose an edge */
428 writel(mask, reg);
429
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300430 virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300431 generic_handle_irq(virq);
432
433 /* In case bios or user sets triggering incorretly a pin
434 * might remain in "interrupt triggered" state.
435 */
436 if (looplimit++ > 32) {
437 dev_err(&vg->pdev->dev,
438 "Gpio %d interrupt flood, disabling\n",
439 base + pin);
440
441 reg = byt_gpio_reg(&vg->chip, base + pin,
442 BYT_CONF0_REG);
443 mask = readl(reg);
444 mask &= ~(BYT_TRIG_NEG | BYT_TRIG_POS |
445 BYT_TRIG_LVL);
446 writel(mask, reg);
447 mask = readl(reg); /* flush */
448 break;
449 }
450 }
451 }
452 chip->irq_eoi(data);
453}
454
455static void byt_irq_unmask(struct irq_data *d)
456{
457}
458
459static void byt_irq_mask(struct irq_data *d)
460{
461}
462
463static struct irq_chip byt_irqchip = {
464 .name = "BYT-GPIO",
465 .irq_mask = byt_irq_mask,
466 .irq_unmask = byt_irq_unmask,
467 .irq_set_type = byt_irq_type,
Mathias Nyman41939e62014-08-11 16:51:55 +0300468 .flags = IRQCHIP_SKIP_SET_WAKE,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300469};
470
471static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
472{
473 void __iomem *reg;
474 u32 base, value;
475
476 /* clear interrupt status trigger registers */
477 for (base = 0; base < vg->chip.ngpio; base += 32) {
478 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
479 writel(0xffffffff, reg);
480 /* make sure trigger bits are cleared, if not then a pin
481 might be misconfigured in bios */
482 value = readl(reg);
483 if (value)
484 dev_err(&vg->pdev->dev,
485 "GPIO interrupt error, pins misconfigured\n");
486 }
487}
488
Mathias Nymana5d811b2013-06-18 14:33:02 +0300489static int byt_gpio_probe(struct platform_device *pdev)
490{
491 struct byt_gpio *vg;
492 struct gpio_chip *gc;
493 struct resource *mem_rc, *irq_rc;
494 struct device *dev = &pdev->dev;
495 struct acpi_device *acpi_dev;
496 struct pinctrl_gpio_range *range;
497 acpi_handle handle = ACPI_HANDLE(dev);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300498 int ret;
499
500 if (acpi_bus_get_device(handle, &acpi_dev))
501 return -ENODEV;
502
503 vg = devm_kzalloc(dev, sizeof(struct byt_gpio), GFP_KERNEL);
504 if (!vg) {
505 dev_err(&pdev->dev, "can't allocate byt_gpio chip data\n");
506 return -ENOMEM;
507 }
508
509 for (range = byt_ranges; range->name; range++) {
510 if (!strcmp(acpi_dev->pnp.unique_id, range->name)) {
511 vg->chip.ngpio = range->npins;
512 vg->range = range;
513 break;
514 }
515 }
516
517 if (!vg->chip.ngpio || !vg->range)
518 return -ENODEV;
519
520 vg->pdev = pdev;
521 platform_set_drvdata(pdev, vg);
522
523 mem_rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
524 vg->reg_base = devm_ioremap_resource(dev, mem_rc);
525 if (IS_ERR(vg->reg_base))
526 return PTR_ERR(vg->reg_base);
527
528 spin_lock_init(&vg->lock);
529
530 gc = &vg->chip;
531 gc->label = dev_name(&pdev->dev);
532 gc->owner = THIS_MODULE;
533 gc->request = byt_gpio_request;
534 gc->free = byt_gpio_free;
535 gc->direction_input = byt_gpio_direction_input;
536 gc->direction_output = byt_gpio_direction_output;
537 gc->get = byt_gpio_get;
538 gc->set = byt_gpio_set;
539 gc->dbg_show = byt_gpio_dbg_show;
540 gc->base = -1;
Linus Walleij9fb1f392013-12-04 14:42:46 +0100541 gc->can_sleep = false;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300542 gc->dev = dev;
543
Jin Yao605a7bc2014-05-15 18:28:47 +0300544 ret = gpiochip_add(gc);
545 if (ret) {
546 dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
547 return ret;
548 }
549
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300550 /* set up interrupts */
551 irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
552 if (irq_rc && irq_rc->start) {
553 byt_gpio_irq_init_hw(vg);
554 ret = gpiochip_irqchip_add(gc, &byt_irqchip, 0,
555 handle_simple_irq, IRQ_TYPE_NONE);
556 if (ret) {
557 dev_err(dev, "failed to add irqchip\n");
558 gpiochip_remove(gc);
559 return ret;
560 }
561
562 gpiochip_set_chained_irqchip(gc, &byt_irqchip,
563 (unsigned)irq_rc->start,
564 byt_gpio_irq_handler);
565 }
566
Mathias Nymana5d811b2013-06-18 14:33:02 +0300567 pm_runtime_enable(dev);
568
569 return 0;
570}
571
572static int byt_gpio_runtime_suspend(struct device *dev)
573{
574 return 0;
575}
576
577static int byt_gpio_runtime_resume(struct device *dev)
578{
579 return 0;
580}
581
582static const struct dev_pm_ops byt_gpio_pm_ops = {
583 .runtime_suspend = byt_gpio_runtime_suspend,
584 .runtime_resume = byt_gpio_runtime_resume,
585};
586
587static const struct acpi_device_id byt_gpio_acpi_match[] = {
588 { "INT33B2", 0 },
Jin Yao20482d32014-05-15 18:28:46 +0300589 { "INT33FC", 0 },
Mathias Nymana5d811b2013-06-18 14:33:02 +0300590 { }
591};
592MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match);
593
594static int byt_gpio_remove(struct platform_device *pdev)
595{
596 struct byt_gpio *vg = platform_get_drvdata(pdev);
Andy Shevchenkoec243322013-07-10 14:55:36 +0300597
Mathias Nymana5d811b2013-06-18 14:33:02 +0300598 pm_runtime_disable(&pdev->dev);
abdoulaye bertheb4e7c552014-07-12 22:30:13 +0200599 gpiochip_remove(&vg->chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300600
601 return 0;
602}
603
604static struct platform_driver byt_gpio_driver = {
605 .probe = byt_gpio_probe,
606 .remove = byt_gpio_remove,
607 .driver = {
608 .name = "byt_gpio",
609 .owner = THIS_MODULE,
610 .pm = &byt_gpio_pm_ops,
611 .acpi_match_table = ACPI_PTR(byt_gpio_acpi_match),
612 },
613};
614
615static int __init byt_gpio_init(void)
616{
617 return platform_driver_register(&byt_gpio_driver);
618}
619
620subsys_initcall(byt_gpio_init);