On 2021-09-06 01:03, Peter Rosin wrote: > On 2021-09-05 12:04, Jonathan Cameron wrote: >> On Tue, 31 Aug 2021 09:40:11 +0200 >> Jacopo Mondi <jacopo@xxxxxxxxxx> wrote: >> >>> Hi Jonathan, >>> two more clarification requests, sorry to bother :) >> No problem. First one: No idea +CC wolfram and i2c list. >>> >>> On Mon, Aug 30, 2021 at 06:11:17PM +0100, Jonathan Cameron wrote: >>>> On Mon, 30 Aug 2021 18:20:51 +0200 >>>>>>> +static int sunrise_write_word(struct sunrise_dev *sunrise, u8 reg, u16 data) >>>>>>> +{ >>>>>>> + __be16 be_data = cpu_to_be16(data); >>>>>>> + int ret; >>>>>>> + >>>>>>> + sunrise_wakeup(sunrise); >>>>>> >>>>>> Hmm. Technically there isn't anything stopping another user of the i2c bus sneaking in >>>>>> between the wakeup and the following command. That would make the device going back >>>>>> to sleep a lot more likely. I can't off the top of my head remember if regmap lets >>>>>> you lock the bus. If not, you'll have to use the underlying i2c bus locking functions. >>>>>> https://elixir.bootlin.com/linux/latest/source/drivers/iio/temperature/mlx90614.c#L432 >>>>>> gives an example. Forgot to mention, regmap does let you do that. See e.g. drivers/media/dvb-frontends/rtl2830.c which wraps regmap_update_bits, regmap_bulk_write and regmap_bulk_read within a local I2C segment lock along with a special regmap_bus that does unlocked I2C trasfers. I think the driver does this because it has an I2C gate that needs to be opened with a regmap interaction that in turn needs to be back to back with the "real" regmap access, or else the gate closes again. Cheers, Peter