xref: /OK3568_Linux_fs/kernel/drivers/gpio/gpio-intel-mid.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Intel MID GPIO driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2008-2014,2016 Intel Corporation.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun /* Supports:
9*4882a593Smuzhiyun  * Moorestown platform Langwell chip.
10*4882a593Smuzhiyun  * Medfield platform Penwell chip.
11*4882a593Smuzhiyun  * Clovertrail platform Cloverview chip.
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/delay.h>
15*4882a593Smuzhiyun #include <linux/gpio/driver.h>
16*4882a593Smuzhiyun #include <linux/init.h>
17*4882a593Smuzhiyun #include <linux/interrupt.h>
18*4882a593Smuzhiyun #include <linux/io.h>
19*4882a593Smuzhiyun #include <linux/kernel.h>
20*4882a593Smuzhiyun #include <linux/pci.h>
21*4882a593Smuzhiyun #include <linux/platform_device.h>
22*4882a593Smuzhiyun #include <linux/pm_runtime.h>
23*4882a593Smuzhiyun #include <linux/slab.h>
24*4882a593Smuzhiyun #include <linux/stddef.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define INTEL_MID_IRQ_TYPE_EDGE		(1 << 0)
27*4882a593Smuzhiyun #define INTEL_MID_IRQ_TYPE_LEVEL	(1 << 1)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun  * Langwell chip has 64 pins and thus there are 2 32bit registers to control
31*4882a593Smuzhiyun  * each feature, while Penwell chip has 96 pins for each block, and need 3 32bit
32*4882a593Smuzhiyun  * registers to control them, so we only define the order here instead of a
33*4882a593Smuzhiyun  * structure, to get a bit offset for a pin (use GPDR as an example):
34*4882a593Smuzhiyun  *
35*4882a593Smuzhiyun  * nreg = ngpio / 32;
36*4882a593Smuzhiyun  * reg = offset / 32;
37*4882a593Smuzhiyun  * bit = offset % 32;
38*4882a593Smuzhiyun  * reg_addr = reg_base + GPDR * nreg * 4 + reg * 4;
39*4882a593Smuzhiyun  *
40*4882a593Smuzhiyun  * so the bit of reg_addr is to control pin offset's GPDR feature
41*4882a593Smuzhiyun */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun enum GPIO_REG {
44*4882a593Smuzhiyun 	GPLR = 0,	/* pin level read-only */
45*4882a593Smuzhiyun 	GPDR,		/* pin direction */
46*4882a593Smuzhiyun 	GPSR,		/* pin set */
47*4882a593Smuzhiyun 	GPCR,		/* pin clear */
48*4882a593Smuzhiyun 	GRER,		/* rising edge detect */
49*4882a593Smuzhiyun 	GFER,		/* falling edge detect */
50*4882a593Smuzhiyun 	GEDR,		/* edge detect result */
51*4882a593Smuzhiyun 	GAFR,		/* alt function */
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* intel_mid gpio driver data */
55*4882a593Smuzhiyun struct intel_mid_gpio_ddata {
56*4882a593Smuzhiyun 	u16 ngpio;		/* number of gpio pins */
57*4882a593Smuzhiyun 	u32 chip_irq_type;	/* chip interrupt type */
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct intel_mid_gpio {
61*4882a593Smuzhiyun 	struct gpio_chip		chip;
62*4882a593Smuzhiyun 	void __iomem			*reg_base;
63*4882a593Smuzhiyun 	spinlock_t			lock;
64*4882a593Smuzhiyun 	struct pci_dev			*pdev;
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
gpio_reg(struct gpio_chip * chip,unsigned offset,enum GPIO_REG reg_type)67*4882a593Smuzhiyun static void __iomem *gpio_reg(struct gpio_chip *chip, unsigned offset,
68*4882a593Smuzhiyun 			      enum GPIO_REG reg_type)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(chip);
71*4882a593Smuzhiyun 	unsigned nreg = chip->ngpio / 32;
72*4882a593Smuzhiyun 	u8 reg = offset / 32;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	return priv->reg_base + reg_type * nreg * 4 + reg * 4;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
gpio_reg_2bit(struct gpio_chip * chip,unsigned offset,enum GPIO_REG reg_type)77*4882a593Smuzhiyun static void __iomem *gpio_reg_2bit(struct gpio_chip *chip, unsigned offset,
78*4882a593Smuzhiyun 				   enum GPIO_REG reg_type)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(chip);
81*4882a593Smuzhiyun 	unsigned nreg = chip->ngpio / 32;
82*4882a593Smuzhiyun 	u8 reg = offset / 16;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	return priv->reg_base + reg_type * nreg * 4 + reg * 4;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
intel_gpio_request(struct gpio_chip * chip,unsigned offset)87*4882a593Smuzhiyun static int intel_gpio_request(struct gpio_chip *chip, unsigned offset)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun 	void __iomem *gafr = gpio_reg_2bit(chip, offset, GAFR);
90*4882a593Smuzhiyun 	u32 value = readl(gafr);
91*4882a593Smuzhiyun 	int shift = (offset % 16) << 1, af = (value >> shift) & 3;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	if (af) {
94*4882a593Smuzhiyun 		value &= ~(3 << shift);
95*4882a593Smuzhiyun 		writel(value, gafr);
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun 	return 0;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
intel_gpio_get(struct gpio_chip * chip,unsigned offset)100*4882a593Smuzhiyun static int intel_gpio_get(struct gpio_chip *chip, unsigned offset)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	void __iomem *gplr = gpio_reg(chip, offset, GPLR);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	return !!(readl(gplr) & BIT(offset % 32));
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
intel_gpio_set(struct gpio_chip * chip,unsigned offset,int value)107*4882a593Smuzhiyun static void intel_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	void __iomem *gpsr, *gpcr;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	if (value) {
112*4882a593Smuzhiyun 		gpsr = gpio_reg(chip, offset, GPSR);
113*4882a593Smuzhiyun 		writel(BIT(offset % 32), gpsr);
114*4882a593Smuzhiyun 	} else {
115*4882a593Smuzhiyun 		gpcr = gpio_reg(chip, offset, GPCR);
116*4882a593Smuzhiyun 		writel(BIT(offset % 32), gpcr);
117*4882a593Smuzhiyun 	}
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
intel_gpio_direction_input(struct gpio_chip * chip,unsigned offset)120*4882a593Smuzhiyun static int intel_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(chip);
123*4882a593Smuzhiyun 	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
124*4882a593Smuzhiyun 	u32 value;
125*4882a593Smuzhiyun 	unsigned long flags;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	if (priv->pdev)
128*4882a593Smuzhiyun 		pm_runtime_get(&priv->pdev->dev);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	spin_lock_irqsave(&priv->lock, flags);
131*4882a593Smuzhiyun 	value = readl(gpdr);
132*4882a593Smuzhiyun 	value &= ~BIT(offset % 32);
133*4882a593Smuzhiyun 	writel(value, gpdr);
134*4882a593Smuzhiyun 	spin_unlock_irqrestore(&priv->lock, flags);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	if (priv->pdev)
137*4882a593Smuzhiyun 		pm_runtime_put(&priv->pdev->dev);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	return 0;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
intel_gpio_direction_output(struct gpio_chip * chip,unsigned offset,int value)142*4882a593Smuzhiyun static int intel_gpio_direction_output(struct gpio_chip *chip,
143*4882a593Smuzhiyun 			unsigned offset, int value)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(chip);
146*4882a593Smuzhiyun 	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
147*4882a593Smuzhiyun 	unsigned long flags;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	intel_gpio_set(chip, offset, value);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	if (priv->pdev)
152*4882a593Smuzhiyun 		pm_runtime_get(&priv->pdev->dev);
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	spin_lock_irqsave(&priv->lock, flags);
155*4882a593Smuzhiyun 	value = readl(gpdr);
156*4882a593Smuzhiyun 	value |= BIT(offset % 32);
157*4882a593Smuzhiyun 	writel(value, gpdr);
158*4882a593Smuzhiyun 	spin_unlock_irqrestore(&priv->lock, flags);
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	if (priv->pdev)
161*4882a593Smuzhiyun 		pm_runtime_put(&priv->pdev->dev);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	return 0;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun 
intel_mid_irq_type(struct irq_data * d,unsigned type)166*4882a593Smuzhiyun static int intel_mid_irq_type(struct irq_data *d, unsigned type)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
169*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(gc);
170*4882a593Smuzhiyun 	u32 gpio = irqd_to_hwirq(d);
171*4882a593Smuzhiyun 	unsigned long flags;
172*4882a593Smuzhiyun 	u32 value;
173*4882a593Smuzhiyun 	void __iomem *grer = gpio_reg(&priv->chip, gpio, GRER);
174*4882a593Smuzhiyun 	void __iomem *gfer = gpio_reg(&priv->chip, gpio, GFER);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	if (gpio >= priv->chip.ngpio)
177*4882a593Smuzhiyun 		return -EINVAL;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	if (priv->pdev)
180*4882a593Smuzhiyun 		pm_runtime_get(&priv->pdev->dev);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	spin_lock_irqsave(&priv->lock, flags);
183*4882a593Smuzhiyun 	if (type & IRQ_TYPE_EDGE_RISING)
184*4882a593Smuzhiyun 		value = readl(grer) | BIT(gpio % 32);
185*4882a593Smuzhiyun 	else
186*4882a593Smuzhiyun 		value = readl(grer) & (~BIT(gpio % 32));
187*4882a593Smuzhiyun 	writel(value, grer);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	if (type & IRQ_TYPE_EDGE_FALLING)
190*4882a593Smuzhiyun 		value = readl(gfer) | BIT(gpio % 32);
191*4882a593Smuzhiyun 	else
192*4882a593Smuzhiyun 		value = readl(gfer) & (~BIT(gpio % 32));
193*4882a593Smuzhiyun 	writel(value, gfer);
194*4882a593Smuzhiyun 	spin_unlock_irqrestore(&priv->lock, flags);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	if (priv->pdev)
197*4882a593Smuzhiyun 		pm_runtime_put(&priv->pdev->dev);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	return 0;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun 
intel_mid_irq_unmask(struct irq_data * d)202*4882a593Smuzhiyun static void intel_mid_irq_unmask(struct irq_data *d)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
intel_mid_irq_mask(struct irq_data * d)206*4882a593Smuzhiyun static void intel_mid_irq_mask(struct irq_data *d)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun static struct irq_chip intel_mid_irqchip = {
211*4882a593Smuzhiyun 	.name		= "INTEL_MID-GPIO",
212*4882a593Smuzhiyun 	.irq_mask	= intel_mid_irq_mask,
213*4882a593Smuzhiyun 	.irq_unmask	= intel_mid_irq_unmask,
214*4882a593Smuzhiyun 	.irq_set_type	= intel_mid_irq_type,
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun static const struct intel_mid_gpio_ddata gpio_lincroft = {
218*4882a593Smuzhiyun 	.ngpio = 64,
219*4882a593Smuzhiyun };
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun static const struct intel_mid_gpio_ddata gpio_penwell_aon = {
222*4882a593Smuzhiyun 	.ngpio = 96,
223*4882a593Smuzhiyun 	.chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun static const struct intel_mid_gpio_ddata gpio_penwell_core = {
227*4882a593Smuzhiyun 	.ngpio = 96,
228*4882a593Smuzhiyun 	.chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun static const struct intel_mid_gpio_ddata gpio_cloverview_aon = {
232*4882a593Smuzhiyun 	.ngpio = 96,
233*4882a593Smuzhiyun 	.chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE | INTEL_MID_IRQ_TYPE_LEVEL,
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun static const struct intel_mid_gpio_ddata gpio_cloverview_core = {
237*4882a593Smuzhiyun 	.ngpio = 96,
238*4882a593Smuzhiyun 	.chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
239*4882a593Smuzhiyun };
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun static const struct pci_device_id intel_gpio_ids[] = {
242*4882a593Smuzhiyun 	{
243*4882a593Smuzhiyun 		/* Lincroft */
244*4882a593Smuzhiyun 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080f),
245*4882a593Smuzhiyun 		.driver_data = (kernel_ulong_t)&gpio_lincroft,
246*4882a593Smuzhiyun 	},
247*4882a593Smuzhiyun 	{
248*4882a593Smuzhiyun 		/* Penwell AON */
249*4882a593Smuzhiyun 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x081f),
250*4882a593Smuzhiyun 		.driver_data = (kernel_ulong_t)&gpio_penwell_aon,
251*4882a593Smuzhiyun 	},
252*4882a593Smuzhiyun 	{
253*4882a593Smuzhiyun 		/* Penwell Core */
254*4882a593Smuzhiyun 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x081a),
255*4882a593Smuzhiyun 		.driver_data = (kernel_ulong_t)&gpio_penwell_core,
256*4882a593Smuzhiyun 	},
257*4882a593Smuzhiyun 	{
258*4882a593Smuzhiyun 		/* Cloverview Aon */
259*4882a593Smuzhiyun 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08eb),
260*4882a593Smuzhiyun 		.driver_data = (kernel_ulong_t)&gpio_cloverview_aon,
261*4882a593Smuzhiyun 	},
262*4882a593Smuzhiyun 	{
263*4882a593Smuzhiyun 		/* Cloverview Core */
264*4882a593Smuzhiyun 		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08f7),
265*4882a593Smuzhiyun 		.driver_data = (kernel_ulong_t)&gpio_cloverview_core,
266*4882a593Smuzhiyun 	},
267*4882a593Smuzhiyun 	{ }
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
intel_mid_irq_handler(struct irq_desc * desc)270*4882a593Smuzhiyun static void intel_mid_irq_handler(struct irq_desc *desc)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	struct gpio_chip *gc = irq_desc_get_handler_data(desc);
273*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(gc);
274*4882a593Smuzhiyun 	struct irq_data *data = irq_desc_get_irq_data(desc);
275*4882a593Smuzhiyun 	struct irq_chip *chip = irq_data_get_irq_chip(data);
276*4882a593Smuzhiyun 	u32 base, gpio, mask;
277*4882a593Smuzhiyun 	unsigned long pending;
278*4882a593Smuzhiyun 	void __iomem *gedr;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	/* check GPIO controller to check which pin triggered the interrupt */
281*4882a593Smuzhiyun 	for (base = 0; base < priv->chip.ngpio; base += 32) {
282*4882a593Smuzhiyun 		gedr = gpio_reg(&priv->chip, base, GEDR);
283*4882a593Smuzhiyun 		while ((pending = readl(gedr))) {
284*4882a593Smuzhiyun 			gpio = __ffs(pending);
285*4882a593Smuzhiyun 			mask = BIT(gpio);
286*4882a593Smuzhiyun 			/* Clear before handling so we can't lose an edge */
287*4882a593Smuzhiyun 			writel(mask, gedr);
288*4882a593Smuzhiyun 			generic_handle_irq(irq_find_mapping(gc->irq.domain,
289*4882a593Smuzhiyun 							    base + gpio));
290*4882a593Smuzhiyun 		}
291*4882a593Smuzhiyun 	}
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	chip->irq_eoi(data);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun 
intel_mid_irq_init_hw(struct gpio_chip * chip)296*4882a593Smuzhiyun static int intel_mid_irq_init_hw(struct gpio_chip *chip)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun 	struct intel_mid_gpio *priv = gpiochip_get_data(chip);
299*4882a593Smuzhiyun 	void __iomem *reg;
300*4882a593Smuzhiyun 	unsigned base;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	for (base = 0; base < priv->chip.ngpio; base += 32) {
303*4882a593Smuzhiyun 		/* Clear the rising-edge detect register */
304*4882a593Smuzhiyun 		reg = gpio_reg(&priv->chip, base, GRER);
305*4882a593Smuzhiyun 		writel(0, reg);
306*4882a593Smuzhiyun 		/* Clear the falling-edge detect register */
307*4882a593Smuzhiyun 		reg = gpio_reg(&priv->chip, base, GFER);
308*4882a593Smuzhiyun 		writel(0, reg);
309*4882a593Smuzhiyun 		/* Clear the edge detect status register */
310*4882a593Smuzhiyun 		reg = gpio_reg(&priv->chip, base, GEDR);
311*4882a593Smuzhiyun 		writel(~0, reg);
312*4882a593Smuzhiyun 	}
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	return 0;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
intel_gpio_runtime_idle(struct device * dev)317*4882a593Smuzhiyun static int __maybe_unused intel_gpio_runtime_idle(struct device *dev)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun 	int err = pm_schedule_suspend(dev, 500);
320*4882a593Smuzhiyun 	return err ?: -EBUSY;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun static const struct dev_pm_ops intel_gpio_pm_ops = {
324*4882a593Smuzhiyun 	SET_RUNTIME_PM_OPS(NULL, NULL, intel_gpio_runtime_idle)
325*4882a593Smuzhiyun };
326*4882a593Smuzhiyun 
intel_gpio_probe(struct pci_dev * pdev,const struct pci_device_id * id)327*4882a593Smuzhiyun static int intel_gpio_probe(struct pci_dev *pdev,
328*4882a593Smuzhiyun 			  const struct pci_device_id *id)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	void __iomem *base;
331*4882a593Smuzhiyun 	struct intel_mid_gpio *priv;
332*4882a593Smuzhiyun 	u32 gpio_base;
333*4882a593Smuzhiyun 	u32 irq_base;
334*4882a593Smuzhiyun 	int retval;
335*4882a593Smuzhiyun 	struct gpio_irq_chip *girq;
336*4882a593Smuzhiyun 	struct intel_mid_gpio_ddata *ddata =
337*4882a593Smuzhiyun 				(struct intel_mid_gpio_ddata *)id->driver_data;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	retval = pcim_enable_device(pdev);
340*4882a593Smuzhiyun 	if (retval)
341*4882a593Smuzhiyun 		return retval;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	retval = pcim_iomap_regions(pdev, 1 << 0 | 1 << 1, pci_name(pdev));
344*4882a593Smuzhiyun 	if (retval) {
345*4882a593Smuzhiyun 		dev_err(&pdev->dev, "I/O memory mapping error\n");
346*4882a593Smuzhiyun 		return retval;
347*4882a593Smuzhiyun 	}
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	base = pcim_iomap_table(pdev)[1];
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	irq_base = readl(base);
352*4882a593Smuzhiyun 	gpio_base = readl(sizeof(u32) + base);
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	/* release the IO mapping, since we already get the info from bar1 */
355*4882a593Smuzhiyun 	pcim_iounmap_regions(pdev, 1 << 1);
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
358*4882a593Smuzhiyun 	if (!priv)
359*4882a593Smuzhiyun 		return -ENOMEM;
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	priv->reg_base = pcim_iomap_table(pdev)[0];
362*4882a593Smuzhiyun 	priv->chip.label = dev_name(&pdev->dev);
363*4882a593Smuzhiyun 	priv->chip.parent = &pdev->dev;
364*4882a593Smuzhiyun 	priv->chip.request = intel_gpio_request;
365*4882a593Smuzhiyun 	priv->chip.direction_input = intel_gpio_direction_input;
366*4882a593Smuzhiyun 	priv->chip.direction_output = intel_gpio_direction_output;
367*4882a593Smuzhiyun 	priv->chip.get = intel_gpio_get;
368*4882a593Smuzhiyun 	priv->chip.set = intel_gpio_set;
369*4882a593Smuzhiyun 	priv->chip.base = gpio_base;
370*4882a593Smuzhiyun 	priv->chip.ngpio = ddata->ngpio;
371*4882a593Smuzhiyun 	priv->chip.can_sleep = false;
372*4882a593Smuzhiyun 	priv->pdev = pdev;
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	spin_lock_init(&priv->lock);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	girq = &priv->chip.irq;
377*4882a593Smuzhiyun 	girq->chip = &intel_mid_irqchip;
378*4882a593Smuzhiyun 	girq->init_hw = intel_mid_irq_init_hw;
379*4882a593Smuzhiyun 	girq->parent_handler = intel_mid_irq_handler;
380*4882a593Smuzhiyun 	girq->num_parents = 1;
381*4882a593Smuzhiyun 	girq->parents = devm_kcalloc(&pdev->dev, girq->num_parents,
382*4882a593Smuzhiyun 				     sizeof(*girq->parents),
383*4882a593Smuzhiyun 				     GFP_KERNEL);
384*4882a593Smuzhiyun 	if (!girq->parents)
385*4882a593Smuzhiyun 		return -ENOMEM;
386*4882a593Smuzhiyun 	girq->parents[0] = pdev->irq;
387*4882a593Smuzhiyun 	girq->first = irq_base;
388*4882a593Smuzhiyun 	girq->default_type = IRQ_TYPE_NONE;
389*4882a593Smuzhiyun 	girq->handler = handle_simple_irq;
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	pci_set_drvdata(pdev, priv);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun 	retval = devm_gpiochip_add_data(&pdev->dev, &priv->chip, priv);
394*4882a593Smuzhiyun 	if (retval) {
395*4882a593Smuzhiyun 		dev_err(&pdev->dev, "gpiochip_add error %d\n", retval);
396*4882a593Smuzhiyun 		return retval;
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	pm_runtime_put_noidle(&pdev->dev);
400*4882a593Smuzhiyun 	pm_runtime_allow(&pdev->dev);
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	return 0;
403*4882a593Smuzhiyun }
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun static struct pci_driver intel_gpio_driver = {
406*4882a593Smuzhiyun 	.name		= "intel_mid_gpio",
407*4882a593Smuzhiyun 	.id_table	= intel_gpio_ids,
408*4882a593Smuzhiyun 	.probe		= intel_gpio_probe,
409*4882a593Smuzhiyun 	.driver		= {
410*4882a593Smuzhiyun 		.pm	= &intel_gpio_pm_ops,
411*4882a593Smuzhiyun 	},
412*4882a593Smuzhiyun };
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun builtin_pci_driver(intel_gpio_driver);
415