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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help