diff options
Diffstat (limited to 'drivers/gpio/gpio-timberdale.c')
| -rw-r--r-- | drivers/gpio/gpio-timberdale.c | 53 | 
1 files changed, 19 insertions, 34 deletions
diff --git a/drivers/gpio/gpio-timberdale.c b/drivers/gpio/gpio-timberdale.c index 7a0e956ef1e..efc7c129016 100644 --- a/drivers/gpio/gpio-timberdale.c +++ b/drivers/gpio/gpio-timberdale.c @@ -224,6 +224,7 @@ static struct irq_chip timbgpio_irqchip = {  static int timbgpio_probe(struct platform_device *pdev)  {  	int err, i; +	struct device *dev = &pdev->dev;  	struct gpio_chip *gc;  	struct timbgpio *tgpio;  	struct resource *iomem; @@ -231,35 +232,35 @@ static int timbgpio_probe(struct platform_device *pdev)  	int irq = platform_get_irq(pdev, 0);  	if (!pdata || pdata->nr_pins > 32) { -		err = -EINVAL; -		goto err_mem; +		dev_err(dev, "Invalid platform data\n"); +		return -EINVAL;  	}  	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (!iomem) { -		err = -EINVAL; -		goto err_mem; +		dev_err(dev, "Unable to get resource\n"); +		return -EINVAL;  	} -	tgpio = kzalloc(sizeof(*tgpio), GFP_KERNEL); +	tgpio = devm_kzalloc(dev, sizeof(struct timbgpio), GFP_KERNEL);  	if (!tgpio) { -		err = -EINVAL; -		goto err_mem; +		dev_err(dev, "Memory alloc failed\n"); +		return -EINVAL;  	}  	tgpio->irq_base = pdata->irq_base;  	spin_lock_init(&tgpio->lock); -	if (!request_mem_region(iomem->start, resource_size(iomem), -		DRIVER_NAME)) { -		err = -EBUSY; -		goto err_request; +	if (!devm_request_mem_region(dev, iomem->start, resource_size(iomem), +				     DRIVER_NAME)) { +		dev_err(dev, "Region already claimed\n"); +		return -EBUSY;  	} -	tgpio->membase = ioremap(iomem->start, resource_size(iomem)); +	tgpio->membase = devm_ioremap(dev, iomem->start, resource_size(iomem));  	if (!tgpio->membase) { -		err = -ENOMEM; -		goto err_ioremap; +		dev_err(dev, "Cannot ioremap\n"); +		return -ENOMEM;  	}  	gc = &tgpio->gpio; @@ -275,11 +276,11 @@ static int timbgpio_probe(struct platform_device *pdev)  	gc->dbg_show = NULL;  	gc->base = pdata->gpio_base;  	gc->ngpio = pdata->nr_pins; -	gc->can_sleep = 0; +	gc->can_sleep = false;  	err = gpiochip_add(gc);  	if (err) -		goto err_chipadd; +		return err;  	platform_set_drvdata(pdev, tgpio); @@ -290,8 +291,8 @@ static int timbgpio_probe(struct platform_device *pdev)  		return 0;  	for (i = 0; i < pdata->nr_pins; i++) { -		irq_set_chip_and_handler_name(tgpio->irq_base + i, -			&timbgpio_irqchip, handle_simple_irq, "mux"); +		irq_set_chip_and_handler(tgpio->irq_base + i, +			&timbgpio_irqchip, handle_simple_irq);  		irq_set_chip_data(tgpio->irq_base + i, tgpio);  #ifdef CONFIG_ARM  		set_irq_flags(tgpio->irq_base + i, IRQF_VALID | IRQF_PROBE); @@ -302,17 +303,6 @@ static int timbgpio_probe(struct platform_device *pdev)  	irq_set_chained_handler(irq, timbgpio_irq);  	return 0; - -err_chipadd: -	iounmap(tgpio->membase); -err_ioremap: -	release_mem_region(iomem->start, resource_size(iomem)); -err_request: -	kfree(tgpio); -err_mem: -	printk(KERN_ERR DRIVER_NAME": Failed to register GPIOs: %d\n", err); - -	return err;  }  static int timbgpio_remove(struct platform_device *pdev) @@ -320,7 +310,6 @@ static int timbgpio_remove(struct platform_device *pdev)  	int err;  	struct timbgpio_platform_data *pdata = dev_get_platdata(&pdev->dev);  	struct timbgpio *tgpio = platform_get_drvdata(pdev); -	struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	int irq = platform_get_irq(pdev, 0);  	if (irq >= 0 && tgpio->irq_base > 0) { @@ -338,10 +327,6 @@ static int timbgpio_remove(struct platform_device *pdev)  	if (err)  		printk(KERN_ERR DRIVER_NAME": failed to remove gpio_chip\n"); -	iounmap(tgpio->membase); -	release_mem_region(iomem->start, resource_size(iomem)); -	kfree(tgpio); -  	return 0;  }  | 
