MFD: ucb1x00-core: clean up device handling in probe
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 21 Jan 2012 14:45:17 +0000 (14:45 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 18 Feb 2012 23:15:33 +0000 (23:15 +0000)
Clean up the device handling so we can use the struct device sanely.

Acked-by: Jochen Friedrich <jochen@scram.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
drivers/mfd/ucb1x00-core.c

index 7386f822d4cde30af367119bb652c91bf9be7467..74d9fcf891d5c69fa99765c50f2150c58ceb7618 100644 (file)
@@ -553,6 +553,7 @@ static int ucb1x00_probe(struct mcp *mcp)
        if (!ucb)
                goto err_disable;
 
+       device_initialize(&ucb->dev);
        ucb->dev.class = &ucb1x00_class;
        ucb->dev.parent = &mcp->attached_device;
        dev_set_name(&ucb->dev, "ucb1x00");
@@ -563,11 +564,16 @@ static int ucb1x00_probe(struct mcp *mcp)
 
        ucb->id  = id;
        ucb->mcp = mcp;
+
+       ret = device_add(&ucb->dev);
+       if (ret)
+               goto err_dev_add;
+
        ucb->irq = ucb1x00_detect_irq(ucb);
        if (ucb->irq == NO_IRQ) {
-               printk(KERN_ERR "UCB1x00: IRQ probe failed\n");
+               dev_err(&ucb->dev, "IRQ probe failed\n");
                ret = -ENODEV;
-               goto err_free;
+               goto err_no_irq;
        }
 
        ucb->gpio.base = -1;
@@ -581,25 +587,20 @@ static int ucb1x00_probe(struct mcp *mcp)
                ucb->gpio.direction_output = ucb1x00_gpio_direction_output;
                ret = gpiochip_add(&ucb->gpio);
                if (ret)
-                       goto err_free;
+                       goto err_gpio_add;
        } else
                dev_info(&ucb->dev, "gpio_base not set so no gpiolib support");
 
        ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING,
                          "UCB1x00", ucb);
        if (ret) {
-               printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n",
+               dev_err(&ucb->dev, "ucb1x00: unable to grab irq%d: %d\n",
                        ucb->irq, ret);
-               goto err_gpio;
+               goto err_irq;
        }
 
        mcp_set_drvdata(mcp, ucb);
 
-       ret = device_register(&ucb->dev);
-       if (ret)
-               goto err_irq;
-
-
        INIT_LIST_HEAD(&ucb->devs);
        mutex_lock(&ucb1x00_mutex);
        list_add(&ucb->node, &ucb1x00_devices);
@@ -611,12 +612,13 @@ static int ucb1x00_probe(struct mcp *mcp)
        return ret;
 
  err_irq:
-       free_irq(ucb->irq, ucb);
- err_gpio:
        if (ucb->gpio.base != -1)
                temp = gpiochip_remove(&ucb->gpio);
- err_free:
-       kfree(ucb);
+ err_gpio_add:
+ err_no_irq:
+       device_del(&ucb->dev);
+ err_dev_add:
+       put_device(&ucb->dev);
  err_disable:
        mcp_disable(mcp);
  out: