Re: [PATCH 09/20] regmap: _regmap_raw_write fix for busses without write()
From: Markus Pargmann
Date: Wed Aug 12 2015 - 08:20:21 EST
On Wed, Aug 12, 2015 at 12:20:35PM +0100, Mark Brown wrote:
> On Wed, Aug 12, 2015 at 12:12:34PM +0200, Markus Pargmann wrote:
>
> > @@ -1229,6 +1229,11 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
> > }
> > }
> >
> > + if (!map->bus->write && val_len == map->format.val_bytes) {
> > + ret = _regmap_bus_reg_write(map, reg, *(unsigned int *)val);
> > + return ret;
> > + }
>
> This is broken - you can't use a raw value as a register value. The
I am not sure what you mean here?
The register value given to _regmap_raw_write is the real register
value, not formatted differenty. This is given directly towards
bus->reg_write() which should handle the rest.
At least that's how I understood the code. For example regmap_read()
directly calls _regmap_read() which in turn calls directly
bus->reg_read() without any formating.
> endianness of the device may not be the same as the endianness of the
> system and you can't cast a value to unsigned int, the value may be of
> any size.
Yes right. On the other hand if bus->read() and bus->write() was not set
in the init method (before this patch series) no formatting functions at
all were assigned. So it was always ignored for bus->reg_read() and
bus->reg_write()?!
>
> > @@ -1340,7 +1345,7 @@ 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 && map->bus->write) {
> > ret = map->bus->write(map->bus_context, map->work_buf,
> > map->format.reg_bytes +
> > map->format.pad_bytes +
>
> This appears to be another case of merging an unrelated change :(
Yes, will fix.
Thanks,
Markus
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Attachment:
signature.asc
Description: Digital signature