diff options
Diffstat (limited to 'drivers/gpio/gpio-em.c')
| -rw-r--r-- | drivers/gpio/gpio-em.c | 54 | 
1 files changed, 11 insertions, 43 deletions
diff --git a/drivers/gpio/gpio-em.c b/drivers/gpio/gpio-em.c index efb4c2d0d13..bdc8302e711 100644 --- a/drivers/gpio/gpio-em.c +++ b/drivers/gpio/gpio-em.c @@ -35,7 +35,6 @@  struct em_gio_priv {  	void __iomem *base0;  	void __iomem *base1; -	unsigned int irq_base;  	spinlock_t sense_lock;  	struct platform_device *pdev;  	struct gpio_chip gpio_chip; @@ -214,7 +213,7 @@ static int em_gio_direction_output(struct gpio_chip *chip, unsigned offset,  static int em_gio_to_irq(struct gpio_chip *chip, unsigned offset)  { -	return irq_find_mapping(gpio_to_priv(chip)->irq_domain, offset); +	return irq_create_mapping(gpio_to_priv(chip)->irq_domain, offset);  }  static int em_gio_irq_domain_map(struct irq_domain *h, unsigned int virq, @@ -234,41 +233,7 @@ static struct irq_domain_ops em_gio_irq_domain_ops = {  	.map	= em_gio_irq_domain_map,  }; -static int __devinit em_gio_irq_domain_init(struct em_gio_priv *p) -{ -	struct platform_device *pdev = p->pdev; -	struct gpio_em_config *pdata = pdev->dev.platform_data; - -	p->irq_base = irq_alloc_descs(pdata->irq_base, 0, -				      pdata->number_of_pins, numa_node_id()); -	if (p->irq_base < 0) { -		dev_err(&pdev->dev, "cannot get irq_desc\n"); -		return p->irq_base; -	} -	pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n", -		 pdata->gpio_base, pdata->number_of_pins, p->irq_base); - -	p->irq_domain = irq_domain_add_legacy(pdev->dev.of_node, -					      pdata->number_of_pins, -					      p->irq_base, 0, -					      &em_gio_irq_domain_ops, p); -	if (!p->irq_domain) { -		irq_free_descs(p->irq_base, pdata->number_of_pins); -		return -ENXIO; -	} - -	return 0; -} - -static void em_gio_irq_domain_cleanup(struct em_gio_priv *p) -{ -	struct gpio_em_config *pdata = p->pdev->dev.platform_data; - -	irq_free_descs(p->irq_base, pdata->number_of_pins); -	/* FIXME: irq domain wants to be freed! */ -} - -static int __devinit em_gio_probe(struct platform_device *pdev) +static int em_gio_probe(struct platform_device *pdev)  {  	struct gpio_em_config *pdata = pdev->dev.platform_data;  	struct em_gio_priv *p; @@ -334,8 +299,11 @@ static int __devinit em_gio_probe(struct platform_device *pdev)  	irq_chip->irq_set_type = em_gio_irq_set_type;  	irq_chip->flags	= IRQCHIP_SKIP_SET_WAKE; -	ret = em_gio_irq_domain_init(p); -	if (ret) { +	p->irq_domain = irq_domain_add_linear(pdev->dev.of_node, +					      pdata->number_of_pins, +					      &em_gio_irq_domain_ops, p); +	if (!p->irq_domain) { +		ret = -ENXIO;  		dev_err(&pdev->dev, "cannot initialize irq domain\n");  		goto err3;  	} @@ -364,7 +332,7 @@ err6:  err5:  	free_irq(irq[0]->start, pdev);  err4: -	em_gio_irq_domain_cleanup(p); +	irq_domain_remove(p->irq_domain);  err3:  	iounmap(p->base1);  err2: @@ -375,7 +343,7 @@ err0:  	return ret;  } -static int __devexit em_gio_remove(struct platform_device *pdev) +static int em_gio_remove(struct platform_device *pdev)  {  	struct em_gio_priv *p = platform_get_drvdata(pdev);  	struct resource *irq[2]; @@ -390,7 +358,7 @@ static int __devexit em_gio_remove(struct platform_device *pdev)  	free_irq(irq[1]->start, pdev);  	free_irq(irq[0]->start, pdev); -	em_gio_irq_domain_cleanup(p); +	irq_domain_remove(p->irq_domain);  	iounmap(p->base1);  	iounmap(p->base0);  	kfree(p); @@ -399,7 +367,7 @@ static int __devexit em_gio_remove(struct platform_device *pdev)  static struct platform_driver em_gio_device_driver = {  	.probe		= em_gio_probe, -	.remove		= __devexit_p(em_gio_remove), +	.remove		= em_gio_remove,  	.driver		= {  		.name	= "em_gio",  	}  |