All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] arm: omap: hwmod: add new memory resource for usb phy cont
@ 2012-07-09 13:48 Damodar Santhapuri
  2012-07-09 13:48 ` [PATCH 2/3] usb: musb: dsps: add phy control logic to glue Damodar Santhapuri
       [not found] ` <1341841690-23899-1-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
  0 siblings, 2 replies; 9+ messages in thread
From: Damodar Santhapuri @ 2012-07-09 13:48 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: balbi-l0cyMroinI0, linux-omap-u79uwXL29TY76Z2rM5mHXA,
	Ajay Kumar Gupta, Damodar Santhapuri

From: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>

Added usb_ctrl0 and usb_ctrl1 base address as new memory resources
which will be used at am335x musb driver glue layer to turn on or
off builin PHY. This is needed untill we have a separate system
control module driver.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
Signed-off-by: Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org>
---
This patch set applies to 'xceiv' branch on Felipe's tree.

 arch/arm/mach-omap2/omap_hwmod_33xx_data.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
index df888fe..7dfb61e 100644
--- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
@@ -3274,6 +3274,18 @@ static struct omap_hwmod_addr_space am33xx_usbss_addr_space[] = {
 		.pa_end		= 0x47401800 + SZ_2K - 1,
 		.flags		= ADDR_TYPE_RT
 	},
+	{
+		.name		= "usb_ctrl0",
+		.pa_start	= 0x44E10620,
+		.pa_end		= 0x44E10624,
+		.flags		= ADDR_TYPE_RT
+	},
+	{
+		.name		= "usb_ctrl1",
+		.pa_start	= 0x44E10628,
+		.pa_end		= 0x44E1062c,
+		.flags		= ADDR_TYPE_RT
+	},
 	{ }
 };
 
-- 
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
  2012-07-09 13:48 [PATCH 1/3] arm: omap: hwmod: add new memory resource for usb phy cont Damodar Santhapuri
@ 2012-07-09 13:48 ` Damodar Santhapuri
       [not found]   ` <1341841690-23899-2-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
       [not found] ` <1341841690-23899-1-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
  1 sibling, 1 reply; 9+ messages in thread
From: Damodar Santhapuri @ 2012-07-09 13:48 UTC (permalink / raw)
  To: linux-usb; +Cc: balbi, linux-omap, Ajay Kumar Gupta, Damodar Santhapuri

From: Ajay Kumar Gupta <ajay.gupta@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: Damodar Santhapuri <x0132156@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            |   88 +++++++++++++++++++++++++------
 4 files changed, 74 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 494772f..f7271c3 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -115,9 +115,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)
@@ -363,11 +400,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;
@@ -395,8 +430,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;
 
@@ -418,8 +452,6 @@ 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);
 
@@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
 		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);
@@ -460,6 +491,22 @@ 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 */
+	sprintf(res_name, "usb_ctrl%d", id);
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
+	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);
@@ -538,6 +585,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 */
@@ -556,6 +604,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);
@@ -582,6 +637,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:
@@ -612,24 +670,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


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] usb: musb: dsps: enable phy control for am335x
       [not found] ` <1341841690-23899-1-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
