diff options
Diffstat (limited to 'drivers/gpio/gpio-zynq.c')
| -rw-r--r-- | drivers/gpio/gpio-zynq.c | 41 | 
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c index f241b6c13dbe..cd475ff4bcad 100644 --- a/drivers/gpio/gpio-zynq.c +++ b/drivers/gpio/gpio-zynq.c @@ -830,6 +830,7 @@ static int zynq_gpio_probe(struct platform_device *pdev)  	int ret, bank_num;  	struct zynq_gpio *gpio;  	struct gpio_chip *chip; +	struct gpio_irq_chip *girq;  	const struct of_device_id *match;  	gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); @@ -849,10 +850,8 @@ static int zynq_gpio_probe(struct platform_device *pdev)  		return PTR_ERR(gpio->base_addr);  	gpio->irq = platform_get_irq(pdev, 0); -	if (gpio->irq < 0) { -		dev_err(&pdev->dev, "invalid IRQ\n"); +	if (gpio->irq < 0)  		return gpio->irq; -	}  	/* configure the gpio chip */  	chip = &gpio->chip; @@ -887,34 +886,38 @@ static int zynq_gpio_probe(struct platform_device *pdev)  	if (ret < 0)  		goto err_pm_dis; -	/* report a bug if gpio chip registration fails */ -	ret = gpiochip_add_data(chip, gpio); -	if (ret) { -		dev_err(&pdev->dev, "Failed to add gpio chip\n"); -		goto err_pm_put; -	} -  	/* disable interrupts for all banks */  	for (bank_num = 0; bank_num < gpio->p_data->max_bank; bank_num++)  		writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr +  			       ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); -	ret = gpiochip_irqchip_add(chip, &zynq_gpio_edge_irqchip, 0, -				   handle_level_irq, IRQ_TYPE_NONE); -	if (ret) { -		dev_err(&pdev->dev, "Failed to add irq chip\n"); -		goto err_rm_gpiochip; +	/* Set up the GPIO irqchip */ +	girq = &chip->irq; +	girq->chip = &zynq_gpio_edge_irqchip; +	girq->parent_handler = zynq_gpio_irqhandler; +	girq->num_parents = 1; +	girq->parents = devm_kcalloc(&pdev->dev, 1, +				     sizeof(*girq->parents), +				     GFP_KERNEL); +	if (!girq->parents) { +		ret = -ENOMEM; +		goto err_pm_put;  	} +	girq->parents[0] = gpio->irq; +	girq->default_type = IRQ_TYPE_NONE; +	girq->handler = handle_level_irq; -	gpiochip_set_chained_irqchip(chip, &zynq_gpio_edge_irqchip, gpio->irq, -				     zynq_gpio_irqhandler); +	/* report a bug if gpio chip registration fails */ +	ret = gpiochip_add_data(chip, gpio); +	if (ret) { +		dev_err(&pdev->dev, "Failed to add gpio chip\n"); +		goto err_pm_put; +	}  	pm_runtime_put(&pdev->dev);  	return 0; -err_rm_gpiochip: -	gpiochip_remove(chip);  err_pm_put:  	pm_runtime_put(&pdev->dev);  err_pm_dis:  |