Merge branch 'timer/cleanup' into late/mvebu2
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / mfd / arizona-core.c
index f4f9bf84bc7b6348bc804b6368f5522cc29e2ddf..222c03a5ddc0b3d3e9a37af453d4a1745f1b35e3 100644 (file)
@@ -239,7 +239,12 @@ static int arizona_runtime_resume(struct device *dev)
                return ret;
        }
 
-       regcache_sync(arizona->regmap);
+       ret = regcache_sync(arizona->regmap);
+       if (ret != 0) {
+               dev_err(arizona->dev, "Failed to restore register cache\n");
+               regulator_disable(arizona->dcvdd);
+               return ret;
+       }
 
        return 0;
 }
@@ -272,6 +277,7 @@ static struct mfd_cell early_devs[] = {
 static struct mfd_cell wm5102_devs[] = {
        { .name = "arizona-extcon" },
        { .name = "arizona-gpio" },
+       { .name = "arizona-haptics" },
        { .name = "arizona-micsupp" },
        { .name = "arizona-pwm" },
        { .name = "wm5102-codec" },
@@ -280,16 +286,18 @@ static struct mfd_cell wm5102_devs[] = {
 static struct mfd_cell wm5110_devs[] = {
        { .name = "arizona-extcon" },
        { .name = "arizona-gpio" },
+       { .name = "arizona-haptics" },
        { .name = "arizona-micsupp" },
        { .name = "arizona-pwm" },
        { .name = "wm5110-codec" },
 };
 
-int __devinit arizona_dev_init(struct arizona *arizona)
+int arizona_dev_init(struct arizona *arizona)
 {
        struct device *dev = arizona->dev;
        const char *type_name;
        unsigned int reg, val;
+       int (*apply_patch)(struct arizona *) = NULL;
        int ret, i;
 
        dev_set_drvdata(arizona->dev, arizona);
@@ -389,7 +397,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
                                arizona->type);
                        arizona->type = WM5102;
                }
-               ret = wm5102_patch(arizona);
+               apply_patch = wm5102_patch;
                break;
 #endif
 #ifdef CONFIG_MFD_WM5110
@@ -400,7 +408,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
                                arizona->type);
                        arizona->type = WM5110;
                }
-               ret = wm5110_patch(arizona);
+               apply_patch = wm5110_patch;
                break;
 #endif
        default:
@@ -410,9 +418,6 @@ int __devinit arizona_dev_init(struct arizona *arizona)
 
        dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
 
-       if (ret != 0)
-               dev_err(arizona->dev, "Failed to apply patch: %d\n", ret);
-
        /* If we have a /RESET GPIO we'll already be reset */
        if (!arizona->pdata.reset) {
                regcache_mark_dirty(arizona->regmap);
@@ -436,6 +441,15 @@ int __devinit arizona_dev_init(struct arizona *arizona)
                goto err_reset;
        }
 
+       if (apply_patch) {
+               ret = apply_patch(arizona);
+               if (ret != 0) {
+                       dev_err(arizona->dev, "Failed to apply patch: %d\n",
+                               ret);
+                       goto err_reset;
+               }
+       }
+
        for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
                if (!arizona->pdata.gpio_defaults[i])
                        continue;
@@ -561,7 +575,7 @@ err_early:
 }
 EXPORT_SYMBOL_GPL(arizona_dev_init);
 
-int __devexit arizona_dev_exit(struct arizona *arizona)
+int arizona_dev_exit(struct arizona *arizona)
 {
        mfd_remove_devices(arizona->dev);
        arizona_free_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, arizona);