From patchwork Fri Sep 24 05:34:09 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Kalliguddi, Hema" X-Patchwork-Id: 203672 X-Patchwork-Delegate: me@felipebalbi.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8O5YQhL029870 for ; Fri, 24 Sep 2010 05:34:26 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753127Ab0IXFeT (ORCPT ); Fri, 24 Sep 2010 01:34:19 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:37189 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751055Ab0IXFeS convert rfc822-to-8bit (ORCPT ); Fri, 24 Sep 2010 01:34:18 -0400 Received: from dbdp20.itg.ti.com ([172.24.170.38]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id o8O5YDHC024724 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 24 Sep 2010 00:34:15 -0500 Received: from dbde71.ent.ti.com (localhost [127.0.0.1]) by dbdp20.itg.ti.com (8.13.8/8.13.8) with ESMTP id o8O5YAY9003704; Fri, 24 Sep 2010 11:04:10 +0530 (IST) Received: from dbde02.ent.ti.com ([172.24.170.145]) by dbde71.ent.ti.com ([172.24.170.149]) with mapi; Fri, 24 Sep 2010 11:04:10 +0530 From: "Kalliguddi, Hema" To: "Kalliguddi, Hema" , Kevin Hilman , "Balbi, Felipe" CC: "linux-omap@vger.kernel.org" , "linux-usb@vger.kernel.org" , "Basak, Partha" , Tony Lindgren , "Cousson, Benoit" , Paul Walmsley Date: Fri, 24 Sep 2010 11:04:09 +0530 Subject: RE: [PATCH 8/9 v3] usb : musb: Using runtime pm apis for musb. Thread-Topic: [PATCH 8/9 v3] usb : musb: Using runtime pm apis for musb. Thread-Index: ActbNC+8bLFLFsH6Qz+iuVAS0/8qSgAASrYgAB0WQHA= Message-ID: References: <1285201830-26561-1-git-send-email-hemahk@ti.com> <20100923063604.GE2563@legolas.emea.dhcp.ti.com> <87wrqc4gwd.fsf@deeprootsystems.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Fri, 24 Sep 2010 05:34:27 +0000 (UTC) Index: linux-omap-pm/arch/arm/mach-omap2/usb-musb.c =================================================================== --- linux-omap-pm.orig/arch/arm/mach-omap2/usb-musb.c +++ linux-omap-pm/arch/arm/mach-omap2/usb-musb.c @@ -25,6 +25,7 @@ #include #include +#include #include @@ -46,6 +47,7 @@ static struct platform_device dummy_pdev static void __iomem *otg_base; static struct clk *otg_clk; +static struct omap_hwmod *oh_p; static void __init usb_musb_pm_init(void) { @@ -129,6 +131,20 @@ static struct omap_device_pm_latency oma }, }; +void omap_set_clock(struct clk *clock , int is_on) +{ + + struct omap_hwmod *oh = oh_p; + struct omap_device *od = oh->od; + struct platform_device *pdev = &od->pdev; + struct device *dev = &pdev->dev; + + if(is_on) + pm_runtime_get_sync(dev); + else + pm_runtime_put_sync(dev); +} + void __init usb_musb_init(struct omap_musb_board_data *board_data) { struct omap_hwmod *oh; @@ -154,8 +170,10 @@ void __init usb_musb_init(struct omap_mu musb_plat.power = board_data->power >> 1; musb_plat.mode = board_data->mode; musb_plat.extvbus = board_data->extvbus; + musb_plat.set_clock = omap_set_clock; pdata = &musb_plat; + oh_p = oh; od = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), omap_musb_latency, Index: linux-omap-pm/drivers/usb/musb/musb_core.c =================================================================== --- linux-omap-pm.orig/drivers/usb/musb/musb_core.c +++ linux-omap-pm/drivers/usb/musb/musb_core.c @@ -98,6 +98,7 @@ #include #include #include +#include #ifdef CONFIG_ARM #include @@ -2457,9 +2458,20 @@ static int musb_resume_noirq(struct devi return 0; } +static int musb_runtime_suspend(struct device *dev) +{ + return 0; +} + +static int musb_runtime_resume(struct device *dev) +{ + return 0; +} static const struct dev_pm_ops musb_dev_pm_ops = { .suspend = musb_suspend, .resume_noirq = musb_resume_noirq, + .runtime_suspend = musb_runtime_suspend, + .runtime_resume = musb_runtime_resume, }; #define MUSB_DEV_PM_OPS (&musb_dev_pm_ops) Index: linux-omap-pm/drivers/usb/musb/omap2430.c =================================================================== --- linux-omap-pm.orig/drivers/usb/musb/omap2430.c +++ linux-omap-pm/drivers/usb/musb/omap2430.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include "musb_core.h" #include "omap2430.h" @@ -206,21 +208,6 @@ int __init musb_platform_init(struct mus musb_platform_resume(musb); - l = musb_readl(musb->mregs, OTG_SYSCONFIG); - l &= ~ENABLEWAKEUP; /* disable wakeup */ - l &= ~NOSTDBY; /* remove possible nostdby */ - l |= SMARTSTDBY; /* enable smart standby */ - l &= ~AUTOIDLE; /* disable auto idle */ - l &= ~NOIDLE; /* remove possible noidle */ - l |= SMARTIDLE; /* enable smart idle */ - /* - * MUSB AUTOIDLE don't work in 3430. - * Workaround by Richard Woodruff/TI - */ - if (!cpu_is_omap3430()) - l |= AUTOIDLE; /* enable auto idle */ - musb_writel(musb->mregs, OTG_SYSCONFIG, l); - l = musb_readl(musb->mregs, OTG_INTERFSEL); if (data->interface_type == MUSB_INTERFACE_UTMI) { @@ -253,15 +240,21 @@ int __init musb_platform_init(struct mus void musb_platform_save_context(struct musb *musb, struct musb_context_registers *musb_context) { - musb_context->otg_sysconfig = musb_readl(musb->mregs, OTG_SYSCONFIG); - musb_context->otg_forcestandby = musb_readl(musb->mregs, OTG_FORCESTDBY); + /* + * As per the omap-usbotg specification, configure it to forced standby + * and force idle mode when no activity on usb. + */ + musb_writel(musb->mregs, OTG_FORCESTDBY, ENABLEFORCE); } void musb_platform_restore_context(struct musb *musb, struct musb_context_registers *musb_context) { - musb_writel(musb->mregs, OTG_SYSCONFIG, musb_context->otg_sysconfig); - musb_writel(musb->mregs, OTG_FORCESTDBY, musb_context->otg_forcestandby); + /* + * As per the omap-usbotg specification, configure it smart standby + * and smart idle during operation. + */ + musb_writel(musb->mregs, OTG_FORCESTDBY, 0); } #endif @@ -277,10 +270,6 @@ static int musb_platform_suspend(struct l |= ENABLEFORCE; /* enable MSTANDBY */ musb_writel(musb->mregs, OTG_FORCESTDBY, l); - l = musb_readl(musb->mregs, OTG_SYSCONFIG); - l |= ENABLEWAKEUP; /* enable wakeup */ - musb_writel(musb->mregs, OTG_SYSCONFIG, l); - otg_set_suspend(musb->xceiv, 1); if (musb->set_clock) @@ -294,23 +283,21 @@ static int musb_platform_suspend(struct static int musb_platform_resume(struct musb *musb) { u32 l; + struct device *dev = musb->controller; if (!musb->clock) return 0; otg_set_suspend(musb->xceiv, 0); + pm_runtime_enable(dev); if (musb->set_clock) musb->set_clock(musb->clock, 1); else clk_enable(musb->clock); - l = musb_readl(musb->mregs, OTG_SYSCONFIG); - l &= ~ENABLEWAKEUP; /* disable wakeup */ - musb_writel(musb->mregs, OTG_SYSCONFIG, l); - l = musb_readl(musb->mregs, OTG_FORCESTDBY); - l &= ~ENABLEFORCE; /* disable MSTANDBY */ + l |= ENABLEFORCE; /* enable MSTANDBY */ musb_writel(musb->mregs, OTG_FORCESTDBY, l); return 0;