On Tue, 19 Apr 2011, Ohad Ben-Cohen wrote: > On Tue, Apr 19, 2011 at 1:46 PM, Guennadi Liakhovetski > <g.liakhovetski@xxxxxx> wrote: > > MMC bus PM operations implement a .runtime_idle() method, which calls > > pm_runtime_suspend(), but this call is not balanced by a resume > > counterpart, > > What's the exact flow you refer to ? Seeing a "struct dev_pm_ops" instance with .runtime_suspend(), .runtime_resume(), and .runtime_idle() methods I understand, that "suspend" and "resume" are two counterparts, that balance each other. Now with "idle" I am not sure which method should balance it. With platform devices in the generic case idle ends up calling pm_generic_runtime_idle(), which then calls pm_runtime_suspend(). So, there should be a balancing pm_runtime_resume() somewhere? > > which causes problems with repeated card-plug and driver-load > > cycles. > > Can you please be more specific ? What are you trying to achieve, what > are the problems you encounter ? See this patch: http://article.gmane.org/gmane.linux.ports.sh.devel/10724 The purpose of that patch is to (1) implement runtime PM in a way, that whenever the driver is unloaded or the card is ejected the interface is powered down, and (2) implement system-wide PM. For (1) doing the usual probe() { ... pm_runtime_enable(); pm_runtime_resume(); ... } remove() { ... pm_runtime_suspend(); pm_runtime_dieabls(); ... } set_ios() { ... if (power_down) pm_runtime_put(); if (power_up) pm_runtime_get_sync(); ... } Doesn't work: some internal MMC counters become disbalanced and after one card replug or driver reloading the interface gets stuck with power either permanently on or off. > > Removing this method fixes the disbalance. > > I'm not sure which disbalance you're referring to, but if you'll > remove this method you will break MMC/SDIO runtime PM. > > More specifically, without having this ->runtime_idle() handler, the > last user giving up its power usage_count (e.g. by calling > pm_runtime_put{_sync}) will not end up powering down the MMC card. How do they work then? Who does the pm_runtime_resume() to undo the effects of the pm_runtime_suspend(), or is it the platform runtime-pm, that is implementing the "idle" method wrongly? Thanks Guennadi --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/ -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html