All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ravi Babu <ravibabu@ti.com>
To: linux-usb@vger.kernel.org
Cc: linux-omap@vger.kernel.org, balbi@ti.com,
	grant.likely@secretlab.ca, devicetree-discuss@lists.ozlabs.org,
	tony@atomide.com
Subject: [PATCH v9 01/13] usb: musb: dsps: add phy control logic to glue
Date: Fri, 31 Aug 2012 16:39:47 +0530	[thread overview]
Message-ID: <1346411399-23964-2-git-send-email-ravibabu@ti.com> (raw)
In-Reply-To: <1346411399-23964-1-git-send-email-ravibabu@ti.com>

From: Santhapuri, Damodar <damodar.santhapuri@ti.com>

AM335x uses NOP transceiver driver and need to enable builtin PHY
by writing into usb_ctrl register available in system control
module register space. This is being added at musb glue driver
layer untill a separate system control module driver is available.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Santhapuri, Damodar <damodar.santhapuri@ti.com>
Signed-off-by: Ravi Babu <ravibabu@ti.com>
---
 arch/arm/mach-omap2/board-ti8168evm.c   |    1 -
 arch/arm/mach-omap2/omap_phy_internal.c |   35 ------------
 arch/arm/plat-omap/include/plat/usb.h   |    5 +-
 drivers/usb/musb/musb_dsps.c            |   87 +++++++++++++++++++++++++------
 4 files changed, 73 insertions(+), 55 deletions(-)

diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c
index d4c8392..0c7c098 100644
--- a/arch/arm/mach-omap2/board-ti8168evm.c
+++ b/arch/arm/mach-omap2/board-ti8168evm.c
@@ -26,7 +26,6 @@
 #include <plat/usb.h>
 
 static struct omap_musb_board_data musb_board_data = {
-	.set_phy_power	= ti81xx_musb_phy_power,
 	.interface_type	= MUSB_INTERFACE_ULPI,
 	.mode           = MUSB_OTG,
 	.power		= 500,
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c
index d52651a..d80bb16 100644
--- a/arch/arm/mach-omap2/omap_phy_internal.c
+++ b/arch/arm/mach-omap2/omap_phy_internal.c
@@ -254,38 +254,3 @@ void am35x_set_mode(u8 musb_mode)
 
 	omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
 }
-
-void ti81xx_musb_phy_power(u8 on)
-{
-	void __iomem *scm_base = NULL;
-	u32 usbphycfg;
-
-	scm_base = ioremap(TI81XX_SCM_BASE, SZ_2K);
-	if (!scm_base) {
-		pr_err("system control module ioremap failed\n");
-		return;
-	}
-
-	usbphycfg = __raw_readl(scm_base + USBCTRL0);
-
-	if (on) {
-		if (cpu_is_ti816x()) {
-			usbphycfg |= TI816X_USBPHY0_NORMAL_MODE;
-			usbphycfg &= ~TI816X_USBPHY_REFCLK_OSC;
-		} else if (cpu_is_ti814x()) {
-			usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN
-				| USBPHY_DPINPUT | USBPHY_DMINPUT);
-			usbphycfg |= (USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN
-				| USBPHY_DPOPBUFCTL | USBPHY_DMOPBUFCTL);
-		}
-	} else {
-		if (cpu_is_ti816x())
-			usbphycfg &= ~TI816X_USBPHY0_NORMAL_MODE;
-		else if (cpu_is_ti814x())
-			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
-
-	}
-	__raw_writel(usbphycfg, scm_base + USBCTRL0);
-
-	iounmap(scm_base);
-}
diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h
index 548a4c8..c2aa4ae 100644
--- a/arch/arm/plat-omap/include/plat/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -95,7 +95,6 @@ extern void am35x_musb_reset(void);
 extern void am35x_musb_phy_power(u8 on);
 extern void am35x_musb_clear_irq(void);
 extern void am35x_set_mode(u8 musb_mode);
-extern void ti81xx_musb_phy_power(u8 on);
 
 /* AM35x */
 /* USB 2.0 PHY Control */
@@ -120,8 +119,8 @@ extern void ti81xx_musb_phy_power(u8 on);
 #define CONF2_DATPOL		(1 << 1)
 
 /* TI81XX specific definitions */
