Messages in this thread | | | From | Chen Peter-B29397 <> | Subject | RE: [PATCH 1/1] driver core: disable device's runtime pm during shutdown | Date | Mon, 5 Dec 2011 03:29:24 +0000 |
| |
> > Hi, > this patches causes a problem for me. > > Specifically it makes it impossible to power-down a device which uses > twl4030 > for power control on an omap3 processor. > > To perform the shutdown we need to send a command over the i2c bus. > The relevant bus is called omap_i2c.1 and this is normally in suspend > mode. > When a request is sent, omap_i2c_xfer uses pm_runtime_get_sync to wake it > up, > performs the transfer, then calls pm_runtime_put to let it go back to > sleep. > > So it is asleep when the new pm_runtime_disable() call is made, so it > stays > asleep, omap_i2c_xfer cannot wake it, the transfer doesn't happen and the > system doesn't get powered off. > > So here is a device that should *not* have pm disabled at shutdown. > > So I feel this fix is a little too heavy-handed. > I don't fully understand the problem scenario described above but it > seems to > me that if the auto-suspend timer can fire after the hardware has been > shut > down, then maybe the hardware-shutdown should be disabling that timer. > Maybe? > Oh, I am sorry to cause your problem. I think it may not be easy to handle this kinds of problem well.
In my opinion, it is better to handle shutdown/suspend SYNC at device drivers. Since the pm core is hard to know driver's shutdown is finished, and vice versa.
1. Driver needs to has relationship between suspend/shutdown, like usb host, hcd needs to know downstream port's suspend, and usb core needs to know hcd's shutdown.
2. At driver's shutdown static void xxx_driver_shutdown(struct platform_device *pdev) { if (supports_autosuspend(&pdev->dev) { pm_runtime_cancel_pending(&pdev->dev); wait_xxx_driver_suspend(pdev); /* need to sync with driver's suspend */ } real_shutdown(); }
> Suggestions? > > Thanks, > NeilBrown
| |