@ 2012-07-09 13:48   ` Damodar Santhapuri
  0 siblings, 0 replies; 9+ messages in thread
From: Damodar Santhapuri @ 2012-07-09 13:48 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: balbi-l0cyMroinI0, linux-omap-u79uwXL29TY76Z2rM5mHXA,
	Ajay Kumar Gupta, Damodar Santhapuri

From: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>

Enabled the phy control logic for am335x also based on usbss
revision register.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
Signed-off-by: Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org>
---
Earlier version of this patch based on function pointer was submitted at
http://marc.info/?l=linux-usb&m=133583281512646&w=2

and was not accepted as Felipe wanted this to be done through
system conrol module driver.

 arch/arm/plat-omap/include/plat/usb.h |    1 +
 drivers/usb/musb/musb_dsps.c          |   17 +++++++++++------
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h
index c2aa4ae..6459b10 100644
--- a/arch/arm/plat-omap/include/plat/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -121,6 +121,7 @@ extern void am35x_set_mode(u8 musb_mode);
 /* TI81XX specific definitions */
 #define MUSB_USBSS_REV_816X	0x9
 #define MUSB_USBSS_REV_814X	0xb
+#define MUSB_USBSS_REV_33XX	0xd
 
 /* 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 f7271c3..171352c 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -140,16 +140,21 @@ static void musb_dsps_phy_control(struct dsps_glue *glue, u8 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_814X ||
+				glue->usbss_rev == MUSB_USBSS_REV_33XX) {
+			usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
+			usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
+			if (glue->usbss_rev == MUSB_USBSS_REV_814X) {
+				usbphycfg &= ~(USBPHY_DPINPUT | USBPHY_DMINPUT);
+				usbphycfg |= 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)
+		else if (glue->usbss_rev == MUSB_USBSS_REV_814X ||
+				glue->usbss_rev == MUSB_USBSS_REV_33XX)
 			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
 	}
 	__raw_writel(usbphycfg, glue->usb_ctrl);
-- 
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
       [not found]   ` <1341841690-23899-2-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
@ 2012-07-09 14:46     ` ABRAHAM, KISHON VIJAY
       [not found]       ` <CAAe_U6+wYsiVOvYm8t4g8P5R4jWzBCQhC-XBfNVgM4GqWi-JLQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 9+ messages in thread
From: ABRAHAM, KISHON VIJAY @ 2012-07-09 14:46 UTC (permalink / raw)
  To: Damodar Santhapuri
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	linux-omap-u79uwXL29TY76Z2rM5mHXA, Ajay Kumar Gupta

Hi,

On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org> wrote:
> From: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
>
> 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-l0cyMroinI0@public.gmane.org>
> Signed-off-by: Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org>
> ---
>  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            |   88 +++++++++++++++++++++++++------
>  4 files changed, 74 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 494772f..f7271c3 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -115,9 +115,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
%s/seperate/separate
> + * control module
> + */
> +static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
> +{
> +       u32 usbphycfg;
> +
> +       usbphycfg = __raw_readl(glue->usb_ctrl);

How about using readl instead of __raw_readl here and below?
> +
> +       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);
only writel()?
> +}
> +/**
>   * dsps_musb_enable - enable interrupts
>   */
>  static void dsps_musb_enable(struct musb *musb)
> @@ -363,11 +400,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;
> @@ -395,8 +430,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;
>
> @@ -418,8 +452,6 @@ 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);
>
> @@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
>                 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);
> @@ -460,6 +491,22 @@ 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 */
> +       sprintf(res_name, "usb_ctrl%d", id);
> +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
Avoid getting resource by name.. With dt, you wont be able to do those..

Thanks
Kishon
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
       [not found]       ` <CAAe_U6+wYsiVOvYm8t4g8P5R4jWzBCQhC-XBfNVgM4GqWi-JLQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2012-07-10  6:05         ` Gupta, Ajay Kumar
  2012-07-10  6:09           ` ABRAHAM, KISHON VIJAY
  0 siblings, 1 reply; 9+ messages in thread
From: Gupta, Ajay Kumar @ 2012-07-10  6:05 UTC (permalink / raw)
  To: ABRAHAM, KISHON VIJAY, Santhapuri, Damodar
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA, Balbi, Felipe,
	linux-omap-u79uwXL29TY76Z2rM5mHXA

Hi,
> 
> On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org>
> wrote:
> > From: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
> >
> > 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-l0cyMroinI0@public.gmane.org>
> > Signed-off-by: Damodar Santhapuri <x0132156-l0cyMroinI0@public.gmane.org>
> > ---
> >  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            |   88
> +++++++++++++++++++++++++------
> >  4 files changed, 74 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 494772f..f7271c3 100644
> > --- a/drivers/usb/musb/musb_dsps.c
> > +++ b/drivers/usb/musb/musb_dsps.c
> > @@ -115,9 +115,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
> %s/seperate/separate
> > + * control module
> > + */
> > +static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
> > +{
> > +       u32 usbphycfg;
> > +
> > +       usbphycfg = __raw_readl(glue->usb_ctrl);
> 
> How about using readl instead of __raw_readl here and below?
> > +
> > +       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);
> only writel()?
> > +}
> > +/**
> >   * dsps_musb_enable - enable interrupts
> >   */
> >  static void dsps_musb_enable(struct musb *musb)
> > @@ -363,11 +400,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;
> > @@ -395,8 +430,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;
> >
> > @@ -418,8 +452,6 @@ 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);
> >
> > @@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
> >                 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);
> > @@ -460,6 +491,22 @@ 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 */
> > +       sprintf(res_name, "usb_ctrl%d", id);
> > +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> res_name);
> Avoid getting resource by name.. With dt, you wont be able to do
> those..

When we are completely on DT then this would anyways go and we can
get these resource data for each usb port from DT APIs.

Thanks,
Ajay
> 
> Thanks
> Kishon
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
  2012-07-10  6:05         ` Gupta, Ajay Kumar
