diff options
author | Kamlakant Patel <kamlakant.patel@broadcom.com> | 2016-03-24 05:31:40 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2016-03-31 04:44:08 -0400 |
commit | dd98756d78153dbb43685f0f0e618dda235aee00 (patch) | |
tree | 844d2f29936ca3c6230179a17c682ab5e8c18780 /drivers/gpio/gpio-xlp.c | |
parent | 16fe1ad289019d78a8f8fdb65f08d298ee921cb3 (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.c | 25 |
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 | ||
91 | struct xlp_gpio_priv { | 92 | struct 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 | }; |
290 | MODULE_DEVICE_TABLE(of, xlp_gpio_of_ids); | 295 | MODULE_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); |