Skip to content

Commit

Permalink
MFD: ucb1x00-core: clean up device handling in probe
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King committed Feb 18, 2012
1 parent cae1547 commit f5ae587
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions drivers/mfd/ucb1x00-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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:
Expand Down

0 comments on commit f5ae587

Please sign in to comment.