@ 2012-07-10  6:09           ` ABRAHAM, KISHON VIJAY
  2012-07-10  6:20             ` Gupta, Ajay Kumar
  0 siblings, 1 reply; 9+ messages in thread
From: ABRAHAM, KISHON VIJAY @ 2012-07-10  6:09 UTC (permalink / raw)
  To: Gupta, Ajay Kumar
  Cc: Santhapuri, Damodar, linux-usb, Balbi, Felipe, linux-omap

Hi,

On Tue, Jul 10, 2012 at 11:35 AM, Gupta, Ajay Kumar <ajay.gupta@ti.com> wrote:
> Hi,
>>
>> On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri <x0132156@ti.com>
>> wrote:
>> > From: Ajay Kumar Gupta <ajay.gupta@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: Damodar Santhapuri <x0132156@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            |   88
>> +++++++++++++++++++++++++------
>> >  4 files changed, 74 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 494772f..f7271c3 100644
>> > --- a/drivers/usb/musb/musb_dsps.c
>> > +++ b/drivers/usb/musb/musb_dsps.c
>> > @@ -115,9 +115,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
>> %s/seperate/separate
>> > + * control module
>> > + */
>> > +static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
>> > +{
>> > +       u32 usbphycfg;
>> > +
>> > +       usbphycfg = __raw_readl(glue->usb_ctrl);
>>
>> How about using readl instead of __raw_readl here and below?
>> > +
>> > +       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);
>> only writel()?
>> > +}
>> > +/**
>> >   * dsps_musb_enable - enable interrupts
>> >   */
>> >  static void dsps_musb_enable(struct musb *musb)
>> > @@ -363,11 +400,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;
>> > @@ -395,8 +430,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;
>> >
>> > @@ -418,8 +452,6 @@ 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);
>> >
>> > @@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
>> >                 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);
>> > @@ -460,6 +491,22 @@ 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 */
>> > +       sprintf(res_name, "usb_ctrl%d", id);
>> > +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
>> res_name);
>> Avoid getting resource by name.. With dt, you wont be able to do
>> those..
>
> When we are completely on DT then this would anyways go and we can
> get these resource data for each usb port from DT APIs.

Even with dt, you will still get the resources using
platform_get_resource() API's.. So why not have it that way from the
beginning itself..

