Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752128AbbHaFSU (ORCPT ); Mon, 31 Aug 2015 01:18:20 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:34412 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752013AbbHaFSS (ORCPT ); Mon, 31 Aug 2015 01:18:18 -0400 X-Listener-Flag: 11101 Message-ID: <1440998292.5539.7.camel@mtksdaap41> Subject: Re: [PATCH] regmap: Support bulk reads for devices without raw formatting From: Henry Chen To: Mark Brown CC: Markus Pargmann , Date: Mon, 31 Aug 2015 13:18:12 +0800 In-Reply-To: <1440789064-11098-1-git-send-email-broonie@kernel.org> References: <1440789064-11098-1-git-send-email-broonie@kernel.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2491 Lines: 76 Hi Mark, Yes, this patch solved the issue.It avoid the null function and just need to handle the native endian case. Thanks. Henry On Fri, 2015-08-28 at 20:11 +0100, Mark Brown wrote: > When doing a bulk read from a device which lacks raw I/O support we fall > back to doing register at a time reads but we still use the raw > formatters in order to render the data into the word size used by the > device (since bulk reads still operate on the device word size rather > than unsigned ints). This means that devices without raw formatting > such as those that provide reg_read() are not supported. Provide > handling for them by copying the values read into native endian values > of the appropriate size. > > Signed-off-by: Mark Brown > --- > > This is tested with my "hey, look - it compiles!" test plan. Based on > looking at the users and the other ways formatting is used this is the > interface that makes most sense to me, we'll need similar handling for > the write case. Does this solve the problems you are seeing? > > drivers/base/regmap/regmap.c | 29 ++++++++++++++++++++++++++++- > 1 file changed, 28 insertions(+), 1 deletion(-) > > diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c > index c13b1f2..62e3d7c 100644 > --- a/drivers/base/regmap/regmap.c > +++ b/drivers/base/regmap/regmap.c > @@ -2364,7 +2364,34 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val, > &ival); > if (ret != 0) > return ret; > - map->format.format_val(val + (i * val_bytes), ival, 0); > + > + if (map->format.format_val) { > + map->format.format_val(val + (i * val_bytes), ival, 0); > + } else { > + /* Devices providing read and write > + * operations can use the bulk I/O > + * functions if they define a val_bytes, > + * we assume that the values are native > + * endian. > + */ > + u32 *u32 = val; > + u16 *u16 = val; > + u8 *u8 = val; > + > + switch (map->format.val_bytes) { > + case 4: > + u32[i] = ival; > + break; > + case 2: > + u16[i] = ival; > + break; > + case 1: > + u8[i] = ival; > + break; > + default: > + return -EINVAL; > + } > + } > } > } > -- 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/