Re: I2C writes with interrupts disabled

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Keerhty,

On Tue, Jul 31, 2018 at 02:04:46PM +0530, Keerthy wrote:
> Hi All,
> 
> I am looking at the poweroff scenario. At least on ARM based SoCs i see
> that machine_power_off first disables the local interrupts and then
> shuts off the secondary cores with smp_send_stop.
> 
> After this happens we try to shutdown the PMIC that interact over I2C.
> I2C writes will need I2C interrupts to be enabled but in an interrupt
> disabled context if shutting PMIC is the last thing in the sequence
> which needs I2C writes is there an already existing solution to this
> scenario? Any pointers would help.

Just to add my two bits of information. I was facing the same problem
two years ago and send a RFC patch set to this mailing list. For me it
was the reboot, not the poweroff scenario, but that should be
interchangeable. You can look up the thread here:
https://www.spinics.net/lists/linux-i2c/msg25401.html

There are two distinct problems:
* Sending I2C messages in an atomic/irqless/sleep-free context
* Blocking the I2C-adapter for other users before starting the
  sequence poweroff/reboot.

For the first item: I had to patch the I2C core driver to use
polling(=irqless) instead of interrupts.

For the last item: When the poweroff/restart handler code is executed,
the SoC I2C core must not be in use by another driver in the system.
There must be no other bus communication going on, because the code
cannot wait anymore for sending final I2C message to poweroff the
system.

As Wolfram said, a good solution should implement something like
'master_xfer_irqless' and add a new flag I2C_M_IRQLESS, not accessing
the `i2c_algorithm` of the I2C core driver directly as my code did.

Kind Regards,
Stefan



[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux