mfd: wm5102: Manually apply register patch
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Tue, 26 Mar 2013 18:01:49 +0000 (18:01 +0000)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 8 Apr 2013 13:21:00 +0000 (15:21 +0200)
Future updates will require us to manually apply the register patch for
wm5102.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/arizona-core.c
drivers/mfd/wm5102-tables.c

index f120571..b71bf7b 100644 (file)
@@ -255,6 +255,16 @@ static int arizona_runtime_resume(struct device *dev)
                goto err;
        }
 
+       switch (arizona->type) {
+       case WM5102:
+               ret = wm5102_patch(arizona);
+               if (ret != 0) {
+                       dev_err(arizona->dev, "Failed to apply patch: %d\n",
+                               ret);
+                       goto err;
+               }
+       }
+
        ret = regcache_sync(arizona->regmap);
        if (ret != 0) {
                dev_err(arizona->dev, "Failed to restore register cache\n");
index 909e043..44cb7be 100644 (file)
@@ -10,6 +10,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/device.h>
 #include <linux/module.h>
 
 #include <linux/mfd/arizona/core.h>
@@ -77,16 +78,34 @@ static const struct reg_default wm5102_revb_patch[] = {
 /* We use a function so we can use ARRAY_SIZE() */
 int wm5102_patch(struct arizona *arizona)
 {
+       const struct reg_default *wm5102_patch;
+       int ret = 0;
+       int i, patch_size;
+
        switch (arizona->rev) {
        case 0:
-               return regmap_register_patch(arizona->regmap,
-                                            wm5102_reva_patch,
-                                            ARRAY_SIZE(wm5102_reva_patch));
+               wm5102_patch = wm5102_reva_patch;
+               patch_size = ARRAY_SIZE(wm5102_reva_patch);
        default:
-               return regmap_register_patch(arizona->regmap,
-                                            wm5102_revb_patch,
-                                            ARRAY_SIZE(wm5102_revb_patch));
+               wm5102_patch = wm5102_revb_patch;
+               patch_size = ARRAY_SIZE(wm5102_revb_patch);
        }
+
+       regcache_cache_bypass(arizona->regmap, true);
+
+       for (i = 0; i < patch_size; i++) {
+               ret = regmap_write(arizona->regmap, wm5102_patch[i].reg,
+                                  wm5102_patch[i].def);
+               if (ret != 0) {
+                       dev_err(arizona->dev, "Failed to write %x = %x: %d\n",
+                               wm5102_patch[i].reg, wm5102_patch[i].def, ret);
+                       goto out;
+               }
+       }
+
+out:
+       regcache_cache_bypass(arizona->regmap, false);
+       return ret;
 }
 
 static const struct regmap_irq wm5102_aod_irqs[ARIZONA_NUM_IRQ] = {