Thanks
Kishon

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
  2012-07-10  6:09           ` ABRAHAM, KISHON VIJAY
@ 2012-07-10  6:20             ` Gupta, Ajay Kumar
  2012-07-10 10:44               ` Santhapuri, Damodar
  0 siblings, 1 reply; 9+ messages in thread
From: Gupta, Ajay Kumar @ 2012-07-10  6:20 UTC (permalink / raw)
  To: ABRAHAM, KISHON VIJAY
  Cc: Santhapuri, Damodar, linux-usb, Balbi, Felipe, linux-omap

Hi,
> On Tue, Jul 10, 2012 at 11:35 AM, Gupta, Ajay Kumar <ajay.gupta@ti.com>
> wrote:
> > Hi,
> >>
> >> On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri <x0132156@ti.com>
> >> wrote:
> >> > From: Ajay Kumar Gupta <ajay.gupta@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: Damodar Santhapuri <x0132156@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            |   88
> >> +++++++++++++++++++++++++------
> >> >  4 files changed, 74 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 494772f..f7271c3 100644
> >> > --- a/drivers/usb/musb/musb_dsps.c
> >> > +++ b/drivers/usb/musb/musb_dsps.c
> >> > @@ -115,9 +115,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
> >> %s/seperate/separate
> >> > + * control module
> >> > + */
> >> > +static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
> >> > +{
> >> > +       u32 usbphycfg;
> >> > +
> >> > +       usbphycfg = __raw_readl(glue->usb_ctrl);
> >>
> >> How about using readl instead of __raw_readl here and below?
> >> > +
> >> > +       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);
> >> only writel()?
> >> > +}
> >> > +/**
> >> >   * dsps_musb_enable - enable interrupts
> >> >   */
> >> >  static void dsps_musb_enable(struct musb *musb)
> >> > @@ -363,11 +400,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;
> >> > @@ -395,8 +430,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;
> >> >
> >> > @@ -418,8 +452,6 @@ 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);
> >> >
> >> > @@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
> >> >                 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);
> >> > @@ -460,6 +491,22 @@ 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 */
> >> > +       sprintf(res_name, "usb_ctrl%d", id);
> >> > +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> >> res_name);
> >> Avoid getting resource by name.. With dt, you wont be able to do
> >> those..
> >
> > When we are completely on DT then this would anyways go and we can
> > get these resource data for each usb port from DT APIs.
> 
> Even with dt, you will still get the resources using
> platform_get_resource() API's.. So why not have it that way from the
> beginning itself..

Ok got it. We will post an updated patch.

Ajay 
> 
> Thanks
> Kishon

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
  2012-07-10  6:20             ` Gupta, Ajay Kumar
@ 2012-07-10 10:44               ` Santhapuri, Damodar
  2012-07-11  7:03                 ` Gupta, Ajay Kumar
  0 siblings, 1 reply; 9+ messages in thread
From: Santhapuri, Damodar @ 2012-07-10 10:44 UTC (permalink / raw)
  To: Gupta, Ajay Kumar, ABRAHAM, KISHON VIJAY
  Cc: linux-usb, Balbi, Felipe, linux-omap


Hi,
> 
> Hi,
> > On Tue, Jul 10, 2012 at 11:35 AM, Gupta, Ajay Kumar <ajay.gupta@ti.com>
> > wrote:
> > > Hi,
> > >>
> > >> On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri <x0132156@ti.com>
> > >> wrote:
> > >> > From: Ajay Kumar Gupta <ajay.gupta@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: Damodar Santhapuri <x0132156@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            |   88
> > >> +++++++++++++++++++++++++------
> > >> >  4 files changed, 74 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 494772f..f7271c3 100644
> > >> > --- a/drivers/usb/musb/musb_dsps.c
> > >> > +++ b/drivers/usb/musb/musb_dsps.c
> > >> > @@ -115,9 +115,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
> > >> %s/seperate/separate
> > >> > + * control module
> > >> > + */
> > >> > +static void musb_dsps_phy_control(struct dsps_glue *glue, u8 on)
> > >> > +{
> > >> > +       u32 usbphycfg;
> > >> > +
> > >> > +       usbphycfg = __raw_readl(glue->usb_ctrl);
> > >>
> > >> How about using readl instead of __raw_readl here and below?
> > >> > +
> > >> > +       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);
> > >> only writel()?
> > >> > +}
> > >> > +/**
> > >> >   * dsps_musb_enable - enable interrupts
> > >> >   */
> > >> >  static void dsps_musb_enable(struct musb *musb)
> > >> > @@ -363,11 +400,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;
> > >> > @@ -395,8 +430,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;
> > >> >
> > >> > @@ -418,8 +452,6 @@ 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);
> > >> >
> > >> > @@ -427,8 +459,7 @@ static int dsps_musb_exit(struct musb *musb)
> > >> >                 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);
> > >> > @@ -460,6 +491,22 @@ 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 */
> > >> > +       sprintf(res_name, "usb_ctrl%d", id);
> > >> > +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> > >> res_name);
> > >> Avoid getting resource by name.. With dt, you wont be able to do
> > >> those..
> > >
> > > When we are completely on DT then this would anyways go and we can
> > > get these resource data for each usb port from DT APIs.
> >
> > Even with dt, you will still get the resources using
> > platform_get_resource() API's.. So why not have it that way from the
> > beginning itself..
> 
> Ok got it. We will post an updated patch.

