MFD: ucb1x00-core: disable mcp clock when bus is not required
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 21 Jan 2012 18:24:17 +0000 (18:24 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 18 Feb 2012 23:15:41 +0000 (23:15 +0000)
The ucb1x00-core was leaving the mcp clock enabled indefinitely after
probe.  This needlessly wastes power.  Add the necessary disables to
ensure that the clock remains off when we don't need it.

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

index 9f8ea52f0ca8d9905558f60e2e3e491b28174f57..ed2a4b2e518f7f887348c4c4d32059c83f966b86 100644 (file)
@@ -554,16 +554,17 @@ static int ucb1x00_probe(struct mcp *mcp)
 
        mcp_enable(mcp);
        id = mcp_reg_read(mcp, UCB_ID);
+       mcp_disable(mcp);
 
        if (id != UCB_ID_1200 && id != UCB_ID_1300 && id != UCB_ID_TC35143) {
                printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id);
-               goto err_disable;
+               goto out;
        }
 
        ucb = kzalloc(sizeof(struct ucb1x00), GFP_KERNEL);
        ret = -ENOMEM;
        if (!ucb)
-               goto err_disable;
+               goto out;
 
        device_initialize(&ucb->dev);
        ucb->dev.class = &ucb1x00_class;
@@ -581,7 +582,9 @@ static int ucb1x00_probe(struct mcp *mcp)
        if (ret)
                goto err_dev_add;
 
+       ucb1x00_enable(ucb);
        ucb->irq = ucb1x00_detect_irq(ucb);
+       ucb1x00_disable(ucb);
        if (ucb->irq == NO_IRQ) {
                dev_err(&ucb->dev, "IRQ probe failed\n");
                ret = -ENODEV;
@@ -633,8 +636,6 @@ static int ucb1x00_probe(struct mcp *mcp)
        device_del(&ucb->dev);
  err_dev_add:
        put_device(&ucb->dev);
- err_disable:
-       mcp_disable(mcp);
  out:
        if (pdata && pdata->reset)
                pdata->reset(UCB_RST_PROBE_FAIL);