blob: e44f2fd6753fdb777eb2eed40b1cda75f4a850eb [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
Mika Westerbergf8323b62015-02-23 14:53:10 +0200161static u32 byt_get_gpio_mux(struct byt_gpio *vg, unsigned offset)
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800162{
163 /* SCORE pin 92-93 */
164 if (!strcmp(vg->range->name, BYT_SCORE_ACPI_UID) &&
165 offset >= 92 && offset <= 93)
Mika Westerbergf8323b62015-02-23 14:53:10 +0200166 return 1;
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800167
168 /* SUS pin 11-21 */
169 if (!strcmp(vg->range->name, BYT_SUS_ACPI_UID) &&
170 offset >= 11 && offset <= 21)
Mika Westerbergf8323b62015-02-23 14:53:10 +0200171 return 1;
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800172
Mika Westerbergf8323b62015-02-23 14:53:10 +0200173 return 0;
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800174}
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);
Mika Westerbergf8323b62015-02-23 14:53:10 +0200180 u32 value, gpio_mux;
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800181
182 /*
183 * In most cases, func pin mux 000 means GPIO function.
184 * But, some pins may have func pin mux 001 represents
Mika Westerbergf8323b62015-02-23 14:53:10 +0200185 * GPIO function.
186 *
187 * Because there are devices out there where some pins were not
188 * configured correctly we allow changing the mux value from
189 * request (but print out warning about that).
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800190 */
191 value = readl(reg) & BYT_PIN_MUX;
Mika Westerbergf8323b62015-02-23 14:53:10 +0200192 gpio_mux = byt_get_gpio_mux(vg, offset);
193 if (WARN_ON(gpio_mux != value)) {
194 unsigned long flags;
195
196 spin_lock_irqsave(&vg->lock, flags);
197 value = readl(reg) & ~BYT_PIN_MUX;
198 value |= gpio_mux;
199 writel(value, reg);
200 spin_unlock_irqrestore(&vg->lock, flags);
201
202 dev_warn(&vg->pdev->dev,
203 "pin %u forcibly re-configured as GPIO\n", offset);
Chew, Kean Ho42bd0072014-03-06 21:59:49 +0800204 }
Mathias Nymana5d811b2013-06-18 14:33:02 +0300205
206 pm_runtime_get(&vg->pdev->dev);
207
208 return 0;
209}
210
211static void byt_gpio_free(struct gpio_chip *chip, unsigned offset)
212{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300213 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300214 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
215 u32 value;
216
217 /* clear interrupt triggering */
218 value = readl(reg);
219 value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
220 writel(value, reg);
221
222 pm_runtime_put(&vg->pdev->dev);
223}
224
225static int byt_irq_type(struct irq_data *d, unsigned type)
226{
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300227 struct byt_gpio *vg = to_byt_gpio(irq_data_get_irq_chip_data(d));
Mathias Nymana5d811b2013-06-18 14:33:02 +0300228 u32 offset = irqd_to_hwirq(d);
229 u32 value;
230 unsigned long flags;
231 void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
232
233 if (offset >= vg->chip.ngpio)
234 return -EINVAL;
235
236 spin_lock_irqsave(&vg->lock, flags);
237 value = readl(reg);
238
Loic Poulain3a71c052014-09-26 16:14:51 +0200239 WARN(value & BYT_DIRECT_IRQ_EN,
240 "Bad pad config for io mode, force direct_irq_en bit clearing");
241
Mathias Nymana5d811b2013-06-18 14:33:02 +0300242 /* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits
243 * are used to indicate high and low level triggering
244 */
Loic Poulain3a71c052014-09-26 16:14:51 +0200245 value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG |
246 BYT_TRIG_LVL);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300247
248 switch (type) {
249 case IRQ_TYPE_LEVEL_HIGH:
250 value |= BYT_TRIG_LVL;
251 case IRQ_TYPE_EDGE_RISING:
252 value |= BYT_TRIG_POS;
253 break;
254 case IRQ_TYPE_LEVEL_LOW:
255 value |= BYT_TRIG_LVL;
256 case IRQ_TYPE_EDGE_FALLING:
257 value |= BYT_TRIG_NEG;
258 break;
259 case IRQ_TYPE_EDGE_BOTH:
260 value |= (BYT_TRIG_NEG | BYT_TRIG_POS);
261 break;
262 }
263 writel(value, reg);
264
265 spin_unlock_irqrestore(&vg->lock, flags);
266
267 return 0;
268}
269
270static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
271{
272 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
273 return readl(reg) & BYT_LEVEL;
274}
275
276static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
277{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300278 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300279 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
280 unsigned long flags;
281 u32 old_val;
282
283 spin_lock_irqsave(&vg->lock, flags);
284
285 old_val = readl(reg);
286
287 if (value)
288 writel(old_val | BYT_LEVEL, reg);
289 else
290 writel(old_val & ~BYT_LEVEL, reg);
291
292 spin_unlock_irqrestore(&vg->lock, flags);
293}
294
295static int byt_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
296{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300297 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300298 void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
299 unsigned long flags;
300 u32 value;
301
302 spin_lock_irqsave(&vg->lock, flags);
303
304 value = readl(reg) | BYT_DIR_MASK;
Andy Shevchenko496940c2013-07-10 14:55:40 +0300305 value &= ~BYT_INPUT_EN; /* active low */
Mathias Nymana5d811b2013-06-18 14:33:02 +0300306 writel(value, reg);
307
308 spin_unlock_irqrestore(&vg->lock, flags);
309
310 return 0;
311}
312
313static int byt_gpio_direction_output(struct gpio_chip *chip,
314 unsigned gpio, int value)
315{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300316 struct byt_gpio *vg = to_byt_gpio(chip);
Eric Ernstff998352014-06-12 11:06:20 -0700317 void __iomem *conf_reg = byt_gpio_reg(chip, gpio, BYT_CONF0_REG);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300318 void __iomem *reg = byt_gpio_reg(chip, gpio, BYT_VAL_REG);
319 unsigned long flags;
320 u32 reg_val;
321
322 spin_lock_irqsave(&vg->lock, flags);
323
Eric Ernstff998352014-06-12 11:06:20 -0700324 /*
325 * Before making any direction modifications, do a check if gpio
326 * is set for direct IRQ. On baytrail, setting GPIO to output does
327 * not make sense, so let's at least warn the caller before they shoot
328 * themselves in the foot.
329 */
330 WARN(readl(conf_reg) & BYT_DIRECT_IRQ_EN,
331 "Potential Error: Setting GPIO with direct_irq_en to output");
332
Andy Shevchenko496940c2013-07-10 14:55:40 +0300333 reg_val = readl(reg) | BYT_DIR_MASK;
David Cohend90c3382014-10-14 10:54:37 -0700334 reg_val &= ~(BYT_OUTPUT_EN | BYT_INPUT_EN);
Andy Shevchenko496940c2013-07-10 14:55:40 +0300335
336 if (value)
337 writel(reg_val | BYT_LEVEL, reg);
338 else
339 writel(reg_val & ~BYT_LEVEL, reg);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300340
341 spin_unlock_irqrestore(&vg->lock, flags);
342
343 return 0;
344}
345
346static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
347{
Andy Shevchenko17e52462013-07-10 14:55:39 +0300348 struct byt_gpio *vg = to_byt_gpio(chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300349 int i;
350 unsigned long flags;
351 u32 conf0, val, offs;
352
353 spin_lock_irqsave(&vg->lock, flags);
354
355 for (i = 0; i < vg->chip.ngpio; i++) {
Mika Westerberg3ff95882014-05-16 12:18:29 +0300356 const char *pull_str = NULL;
357 const char *pull = NULL;
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200358 const char *label;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300359 offs = vg->range->pins[i] * 16;
360 conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);
361 val = readl(vg->reg_base + offs + BYT_VAL_REG);
362
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200363 label = gpiochip_is_requested(chip, i);
364 if (!label)
365 label = "Unrequested";
366
Mika Westerberg3ff95882014-05-16 12:18:29 +0300367 switch (conf0 & BYT_PULL_ASSIGN_MASK) {
368 case BYT_PULL_ASSIGN_UP:
369 pull = "up";
370 break;
371 case BYT_PULL_ASSIGN_DOWN:
372 pull = "down";
373 break;
374 }
375
376 switch (conf0 & BYT_PULL_STR_MASK) {
377 case BYT_PULL_STR_2K:
378 pull_str = "2k";
379 break;
380 case BYT_PULL_STR_10K:
381 pull_str = "10k";
382 break;
383 case BYT_PULL_STR_20K:
384 pull_str = "20k";
385 break;
386 case BYT_PULL_STR_40K:
387 pull_str = "40k";
388 break;
389 }
390
Mathias Nymana5d811b2013-06-18 14:33:02 +0300391 seq_printf(s,
Mika Westerberg3ff95882014-05-16 12:18:29 +0300392 " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s",
Mathias Nymana5d811b2013-06-18 14:33:02 +0300393 i,
Mathias Nymana4d8d6d2013-11-22 14:01:23 +0200394 label,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300395 val & BYT_INPUT_EN ? " " : "in",
396 val & BYT_OUTPUT_EN ? " " : "out",
397 val & BYT_LEVEL ? "hi" : "lo",
398 vg->range->pins[i], offs,
399 conf0 & 0x7,
Mika Westerberg3ff95882014-05-16 12:18:29 +0300400 conf0 & BYT_TRIG_NEG ? " fall" : " ",
401 conf0 & BYT_TRIG_POS ? " rise" : " ",
402 conf0 & BYT_TRIG_LVL ? " level" : " ");
403
404 if (pull && pull_str)
405 seq_printf(s, " %-4s %-3s", pull, pull_str);
406 else
407 seq_puts(s, " ");
408
409 if (conf0 & BYT_IODEN)
410 seq_puts(s, " open-drain");
411
412 seq_puts(s, "\n");
Mathias Nymana5d811b2013-06-18 14:33:02 +0300413 }
414 spin_unlock_irqrestore(&vg->lock, flags);
415}
416
Mathias Nymana5d811b2013-06-18 14:33:02 +0300417static void byt_gpio_irq_handler(unsigned irq, struct irq_desc *desc)
418{
419 struct irq_data *data = irq_desc_get_irq_data(desc);
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300420 struct byt_gpio *vg = to_byt_gpio(irq_desc_get_handler_data(desc));
Mathias Nymana5d811b2013-06-18 14:33:02 +0300421 struct irq_chip *chip = irq_data_get_irq_chip(data);
422 u32 base, pin, mask;
423 void __iomem *reg;
424 u32 pending;
425 unsigned virq;
426 int looplimit = 0;
427
428 /* check from GPIO controller which pin triggered the interrupt */
429 for (base = 0; base < vg->chip.ngpio; base += 32) {
430
431 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
432
433 while ((pending = readl(reg))) {
434 pin = __ffs(pending);
435 mask = BIT(pin);
436 /* Clear before handling so we can't lose an edge */
437 writel(mask, reg);
438
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300439 virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300440 generic_handle_irq(virq);
441
442 /* In case bios or user sets triggering incorretly a pin
443 * might remain in "interrupt triggered" state.
444 */
445 if (looplimit++ > 32) {
446 dev_err(&vg->pdev->dev,
447 "Gpio %d interrupt flood, disabling\n",
448 base + pin);
449
450 reg = byt_gpio_reg(&vg->chip, base + pin,
451 BYT_CONF0_REG);
452 mask = readl(reg);
453 mask &= ~(BYT_TRIG_NEG | BYT_TRIG_POS |
454 BYT_TRIG_LVL);
455 writel(mask, reg);
456 mask = readl(reg); /* flush */
457 break;
458 }
459 }
460 }
461 chip->irq_eoi(data);
462}
463
464static void byt_irq_unmask(struct irq_data *d)
465{
466}
467
468static void byt_irq_mask(struct irq_data *d)
469{
470}
471
472static struct irq_chip byt_irqchip = {
473 .name = "BYT-GPIO",
474 .irq_mask = byt_irq_mask,
475 .irq_unmask = byt_irq_unmask,
476 .irq_set_type = byt_irq_type,
Mathias Nyman41939e62014-08-11 16:51:55 +0300477 .flags = IRQCHIP_SKIP_SET_WAKE,
Mathias Nymana5d811b2013-06-18 14:33:02 +0300478};
479
480static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
481{
482 void __iomem *reg;
483 u32 base, value;
484
485 /* clear interrupt status trigger registers */
486 for (base = 0; base < vg->chip.ngpio; base += 32) {
487 reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
488 writel(0xffffffff, reg);
489 /* make sure trigger bits are cleared, if not then a pin
490 might be misconfigured in bios */
491 value = readl(reg);
492 if (value)
493 dev_err(&vg->pdev->dev,
494 "GPIO interrupt error, pins misconfigured\n");
495 }
496}
497
Mathias Nymana5d811b2013-06-18 14:33:02 +0300498static int byt_gpio_probe(struct platform_device *pdev)
499{
500 struct byt_gpio *vg;
501 struct gpio_chip *gc;
502 struct resource *mem_rc, *irq_rc;
503 struct device *dev = &pdev->dev;
504 struct acpi_device *acpi_dev;
505 struct pinctrl_gpio_range *range;
506 acpi_handle handle = ACPI_HANDLE(dev);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300507 int ret;
508
509 if (acpi_bus_get_device(handle, &acpi_dev))
510 return -ENODEV;
511
512 vg = devm_kzalloc(dev, sizeof(struct byt_gpio), GFP_KERNEL);
513 if (!vg) {
514 dev_err(&pdev->dev, "can't allocate byt_gpio chip data\n");
515 return -ENOMEM;
516 }
517
518 for (range = byt_ranges; range->name; range++) {
519 if (!strcmp(acpi_dev->pnp.unique_id, range->name)) {
520 vg->chip.ngpio = range->npins;
521 vg->range = range;
522 break;
523 }
524 }
525
526 if (!vg->chip.ngpio || !vg->range)
527 return -ENODEV;
528
529 vg->pdev = pdev;
530 platform_set_drvdata(pdev, vg);
531
532 mem_rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
533 vg->reg_base = devm_ioremap_resource(dev, mem_rc);
534 if (IS_ERR(vg->reg_base))
535 return PTR_ERR(vg->reg_base);
536
537 spin_lock_init(&vg->lock);
538
539 gc = &vg->chip;
540 gc->label = dev_name(&pdev->dev);
541 gc->owner = THIS_MODULE;
542 gc->request = byt_gpio_request;
543 gc->free = byt_gpio_free;
544 gc->direction_input = byt_gpio_direction_input;
545 gc->direction_output = byt_gpio_direction_output;
546 gc->get = byt_gpio_get;
547 gc->set = byt_gpio_set;
548 gc->dbg_show = byt_gpio_dbg_show;
549 gc->base = -1;
Linus Walleij9fb1f392013-12-04 14:42:46 +0100550 gc->can_sleep = false;
Mathias Nymana5d811b2013-06-18 14:33:02 +0300551 gc->dev = dev;
552
Jin Yao605a7bc2014-05-15 18:28:47 +0300553 ret = gpiochip_add(gc);
554 if (ret) {
555 dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
556 return ret;
557 }
558
Mika Westerberge1ee5c52014-07-25 09:54:47 +0300559 /* set up interrupts */
560 irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
561 if (irq_rc && irq_rc->start) {
562 byt_gpio_irq_init_hw(vg);
563 ret = gpiochip_irqchip_add(gc, &byt_irqchip, 0,
564 handle_simple_irq, IRQ_TYPE_NONE);
565 if (ret) {
566 dev_err(dev, "failed to add irqchip\n");
567 gpiochip_remove(gc);
568 return ret;
569 }
570
571 gpiochip_set_chained_irqchip(gc, &byt_irqchip,
572 (unsigned)irq_rc->start,
573 byt_gpio_irq_handler);
574 }
575
Mathias Nymana5d811b2013-06-18 14:33:02 +0300576 pm_runtime_enable(dev);
577
578 return 0;
579}
580
581static int byt_gpio_runtime_suspend(struct device *dev)
582{
583 return 0;
584}
585
586static int byt_gpio_runtime_resume(struct device *dev)
587{
588 return 0;
589}
590
591static const struct dev_pm_ops byt_gpio_pm_ops = {
592 .runtime_suspend = byt_gpio_runtime_suspend,
593 .runtime_resume = byt_gpio_runtime_resume,
594};
595
596static const struct acpi_device_id byt_gpio_acpi_match[] = {
597 { "INT33B2", 0 },
Jin Yao20482d32014-05-15 18:28:46 +0300598 { "INT33FC", 0 },
Mathias Nymana5d811b2013-06-18 14:33:02 +0300599 { }
600};
601MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match);
602
603static int byt_gpio_remove(struct platform_device *pdev)
604{
605 struct byt_gpio *vg = platform_get_drvdata(pdev);
Andy Shevchenkoec243322013-07-10 14:55:36 +0300606
Mathias Nymana5d811b2013-06-18 14:33:02 +0300607 pm_runtime_disable(&pdev->dev);
abdoulaye bertheb4e7c552014-07-12 22:30:13 +0200608 gpiochip_remove(&vg->chip);
Mathias Nymana5d811b2013-06-18 14:33:02 +0300609
610 return 0;
611}
612
613static struct platform_driver byt_gpio_driver = {
614 .probe = byt_gpio_probe,
615 .remove = byt_gpio_remove,
616 .driver = {
617 .name = "byt_gpio",
Mathias Nymana5d811b2013-06-18 14:33:02 +0300618 .pm = &byt_gpio_pm_ops,
619 .acpi_match_table = ACPI_PTR(byt_gpio_acpi_match),
620 },
621};
622
623static int __init byt_gpio_init(void)
624{
625 return platform_driver_register(&byt_gpio_driver);
626}
Mathias Nymana5d811b2013-06-18 14:33:02 +0300627subsys_initcall(byt_gpio_init);
Felipe Balbi9067bbe2014-10-13 15:50:08 -0500628
629static void __exit byt_gpio_exit(void)
630{
631 platform_driver_unregister(&byt_gpio_driver);
632}
633module_exit(byt_gpio_exit);