-#define USBCTRL0	0x620
-#define USBSTAT0	0x624
+#define MUSB_USBSS_REV_816X	0x9
+#define MUSB_USBSS_REV_814X	0xb
 
 /* TI816X PHY controls bits */
 #define TI816X_USBPHY0_NORMAL_MODE	(1 << 0)
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 84d8181..960258d 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -116,9 +116,46 @@ struct dsps_glue {
 	struct platform_device *musb;	/* child musb pdev */
 	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
 	struct timer_list timer;	/* otg_workaround timer */
+	u32 __iomem *usb_ctrl;
+	u8      usbss_rev;
 };
 
 /**
+ * musb_dsps_phy_control - phy on/off
+ * @glue: struct dsps_glue *
+ * @on: flag for phy to be switched on or off
+ *
+ * This is to enable the PHY using usb_ctrl register in system control
+ * module space.
+ *
+ * XXX: This function will be removed once we have a seperate driver for
+ * control module
+ */
+static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
+{
+	u32 usbphycfg;
+
+	usbphycfg = __raw_readl(glue->usb_ctrl);
+
+	if (on) {
+		if (glue->usbss_rev == MUSB_USBSS_REV_816X) {
+			usbphycfg |= TI816X_USBPHY0_NORMAL_MODE;
+			usbphycfg &= ~TI816X_USBPHY_REFCLK_OSC;
+		} else if (glue->usbss_rev == MUSB_USBSS_REV_814X) {
+			usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN
+				| USBPHY_DPINPUT | USBPHY_DMINPUT);
+			usbphycfg |= (USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN
+				| USBPHY_DPOPBUFCTL | USBPHY_DMOPBUFCTL);
+		}
+	} else {
+		if (glue->usbss_rev == MUSB_USBSS_REV_816X)
+			usbphycfg &= ~TI816X_USBPHY0_NORMAL_MODE;
+		else if (glue->usbss_rev == MUSB_USBSS_REV_814X)
+			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
+	}
+	__raw_writel(usbphycfg, glue->usb_ctrl);
+}
+/**
  * dsps_musb_enable - enable interrupts
  */
 static void dsps_musb_enable(struct musb *musb)
@@ -356,11 +393,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
 static int dsps_musb_init(struct musb *musb)
 {
 	struct device *dev = musb->controller;
-	struct musb_hdrc_platform_data *plat = dev->platform_data;
 	struct platform_device *pdev = to_platform_device(dev->parent);
 	struct dsps_glue *glue = platform_get_drvdata(pdev);
 	const struct dsps_musb_wrapper *wrp = glue->wrp;
-	struct omap_musb_board_data *data = plat->board_data;
 	void __iomem *reg_base = musb->ctrl_base;
 	u32 rev, val;
 	int status;
@@ -387,8 +422,7 @@ static int dsps_musb_init(struct musb *musb)
 	dsps_writel(reg_base, wrp->control, (1 << wrp->reset));
 
 	/* Start the on-chip PHY and its PLL. */
-	if (data->set_phy_power)
-		data->set_phy_power(1);
+	musb_dsps_phy_control(glue, 1);
 
 	musb->isr = dsps_interrupt;
 
@@ -410,16 +444,13 @@ err0:
 static int dsps_musb_exit(struct musb *musb)
 {
 	struct device *dev = musb->controller;
-	struct musb_hdrc_platform_data *plat = dev->platform_data;
-	struct omap_musb_board_data *data = plat->board_data;
 	struct platform_device *pdev = to_platform_device(dev->parent);
 	struct dsps_glue *glue = platform_get_drvdata(pdev);
 
 	del_timer_sync(&glue->timer);
 
 	/* Shutdown the on-chip PHY and its PLL. */
-	if (data->set_phy_power)
-		data->set_phy_power(0);
+	musb_dsps_phy_control(glue, 0);
 
 	/* NOP driver needs change if supporting dual instance */
 	usb_put_phy(musb->xceiv);
@@ -451,6 +482,21 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
 	char res_name[10];
 	int ret;
 
+	/* get memory resource for usb control register */
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 2 * id + 2);
+	if (!res) {
+		dev_err(dev, "%s get mem resource failed\n", res_name);
+		ret = -ENODEV;
+		goto err0;
+	}
+
+	glue->usb_ctrl = devm_request_and_ioremap(&pdev->dev, res);
+	if (glue->usb_ctrl == NULL) {
+		dev_err(dev, "Failed to obtain usb_ctrl%d memory\n", id);
+		ret = -ENODEV;
+		goto err0;
+	}
+
 	/* get memory resource */
 	sprintf(res_name, "musb%d", id);
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
@@ -529,6 +575,7 @@ static int __devinit dsps_probe(struct platform_device *pdev)
 				(struct dsps_musb_wrapper *)id->driver_data;
 	struct dsps_glue *glue;
 	struct resource *iomem;
+	u32 __iomem *usbss;
 	int ret;
 
 	/* allocate glue */
@@ -547,6 +594,13 @@ static int __devinit dsps_probe(struct platform_device *pdev)
 		goto err1;
 	}
 
+	usbss = devm_request_and_ioremap(&pdev->dev, iomem);
+	if (usbss == NULL) {
+		dev_err(&pdev->dev, "Failed to obtain usbss memory\n");
+		ret = -ENODEV;
+		goto err1;
+	}
+
 	glue->dev = &pdev->dev;
 
 	glue->wrp = kmemdup(wrp, sizeof(*wrp), GFP_KERNEL);
