lis3lv02d i2c access on shutdown
From: James Maki <hidden>
Date: 2017-02-18 17:46:33
Hi, I have an TI am335x that is using a i2c PMIC with pm_power_off hook which locks up on shutdown. The pm_power_off hook gets stuck obtaining i2c_lock_adapter(). The holder of the lock is the lis3lv02d accelerometer which never releases it. I do not think there is an issue in lis3lv02d. I think this is a general issue with i2c since other drivers have the same design. What I don't have is clear understanding of if/when/how i2c_transfer() can be called post kernel_power_off(). Is it possible to call i2c_transfer() at this point. I have tried calling schedule() and msleep() inside of kernel_power_off() after syscore_shutdown(). It looks like interrupts are enabled and I can still schedule at this point. So how is it possible that lis3lv02d is never able to exit the i2c_transfer()? Is there some other lock inside i2c_transfer that it is blocking on? Is it possible that the process which had the accelerometer open has exited while holding the i2c lock. Is it even possible for a device to shutdown or file to close while holding a lock in the kernel? I looked at adding a lis3lv02d_i2c_shutdown, but that was too late in the process already and the lis3lv02d was already stuck. Is there a very early place during shutdown that I can kick everyone off the i2c bus? Obviously this might not be the best general solution, but my concern right now is fixing the problem on this particular system first. -James