Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c9bb8bc authored by Charles Keepax's avatar Charles Keepax Committed by Samuel Ortiz
Browse files

mfd: wm5102: Manually apply register patch



Future updates will require us to manually apply the register patch for
wm5102.

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent c6d6bfb1
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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");
+25 −6
Original line number Diff line number Diff line
@@ -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] = {