提交 1c18d2ca 编写于 作者: C Charles Keepax 提交者: Mark Brown

mfd: arizona: Use new regmap features for manual register patch

On the wm5102 the register patches are applied manually, rather than by
the regmap core. This application is wrapped in calls to
regcache_cache_bypass. However, this is dangerous as other threads may
be accessing the hardware at the same time as the pm_runtime operations
and if they do so during the period whilst cache_bypass is enabled those
writes will miss the cache when they shouldn't.

Apply the register patch using the new regmap_multi_reg_write_bypassed
function to avoid this problem. Also remove the call to
regcache_cache_bypass from the hardware patch application as it is
unneeded there and creates a similar window for writes to miss the
cache.
Signed-off-by: NCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Acked-by: NLee Jones <lee.jones@linaro.org>
Signed-off-by: NMark Brown <broonie@linaro.org>
上级 6bf13103
...@@ -251,8 +251,6 @@ static int arizona_apply_hardware_patch(struct arizona* arizona) ...@@ -251,8 +251,6 @@ static int arizona_apply_hardware_patch(struct arizona* arizona)
unsigned int fll, sysclk; unsigned int fll, sysclk;
int ret, err; int ret, err;
regcache_cache_bypass(arizona->regmap, true);
/* Cache existing FLL and SYSCLK settings */ /* Cache existing FLL and SYSCLK settings */
ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &fll); ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &fll);
if (ret != 0) { if (ret != 0) {
...@@ -322,8 +320,6 @@ static int arizona_apply_hardware_patch(struct arizona* arizona) ...@@ -322,8 +320,6 @@ static int arizona_apply_hardware_patch(struct arizona* arizona)
err); err);
} }
regcache_cache_bypass(arizona->regmap, false);
if (ret != 0) if (ret != 0)
return ret; return ret;
else else
......
...@@ -80,8 +80,7 @@ static const struct reg_default wm5102_revb_patch[] = { ...@@ -80,8 +80,7 @@ static const struct reg_default wm5102_revb_patch[] = {
int wm5102_patch(struct arizona *arizona) int wm5102_patch(struct arizona *arizona)
{ {
const struct reg_default *wm5102_patch; const struct reg_default *wm5102_patch;
int ret = 0; int patch_size;
int i, patch_size;
switch (arizona->rev) { switch (arizona->rev) {
case 0: case 0:
...@@ -92,21 +91,9 @@ int wm5102_patch(struct arizona *arizona) ...@@ -92,21 +91,9 @@ int wm5102_patch(struct arizona *arizona)
patch_size = ARRAY_SIZE(wm5102_revb_patch); patch_size = ARRAY_SIZE(wm5102_revb_patch);
} }
regcache_cache_bypass(arizona->regmap, true); return regmap_multi_reg_write_bypassed(arizona->regmap,
wm5102_patch,
for (i = 0; i < patch_size; i++) { patch_size);
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] = {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册