• Home
  • Raw
  • Download

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>
17 * XLP GPIO has multiple 32 bit registers for each feature where each register
18 * controls 32 pins. So, pins up to 64 require 2 32-bit registers and up to 96
19 * require 3 32-bit registers for each feature.
24 * offset = (gpio / XLP_GPIO_REGSZ) * 4;
27 * where addr is base address of the that feature register and gpio is the pin.
97 static int xlp_gpio_get_reg(void __iomem *addr, unsigned gpio) in xlp_gpio_get_reg() argument
101 pos = gpio % XLP_GPIO_REGSZ; in xlp_gpio_get_reg()
102 regset = (gpio / XLP_GPIO_REGSZ) * 4; in xlp_gpio_get_reg()
106 static void xlp_gpio_set_reg(void __iomem *addr, unsigned gpio, int state) in xlp_gpio_set_reg() argument
110 pos = gpio % XLP_GPIO_REGSZ; in xlp_gpio_set_reg()
111 regset = (gpio / XLP_GPIO_REGSZ) * 4; in xlp_gpio_set_reg()
128 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_disable()
129 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x0); in xlp_gpio_irq_disable()
130 __clear_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_disable()
131 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_disable()
140 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_mask_ack()
141 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x0); in xlp_gpio_irq_mask_ack()
142 xlp_gpio_set_reg(priv->gpio_intr_stat, d->hwirq, 0x1); in xlp_gpio_irq_mask_ack()
143 __clear_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_mask_ack()
144 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_mask_ack()
153 spin_lock_irqsave(&priv->lock, flags); in xlp_gpio_irq_unmask()
154 xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x1); in xlp_gpio_irq_unmask()
155 __set_bit(d->hwirq, priv->gpio_enabled_mask); in xlp_gpio_irq_unmask()
156 spin_unlock_irqrestore(&priv->lock, flags); in xlp_gpio_irq_unmask()
163 int pol, irq_type; in xlp_gpio_set_irq_type() local
168 pol = XLP_GPIO_IRQ_POL_HIGH; in xlp_gpio_set_irq_type()
172 pol = XLP_GPIO_IRQ_POL_LOW; in xlp_gpio_set_irq_type()
176 pol = XLP_GPIO_IRQ_POL_HIGH; in xlp_gpio_set_irq_type()
180 pol = XLP_GPIO_IRQ_POL_LOW; in xlp_gpio_set_irq_type()
183 return -EINVAL; in xlp_gpio_set_irq_type()
186 xlp_gpio_set_reg(priv->gpio_intr_type, d->hwirq, irq_type); in xlp_gpio_set_irq_type()
187 xlp_gpio_set_reg(priv->gpio_intr_pol, d->hwirq, pol); in xlp_gpio_set_irq_type()
193 .name = "XLP-GPIO",
205 int gpio, regoff; in xlp_gpio_generic_handler() local
208 regoff = -1; in xlp_gpio_generic_handler()
212 for_each_set_bit(gpio, priv->gpio_enabled_mask, XLP_MAX_NR_GPIO) { in xlp_gpio_generic_handler()
213 if (regoff != gpio / XLP_GPIO_REGSZ) { in xlp_gpio_generic_handler()
214 regoff = gpio / XLP_GPIO_REGSZ; in xlp_gpio_generic_handler()
215 gpio_stat = readl(priv->gpio_intr_stat + regoff * 4); in xlp_gpio_generic_handler()
218 if (gpio_stat & BIT(gpio % XLP_GPIO_REGSZ)) in xlp_gpio_generic_handler()
220 priv->chip.irq.domain, gpio)); in xlp_gpio_generic_handler()
225 static int xlp_gpio_dir_output(struct gpio_chip *gc, unsigned gpio, int state) in xlp_gpio_dir_output() argument
229 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_dir_output()
230 xlp_gpio_set_reg(priv->gpio_out_en, gpio, 0x1); in xlp_gpio_dir_output()
235 static int xlp_gpio_dir_input(struct gpio_chip *gc, unsigned gpio) in xlp_gpio_dir_input() argument
239 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_dir_input()
240 xlp_gpio_set_reg(priv->gpio_out_en, gpio, 0x0); in xlp_gpio_dir_input()
245 static int xlp_gpio_get(struct gpio_chip *gc, unsigned gpio) in xlp_gpio_get() argument
249 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_get()
250 return xlp_gpio_get_reg(priv->gpio_paddrv, gpio); in xlp_gpio_get()
253 static void xlp_gpio_set(struct gpio_chip *gc, unsigned gpio, int state) in xlp_gpio_set() argument
257 BUG_ON(gpio >= gc->ngpio); in xlp_gpio_set()
258 xlp_gpio_set_reg(priv->gpio_paddrv, gpio, state); in xlp_gpio_set()
263 .compatible = "netlogic,xlp832-gpio",
267 .compatible = "netlogic,xlp316-gpio",
271 .compatible = "netlogic,xlp208-gpio",
275 .compatible = "netlogic,xlp980-gpio",
279 .compatible = "netlogic,xlp532-gpio",
283 .compatible = "brcm,vulcan-gpio",
300 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in xlp_gpio_probe()
302 return -ENOMEM; in xlp_gpio_probe()
312 if (pdev->dev.of_node) { in xlp_gpio_probe()
313 soc_type = (uintptr_t)of_device_get_match_data(&pdev->dev); in xlp_gpio_probe()
317 acpi_id = acpi_match_device(pdev->dev.driver->acpi_match_table, in xlp_gpio_probe()
318 &pdev->dev); in xlp_gpio_probe()
319 if (!acpi_id || !acpi_id->driver_data) { in xlp_gpio_probe()
320 dev_err(&pdev->dev, "Unable to match ACPI ID\n"); in xlp_gpio_probe()
321 return -ENODEV; in xlp_gpio_probe()
323 soc_type = (uintptr_t) acpi_id->driver_data; in xlp_gpio_probe()
328 priv->gpio_out_en = gpio_base + GPIO_OUTPUT_EN; in xlp_gpio_probe()
329 priv->gpio_paddrv = gpio_base + GPIO_PADDRV; in xlp_gpio_probe()
330 priv->gpio_intr_stat = gpio_base + GPIO_INT_STAT; in xlp_gpio_probe()
331 priv->gpio_intr_type = gpio_base + GPIO_INT_TYPE; in xlp_gpio_probe()
332 priv->gpio_intr_pol = gpio_base + GPIO_INT_POL; in xlp_gpio_probe()
333 priv->gpio_intr_en = gpio_base + GPIO_INT_EN00; in xlp_gpio_probe()
338 priv->gpio_out_en = gpio_base + GPIO_OUTPUT_EN; in xlp_gpio_probe()
339 priv->gpio_paddrv = gpio_base + GPIO_PADDRV; in xlp_gpio_probe()
340 priv->gpio_intr_stat = gpio_base + GPIO_3XX_INT_STAT; in xlp_gpio_probe()
341 priv->gpio_intr_type = gpio_base + GPIO_3XX_INT_TYPE; in xlp_gpio_probe()
342 priv->gpio_intr_pol = gpio_base + GPIO_3XX_INT_POL; in xlp_gpio_probe()
343 priv->gpio_intr_en = gpio_base + GPIO_3XX_INT_EN00; in xlp_gpio_probe()
350 priv->gpio_out_en = gpio_base + GPIO_9XX_OUTPUT_EN; in xlp_gpio_probe()
351 priv->gpio_paddrv = gpio_base + GPIO_9XX_PADDRV; in xlp_gpio_probe()
352 priv->gpio_intr_stat = gpio_base + GPIO_9XX_INT_STAT; in xlp_gpio_probe()
353 priv->gpio_intr_type = gpio_base + GPIO_9XX_INT_TYPE; in xlp_gpio_probe()
354 priv->gpio_intr_pol = gpio_base + GPIO_9XX_INT_POL; in xlp_gpio_probe()
355 priv->gpio_intr_en = gpio_base + GPIO_9XX_INT_EN00; in xlp_gpio_probe()
365 dev_err(&pdev->dev, "Unknown Processor type!\n"); in xlp_gpio_probe()
366 return -ENODEV; in xlp_gpio_probe()
369 bitmap_zero(priv->gpio_enabled_mask, XLP_MAX_NR_GPIO); in xlp_gpio_probe()
371 gc = &priv->chip; in xlp_gpio_probe()
373 gc->owner = THIS_MODULE; in xlp_gpio_probe()
374 gc->label = dev_name(&pdev->dev); in xlp_gpio_probe()
375 gc->base = 0; in xlp_gpio_probe()
376 gc->parent = &pdev->dev; in xlp_gpio_probe()
377 gc->ngpio = ngpio; in xlp_gpio_probe()
378 gc->of_node = pdev->dev.of_node; in xlp_gpio_probe()
379 gc->direction_output = xlp_gpio_dir_output; in xlp_gpio_probe()
380 gc->direction_input = xlp_gpio_dir_input; in xlp_gpio_probe()
381 gc->set = xlp_gpio_set; in xlp_gpio_probe()
382 gc->get = xlp_gpio_get; in xlp_gpio_probe()
384 spin_lock_init(&priv->lock); in xlp_gpio_probe()
386 /* XLP(MIPS) has fixed range for GPIO IRQs, Vulcan(ARM64) does not */ in xlp_gpio_probe()
388 irq_base = devm_irq_alloc_descs(&pdev->dev, -1, in xlp_gpio_probe()
390 gc->ngpio, 0); in xlp_gpio_probe()
392 dev_err(&pdev->dev, "Failed to allocate IRQ numbers\n"); in xlp_gpio_probe()
399 girq = &gc->irq; in xlp_gpio_probe()
400 girq->chip = &xlp_gpio_irq_chip; in xlp_gpio_probe()
401 girq->parent_handler = xlp_gpio_generic_handler; in xlp_gpio_probe()
402 girq->num_parents = 1; in xlp_gpio_probe()
403 girq->parents = devm_kcalloc(&pdev->dev, 1, in xlp_gpio_probe()
404 sizeof(*girq->parents), in xlp_gpio_probe()
406 if (!girq->parents) in xlp_gpio_probe()
407 return -ENOMEM; in xlp_gpio_probe()
408 girq->parents[0] = irq; in xlp_gpio_probe()
409 girq->first = irq_base; in xlp_gpio_probe()
410 girq->default_type = IRQ_TYPE_NONE; in xlp_gpio_probe()
411 girq->handler = handle_level_irq; in xlp_gpio_probe()
417 dev_info(&pdev->dev, "registered %d GPIOs\n", gc->ngpio); in xlp_gpio_probe()
433 .name = "xlp-gpio",
443 MODULE_DESCRIPTION("Netlogic XLP GPIO Driver");