diff options
Diffstat (limited to 'drivers/gpio/gpio-tqmx86.c')
| -rw-r--r-- | drivers/gpio/gpio-tqmx86.c | 50 | 
1 files changed, 30 insertions, 20 deletions
diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c index d5880db7f9d4..a3109bcaa0ac 100644 --- a/drivers/gpio/gpio-tqmx86.c +++ b/drivers/gpio/gpio-tqmx86.c @@ -214,11 +214,23 @@ static const struct dev_pm_ops tqmx86_gpio_dev_pm_ops = {  			   tqmx86_gpio_runtime_resume, NULL)  }; +static void tqmx86_init_irq_valid_mask(struct gpio_chip *chip, +				       unsigned long *valid_mask, +				       unsigned int ngpios) +{ +	/* Only GPIOs 4-7 are valid for interrupts. Clear the others */ +	clear_bit(0, valid_mask); +	clear_bit(1, valid_mask); +	clear_bit(2, valid_mask); +	clear_bit(3, valid_mask); +} +  static int tqmx86_gpio_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev;  	struct tqmx86_gpio_data *gpio;  	struct gpio_chip *chip; +	struct gpio_irq_chip *girq;  	void __iomem *io_base;  	struct resource *res;  	int ret, irq; @@ -259,17 +271,10 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)  	chip->get = tqmx86_gpio_get;  	chip->set = tqmx86_gpio_set;  	chip->ngpio = TQMX86_NGPIO; -	chip->irq.need_valid_mask = true;  	chip->parent = pdev->dev.parent;  	pm_runtime_enable(&pdev->dev); -	ret = devm_gpiochip_add_data(dev, chip, gpio); -	if (ret) { -		dev_err(dev, "Could not register GPIO chip\n"); -		goto out_pm_dis; -	} -  	if (irq) {  		struct irq_chip *irq_chip = &gpio->irq_chip;  		u8 irq_status; @@ -287,23 +292,28 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)  		irq_status = tqmx86_gpio_read(gpio, TQMX86_GPIIS);  		tqmx86_gpio_write(gpio, irq_status, TQMX86_GPIIS); -		ret = gpiochip_irqchip_add(chip, irq_chip, -					   0, handle_simple_irq, -					   IRQ_TYPE_EDGE_BOTH); -		if (ret) { -			dev_err(dev, "Could not add irq chip\n"); +		girq = &chip->irq; +		girq->chip = irq_chip; +		girq->parent_handler = tqmx86_gpio_irq_handler; +		girq->num_parents = 1; +		girq->parents = devm_kcalloc(&pdev->dev, 1, +					     sizeof(*girq->parents), +					     GFP_KERNEL); +		if (!girq->parents) { +			ret = -ENOMEM;  			goto out_pm_dis;  		} - -		gpiochip_set_chained_irqchip(chip, irq_chip, -					     irq, tqmx86_gpio_irq_handler); +		girq->parents[0] = irq; +		girq->default_type = IRQ_TYPE_NONE; +		girq->handler = handle_simple_irq; +		girq->init_valid_mask = tqmx86_init_irq_valid_mask;  	} -	/* Only GPIOs 4-7 are valid for interrupts. Clear the others */ -	clear_bit(0, chip->irq.valid_mask); -	clear_bit(1, chip->irq.valid_mask); -	clear_bit(2, chip->irq.valid_mask); -	clear_bit(3, chip->irq.valid_mask); +	ret = devm_gpiochip_add_data(dev, chip, gpio); +	if (ret) { +		dev_err(dev, "Could not register GPIO chip\n"); +		goto out_pm_dis; +	}  	dev_info(dev, "GPIO functionality initialized with %d pins\n",  		 chip->ngpio);  |