Message ID | 1439374365-20623-12-git-send-email-mpa@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Aug 12, 2015 at 12:12:36PM +0200, Markus Pargmann wrote: > + /* > + * There are busses that do not have a read function as it is optional. > + * Use their reg_read function instead if the requested number of bytes > + * is correct. > + */ > + if (!map->bus->read) { > + /* > + * bus_reg_read() does not support reading values that are not > + * exactly the size of format.val_bytes > + */ > + if (val_len != map->format.val_bytes) > + return -EINVAL; > + return _regmap_bus_reg_read(map, reg, val); > + } No, this makes no sense - if the device doesn't have a read operation then it doesn't support a raw data stream and hence can't support raw access sensibly. Callers that want to access a lot of registers at once without knowing what the wire format for the device is should be using the bulk or multi interfaces.
On Wed, Aug 12, 2015 at 12:27:07PM +0100, Mark Brown wrote: > On Wed, Aug 12, 2015 at 12:12:36PM +0200, Markus Pargmann wrote: > > > + /* > > + * There are busses that do not have a read function as it is optional. > > + * Use their reg_read function instead if the requested number of bytes > > + * is correct. > > + */ > > + if (!map->bus->read) { > > + /* > > + * bus_reg_read() does not support reading values that are not > > + * exactly the size of format.val_bytes > > + */ > > + if (val_len != map->format.val_bytes) > > + return -EINVAL; > > + return _regmap_bus_reg_read(map, reg, val); > > + } > > No, this makes no sense - if the device doesn't have a read operation > then it doesn't support a raw data stream and hence can't support raw > access sensibly. Callers that want to access a lot of registers at once > without knowing what the wire format for the device is should be using > the bulk or multi interfaces. Yes okay. Then I will reduce this patch to the following and put it into regmap_read() instead? if (!map->bus->read) { return -EINVAL; Is -EINVAL the right thing to return or would you prefer -ENOTSUPP? Thanks, Markus
On Wed, Aug 12, 2015 at 02:34:12PM +0200, Markus Pargmann wrote:
> Is -EINVAL the right thing to return or would you prefer -ENOTSUPP?
-ENOTSUPP is going to be better.
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 87f15fb60bc5..3b663350c573 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -2071,6 +2071,21 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, WARN_ON(!map->bus); + /* + * There are busses that do not have a read function as it is optional. + * Use their reg_read function instead if the requested number of bytes + * is correct. + */ + if (!map->bus->read) { + /* + * bus_reg_read() does not support reading values that are not + * exactly the size of format.val_bytes + */ + if (val_len != map->format.val_bytes) + return -EINVAL; + return _regmap_bus_reg_read(map, reg, val); + } + range = _regmap_range_lookup(map, reg); if (range) { ret = _regmap_select_page(map, ®, range,
Handle easy reads by using bus->reg_read(). Return with an error value if a read is requested that can not be handled with reg_read(). Signed-off-by: Markus Pargmann <mpa@pengutronix.de> --- drivers/base/regmap/regmap.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)