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