Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755372AbbHLKQx (ORCPT ); Wed, 12 Aug 2015 06:16:53 -0400 Received: from metis.ext.pengutronix.de ([92.198.50.35]:56766 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754236AbbHLKNt (ORCPT ); Wed, 12 Aug 2015 06:13:49 -0400 From: Markus Pargmann To: Mark Brown , Jonathan Cameron Cc: Srinivas Pandruvada , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de, Markus Pargmann Subject: [PATCH 05/20] regmap: Restructure writes in _regmap_raw_write() Date: Wed, 12 Aug 2015 12:12:30 +0200 Message-Id: <1439374365-20623-6-git-send-email-mpa@pengutronix.de> X-Mailer: git-send-email 2.4.6 In-Reply-To: <1439374365-20623-1-git-send-email-mpa@pengutronix.de> References: <1439374365-20623-1-git-send-email-mpa@pengutronix.de> X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 X-SA-Exim-Mail-From: mpa@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2886 Lines: 81 Currently we try to write the data without copying directly using bus->write() or bus->gather_write() if it exists. If one of the previous tries to write reported -ENOTSUPP or none of them were usable, we copy the data into a buffer and use bus->write(). However it does not make sense to try bus->write() a second time with a copied buffer if it didn't work the first time. This patch restructures this if/else block to make it clear that this is not intended for the case where bus->write() returns -ENOTSUPP. Signed-off-by: Markus Pargmann --- drivers/base/regmap/regmap.c | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 86e94be3c749..f6bd3517a472 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -1340,30 +1340,34 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg, * send the work_buf directly, otherwise try to do a gather * write. */ - if (val == work_val) + if (val == work_val) { ret = map->bus->write(map->bus_context, map->work_buf, map->format.reg_bytes + map->format.pad_bytes + val_len); - else if (map->bus->gather_write) - ret = map->bus->gather_write(map->bus_context, map->work_buf, - map->format.reg_bytes + - map->format.pad_bytes, - val, val_len); - - /* If that didn't work fall back on linearising by hand. */ - if (ret == -ENOTSUPP) { - len = map->format.reg_bytes + map->format.pad_bytes + val_len; - buf = kzalloc(len, GFP_KERNEL); - if (!buf) - return -ENOMEM; + } else { + if (map->bus->gather_write) + ret = map->bus->gather_write(map->bus_context, + map->work_buf, + map->format.reg_bytes + + map->format.pad_bytes, + val, val_len); + + /* If that didn't work fall back on linearising by hand. */ + if (ret == -ENOTSUPP) { + len = map->format.reg_bytes + map->format.pad_bytes + + val_len; + buf = kzalloc(len, GFP_KERNEL); + if (!buf) + return -ENOMEM; - memcpy(buf, map->work_buf, map->format.reg_bytes); - memcpy(buf + map->format.reg_bytes + map->format.pad_bytes, - val, val_len); - ret = map->bus->write(map->bus_context, buf, len); + memcpy(buf, map->work_buf, map->format.reg_bytes); + memcpy(buf + map->format.reg_bytes + + map->format.pad_bytes, val, val_len); + ret = map->bus->write(map->bus_context, buf, len); - kfree(buf); + kfree(buf); + } } trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes); -- 2.4.6 -- 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/