Plalform_get_resource api works fine if we hardcode 3rd argument to 3+id for usb_cntrl register Since dsps_create_musb_pdev calls for each 
wrp->instances.

static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
{
	....
	....
        /* get memory resource for usb control register */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 3+id);
        dev_err(dev,"Damodar :usb ctrl%d res=%x\n",id,res->start);
        if (!res) {
                dev_err(dev, "%s get mem resource failed\n", res_name);
                ret = -ENODEV;
                goto err0;
        }
....
}

Damodar.
> 
> Ajay
> >
> > Thanks
> > Kishon

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 2/3] usb: musb: dsps: add phy control logic to glue
  2012-07-10 10:44               ` Santhapuri, Damodar
@ 2012-07-11  7:03                 ` Gupta, Ajay Kumar
  0 siblings, 0 replies; 9+ messages in thread
From: Gupta, Ajay Kumar @ 2012-07-11  7:03 UTC (permalink / raw)
  To: Santhapuri, Damodar, ABRAHAM, KISHON VIJAY
  Cc: linux-usb, Balbi, Felipe, linux-omap

Hi,
> > > >> On Mon, Jul 9, 2012 at 7:18 PM, Damodar Santhapuri
> <x0132156@ti.com>
[...]
> > > >> Avoid getting resource by name.. With dt, you wont be able to do
> > > >> those..
> > > >
> > > > When we are completely on DT then this would anyways go and we
> can
> > > > get these resource data for each usb port from DT APIs.
> > >
> > > Even with dt, you will still get the resources using
> > > platform_get_resource() API's.. So why not have it that way from
> the
> > > beginning itself..
> >
> > Ok got it. We will post an updated patch.
> 
> Plalform_get_resource api works fine if we hardcode 3rd argument to
> 3+id for usb_cntrl register Since dsps_create_musb_pdev calls for each
> wrp->instances.
> 
> static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8
> id)
> {
> 	....
> 	....
>         /* get memory resource for usb control register */
>         res = platform_get_resource(pdev, IORESOURCE_MEM, 3+id);
>         dev_err(dev,"Damodar :usb ctrl%d res=%x\n",id,res->start);
>         if (!res) {
>                 dev_err(dev, "%s get mem resource failed\n", res_name);
>                 ret = -ENODEV;
>                 goto err0;
>         }
> ....
> }

You can place the memory resources as 
{{usbss, .}, {musb0, .}, {usb0_ctrl, .}, {musb1, .}, {usb1_ctrl, .}}

and then use index as "2 * id + 2" to get the usbX_ctrl base address.

Ajay
> 
> Damodar.
> >
> > Ajay
> > >
> > > Thanks
> > > Kishon

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-07-11  7:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-09 13:48 [PATCH 1/3] arm: omap: hwmod: add new memory resource for usb phy cont Damodar Santhapuri
2012-07-09 13:48 ` [PATCH 2/3] usb: musb: dsps: add phy control logic to glue Damodar Santhapuri
     [not found]   ` <1341841690-23899-2-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
2012-07-09 14:46     ` ABRAHAM, KISHON VIJAY
     [not found]       ` <CAAe_U6+wYsiVOvYm8t4g8P5R4jWzBCQhC-XBfNVgM4GqWi-JLQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-07-10  6:05         ` Gupta, Ajay Kumar
2012-07-10  6:09           ` ABRAHAM, KISHON VIJAY
2012-07-10  6:20             ` Gupta, Ajay Kumar
2012-07-10 10:44               ` Santhapuri, Damodar
2012-07-11  7:03                 ` Gupta, Ajay Kumar
     [not found] ` <1341841690-23899-1-git-send-email-x0132156-l0cyMroinI0@public.gmane.org>
2012-07-09 13:48   ` [PATCH 3/3] usb: musb: dsps: enable phy control for am335x Damodar Santhapuri

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.