mfd: wm5102: Manually apply register patch

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>
This commit is contained in:
Charles Keepax 2013-03-26 18:01:49 +00:00 committed by Samuel Ortiz
parent c6d6bfb186
commit 4c9bb8bc35
2 changed files with 35 additions and 6 deletions

View File

@ -255,6 +255,16 @@ static int arizona_runtime_resume(struct device *dev)
goto err; 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); ret = regcache_sync(arizona->regmap);
if (ret != 0) { if (ret != 0) {
dev_err(arizona->dev, "Failed to restore register cache\n"); dev_err(arizona->dev, "Failed to restore register cache\n");

View File

@ -10,6 +10,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/device.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mfd/arizona/core.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() */ /* We use a function so we can use ARRAY_SIZE() */
int wm5102_patch(struct arizona *arizona) int wm5102_patch(struct arizona *arizona)
{ {
const struct reg_default *wm5102_patch;
int ret = 0;
int i, patch_size;
switch (arizona->rev) { switch (arizona->rev) {
case 0: case 0:
return regmap_register_patch(arizona->regmap, wm5102_patch = wm5102_reva_patch;
wm5102_reva_patch, patch_size = ARRAY_SIZE(wm5102_reva_patch);
ARRAY_SIZE(wm5102_reva_patch));
default: default:
return regmap_register_patch(arizona->regmap, wm5102_patch = wm5102_revb_patch;
wm5102_revb_patch, patch_size = ARRAY_SIZE(wm5102_revb_patch);
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] = { static const struct regmap_irq wm5102_aod_irqs[ARIZONA_NUM_IRQ] = {