Lines Matching +full:gpio +full:- +full:pol

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2003-2015 Broadcom Corporation
7 #include <linux/gpio/driver.h>
16 * XLP GPIO has multiple 32 bit registers for each feature where each register
17 * controls 32 pins. So, pins up to 64 require 2 32-bit registers and up to 96
18 * require 3 32-bit registers for each feature.
23 * offset = (gpio / XLP_GPIO_REGSZ) * 4;
26 * where addr is base address of the that feature register and gpio is the pin.
68 static int xlp_gpio_get_reg(void __iomem *addr, unsigned gpio) in xlp_gpio_get_reg() argument
72 pos = gpio % XLP_GPIO_REGSZ; in xlp_gpio_get_reg()
73 regset = (gpio / XLP_GPIO_REGSZ) * 4; in xlp_gpio_get_reg()
77 static void xlp_gpio_set_reg(void __iomem *addr, unsigned gpio, int state) in xlp_gpio_set_reg() argument
81 pos = gpio % XLP_GPIO_REGSZ; in xlp_gpio_set_reg()
82 regset = (gpio / XLP_GPIO_REGSZ) * 4; in xlp_gpio_set_reg()
106 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_disable()
107 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x0); in xlp_gpio_irq_disable()
108 __clear_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_disable()
109 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_disable()
119 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_mask_ack()
120 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x0); in xlp_gpio_irq_mask_ack()
121 xlp_gpio_set_reg(priv->gpio_intr_stat, d->hwirq, 0x1); in xlp_gpio_irq_mask_ack()
122 __clear_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_mask_ack()
123 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_mask_ack()
132 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_unmask()
133 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x1); in xlp_gpio_irq_unmask()
134 __set_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_unmask()
135 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_unmask()
142 int pol, irq_type; in xlp_gpio_set_irq_type() local
147 pol = XLP_GPIO_IRQ_POL_HIGH; in xlp_gpio_set_irq_type()
151 pol = XLP_GPIO_IRQ_POL_LOW; in xlp_gpio_set_irq_type()
155 pol = XLP_GPIO_IRQ_POL_HIGH; in xlp_gpio_set_irq_type()
159 pol = XLP_GPIO_IRQ_POL_LOW; in xlp_gpio_set_irq_type()
162 return -EINVAL; in xlp_gpio_set_irq_type()
165 xlp_gpio_set_reg(priv->gpio_intr_type, d->hwirq, irq_type); in xlp_gpio_set_irq_type()
166 xlp_gpio_set_reg(priv->gpio_intr_pol, d->hwirq, pol); in xlp_gpio_set_irq_type()
172 .name = "XLP-GPIO",
186 int gpio, regoff; in xlp_gpio_generic_handler() local
189 regoff = -1; in xlp_gpio_generic_handler()
193 for_each_set_bit(gpio, priv->gpio_enabled_mask, XLP_MAX_NR_GPIO) { in xlp_gpio_generic_handler()
194 if (regoff != gpio / XLP_GPIO_REGSZ) { in xlp_gpio_generic_handler()
195 regoff = gpio / XLP_GPIO_REGSZ; in xlp_gpio_generic_handler()
196 gpio_stat = readl(priv->gpio_intr_stat + regoff * 4); in xlp_gpio_generic_handler()
199 if (gpio_stat & BIT(gpio % XLP_GPIO_REGSZ)) in xlp_gpio_generic_handler()
200 generic_handle_domain_irq(priv->chip.irq.domain, gpio); in xlp_gpio_generic_handler()
205 static int xlp_gpio_dir_output(struct gpio_chip *gc, unsigned gpio, int state) in xlp_gpio_dir_output() argument
209 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_dir_output()
210 xlp_gpio_set_reg(priv->gpio_out_en, gpio, 0x1); in xlp_gpio_dir_output()
215 static int xlp_gpio_dir_input(struct gpio_chip *gc, unsigned gpio) in xlp_gpio_dir_input() argument
219 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_dir_input()
220 xlp_gpio_set_reg(priv->gpio_out_en, gpio, 0x0); in xlp_gpio_dir_input()
225 static int xlp_gpio_get(struct gpio_chip *gc, unsigned gpio) in xlp_gpio_get() argument
229 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_get()
230 return xlp_gpio_get_reg(priv->gpio_paddrv, gpio); in xlp_gpio_get()
233 static void xlp_gpio_set(struct gpio_chip *gc, unsigned gpio, int state) in xlp_gpio_set() argument
237 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_set()
238 xlp_gpio_set_reg(priv->gpio_paddrv, gpio, state); in xlp_gpio_set()
249 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in xlp_gpio_probe()
251 return -ENOMEM; in xlp_gpio_probe()
261 priv->gpio_out_en = gpio_base + GPIO_9XX_OUTPUT_EN; in xlp_gpio_probe()
262 priv->gpio_paddrv = gpio_base + GPIO_9XX_PADDRV; in xlp_gpio_probe()
263 priv->gpio_intr_stat = gpio_base + GPIO_9XX_INT_STAT; in xlp_gpio_probe()
264 priv->gpio_intr_type = gpio_base + GPIO_9XX_INT_TYPE; in xlp_gpio_probe()
265 priv->gpio_intr_pol = gpio_base + GPIO_9XX_INT_POL; in xlp_gpio_probe()
266 priv->gpio_intr_en = gpio_base + GPIO_9XX_INT_EN00; in xlp_gpio_probe()
268 bitmap_zero(priv->gpio_enabled_mask, XLP_MAX_NR_GPIO); in xlp_gpio_probe()
270 gc = &priv->chip; in xlp_gpio_probe()
272 gc->owner = THIS_MODULE; in xlp_gpio_probe()
273 gc->label = dev_name(&pdev->dev); in xlp_gpio_probe()
274 gc->base = 0; in xlp_gpio_probe()
275 gc->parent = &pdev->dev; in xlp_gpio_probe()
276 gc->ngpio = 70; in xlp_gpio_probe()
277 gc->direction_output = xlp_gpio_dir_output; in xlp_gpio_probe()
278 gc->direction_input = xlp_gpio_dir_input; in xlp_gpio_probe()
279 gc->set = xlp_gpio_set; in xlp_gpio_probe()
280 gc->get = xlp_gpio_get; in xlp_gpio_probe()
282 spin_lock_init(&priv->lock); in xlp_gpio_probe()
284 girq = &gc->irq; in xlp_gpio_probe()
286 girq->parent_handler = xlp_gpio_generic_handler; in xlp_gpio_probe()
287 girq->num_parents = 1; in xlp_gpio_probe()
288 girq->parents = devm_kcalloc(&pdev->dev, 1, in xlp_gpio_probe()
289 sizeof(*girq->parents), in xlp_gpio_probe()
291 if (!girq->parents) in xlp_gpio_probe()
292 return -ENOMEM; in xlp_gpio_probe()
293 girq->parents[0] = irq; in xlp_gpio_probe()
294 girq->first = 0; in xlp_gpio_probe()
295 girq->default_type = IRQ_TYPE_NONE; in xlp_gpio_probe()
296 girq->handler = handle_level_irq; in xlp_gpio_probe()
302 dev_info(&pdev->dev, "registered %d GPIOs\n", gc->ngpio); in xlp_gpio_probe()
318 .name = "xlp-gpio",
327 MODULE_DESCRIPTION("Netlogic XLP GPIO Driver");