aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-xlp.c
diff options
context:
space:
mode:
authorKamlakant Patel <kamlakant.patel@broadcom.com>2016-03-24 05:31:40 -0400
committerLinus Walleij <linus.walleij@linaro.org>2016-03-31 04:44:08 -0400
commitdd98756d78153dbb43685f0f0e618dda235aee00 (patch)
tree844d2f29936ca3c6230179a17c682ab5e8c18780 /drivers/gpio/gpio-xlp.c
parent16fe1ad289019d78a8f8fdb65f08d298ee921cb3 (diff)
gpio: xlp: Add GPIO driver support for Broadcom Vulcan ARM64
- Add GPIO support for Broadcom Vulcan ARM64. - Add depends on ARCH_VULCAN to Kconfig to enable gpio controller driver for Broadcom Vulcan ARM64 SoCs. Signed-off-by: Kamlakant Patel <kamlakant.patel@broadcom.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpio-xlp.c')
-rw-r--r--drivers/gpio/gpio-xlp.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/gpio/gpio-xlp.c b/drivers/gpio/gpio-xlp.c
index aa5813d2deb1..08897dc11915 100644
--- a/drivers/gpio/gpio-xlp.c
+++ b/drivers/gpio/gpio-xlp.c
@@ -85,7 +85,8 @@ enum {
85 XLP_GPIO_VARIANT_XLP316, 85 XLP_GPIO_VARIANT_XLP316,
86 XLP_GPIO_VARIANT_XLP208, 86 XLP_GPIO_VARIANT_XLP208,
87 XLP_GPIO_VARIANT_XLP980, 87 XLP_GPIO_VARIANT_XLP980,
88 XLP_GPIO_VARIANT_XLP532 88 XLP_GPIO_VARIANT_XLP532,
89 GPIO_VARIANT_VULCAN
89}; 90};
90 91
91struct xlp_gpio_priv { 92struct xlp_gpio_priv {
@@ -285,6 +286,10 @@ static const struct of_device_id xlp_gpio_of_ids[] = {
285 .compatible = "netlogic,xlp532-gpio", 286 .compatible = "netlogic,xlp532-gpio",
286 .data = (void *)XLP_GPIO_VARIANT_XLP532, 287 .data = (void *)XLP_GPIO_VARIANT_XLP532,
287 }, 288 },
289 {
290 .compatible = "brcm,vulcan-gpio",
291 .data = (void *)GPIO_VARIANT_VULCAN,
292 },
288 { /* sentinel */ }, 293 { /* sentinel */ },
289}; 294};
290MODULE_DEVICE_TABLE(of, xlp_gpio_of_ids); 295MODULE_DEVICE_TABLE(of, xlp_gpio_of_ids);
@@ -347,6 +352,7 @@ static int xlp_gpio_probe(struct platform_device *pdev)
347 break; 352 break;
348 case XLP_GPIO_VARIANT_XLP980: 353 case XLP_GPIO_VARIANT_XLP980:
349 case XLP_GPIO_VARIANT_XLP532: 354 case XLP_GPIO_VARIANT_XLP532:
355 case GPIO_VARIANT_VULCAN:
350 priv->gpio_out_en = gpio_base + GPIO_9XX_OUTPUT_EN; 356 priv->gpio_out_en = gpio_base + GPIO_9XX_OUTPUT_EN;
351 priv->gpio_paddrv = gpio_base + GPIO_9XX_PADDRV; 357 priv->gpio_paddrv = gpio_base + GPIO_9XX_PADDRV;
352 priv->gpio_intr_stat = gpio_base + GPIO_9XX_INT_STAT; 358 priv->gpio_intr_stat = gpio_base + GPIO_9XX_INT_STAT;
@@ -354,7 +360,12 @@ static int xlp_gpio_probe(struct platform_device *pdev)
354 priv->gpio_intr_pol = gpio_base + GPIO_9XX_INT_POL; 360 priv->gpio_intr_pol = gpio_base + GPIO_9XX_INT_POL;
355 priv->gpio_intr_en = gpio_base + GPIO_9XX_INT_EN00; 361 priv->gpio_intr_en = gpio_base + GPIO_9XX_INT_EN00;
356 362
357 ngpio = (soc_type == XLP_GPIO_VARIANT_XLP980) ? 66 : 67; 363 if (soc_type == XLP_GPIO_VARIANT_XLP980)
364 ngpio = 66;
365 else if (soc_type == XLP_GPIO_VARIANT_XLP532)
366 ngpio = 67;
367 else
368 ngpio = 70;
358 break; 369 break;
359 default: 370 default:
360 dev_err(&pdev->dev, "Unknown Processor type!\n"); 371 dev_err(&pdev->dev, "Unknown Processor type!\n");
@@ -377,10 +388,14 @@ static int xlp_gpio_probe(struct platform_device *pdev)
377 gc->get = xlp_gpio_get; 388 gc->get = xlp_gpio_get;
378 389
379 spin_lock_init(&priv->lock); 390 spin_lock_init(&priv->lock);
380 irq_base = irq_alloc_descs(-1, XLP_GPIO_IRQ_BASE, gc->ngpio, 0); 391 /* XLP has fixed IRQ range for GPIO interrupts */
381 if (irq_base < 0) { 392 if (soc_type == GPIO_VARIANT_VULCAN)
393 irq_base = irq_alloc_descs(-1, 0, gc->ngpio, 0);
394 else
395 irq_base = irq_alloc_descs(-1, XLP_GPIO_IRQ_BASE, gc->ngpio, 0);
396 if (IS_ERR_VALUE(irq_base)) {
382 dev_err(&pdev->dev, "Failed to allocate IRQ numbers\n"); 397 dev_err(&pdev->dev, "Failed to allocate IRQ numbers\n");
383 return -ENODEV; 398 return irq_base;
384 } 399 }
385 400
386 err = gpiochip_add_data(gc, priv); 401 err = gpiochip_add_data(gc, priv);