15fae8b86SMika Westerberg /*
25fae8b86SMika Westerberg  * Pinctrl GPIO driver for Intel Baytrail
35fae8b86SMika Westerberg  * Copyright (c) 2012-2013, Intel Corporation.
45fae8b86SMika Westerberg  *
55fae8b86SMika Westerberg  * Author: Mathias Nyman <mathias.nyman@linux.intel.com>
65fae8b86SMika Westerberg  *
75fae8b86SMika Westerberg  * This program is free software; you can redistribute it and/or modify it
85fae8b86SMika Westerberg  * under the terms and conditions of the GNU General Public License,
95fae8b86SMika Westerberg  * version 2, as published by the Free Software Foundation.
105fae8b86SMika Westerberg  *
115fae8b86SMika Westerberg  * This program is distributed in the hope it will be useful, but WITHOUT
125fae8b86SMika Westerberg  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
135fae8b86SMika Westerberg  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
145fae8b86SMika Westerberg  * more details.
155fae8b86SMika Westerberg  */
165fae8b86SMika Westerberg 
175fae8b86SMika Westerberg #include <linux/kernel.h>
185fae8b86SMika Westerberg #include <linux/module.h>
195fae8b86SMika Westerberg #include <linux/init.h>
205fae8b86SMika Westerberg #include <linux/types.h>
215fae8b86SMika Westerberg #include <linux/bitops.h>
225fae8b86SMika Westerberg #include <linux/interrupt.h>
23bf9a5c96SLinus Walleij #include <linux/gpio/driver.h>
245fae8b86SMika Westerberg #include <linux/acpi.h>
255fae8b86SMika Westerberg #include <linux/platform_device.h>
265fae8b86SMika Westerberg #include <linux/seq_file.h>
275fae8b86SMika Westerberg #include <linux/io.h>
285fae8b86SMika Westerberg #include <linux/pm_runtime.h>
295fae8b86SMika Westerberg #include <linux/pinctrl/pinctrl.h>
305fae8b86SMika Westerberg 
315fae8b86SMika Westerberg /* memory mapped register offsets */
325fae8b86SMika Westerberg #define BYT_CONF0_REG		0x000
335fae8b86SMika Westerberg #define BYT_CONF1_REG		0x004
345fae8b86SMika Westerberg #define BYT_VAL_REG		0x008
355fae8b86SMika Westerberg #define BYT_DFT_REG		0x00c
365fae8b86SMika Westerberg #define BYT_INT_STAT_REG	0x800
375fae8b86SMika Westerberg 
385fae8b86SMika Westerberg /* BYT_CONF0_REG register bits */
395fae8b86SMika Westerberg #define BYT_IODEN		BIT(31)
405fae8b86SMika Westerberg #define BYT_DIRECT_IRQ_EN	BIT(27)
415fae8b86SMika Westerberg #define BYT_TRIG_NEG		BIT(26)
425fae8b86SMika Westerberg #define BYT_TRIG_POS		BIT(25)
435fae8b86SMika Westerberg #define BYT_TRIG_LVL		BIT(24)
445fae8b86SMika Westerberg #define BYT_PULL_STR_SHIFT	9
455fae8b86SMika Westerberg #define BYT_PULL_STR_MASK	(3 << BYT_PULL_STR_SHIFT)
465fae8b86SMika Westerberg #define BYT_PULL_STR_2K		(0 << BYT_PULL_STR_SHIFT)
475fae8b86SMika Westerberg #define BYT_PULL_STR_10K	(1 << BYT_PULL_STR_SHIFT)
485fae8b86SMika Westerberg #define BYT_PULL_STR_20K	(2 << BYT_PULL_STR_SHIFT)
495fae8b86SMika Westerberg #define BYT_PULL_STR_40K	(3 << BYT_PULL_STR_SHIFT)
505fae8b86SMika Westerberg #define BYT_PULL_ASSIGN_SHIFT	7
515fae8b86SMika Westerberg #define BYT_PULL_ASSIGN_MASK	(3 << BYT_PULL_ASSIGN_SHIFT)
525fae8b86SMika Westerberg #define BYT_PULL_ASSIGN_UP	(1 << BYT_PULL_ASSIGN_SHIFT)
535fae8b86SMika Westerberg #define BYT_PULL_ASSIGN_DOWN	(2 << BYT_PULL_ASSIGN_SHIFT)
545fae8b86SMika Westerberg #define BYT_PIN_MUX		0x07
555fae8b86SMika Westerberg 
565fae8b86SMika Westerberg /* BYT_VAL_REG register bits */
575fae8b86SMika Westerberg #define BYT_INPUT_EN		BIT(2)  /* 0: input enabled (active low)*/
585fae8b86SMika Westerberg #define BYT_OUTPUT_EN		BIT(1)  /* 0: output enabled (active low)*/
595fae8b86SMika Westerberg #define BYT_LEVEL		BIT(0)
605fae8b86SMika Westerberg 
615fae8b86SMika Westerberg #define BYT_DIR_MASK		(BIT(1) | BIT(2))
625fae8b86SMika Westerberg #define BYT_TRIG_MASK		(BIT(26) | BIT(25) | BIT(24))
635fae8b86SMika Westerberg 
64fcc18debSMika Westerberg #define BYT_CONF0_RESTORE_MASK	(BYT_DIRECT_IRQ_EN | BYT_TRIG_MASK | \
65fcc18debSMika Westerberg 				 BYT_PIN_MUX)
66fcc18debSMika Westerberg #define BYT_VAL_RESTORE_MASK	(BYT_DIR_MASK | BYT_LEVEL)
67fcc18debSMika Westerberg 
685fae8b86SMika Westerberg #define BYT_NGPIO_SCORE		102
695fae8b86SMika Westerberg #define BYT_NGPIO_NCORE		28
705fae8b86SMika Westerberg #define BYT_NGPIO_SUS		44
715fae8b86SMika Westerberg 
725fae8b86SMika Westerberg #define BYT_SCORE_ACPI_UID	"1"
735fae8b86SMika Westerberg #define BYT_NCORE_ACPI_UID	"2"
745fae8b86SMika Westerberg #define BYT_SUS_ACPI_UID	"3"
755fae8b86SMika Westerberg 
765fae8b86SMika Westerberg /*
775fae8b86SMika Westerberg  * Baytrail gpio controller consist of three separate sub-controllers called
785fae8b86SMika Westerberg  * SCORE, NCORE and SUS. The sub-controllers are identified by their acpi UID.
795fae8b86SMika Westerberg  *
805fae8b86SMika Westerberg  * GPIO numbering is _not_ ordered meaning that gpio # 0 in ACPI namespace does
815fae8b86SMika Westerberg  * _not_ correspond to the first gpio register at controller's gpio base.
825fae8b86SMika Westerberg  * There is no logic or pattern in mapping gpio numbers to registers (pads) so
835fae8b86SMika Westerberg  * each sub-controller needs to have its own mapping table
845fae8b86SMika Westerberg  */
855fae8b86SMika Westerberg 
865fae8b86SMika Westerberg /* score_pins[gpio_nr] = pad_nr */
875fae8b86SMika Westerberg 
885fae8b86SMika Westerberg static unsigned const score_pins[BYT_NGPIO_SCORE] = {
895fae8b86SMika Westerberg 	85, 89, 93, 96, 99, 102, 98, 101, 34, 37,
905fae8b86SMika Westerberg 	36, 38, 39, 35, 40, 84, 62, 61, 64, 59,
915fae8b86SMika Westerberg 	54, 56, 60, 55, 63, 57, 51, 50, 53, 47,
925fae8b86SMika Westerberg 	52, 49, 48, 43, 46, 41, 45, 42, 58, 44,
935fae8b86SMika Westerberg 	95, 105, 70, 68, 67, 66, 69, 71, 65, 72,
945fae8b86SMika Westerberg 	86, 90, 88, 92, 103, 77, 79, 83, 78, 81,
955fae8b86SMika Westerberg 	80, 82, 13, 12, 15, 14, 17, 18, 19, 16,
965fae8b86SMika Westerberg 	2, 1, 0, 4, 6, 7, 9, 8, 33, 32,
975fae8b86SMika Westerberg 	31, 30, 29, 27, 25, 28, 26, 23, 21, 20,
985fae8b86SMika Westerberg 	24, 22, 5, 3, 10, 11, 106, 87, 91, 104,
995fae8b86SMika Westerberg 	97, 100,
1005fae8b86SMika Westerberg };
1015fae8b86SMika Westerberg 
1025fae8b86SMika Westerberg static unsigned const ncore_pins[BYT_NGPIO_NCORE] = {
1035fae8b86SMika Westerberg 	19, 18, 17, 20, 21, 22, 24, 25, 23, 16,
1045fae8b86SMika Westerberg 	14, 15, 12, 26, 27, 1, 4, 8, 11, 0,
1055fae8b86SMika Westerberg 	3, 6, 10, 13, 2, 5, 9, 7,
1065fae8b86SMika Westerberg };
1075fae8b86SMika Westerberg 
1085fae8b86SMika Westerberg static unsigned const sus_pins[BYT_NGPIO_SUS] = {
1095fae8b86SMika Westerberg 	29, 33, 30, 31, 32, 34, 36, 35, 38, 37,
1105fae8b86SMika Westerberg 	18, 7, 11, 20, 17, 1, 8, 10, 19, 12,
1115fae8b86SMika Westerberg 	0, 2, 23, 39, 28, 27, 22, 21, 24, 25,
1125fae8b86SMika Westerberg 	26, 51, 56, 54, 49, 55, 48, 57, 50, 58,
1135fae8b86SMika Westerberg 	52, 53, 59, 40,
1145fae8b86SMika Westerberg };
1155fae8b86SMika Westerberg 
1165fae8b86SMika Westerberg static struct pinctrl_gpio_range byt_ranges[] = {
1175fae8b86SMika Westerberg 	{
1185fae8b86SMika Westerberg 		.name = BYT_SCORE_ACPI_UID, /* match with acpi _UID in probe */
1195fae8b86SMika Westerberg 		.npins = BYT_NGPIO_SCORE,
1205fae8b86SMika Westerberg 		.pins = score_pins,
1215fae8b86SMika Westerberg 	},
1225fae8b86SMika Westerberg 	{
1235fae8b86SMika Westerberg 		.name = BYT_NCORE_ACPI_UID,
1245fae8b86SMika Westerberg 		.npins = BYT_NGPIO_NCORE,
1255fae8b86SMika Westerberg 		.pins = ncore_pins,
1265fae8b86SMika Westerberg 	},
1275fae8b86SMika Westerberg 	{
1285fae8b86SMika Westerberg 		.name = BYT_SUS_ACPI_UID,
1295fae8b86SMika Westerberg 		.npins = BYT_NGPIO_SUS,
1305fae8b86SMika Westerberg 		.pins = sus_pins,
1315fae8b86SMika Westerberg 	},
1325fae8b86SMika Westerberg 	{
1335fae8b86SMika Westerberg 	},
1345fae8b86SMika Westerberg };
1355fae8b86SMika Westerberg 
136fcc18debSMika Westerberg struct byt_gpio_pin_context {
137fcc18debSMika Westerberg 	u32 conf0;
138fcc18debSMika Westerberg 	u32 val;
139fcc18debSMika Westerberg };
140fcc18debSMika Westerberg 
1415fae8b86SMika Westerberg struct byt_gpio {
1425fae8b86SMika Westerberg 	struct gpio_chip		chip;
1435fae8b86SMika Westerberg 	struct platform_device		*pdev;
14478e1c896SMika Westerberg 	raw_spinlock_t			lock;
1455fae8b86SMika Westerberg 	void __iomem			*reg_base;
1465fae8b86SMika Westerberg 	struct pinctrl_gpio_range	*range;
147fcc18debSMika Westerberg 	struct byt_gpio_pin_context	*saved_context;
1485fae8b86SMika Westerberg };
1495fae8b86SMika Westerberg 
1505fae8b86SMika Westerberg static void __iomem *byt_gpio_reg(struct gpio_chip *chip, unsigned offset,
1515fae8b86SMika Westerberg 				 int reg)
1525fae8b86SMika Westerberg {
153bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
1545fae8b86SMika Westerberg 	u32 reg_offset;
1555fae8b86SMika Westerberg 
1565fae8b86SMika Westerberg 	if (reg == BYT_INT_STAT_REG)
1575fae8b86SMika Westerberg 		reg_offset = (offset / 32) * 4;
1585fae8b86SMika Westerberg 	else
1595fae8b86SMika Westerberg 		reg_offset = vg->range->pins[offset] * 16;
1605fae8b86SMika Westerberg 
1615fae8b86SMika Westerberg 	return vg->reg_base + reg_offset + reg;
1625fae8b86SMika Westerberg }
1635fae8b86SMika Westerberg 
16495f0972cSMika Westerberg static void byt_gpio_clear_triggering(struct byt_gpio *vg, unsigned offset)
16595f0972cSMika Westerberg {
16695f0972cSMika Westerberg 	void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
16795f0972cSMika Westerberg 	unsigned long flags;
16895f0972cSMika Westerberg 	u32 value;
16995f0972cSMika Westerberg 
17078e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
17195f0972cSMika Westerberg 	value = readl(reg);
17295f0972cSMika Westerberg 	value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
17395f0972cSMika Westerberg 	writel(value, reg);
17478e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
17595f0972cSMika Westerberg }
17695f0972cSMika Westerberg 
177f8323b6bSMika Westerberg static u32 byt_get_gpio_mux(struct byt_gpio *vg, unsigned offset)
1785fae8b86SMika Westerberg {
1795fae8b86SMika Westerberg 	/* SCORE pin 92-93 */
1805fae8b86SMika Westerberg 	if (!strcmp(vg->range->name, BYT_SCORE_ACPI_UID) &&
1815fae8b86SMika Westerberg 		offset >= 92 && offset <= 93)
182f8323b6bSMika Westerberg 		return 1;
1835fae8b86SMika Westerberg 
1845fae8b86SMika Westerberg 	/* SUS pin 11-21 */
1855fae8b86SMika Westerberg 	if (!strcmp(vg->range->name, BYT_SUS_ACPI_UID) &&
1865fae8b86SMika Westerberg 		offset >= 11 && offset <= 21)
187f8323b6bSMika Westerberg 		return 1;
1885fae8b86SMika Westerberg 
189f8323b6bSMika Westerberg 	return 0;
1905fae8b86SMika Westerberg }
1915fae8b86SMika Westerberg 
1925fae8b86SMika Westerberg static int byt_gpio_request(struct gpio_chip *chip, unsigned offset)
1935fae8b86SMika Westerberg {
194bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
1955fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(chip, offset, BYT_CONF0_REG);
196f8323b6bSMika Westerberg 	u32 value, gpio_mux;
19739ce8150SMika Westerberg 	unsigned long flags;
19839ce8150SMika Westerberg 
19978e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
2005fae8b86SMika Westerberg 
2015fae8b86SMika Westerberg 	/*
2025fae8b86SMika Westerberg 	 * In most cases, func pin mux 000 means GPIO function.
2035fae8b86SMika Westerberg 	 * But, some pins may have func pin mux 001 represents
204f8323b6bSMika Westerberg 	 * GPIO function.
205f8323b6bSMika Westerberg 	 *
206f8323b6bSMika Westerberg 	 * Because there are devices out there where some pins were not
207f8323b6bSMika Westerberg 	 * configured correctly we allow changing the mux value from
208f8323b6bSMika Westerberg 	 * request (but print out warning about that).
2095fae8b86SMika Westerberg 	 */
2105fae8b86SMika Westerberg 	value = readl(reg) & BYT_PIN_MUX;
211f8323b6bSMika Westerberg 	gpio_mux = byt_get_gpio_mux(vg, offset);
212f8323b6bSMika Westerberg 	if (WARN_ON(gpio_mux != value)) {
213f8323b6bSMika Westerberg 		value = readl(reg) & ~BYT_PIN_MUX;
214f8323b6bSMika Westerberg 		value |= gpio_mux;
215f8323b6bSMika Westerberg 		writel(value, reg);
216f8323b6bSMika Westerberg 
217f8323b6bSMika Westerberg 		dev_warn(&vg->pdev->dev,
218f8323b6bSMika Westerberg 			 "pin %u forcibly re-configured as GPIO\n", offset);
2195fae8b86SMika Westerberg 	}
2205fae8b86SMika Westerberg 
22178e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
22239ce8150SMika Westerberg 
2235fae8b86SMika Westerberg 	pm_runtime_get(&vg->pdev->dev);
2245fae8b86SMika Westerberg 
2255fae8b86SMika Westerberg 	return 0;
2265fae8b86SMika Westerberg }
2275fae8b86SMika Westerberg 
2285fae8b86SMika Westerberg static void byt_gpio_free(struct gpio_chip *chip, unsigned offset)
2295fae8b86SMika Westerberg {
230bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
2315fae8b86SMika Westerberg 
23295f0972cSMika Westerberg 	byt_gpio_clear_triggering(vg, offset);
2335fae8b86SMika Westerberg 	pm_runtime_put(&vg->pdev->dev);
2345fae8b86SMika Westerberg }
2355fae8b86SMika Westerberg 
2365fae8b86SMika Westerberg static int byt_irq_type(struct irq_data *d, unsigned type)
2375fae8b86SMika Westerberg {
238bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(irq_data_get_irq_chip_data(d));
2395fae8b86SMika Westerberg 	u32 offset = irqd_to_hwirq(d);
2405fae8b86SMika Westerberg 	u32 value;
2415fae8b86SMika Westerberg 	unsigned long flags;
2425fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
2435fae8b86SMika Westerberg 
2445fae8b86SMika Westerberg 	if (offset >= vg->chip.ngpio)
2455fae8b86SMika Westerberg 		return -EINVAL;
2465fae8b86SMika Westerberg 
24778e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
2485fae8b86SMika Westerberg 	value = readl(reg);
2495fae8b86SMika Westerberg 
250c1b30e4dSLinus Torvalds 	WARN(value & BYT_DIRECT_IRQ_EN,
251c1b30e4dSLinus Torvalds 		"Bad pad config for io mode, force direct_irq_en bit clearing");
252c1b30e4dSLinus Torvalds 
2535fae8b86SMika Westerberg 	/* For level trigges the BYT_TRIG_POS and BYT_TRIG_NEG bits
2545fae8b86SMika Westerberg 	 * are used to indicate high and low level triggering
2555fae8b86SMika Westerberg 	 */
256c1b30e4dSLinus Torvalds 	value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG |
257c1b30e4dSLinus Torvalds 		   BYT_TRIG_LVL);
2585fae8b86SMika Westerberg 
2595fae8b86SMika Westerberg 	writel(value, reg);
2605fae8b86SMika Westerberg 
26131e4329fSMika Westerberg 	if (type & IRQ_TYPE_EDGE_BOTH)
262f3a085b4SThomas Gleixner 		irq_set_handler_locked(d, handle_edge_irq);
26331e4329fSMika Westerberg 	else if (type & IRQ_TYPE_LEVEL_MASK)
264f3a085b4SThomas Gleixner 		irq_set_handler_locked(d, handle_level_irq);
26531e4329fSMika Westerberg 
26678e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
2675fae8b86SMika Westerberg 
2685fae8b86SMika Westerberg 	return 0;
2695fae8b86SMika Westerberg }
2705fae8b86SMika Westerberg 
2715fae8b86SMika Westerberg static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
2725fae8b86SMika Westerberg {
2735fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
274bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
27539ce8150SMika Westerberg 	unsigned long flags;
27639ce8150SMika Westerberg 	u32 val;
27739ce8150SMika Westerberg 
27878e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
27939ce8150SMika Westerberg 	val = readl(reg);
28078e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
28139ce8150SMika Westerberg 
2823bde8771SLinus Walleij 	return !!(val & BYT_LEVEL);
2835fae8b86SMika Westerberg }
2845fae8b86SMika Westerberg 
2855fae8b86SMika Westerberg static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
2865fae8b86SMika Westerberg {
287bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
2885fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
2895fae8b86SMika Westerberg 	unsigned long flags;
2905fae8b86SMika Westerberg 	u32 old_val;
2915fae8b86SMika Westerberg 
29278e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
2935fae8b86SMika Westerberg 
2945fae8b86SMika Westerberg 	old_val = readl(reg);
2955fae8b86SMika Westerberg 
2965fae8b86SMika Westerberg 	if (value)
2975fae8b86SMika Westerberg 		writel(old_val | BYT_LEVEL, reg);
2985fae8b86SMika Westerberg 	else
2995fae8b86SMika Westerberg 		writel(old_val & ~BYT_LEVEL, reg);
3005fae8b86SMika Westerberg 
30178e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
3025fae8b86SMika Westerberg }
3035fae8b86SMika Westerberg 
3045fae8b86SMika Westerberg static int byt_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
3055fae8b86SMika Westerberg {
306bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
3075fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(chip, offset, BYT_VAL_REG);
3085fae8b86SMika Westerberg 	unsigned long flags;
3095fae8b86SMika Westerberg 	u32 value;
3105fae8b86SMika Westerberg 
31178e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
3125fae8b86SMika Westerberg 
3135fae8b86SMika Westerberg 	value = readl(reg) | BYT_DIR_MASK;
3145fae8b86SMika Westerberg 	value &= ~BYT_INPUT_EN;		/* active low */
3155fae8b86SMika Westerberg 	writel(value, reg);
3165fae8b86SMika Westerberg 
31778e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
3185fae8b86SMika Westerberg 
3195fae8b86SMika Westerberg 	return 0;
3205fae8b86SMika Westerberg }
3215fae8b86SMika Westerberg 
3225fae8b86SMika Westerberg static int byt_gpio_direction_output(struct gpio_chip *chip,
3235fae8b86SMika Westerberg 				     unsigned gpio, int value)
3245fae8b86SMika Westerberg {
325bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
3265fae8b86SMika Westerberg 	void __iomem *conf_reg = byt_gpio_reg(chip, gpio, BYT_CONF0_REG);
3275fae8b86SMika Westerberg 	void __iomem *reg = byt_gpio_reg(chip, gpio, BYT_VAL_REG);
3285fae8b86SMika Westerberg 	unsigned long flags;
3295fae8b86SMika Westerberg 	u32 reg_val;
3305fae8b86SMika Westerberg 
33178e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
3325fae8b86SMika Westerberg 
3335fae8b86SMika Westerberg 	/*
3345fae8b86SMika Westerberg 	 * Before making any direction modifications, do a check if gpio
3355fae8b86SMika Westerberg 	 * is set for direct IRQ.  On baytrail, setting GPIO to output does
3365fae8b86SMika Westerberg 	 * not make sense, so let's at least warn the caller before they shoot
3375fae8b86SMika Westerberg 	 * themselves in the foot.
3385fae8b86SMika Westerberg 	 */
3395fae8b86SMika Westerberg 	WARN(readl(conf_reg) & BYT_DIRECT_IRQ_EN,
3405fae8b86SMika Westerberg 		"Potential Error: Setting GPIO with direct_irq_en to output");
3415fae8b86SMika Westerberg 
3425fae8b86SMika Westerberg 	reg_val = readl(reg) | BYT_DIR_MASK;
343c1b30e4dSLinus Torvalds 	reg_val &= ~(BYT_OUTPUT_EN | BYT_INPUT_EN);
3445fae8b86SMika Westerberg 
3455fae8b86SMika Westerberg 	if (value)
3465fae8b86SMika Westerberg 		writel(reg_val | BYT_LEVEL, reg);
3475fae8b86SMika Westerberg 	else
3485fae8b86SMika Westerberg 		writel(reg_val & ~BYT_LEVEL, reg);
3495fae8b86SMika Westerberg 
35078e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
3515fae8b86SMika Westerberg 
3525fae8b86SMika Westerberg 	return 0;
3535fae8b86SMika Westerberg }
3545fae8b86SMika Westerberg 
3555fae8b86SMika Westerberg static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
3565fae8b86SMika Westerberg {
357bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(chip);
3585fae8b86SMika Westerberg 	int i;
3595fae8b86SMika Westerberg 	u32 conf0, val, offs;
3605fae8b86SMika Westerberg 
3615fae8b86SMika Westerberg 	for (i = 0; i < vg->chip.ngpio; i++) {
3625fae8b86SMika Westerberg 		const char *pull_str = NULL;
3635fae8b86SMika Westerberg 		const char *pull = NULL;
36478e1c896SMika Westerberg 		unsigned long flags;
3655fae8b86SMika Westerberg 		const char *label;
3665fae8b86SMika Westerberg 		offs = vg->range->pins[i] * 16;
36778e1c896SMika Westerberg 
36878e1c896SMika Westerberg 		raw_spin_lock_irqsave(&vg->lock, flags);
3695fae8b86SMika Westerberg 		conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG);
3705fae8b86SMika Westerberg 		val = readl(vg->reg_base + offs + BYT_VAL_REG);
37178e1c896SMika Westerberg 		raw_spin_unlock_irqrestore(&vg->lock, flags);
3725fae8b86SMika Westerberg 
3735fae8b86SMika Westerberg 		label = gpiochip_is_requested(chip, i);
3745fae8b86SMika Westerberg 		if (!label)
3755fae8b86SMika Westerberg 			label = "Unrequested";
3765fae8b86SMika Westerberg 
3775fae8b86SMika Westerberg 		switch (conf0 & BYT_PULL_ASSIGN_MASK) {
3785fae8b86SMika Westerberg 		case BYT_PULL_ASSIGN_UP:
3795fae8b86SMika Westerberg 			pull = "up";
3805fae8b86SMika Westerberg 			break;
3815fae8b86SMika Westerberg 		case BYT_PULL_ASSIGN_DOWN:
3825fae8b86SMika Westerberg 			pull = "down";
3835fae8b86SMika Westerberg 			break;
3845fae8b86SMika Westerberg 		}
3855fae8b86SMika Westerberg 
3865fae8b86SMika Westerberg 		switch (conf0 & BYT_PULL_STR_MASK) {
3875fae8b86SMika Westerberg 		case BYT_PULL_STR_2K:
3885fae8b86SMika Westerberg 			pull_str = "2k";
3895fae8b86SMika Westerberg 			break;
3905fae8b86SMika Westerberg 		case BYT_PULL_STR_10K:
3915fae8b86SMika Westerberg 			pull_str = "10k";
3925fae8b86SMika Westerberg 			break;
3935fae8b86SMika Westerberg 		case BYT_PULL_STR_20K:
3945fae8b86SMika Westerberg 			pull_str = "20k";
3955fae8b86SMika Westerberg 			break;
3965fae8b86SMika Westerberg 		case BYT_PULL_STR_40K:
3975fae8b86SMika Westerberg 			pull_str = "40k";
3985fae8b86SMika Westerberg 			break;
3995fae8b86SMika Westerberg 		}
4005fae8b86SMika Westerberg 
4015fae8b86SMika Westerberg 		seq_printf(s,
4025fae8b86SMika Westerberg 			   " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s",
4035fae8b86SMika Westerberg 			   i,
4045fae8b86SMika Westerberg 			   label,
4055fae8b86SMika Westerberg 			   val & BYT_INPUT_EN ? "  " : "in",
4065fae8b86SMika Westerberg 			   val & BYT_OUTPUT_EN ? "   " : "out",
4075fae8b86SMika Westerberg 			   val & BYT_LEVEL ? "hi" : "lo",
4085fae8b86SMika Westerberg 			   vg->range->pins[i], offs,
4095fae8b86SMika Westerberg 			   conf0 & 0x7,
4105fae8b86SMika Westerberg 			   conf0 & BYT_TRIG_NEG ? " fall" : "     ",
4115fae8b86SMika Westerberg 			   conf0 & BYT_TRIG_POS ? " rise" : "     ",
4125fae8b86SMika Westerberg 			   conf0 & BYT_TRIG_LVL ? " level" : "      ");
4135fae8b86SMika Westerberg 
4145fae8b86SMika Westerberg 		if (pull && pull_str)
4155fae8b86SMika Westerberg 			seq_printf(s, " %-4s %-3s", pull, pull_str);
4165fae8b86SMika Westerberg 		else
4175fae8b86SMika Westerberg 			seq_puts(s, "          ");
4185fae8b86SMika Westerberg 
4195fae8b86SMika Westerberg 		if (conf0 & BYT_IODEN)
4205fae8b86SMika Westerberg 			seq_puts(s, " open-drain");
4215fae8b86SMika Westerberg 
4225fae8b86SMika Westerberg 		seq_puts(s, "\n");
4235fae8b86SMika Westerberg 	}
4245fae8b86SMika Westerberg }
4255fae8b86SMika Westerberg 
426bd0b9ac4SThomas Gleixner static void byt_gpio_irq_handler(struct irq_desc *desc)
4275fae8b86SMika Westerberg {
4285fae8b86SMika Westerberg 	struct irq_data *data = irq_desc_get_irq_data(desc);
429bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(irq_desc_get_handler_data(desc));
4305fae8b86SMika Westerberg 	struct irq_chip *chip = irq_data_get_irq_chip(data);
43131e4329fSMika Westerberg 	u32 base, pin;
4325fae8b86SMika Westerberg 	void __iomem *reg;
43331e4329fSMika Westerberg 	unsigned long pending;
4345fae8b86SMika Westerberg 	unsigned virq;
4355fae8b86SMika Westerberg 
4365fae8b86SMika Westerberg 	/* check from GPIO controller which pin triggered the interrupt */
4375fae8b86SMika Westerberg 	for (base = 0; base < vg->chip.ngpio; base += 32) {
4385fae8b86SMika Westerberg 		reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
43931e4329fSMika Westerberg 		pending = readl(reg);
44031e4329fSMika Westerberg 		for_each_set_bit(pin, &pending, 32) {
4415fae8b86SMika Westerberg 			virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
4425fae8b86SMika Westerberg 			generic_handle_irq(virq);
4435fae8b86SMika Westerberg 		}
4445fae8b86SMika Westerberg 	}
4455fae8b86SMika Westerberg 	chip->irq_eoi(data);
4465fae8b86SMika Westerberg }
4475fae8b86SMika Westerberg 
44831e4329fSMika Westerberg static void byt_irq_ack(struct irq_data *d)
44931e4329fSMika Westerberg {
45031e4329fSMika Westerberg 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
451bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(gc);
45231e4329fSMika Westerberg 	unsigned offset = irqd_to_hwirq(d);
45331e4329fSMika Westerberg 	void __iomem *reg;
45431e4329fSMika Westerberg 
45578e1c896SMika Westerberg 	raw_spin_lock(&vg->lock);
45631e4329fSMika Westerberg 	reg = byt_gpio_reg(&vg->chip, offset, BYT_INT_STAT_REG);
45731e4329fSMika Westerberg 	writel(BIT(offset % 32), reg);
45878e1c896SMika Westerberg 	raw_spin_unlock(&vg->lock);
45931e4329fSMika Westerberg }
46031e4329fSMika Westerberg 
4615fae8b86SMika Westerberg static void byt_irq_unmask(struct irq_data *d)
4625fae8b86SMika Westerberg {
46331e4329fSMika Westerberg 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
464bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(gc);
46531e4329fSMika Westerberg 	unsigned offset = irqd_to_hwirq(d);
46631e4329fSMika Westerberg 	unsigned long flags;
46731e4329fSMika Westerberg 	void __iomem *reg;
46831e4329fSMika Westerberg 	u32 value;
46931e4329fSMika Westerberg 
47031e4329fSMika Westerberg 	reg = byt_gpio_reg(&vg->chip, offset, BYT_CONF0_REG);
47178e1c896SMika Westerberg 
47278e1c896SMika Westerberg 	raw_spin_lock_irqsave(&vg->lock, flags);
47331e4329fSMika Westerberg 	value = readl(reg);
47431e4329fSMika Westerberg 
47531e4329fSMika Westerberg 	switch (irqd_get_trigger_type(d)) {
47631e4329fSMika Westerberg 	case IRQ_TYPE_LEVEL_HIGH:
47731e4329fSMika Westerberg 		value |= BYT_TRIG_LVL;
47831e4329fSMika Westerberg 	case IRQ_TYPE_EDGE_RISING:
47931e4329fSMika Westerberg 		value |= BYT_TRIG_POS;
48031e4329fSMika Westerberg 		break;
48131e4329fSMika Westerberg 	case IRQ_TYPE_LEVEL_LOW:
48231e4329fSMika Westerberg 		value |= BYT_TRIG_LVL;
48331e4329fSMika Westerberg 	case IRQ_TYPE_EDGE_FALLING:
48431e4329fSMika Westerberg 		value |= BYT_TRIG_NEG;
48531e4329fSMika Westerberg 		break;
48631e4329fSMika Westerberg 	case IRQ_TYPE_EDGE_BOTH:
48731e4329fSMika Westerberg 		value |= (BYT_TRIG_NEG | BYT_TRIG_POS);
48831e4329fSMika Westerberg 		break;
48931e4329fSMika Westerberg 	}
49031e4329fSMika Westerberg 
49131e4329fSMika Westerberg 	writel(value, reg);
49231e4329fSMika Westerberg 
49378e1c896SMika Westerberg 	raw_spin_unlock_irqrestore(&vg->lock, flags);
4945fae8b86SMika Westerberg }
4955fae8b86SMika Westerberg 
4965fae8b86SMika Westerberg static void byt_irq_mask(struct irq_data *d)
4975fae8b86SMika Westerberg {
49831e4329fSMika Westerberg 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
499bf9a5c96SLinus Walleij 	struct byt_gpio *vg = gpiochip_get_data(gc);
50031e4329fSMika Westerberg 
50131e4329fSMika Westerberg 	byt_gpio_clear_triggering(vg, irqd_to_hwirq(d));
5025fae8b86SMika Westerberg }
5035fae8b86SMika Westerberg 
5045fae8b86SMika Westerberg static struct irq_chip byt_irqchip = {
5055fae8b86SMika Westerberg 	.name = "BYT-GPIO",
50631e4329fSMika Westerberg 	.irq_ack = byt_irq_ack,
5075fae8b86SMika Westerberg 	.irq_mask = byt_irq_mask,
5085fae8b86SMika Westerberg 	.irq_unmask = byt_irq_unmask,
5095fae8b86SMika Westerberg 	.irq_set_type = byt_irq_type,
5105fae8b86SMika Westerberg 	.flags = IRQCHIP_SKIP_SET_WAKE,
5115fae8b86SMika Westerberg };
5125fae8b86SMika Westerberg 
5135fae8b86SMika Westerberg static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
5145fae8b86SMika Westerberg {
5155fae8b86SMika Westerberg 	void __iomem *reg;
5165fae8b86SMika Westerberg 	u32 base, value;
51795f0972cSMika Westerberg 	int i;
51895f0972cSMika Westerberg 
51995f0972cSMika Westerberg 	/*
52095f0972cSMika Westerberg 	 * Clear interrupt triggers for all pins that are GPIOs and
52195f0972cSMika Westerberg 	 * do not use direct IRQ mode. This will prevent spurious
52295f0972cSMika Westerberg 	 * interrupts from misconfigured pins.
52395f0972cSMika Westerberg 	 */
52495f0972cSMika Westerberg 	for (i = 0; i < vg->chip.ngpio; i++) {
52595f0972cSMika Westerberg 		value = readl(byt_gpio_reg(&vg->chip, i, BYT_CONF0_REG));
52695f0972cSMika Westerberg 		if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i) &&
52795f0972cSMika Westerberg 		    !(value & BYT_DIRECT_IRQ_EN)) {
52895f0972cSMika Westerberg 			byt_gpio_clear_triggering(vg, i);
52995f0972cSMika Westerberg 			dev_dbg(&vg->pdev->dev, "disabling GPIO %d\n", i);
53095f0972cSMika Westerberg 		}
53195f0972cSMika Westerberg 	}
5325fae8b86SMika Westerberg 
5335fae8b86SMika Westerberg 	/* clear interrupt status trigger registers */
5345fae8b86SMika Westerberg 	for (base = 0; base < vg->chip.ngpio; base += 32) {
5355fae8b86SMika Westerberg 		reg = byt_gpio_reg(&vg->chip, base, BYT_INT_STAT_REG);
5365fae8b86SMika Westerberg 		writel(0xffffffff, reg);
5375fae8b86SMika Westerberg 		/* make sure trigger bits are cleared, if not then a pin
5385fae8b86SMika Westerberg 		   might be misconfigured in bios */
5395fae8b86SMika Westerberg 		value = readl(reg);
5405fae8b86SMika Westerberg 		if (value)
5415fae8b86SMika Westerberg 			dev_err(&vg->pdev->dev,
5425fae8b86SMika Westerberg 				"GPIO interrupt error, pins misconfigured\n");
5435fae8b86SMika Westerberg 	}
5445fae8b86SMika Westerberg }
5455fae8b86SMika Westerberg 
5465fae8b86SMika Westerberg static int byt_gpio_probe(struct platform_device *pdev)
5475fae8b86SMika Westerberg {
5485fae8b86SMika Westerberg 	struct byt_gpio *vg;
5495fae8b86SMika Westerberg 	struct gpio_chip *gc;
5505fae8b86SMika Westerberg 	struct resource *mem_rc, *irq_rc;
5515fae8b86SMika Westerberg 	struct device *dev = &pdev->dev;
5525fae8b86SMika Westerberg 	struct acpi_device *acpi_dev;
5535fae8b86SMika Westerberg 	struct pinctrl_gpio_range *range;
5545fae8b86SMika Westerberg 	acpi_handle handle = ACPI_HANDLE(dev);
5555fae8b86SMika Westerberg 	int ret;
5565fae8b86SMika Westerberg 
5575fae8b86SMika Westerberg 	if (acpi_bus_get_device(handle, &acpi_dev))
5585fae8b86SMika Westerberg 		return -ENODEV;
5595fae8b86SMika Westerberg 
5605fae8b86SMika Westerberg 	vg = devm_kzalloc(dev, sizeof(struct byt_gpio), GFP_KERNEL);
5615fae8b86SMika Westerberg 	if (!vg) {
5625fae8b86SMika Westerberg 		dev_err(&pdev->dev, "can't allocate byt_gpio chip data\n");
5635fae8b86SMika Westerberg 		return -ENOMEM;
5645fae8b86SMika Westerberg 	}
5655fae8b86SMika Westerberg 
5665fae8b86SMika Westerberg 	for (range = byt_ranges; range->name; range++) {
5675fae8b86SMika Westerberg 		if (!strcmp(acpi_dev->pnp.unique_id, range->name)) {
5685fae8b86SMika Westerberg 			vg->chip.ngpio = range->npins;
5695fae8b86SMika Westerberg 			vg->range = range;
5705fae8b86SMika Westerberg 			break;
5715fae8b86SMika Westerberg 		}
5725fae8b86SMika Westerberg 	}
5735fae8b86SMika Westerberg 
5745fae8b86SMika Westerberg 	if (!vg->chip.ngpio || !vg->range)
5755fae8b86SMika Westerberg 		return -ENODEV;
5765fae8b86SMika Westerberg 
5775fae8b86SMika Westerberg 	vg->pdev = pdev;
5785fae8b86SMika Westerberg 	platform_set_drvdata(pdev, vg);
5795fae8b86SMika Westerberg 
5805fae8b86SMika Westerberg 	mem_rc = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5815fae8b86SMika Westerberg 	vg->reg_base = devm_ioremap_resource(dev, mem_rc);
5825fae8b86SMika Westerberg 	if (IS_ERR(vg->reg_base))
5835fae8b86SMika Westerberg 		return PTR_ERR(vg->reg_base);
5845fae8b86SMika Westerberg 
58578e1c896SMika Westerberg 	raw_spin_lock_init(&vg->lock);
5865fae8b86SMika Westerberg 
5875fae8b86SMika Westerberg 	gc = &vg->chip;
5885fae8b86SMika Westerberg 	gc->label = dev_name(&pdev->dev);
5895fae8b86SMika Westerberg 	gc->owner = THIS_MODULE;
5905fae8b86SMika Westerberg 	gc->request = byt_gpio_request;
5915fae8b86SMika Westerberg 	gc->free = byt_gpio_free;
5925fae8b86SMika Westerberg 	gc->direction_input = byt_gpio_direction_input;
5935fae8b86SMika Westerberg 	gc->direction_output = byt_gpio_direction_output;
5945fae8b86SMika Westerberg 	gc->get = byt_gpio_get;
5955fae8b86SMika Westerberg 	gc->set = byt_gpio_set;
5965fae8b86SMika Westerberg 	gc->dbg_show = byt_gpio_dbg_show;
5975fae8b86SMika Westerberg 	gc->base = -1;
5985fae8b86SMika Westerberg 	gc->can_sleep = false;
59958383c78SLinus Walleij 	gc->parent = dev;
6005fae8b86SMika Westerberg 
601fcc18debSMika Westerberg #ifdef CONFIG_PM_SLEEP
602fcc18debSMika Westerberg 	vg->saved_context = devm_kcalloc(&pdev->dev, gc->ngpio,
603fcc18debSMika Westerberg 				       sizeof(*vg->saved_context), GFP_KERNEL);
604fcc18debSMika Westerberg #endif
605fcc18debSMika Westerberg 
606bf9a5c96SLinus Walleij 	ret = gpiochip_add_data(gc, vg);
6075fae8b86SMika Westerberg 	if (ret) {
6085fae8b86SMika Westerberg 		dev_err(&pdev->dev, "failed adding byt-gpio chip\n");
6095fae8b86SMika Westerberg 		return ret;
6105fae8b86SMika Westerberg 	}
6115fae8b86SMika Westerberg 
6125fae8b86SMika Westerberg 	/* set up interrupts  */
6135fae8b86SMika Westerberg 	irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
6145fae8b86SMika Westerberg 	if (irq_rc && irq_rc->start) {
6155fae8b86SMika Westerberg 		byt_gpio_irq_init_hw(vg);
6165fae8b86SMika Westerberg 		ret = gpiochip_irqchip_add(gc, &byt_irqchip, 0,
6175fae8b86SMika Westerberg 					   handle_simple_irq, IRQ_TYPE_NONE);
6185fae8b86SMika Westerberg 		if (ret) {
6195fae8b86SMika Westerberg 			dev_err(dev, "failed to add irqchip\n");
6205fae8b86SMika Westerberg 			gpiochip_remove(gc);
6215fae8b86SMika Westerberg 			return ret;
6225fae8b86SMika Westerberg 		}
6235fae8b86SMika Westerberg 
6245fae8b86SMika Westerberg 		gpiochip_set_chained_irqchip(gc, &byt_irqchip,
6255fae8b86SMika Westerberg 					     (unsigned)irq_rc->start,
6265fae8b86SMika Westerberg 					     byt_gpio_irq_handler);
6275fae8b86SMika Westerberg 	}
6285fae8b86SMika Westerberg 
6295fae8b86SMika Westerberg 	pm_runtime_enable(dev);
6305fae8b86SMika Westerberg 
6315fae8b86SMika Westerberg 	return 0;
6325fae8b86SMika Westerberg }
6335fae8b86SMika Westerberg 
634fcc18debSMika Westerberg #ifdef CONFIG_PM_SLEEP
635fcc18debSMika Westerberg static int byt_gpio_suspend(struct device *dev)
636fcc18debSMika Westerberg {
637fcc18debSMika Westerberg 	struct platform_device *pdev = to_platform_device(dev);
638fcc18debSMika Westerberg 	struct byt_gpio *vg = platform_get_drvdata(pdev);
639fcc18debSMika Westerberg 	int i;
640fcc18debSMika Westerberg 
641fcc18debSMika Westerberg 	for (i = 0; i < vg->chip.ngpio; i++) {
642fcc18debSMika Westerberg 		void __iomem *reg;
643fcc18debSMika Westerberg 		u32 value;
644fcc18debSMika Westerberg 
645fcc18debSMika Westerberg 		reg = byt_gpio_reg(&vg->chip, i, BYT_CONF0_REG);
646fcc18debSMika Westerberg 		value = readl(reg) & BYT_CONF0_RESTORE_MASK;
647fcc18debSMika Westerberg 		vg->saved_context[i].conf0 = value;
648fcc18debSMika Westerberg 
649fcc18debSMika Westerberg 		reg = byt_gpio_reg(&vg->chip, i, BYT_VAL_REG);
650fcc18debSMika Westerberg 		value = readl(reg) & BYT_VAL_RESTORE_MASK;
651fcc18debSMika Westerberg 		vg->saved_context[i].val = value;
652fcc18debSMika Westerberg 	}
653fcc18debSMika Westerberg 
654fcc18debSMika Westerberg 	return 0;
655fcc18debSMika Westerberg }
656fcc18debSMika Westerberg 
657fcc18debSMika Westerberg static int byt_gpio_resume(struct device *dev)
658fcc18debSMika Westerberg {
659fcc18debSMika Westerberg 	struct platform_device *pdev = to_platform_device(dev);
660fcc18debSMika Westerberg 	struct byt_gpio *vg = platform_get_drvdata(pdev);
661fcc18debSMika Westerberg 	int i;
662fcc18debSMika Westerberg 
663fcc18debSMika Westerberg 	for (i = 0; i < vg->chip.ngpio; i++) {
664fcc18debSMika Westerberg 		void __iomem *reg;
665fcc18debSMika Westerberg 		u32 value;
666fcc18debSMika Westerberg 
667fcc18debSMika Westerberg 		reg = byt_gpio_reg(&vg->chip, i, BYT_CONF0_REG);
668fcc18debSMika Westerberg 		value = readl(reg);
669fcc18debSMika Westerberg 		if ((value & BYT_CONF0_RESTORE_MASK) !=
670fcc18debSMika Westerberg 		     vg->saved_context[i].conf0) {
671fcc18debSMika Westerberg 			value &= ~BYT_CONF0_RESTORE_MASK;
672fcc18debSMika Westerberg 			value |= vg->saved_context[i].conf0;
673fcc18debSMika Westerberg 			writel(value, reg);
674fcc18debSMika Westerberg 			dev_info(dev, "restored pin %d conf0 %#08x", i, value);
675fcc18debSMika Westerberg 		}
676fcc18debSMika Westerberg 
677fcc18debSMika Westerberg 		reg = byt_gpio_reg(&vg->chip, i, BYT_VAL_REG);
678fcc18debSMika Westerberg 		value = readl(reg);
679fcc18debSMika Westerberg 		if ((value & BYT_VAL_RESTORE_MASK) !=
680fcc18debSMika Westerberg 		     vg->saved_context[i].val) {
681fcc18debSMika Westerberg 			u32 v;
682fcc18debSMika Westerberg 
683fcc18debSMika Westerberg 			v = value & ~BYT_VAL_RESTORE_MASK;
684fcc18debSMika Westerberg 			v |= vg->saved_context[i].val;
685fcc18debSMika Westerberg 			if (v != value) {
686fcc18debSMika Westerberg 				writel(v, reg);
687fcc18debSMika Westerberg 				dev_dbg(dev, "restored pin %d val %#08x\n",
688fcc18debSMika Westerberg 					i, v);
689fcc18debSMika Westerberg 			}
690fcc18debSMika Westerberg 		}
691fcc18debSMika Westerberg 	}
692fcc18debSMika Westerberg 
693fcc18debSMika Westerberg 	return 0;
694fcc18debSMika Westerberg }
695fcc18debSMika Westerberg #endif
696fcc18debSMika Westerberg 
697ec879f12SMika Westerberg #ifdef CONFIG_PM
6985fae8b86SMika Westerberg static int byt_gpio_runtime_suspend(struct device *dev)
6995fae8b86SMika Westerberg {
7005fae8b86SMika Westerberg 	return 0;
7015fae8b86SMika Westerberg }
7025fae8b86SMika Westerberg 
7035fae8b86SMika Westerberg static int byt_gpio_runtime_resume(struct device *dev)
7045fae8b86SMika Westerberg {
7055fae8b86SMika Westerberg 	return 0;
7065fae8b86SMika Westerberg }
707ec879f12SMika Westerberg #endif
7085fae8b86SMika Westerberg 
7095fae8b86SMika Westerberg static const struct dev_pm_ops byt_gpio_pm_ops = {
710fcc18debSMika Westerberg 	SET_LATE_SYSTEM_SLEEP_PM_OPS(byt_gpio_suspend, byt_gpio_resume)
711fcc18debSMika Westerberg 	SET_RUNTIME_PM_OPS(byt_gpio_runtime_suspend, byt_gpio_runtime_resume,
712fcc18debSMika Westerberg 			   NULL)
7135fae8b86SMika Westerberg };
7145fae8b86SMika Westerberg 
7155fae8b86SMika Westerberg static const struct acpi_device_id byt_gpio_acpi_match[] = {
7165fae8b86SMika Westerberg 	{ "INT33B2", 0 },
7175fae8b86SMika Westerberg 	{ "INT33FC", 0 },
7185fae8b86SMika Westerberg 	{ }
7195fae8b86SMika Westerberg };
7205fae8b86SMika Westerberg MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match);
7215fae8b86SMika Westerberg 
7225fae8b86SMika Westerberg static int byt_gpio_remove(struct platform_device *pdev)
7235fae8b86SMika Westerberg {
7245fae8b86SMika Westerberg 	struct byt_gpio *vg = platform_get_drvdata(pdev);
7255fae8b86SMika Westerberg 
7265fae8b86SMika Westerberg 	pm_runtime_disable(&pdev->dev);
7275fae8b86SMika Westerberg 	gpiochip_remove(&vg->chip);
7285fae8b86SMika Westerberg 
7295fae8b86SMika Westerberg 	return 0;
7305fae8b86SMika Westerberg }
7315fae8b86SMika Westerberg 
7325fae8b86SMika Westerberg static struct platform_driver byt_gpio_driver = {
7335fae8b86SMika Westerberg 	.probe          = byt_gpio_probe,
7345fae8b86SMika Westerberg 	.remove         = byt_gpio_remove,
7355fae8b86SMika Westerberg 	.driver         = {
7365fae8b86SMika Westerberg 		.name   = "byt_gpio",
7375fae8b86SMika Westerberg 		.pm	= &byt_gpio_pm_ops,
7385fae8b86SMika Westerberg 		.acpi_match_table = ACPI_PTR(byt_gpio_acpi_match),
7395fae8b86SMika Westerberg 	},
7405fae8b86SMika Westerberg };
7415fae8b86SMika Westerberg 
7425fae8b86SMika Westerberg static int __init byt_gpio_init(void)
7435fae8b86SMika Westerberg {
7445fae8b86SMika Westerberg 	return platform_driver_register(&byt_gpio_driver);
7455fae8b86SMika Westerberg }
7465fae8b86SMika Westerberg subsys_initcall(byt_gpio_init);
7475fae8b86SMika Westerberg 
7485fae8b86SMika Westerberg static void __exit byt_gpio_exit(void)
7495fae8b86SMika Westerberg {
7505fae8b86SMika Westerberg 	platform_driver_unregister(&byt_gpio_driver);
7515fae8b86SMika Westerberg }
7525fae8b86SMika Westerberg module_exit(byt_gpio_exit);
753