Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751918AbbEDGie (ORCPT ); Mon, 4 May 2015 02:38:34 -0400 Received: from smtp-out-180.synserver.de ([212.40.185.180]:1046 "EHLO smtp-out-180.synserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751172AbbEDGiZ (ORCPT ); Mon, 4 May 2015 02:38:25 -0400 X-SynServer-TrustedSrc: 1 X-SynServer-AuthUser: lars@metafoo.de X-SynServer-PPID: 31875 Message-ID: <554713DD.4020006@metafoo.de> Date: Mon, 04 May 2015 08:38:21 +0200 From: Lars-Peter Clausen User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.6.0 MIME-Version: 1.0 To: Kevin Cernekee , lgirdwood@gmail.com, broonie@kernel.org CC: dgreid@chromium.org, abrestic@chromium.org, olofj@chromium.org, alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH V3 1/4] regmap: Use regcache_mark_dirty() to indicate power loss or reset References: <1430697619-22773-1-git-send-email-cernekee@chromium.org> <1430697619-22773-2-git-send-email-cernekee@chromium.org> In-Reply-To: <1430697619-22773-2-git-send-email-cernekee@chromium.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3236 Lines: 78 On 05/04/2015 02:00 AM, Kevin Cernekee wrote: > Existing regmap users call regcache_mark_dirty() as part of the > suspend/resume sequence, to tell regcache that non-default values need to > be resynced post-resume. Add an internal "no_sync_defaults" regmap flag > to remember this state, so that regcache_sync() can differentiate between > these two cases: > > 1) HW was reset, so any cache values that match map->reg_defaults can be > safely skipped. On some chips there are a lot of registers in the > reg_defaults list, so this optimization speeds things up quite a bit. > > 2) HW was not reset (maybe it was just clock-gated), so if we cached > any writes, they should be sent to the hardware regardless of whether > they match the HW default. Currently this will write out all values in > the regcache, since we don't maintain per-register dirty bits. > > Suggested-by: Mark Brown > Signed-off-by: Kevin Cernekee > --- > drivers/base/regmap/internal.h | 3 +++ > drivers/base/regmap/regcache.c | 61 ++++++++++++++++++++++++++++-------------- > 2 files changed, 44 insertions(+), 20 deletions(-) > > diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h > index a13587b5c2be..b2b2849fc6d3 100644 > --- a/drivers/base/regmap/internal.h > +++ b/drivers/base/regmap/internal.h > @@ -131,7 +131,10 @@ struct regmap { > struct reg_default *reg_defaults; > const void *reg_defaults_raw; > void *cache; > + /* if set, the cache contains newer data than the HW */ > u32 cache_dirty; > + /* if set, the HW registers are known to match map->reg_defaults */ > + bool no_sync_defaults; > > struct reg_default *patch; > int patch_regs; > diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c > index 7eb7b3b98794..63af3103d0c6 100644 > --- a/drivers/base/regmap/regcache.c > +++ b/drivers/base/regmap/regcache.c > @@ -253,6 +253,9 @@ static int regcache_default_sync(struct regmap *map, unsigned int min, > unsigned int max) > { > unsigned int reg; > + bool no_sync_defaults = map->no_sync_defaults; > + > + map->no_sync_defaults = false; This needs to be done at the end in regcache_sync(), the same place where dirty is set to false. > > for (reg = min; reg <= max; reg += map->reg_stride) { > unsigned int val; > @@ -266,10 +269,12 @@ static int regcache_default_sync(struct regmap *map, unsigned int min, > if (ret) > return ret; > > - /* Is this the hardware default? If so skip. */ > - ret = regcache_lookup_reg(map, reg); > - if (ret >= 0 && val == map->reg_defaults[ret].def) > - continue; > + if (no_sync_defaults) { > + /* Is this the hardware default? If so skip. */ > + ret = regcache_lookup_reg(map, reg); > + if (ret >= 0 && val == map->reg_defaults[ret].def) > + continue; > + } This should go into a helper function regacache_reg_needs_sync() so it can be reused at the other places where the same logic is needed. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/