Message ID | 1430104208-25478-1-git-send-email-hui.wang@canonical.com |
---|---|
State | New |
Headers | show |
On 04/26/2015 10:10 PM, Hui Wang wrote: > From: Takashi Iwai <tiwai@suse.de> > > BugLink: http://bugs.launchpad.net/bugs/1448830 > > regcache_sync() spews warnings when a value was cached for a read-only > register as it tries to write all registers no matter whether they are > writable or not. This patch adds regmap_wrtieable() checks for > avoiding it in regcache_sync_block_single() and regcache_block_raw(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > Signed-off-by: Mark Brown <broonie@kernel.org> > (cherry picked from commit 4ceba98d3fe204c59e5f63c4d834b45dcfe789f0) > Signed-off-by: Hui Wang <hui.wang@canonical.com> > --- > Recently the kernel alsa hda audio driver was changed to use regmap to > access registers, and use regcache to restore registers when resume > from suspend. > > Without this patch, the regcache_sync() can't restore the registers > successfully since it will immediately return if one of registers is > read-only. After applying this patch, the regcache_sync() can skip > the read-only registers and continue accessing the rest registers. > > And if without this patch, the alsa daily dkms can't work well under > the ubuntu kernels. > > drivers/base/regmap/regcache.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c > index 154e7a8..4477713 100644 > --- a/drivers/base/regmap/regcache.c > +++ b/drivers/base/regmap/regcache.c > @@ -603,7 +603,8 @@ static int regcache_sync_block_single(struct regmap *map, void *block, > for (i = start; i < end; i++) { > regtmp = block_base + (i * map->reg_stride); > > - if (!regcache_reg_present(cache_present, i)) > + if (!regcache_reg_present(cache_present, i) || > + !regmap_writeable(map, regtmp)) > continue; > > val = regcache_get_val(map, block, i); > @@ -666,7 +667,8 @@ static int regcache_sync_block_raw(struct regmap *map, void *block, > for (i = start; i < end; i++) { > regtmp = block_base + (i * map->reg_stride); > > - if (!regcache_reg_present(cache_present, i)) { > + if (!regcache_reg_present(cache_present, i) || > + !regmap_writeable(map, regtmp)) { > ret = regcache_sync_block_raw_flush(map, &data, > base, regtmp); > if (ret != 0) >
On Mon, Apr 27, 2015 at 11:10:08AM +0800, Hui Wang wrote: > From: Takashi Iwai <tiwai@suse.de> > > BugLink: http://bugs.launchpad.net/bugs/1448830 > > regcache_sync() spews warnings when a value was cached for a read-only > register as it tries to write all registers no matter whether they are > writable or not. This patch adds regmap_wrtieable() checks for > avoiding it in regcache_sync_block_single() and regcache_block_raw(). > > Signed-off-by: Takashi Iwai <tiwai@suse.de> > Signed-off-by: Mark Brown <broonie@kernel.org> > (cherry picked from commit 4ceba98d3fe204c59e5f63c4d834b45dcfe789f0) > Signed-off-by: Hui Wang <hui.wang@canonical.com> > --- > Recently the kernel alsa hda audio driver was changed to use regmap to > access registers, and use regcache to restore registers when resume > from suspend. > > Without this patch, the regcache_sync() can't restore the registers > successfully since it will immediately return if one of registers is > read-only. After applying this patch, the regcache_sync() can skip > the read-only registers and continue accessing the rest registers. > > And if without this patch, the alsa daily dkms can't work well under > the ubuntu kernels. > > drivers/base/regmap/regcache.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c > index 154e7a8..4477713 100644 > --- a/drivers/base/regmap/regcache.c > +++ b/drivers/base/regmap/regcache.c > @@ -603,7 +603,8 @@ static int regcache_sync_block_single(struct regmap *map, void *block, > for (i = start; i < end; i++) { > regtmp = block_base + (i * map->reg_stride); > > - if (!regcache_reg_present(cache_present, i)) > + if (!regcache_reg_present(cache_present, i) || > + !regmap_writeable(map, regtmp)) > continue; > > val = regcache_get_val(map, block, i); > @@ -666,7 +667,8 @@ static int regcache_sync_block_raw(struct regmap *map, void *block, > for (i = start; i < end; i++) { > regtmp = block_base + (i * map->reg_stride); > > - if (!regcache_reg_present(cache_present, i)) { > + if (!regcache_reg_present(cache_present, i) || > + !regmap_writeable(map, regtmp)) { > ret = regcache_sync_block_raw_flush(map, &data, > base, regtmp); > if (ret != 0) > -- > 1.9.1 > > > -- > kernel-team mailing list > kernel-team@lists.ubuntu.com > https://lists.ubuntu.com/mailman/listinfo/kernel-team Applied to Trusty, Utopic, Vivid master-next
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 154e7a8..4477713 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -603,7 +603,8 @@ static int regcache_sync_block_single(struct regmap *map, void *block, for (i = start; i < end; i++) { regtmp = block_base + (i * map->reg_stride); - if (!regcache_reg_present(cache_present, i)) + if (!regcache_reg_present(cache_present, i) || + !regmap_writeable(map, regtmp)) continue; val = regcache_get_val(map, block, i); @@ -666,7 +667,8 @@ static int regcache_sync_block_raw(struct regmap *map, void *block, for (i = start; i < end; i++) { regtmp = block_base + (i * map->reg_stride); - if (!regcache_reg_present(cache_present, i)) { + if (!regcache_reg_present(cache_present, i) || + !regmap_writeable(map, regtmp)) { ret = regcache_sync_block_raw_flush(map, &data, base, regtmp); if (ret != 0)