From: ext Felipe Balbi <felipe.balbi@xxxxxxxxx> We can conserve more power if we always let it idle when there's nothing using the bus. Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxx> --- drivers/usb/musb/omap2430.c | 28 ++++------------------------ drivers/usb/musb/tusb6010.c | 31 +++++++------------------------ 2 files changed, 11 insertions(+), 48 deletions(-) diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 36f1739..5c948e5 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c @@ -46,6 +46,7 @@ #endif #define MUSB_TIMEOUT_A_WAIT_BCON 1100 +#define MUSB_DEFAULT_TIMEOUT 500 static struct timer_list musb_idle_timer; @@ -109,34 +110,12 @@ static void musb_do_idle(unsigned long _musb) void musb_platform_try_idle(struct musb *musb, unsigned long timeout) { - unsigned long default_timeout = jiffies + msecs_to_jiffies(3); - static unsigned long last_timer; - - if (timeout == 0) - timeout = default_timeout; - - /* Never idle if active, or when VBUS timeout is not set as host */ - if (musb->is_active || ((musb->a_wait_bcon == 0) - && (musb->xceiv.state == OTG_STATE_A_WAIT_BCON))) { - DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); - del_timer(&musb_idle_timer); - last_timer = jiffies; - return; - } - - if (time_after(last_timer, timeout)) { - if (!timer_pending(&musb_idle_timer)) - last_timer = timeout; - else { - DBG(4, "Longer idle timer already pending, ignoring\n"); - return; - } - } - last_timer = timeout; + unsigned long default_timeout = musb->idle_timeout; DBG(4, "%s inactive, for idle timer for %lu ms\n", otg_state_string(musb), (unsigned long)jiffies_to_msecs(timeout - jiffies)); + mod_timer(&musb_idle_timer, timeout); } @@ -246,6 +225,7 @@ int __init musb_platform_init(struct musb *musb) if (is_peripheral_enabled(musb)) musb->xceiv.set_power = omap_set_power; musb->a_wait_bcon = MUSB_TIMEOUT_A_WAIT_BCON; + musb->idle_timeout = MUSB_DEFAULT_TIMEOUT; setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 14220d9..ecdf41e 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -30,6 +30,8 @@ static void tusb_source_power(struct musb *musb, int is_on); #define TUSB_REV_MAJOR(reg_val) ((reg_val >> 4) & 0xf) #define TUSB_REV_MINOR(reg_val) (reg_val & 0xf) +#define MUSB_DEFAULT_TIMEOUT 500 + /* * Checks the revision. We need to use the DMA register as 3.0 does not * have correct versions for TUSB_PRCM_REV or TUSB_INT_CTRL_REV. @@ -476,34 +478,12 @@ done: */ void musb_platform_try_idle(struct musb *musb, unsigned long timeout) { - unsigned long default_timeout = jiffies + msecs_to_jiffies(3); - static unsigned long last_timer; - - if (timeout == 0) - timeout = default_timeout; - - /* Never idle if active, or when VBUS timeout is not set as host */ - if (musb->is_active || ((musb->a_wait_bcon == 0) - && (musb->xceiv.state == OTG_STATE_A_WAIT_BCON))) { - DBG(4, "%s active, deleting timer\n", otg_state_string(musb)); - del_timer(&musb_idle_timer); - last_timer = jiffies; - return; - } - - if (time_after(last_timer, timeout)) { - if (!timer_pending(&musb_idle_timer)) - last_timer = timeout; - else { - DBG(4, "Longer idle timer already pending, ignoring\n"); - return; - } - } - last_timer = timeout; + unsigned long default_timeout = musb->idle_timeout; DBG(4, "%s inactive, for idle timer for %lu ms\n", otg_state_string(musb), (unsigned long)jiffies_to_msecs(timeout - jiffies)); + mod_timer(&musb_idle_timer, timeout); } @@ -1128,6 +1108,9 @@ int __init musb_platform_init(struct musb *musb) if (is_peripheral_enabled(musb)) musb->xceiv.set_power = tusb_draw_power; + /* Default idle_timeout in ms */ + musb->idle_timeout = MUSB_DEFAULT_TIMEOUT; + setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb); return ret; -- 1.5.5.1.125.gc697a -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html