diff options
Diffstat (limited to 'drivers/gpio/gpio-mxc.c')
| -rw-r--r-- | drivers/gpio/gpio-mxc.c | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c index b752b560126e..b8dd847443c5 100644 --- a/drivers/gpio/gpio-mxc.c +++ b/drivers/gpio/gpio-mxc.c @@ -272,7 +272,7 @@ static void mxc_gpio_irq_handler(struct mxc_gpio_port *port, u32 irq_stat)  }  /* MX1 and MX3 has one interrupt *per* gpio port */ -static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) +static void mx3_gpio_irq_handler(struct irq_desc *desc)  {  	u32 irq_stat;  	struct mxc_gpio_port *port = irq_desc_get_handler_data(desc); @@ -288,7 +288,7 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc)  }  /* MX2 has one interrupt *for all* gpio ports */ -static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) +static void mx2_gpio_irq_handler(struct irq_desc *desc)  {  	u32 irq_msk, irq_stat;  	struct mxc_gpio_port *port; @@ -339,13 +339,15 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable)  	return 0;  } -static void mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base) +static int mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base)  {  	struct irq_chip_generic *gc;  	struct irq_chip_type *ct;  	gc = irq_alloc_generic_chip("gpio-mxc", 1, irq_base,  				    port->base, handle_level_irq); +	if (!gc) +		return -ENOMEM;  	gc->private = port;  	ct = gc->chip_types; @@ -360,6 +362,8 @@ static void mxc_gpio_init_gc(struct mxc_gpio_port *port, int irq_base)  	irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK,  			       IRQ_NOREQUEST, 0); + +	return 0;  }  static void mxc_gpio_get_hw(struct platform_device *pdev) @@ -477,12 +481,16 @@ static int mxc_gpio_probe(struct platform_device *pdev)  	}  	/* gpio-mxc can be a generic irq chip */ -	mxc_gpio_init_gc(port, irq_base); +	err = mxc_gpio_init_gc(port, irq_base); +	if (err < 0) +		goto out_irqdomain_remove;  	list_add_tail(&port->node, &mxc_gpio_ports);  	return 0; +out_irqdomain_remove: +	irq_domain_remove(port->domain);  out_irqdesc_free:  	irq_free_descs(irq_base, 32);  out_gpiochip_remove: |