Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756780AbbHZLno (ORCPT ); Wed, 26 Aug 2015 07:43:44 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:36867 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751887AbbHZLnm (ORCPT ); Wed, 26 Aug 2015 07:43:42 -0400 X-Listener-Flag: 11101 From: Henry Chen To: Mark Brown CC: Matthias Brugger , Sascha Hauer , , , , , Subject: [PATCH] regmap: Fix the null function of format_val on regmap_bulk_read. Date: Wed, 26 Aug 2015 19:43:16 +0800 Message-ID: <1440589396-696-1-git-send-email-henryc.chen@mediatek.com> X-Mailer: git-send-email 1.8.1.1.dirty MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3285 Lines: 92 The regmap_format will not be initialize if device driver not declare the regmap_bus when registering the regmap. To avoid the null function of format_val when called regmap_bulk_read(). It need to give a format function when regmap init. Signed-off-by: Henry Chen --- I ran into this bug when testing Matthias' v4.2-next/for-next branch on mt8173. It now crashes on boot. The commit [0], which added the call to map->format.format_val from regmap_bulk_read() when map->bus == NULL. [0] commit 15b8d2c41fe5839582029f65c5f7004db451cc2b Author: Arun Chandran mvista.com> regmap: Fix regmap_bulk_read in BE mode Please see the error below, thanks. Call trace: [< (null)>] (null) [] mtk_rtc_read_time+0x9c/0x134 [] __rtc_read_time.isra.3+0x40/0x7c [] rtc_read_time+0x34/0x58 [] __rtc_read_alarm+0x20/0x37c [] rtc_device_register+0x194/0x2e0 [] mtk_rtc_probe+0xf8/0x18c [] platform_drv_probe+0x48/0xc4 [] driver_probe_device+0x188/0x29c [] __driver_attach+0x98/0xa0 [] bus_for_each_dev+0x54/0x98 [] driver_attach+0x1c/0x28 [] bus_add_driver+0x1c0/0x228 [] driver_register+0x64/0x130 [] __platform_driver_register+0x5c/0x68 [] mtk_rtc_driver_init+0x14/0x20 [] do_one_initcall+0x88/0x1ac [] kernel_init_freeable+0x158/0x1fc [] kernel_init+0xc/0xd8 --- drivers/base/regmap/regmap.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 7111d04..9357186 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -607,13 +607,13 @@ struct regmap *regmap_init(struct device *dev, map->reg_write = config->reg_write; map->defer_caching = false; - goto skip_format_initialization; + goto simple_format_initialization; } else if (!bus->read || !bus->write) { map->reg_read = _regmap_bus_reg_read; map->reg_write = _regmap_bus_reg_write; map->defer_caching = false; - goto skip_format_initialization; + goto simple_format_initialization; } else { map->reg_read = _regmap_bus_read; } @@ -783,8 +783,22 @@ struct regmap *regmap_init(struct device *dev, map->defer_caching = true; map->reg_write = _regmap_bus_raw_write; } +/* + * For bulk read, need to hook the format function. + */ +simple_format_initialization: -skip_format_initialization: + switch (config->val_bits) { + case 8: + map->format.format_val = regmap_format_8; + break; + case 16: + map->format.format_val = regmap_format_16_native; + break; + case 32: + map->format.format_val = regmap_format_32_native; + break; + } map->range_tree = RB_ROOT; for (i = 0; i < config->num_ranges; i++) { -- 1.8.1.1.dirty -- 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/