Message ID | 49A5DA3E.6040608@samsung.com (mailing list archive) |
---|---|
State | Awaiting Upstream, archived |
Delegated to: | Felipe Balbi |
Headers | show |
On Thu, Feb 26, 2009 at 08:54:38AM +0900, Minkyu Kang wrote: > The MPU module can be waked up by the unexpected USB > interrupt(HSUSB_MC_NINT). For instance, if the MUSB is working as > peripheral mode and connected to a host PC, it can never enter the low > power mode due to interrupts from the host PC. This patch added the > feature that a board specific file can determines that TWL4030 > supplies the USB power or not in the low power mode. Disabling the USB > power may save the power consumption. > > Signed-off-by: Minkyu Kang <mk7.kang@samsung.com> > Signed-off-by: Kim Kyuwon <chammoru@gmail.com> > --- > drivers/usb/otg/twl4030-usb.c | 25 +++++++++++++++++++++++++ > include/linux/i2c/twl4030.h | 1 + > 2 files changed, 26 insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c > index 416e441..b725be2 100644 > --- a/drivers/usb/otg/twl4030-usb.c > +++ b/drivers/usb/otg/twl4030-usb.c > @@ -256,6 +256,7 @@ struct twl4030_usb { > u8 linkstat; > u8 asleep; > bool irq_enabled; > + bool suspend_enabled; before we ack it and let it go through, could you please explain a bit more the necessity of this ? I mean, what you're doing here is that you would allow twl4030 to enter low power mode even though we're connected to host side, meaning we would never get awaken by the host side, right ? Is that really wanted ? I mean, how would you then wake the device ?
> I mean, what you're doing here is that you would allow twl4030 to enter > low power mode even though we're connected to host side, meaning we > would never get awaken by the host side, right ? Yes, right. If usb is connected to host side, our system never sleep because of usb interrupts by host. We don't want this. We want to enter sleep mode quietly without any disturbance even if usb is connected to host side.(And we need to reduce power consumption) This patch gives option for these reasons. If you don't want this option, please set suspend_enabled = false in the board specific configuration. > Is that really wanted ? I mean, how would you then wake the device ? Our system is waked when get wake-up interrupts such as IO pad wake-up events and other wake-up events from peripheral devices. When it wakes up devices, usb device will be waked too. --- Minkyu Kang. -----Original Message----- From: Felipe Balbi [mailto:me@felipebalbi.com] Sent: Thursday, February 26, 2009 9:12 AM To: Minkyu Kang Cc: Kim Kyuwon; me@felipebalbi.com; linux-usb@vger.kernel.org; OMAP; David Brownell; q1.kim@samsung.com Subject: Re: [PATCH 2/2] twl: usb: Add the resume() and suspend() methods to twl4030-usb.c (re) On Thu, Feb 26, 2009 at 08:54:38AM +0900, Minkyu Kang wrote: > The MPU module can be waked up by the unexpected USB > interrupt(HSUSB_MC_NINT). For instance, if the MUSB is working as > peripheral mode and connected to a host PC, it can never enter the low > power mode due to interrupts from the host PC. This patch added the > feature that a board specific file can determines that TWL4030 > supplies the USB power or not in the low power mode. Disabling the USB > power may save the power consumption. > > Signed-off-by: Minkyu Kang <mk7.kang@samsung.com> > Signed-off-by: Kim Kyuwon <chammoru@gmail.com> > --- > drivers/usb/otg/twl4030-usb.c | 25 +++++++++++++++++++++++++ > include/linux/i2c/twl4030.h | 1 + > 2 files changed, 26 insertions(+), 0 deletions(-) > > diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c > index 416e441..b725be2 100644 > --- a/drivers/usb/otg/twl4030-usb.c > +++ b/drivers/usb/otg/twl4030-usb.c > @@ -256,6 +256,7 @@ struct twl4030_usb { > u8 linkstat; > u8 asleep; > bool irq_enabled; > + bool suspend_enabled; before we ack it and let it go through, could you please explain a bit more the necessity of this ? I mean, what you're doing here is that you would allow twl4030 to enter low power mode even though we're connected to host side, meaning we would never get awaken by the host side, right ? Is that really wanted ? I mean, how would you then wake the device ?
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index 416e441..b725be2 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c @@ -256,6 +256,7 @@ struct twl4030_usb { u8 linkstat; u8 asleep; bool irq_enabled; + bool suspend_enabled; }; /* internal define on top of container_of */ @@ -618,6 +619,7 @@ static int __init twl4030_usb_probe(struct platform_device *pdev) twl->otg.set_suspend = twl4030_set_suspend; twl->usb_mode = pdata->usb_mode; twl->asleep = 1; + twl->suspend_enabled = pdata->suspend_enabled; /* init spinlock for workqueue */ spin_lock_init(&twl->lock); @@ -694,9 +696,32 @@ static int __exit twl4030_usb_remove(struct platform_device *pdev) return 0; } +int twl4030_usb_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct twl4030_usb *twl = platform_get_drvdata(pdev); + + if (!twl->suspend_enabled) + return 0; + + otg_set_suspend(&twl->otg, 1); + + return 0; +} + +int twl4030_usb_resume(struct platform_device *pdev) +{ + struct twl4030_usb *twl = platform_get_drvdata(pdev); + + otg_set_suspend(&twl->otg, 0); + + return 0; +} + static struct platform_driver twl4030_usb_driver = { .probe = twl4030_usb_probe, .remove = __exit_p(twl4030_usb_remove), + .suspend = twl4030_usb_suspend, + .resume = twl4030_usb_resume, .driver = { .name = "twl4030_usb", .owner = THIS_MODULE, diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h index c89d33b..0b12509 100644 --- a/include/linux/i2c/twl4030.h +++ b/include/linux/i2c/twl4030.h @@ -325,6 +325,7 @@ enum twl4030_usb_mode { struct twl4030_usb_data { enum twl4030_usb_mode usb_mode; + bool suspend_enabled; }; struct twl4030_ins {