From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754167AbcG2Vmk (ORCPT ); Fri, 29 Jul 2016 17:42:40 -0400 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:43931 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750868AbcG2Vmf (ORCPT ); Fri, 29 Jul 2016 17:42:35 -0400 X-Originating-IP: 82.168.42.142 From: Maarten ter Huurne To: Mark Brown Cc: linux-kernel@vger.kernel.org, Maarten ter Huurne Subject: [PATCH v2] regmap: cache: Fix num_reg_defaults computation from reg_defaults_raw Date: Fri, 29 Jul 2016 23:42:12 +0200 Message-Id: <1469828532-21653-1-git-send-email-maarten@treewalker.org> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1469803603-15862-1-git-send-email-maarten@treewalker.org> References: <1469803603-15862-1-git-send-email-maarten@treewalker.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In 3245d460 (regmap: cache: Fall back to register by register read for cache defaults) non-readable registers are skipped when initializing reg_defaults, but are still included in num_reg_defaults. So there can be uninitialized entries at the end of reg_defaults, which can cause problems when the register cache initializes from the full array. Fixed it by excluding non-readable registers from the count as well. Signed-off-by: Maarten ter Huurne --- drivers/base/regmap/regcache.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index df7ff729..4e58256 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -38,10 +38,11 @@ static int regcache_hw_init(struct regmap *map) /* calculate the size of reg_defaults */ for (count = 0, i = 0; i < map->num_reg_defaults_raw; i++) - if (!regmap_volatile(map, i * map->reg_stride)) + if (regmap_readable(map, i * map->reg_stride) && + !regmap_volatile(map, i * map->reg_stride)) count++; - /* all registers are volatile, so just bypass */ + /* all registers are unreadable or volatile, so just bypass */ if (!count) { map->cache_bypass = true; return 0; -- 2.6.6