@@ -573,6 +627,9 @@ static int __devinit dsps_probe(struct platform_device *pdev)
 		goto err3;
 	}
 
+	/* read the usbss revision register */
+	glue->usbss_rev = __raw_readl(usbss);
+
 	return 0;
 
 err3:
@@ -603,24 +660,22 @@ static int __devexit dsps_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM_SLEEP
 static int dsps_suspend(struct device *dev)
 {
-	struct musb_hdrc_platform_data *plat = dev->platform_data;
-	struct omap_musb_board_data *data = plat->board_data;
+	struct platform_device *pdev = to_platform_device(dev->parent);
+	struct dsps_glue *glue = platform_get_drvdata(pdev);
 
 	/* Shutdown the on-chip PHY and its PLL. */
-	if (data->set_phy_power)
-		data->set_phy_power(0);
+	musb_dsps_phy_control(glue, 0);
 
 	return 0;
 }
 
 static int dsps_resume(struct device *dev)
 {
-	struct musb_hdrc_platform_data *plat = dev->platform_data;
-	struct omap_musb_board_data *data = plat->board_data;
+	struct platform_device *pdev = to_platform_device(dev->parent);
+	struct dsps_glue *glue = platform_get_drvdata(pdev);
 
 	/* Start the on-chip PHY and its PLL. */
-	if (data->set_phy_power)
-		data->set_phy_power(1);
+	musb_dsps_phy_control(glue, 1);
 
 	return 0;
 }
-- 
1.7.0.4


  reply	other threads:[~2012-08-31 11:09 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-31 11:09 [PATCH v9 00/13] usb: musb: adding multi instance support Ravi Babu
2012-08-31 11:09 ` Ravi Babu [this message]
     [not found]   ` <1346411399-23964-2-git-send-email-ravibabu-l0cyMroinI0@public.gmane.org>
2012-08-31 12:23     ` [PATCH v9 01/13] usb: musb: dsps: add phy control logic to glue Felipe Balbi
     [not found]       ` <20120831122342.GC24861-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-08-31 13:21         ` ABRAHAM, KISHON VIJAY
     [not found]           ` <CAAe_U6LaCiEPB9ET26j2xjLtumKzJGu+CtW=fK_02d30Z-3BgQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-08-31 13:19             ` Felipe Balbi
2012-08-31 15:47               ` ABRAHAM, KISHON VIJAY
     [not found]               ` <20120831131915.GA25341-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-09-04 14:04                 ` B, Ravi
2012-09-04 14:35                   ` Felipe Balbi
     [not found]                     ` <20120904143505.GH14348-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-09-04 18:34                       ` B, Ravi
2012-08-31 16:00   ` Tony Lindgren
2012-08-31 11:09 ` [PATCH v9 02/13] usb: musb: dsps: enable phy control for am335x Ravi Babu
2012-08-31 11:09 ` [PATCH v9 03/13] usb: musb: add musb_ida for multi instance support Ravi Babu
2012-08-31 11:09 ` [PATCH v9 06/13] usb: otg: nop: add support for multiple tranceiver Ravi Babu
2012-08-31 11:09 ` [PATCH v9 08/13] arm/dts: am33xx: Add dt data for usbss Ravi Babu
2012-08-31 11:09 ` [PATCH v9 09/13] arm/dts: am33xx: add dt data for usb nop phy Ravi Babu
2012-08-31 11:09 ` [PATCH v9 10/13] usb: musb: dsps: remove explicit NOP device creation Ravi Babu
2012-08-31 11:09 ` [PATCH v9 11/13] usb: musb: dsps: get the PHY using phandle api Ravi Babu
     [not found] ` <1346411399-23964-1-git-send-email-ravibabu-l0cyMroinI0@public.gmane.org>
2012-08-31 11:09   ` [PATCH v9 04/13] usb: musb: kill global and static for multi instance Ravi Babu
2012-08-31 11:09   ` [PATCH v9 05/13] usb: musb: am335x: add support for dual instance Ravi Babu
2012-08-31 11:09   ` [PATCH v9 07/13] usb: musb: dsps: add dt support Ravi Babu
2012-08-31 11:09   ` [PATCH v9 12/13] arm/dts: am33xx: add phy phandle to usbss Ravi Babu
2012-08-31 11:09   ` [PATCH v9 13/13] usb: otg: nop: add dt support Ravi Babu
2012-09-11  9:17   ` [PATCH v9 00/13] usb: musb: adding multi instance support Felipe Balbi
2012-09-11 10:45     ` B, Ravi
2012-09-11 11:35       ` Felipe Balbi
     [not found]         ` <20120911113544.GE18907-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-09-11 11:46           ` B, Ravi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1346411399-23964-2-git-send-email-ravibabu@ti.com \
    --to=ravibabu@ti.com \
    --cc=balbi@ti.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=grant.likely@secretlab.ca \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.