diff mbox

MUSB: Add support for DM646x USB.

Message ID 1250765117-22849-1-git-send-email-swami.iyer@ti.com (mailing list archive)
State Rejected
Headers show

Commit Message

Subbrathnam, Swaminathan Aug. 20, 2009, 10:45 a.m. UTC
Signed-off-by: Swaminathan S <swami.iyer@ti.com>

---
 drivers/usb/musb/davinci.c |   30 +++++++++++++++++++++++-------
 drivers/usb/musb/davinci.h |    6 ++++++
 2 files changed, 29 insertions(+), 7 deletions(-)

Comments

Kevin Hilman Aug. 25, 2009, 11:58 a.m. UTC | #1
Swaminathan S <swami.iyer@ti.com> writes:

Again, need a descriptive changelog please.

>  Signed-off-by: Swaminathan S <swami.iyer@ti.com>
>
> ---
>  drivers/usb/musb/davinci.c |   30 +++++++++++++++++++++++-------
>  drivers/usb/musb/davinci.h |    6 ++++++
>  2 files changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
> index 6691381..2b8345a 100644
> --- a/drivers/usb/musb/davinci.c
> +++ b/drivers/usb/musb/davinci.c
> @@ -65,6 +65,13 @@ static inline void phy_on(void)
>  	/* power everything up; start the on-chip PHY and its PLL */
>  	phy_ctrl &= ~(USBPHY_OSCPDWN | USBPHY_OTGPDWN | USBPHY_PHYPDWN);
>  	phy_ctrl |= USBPHY_SESNDEN | USBPHY_VBDTCTEN | USBPHY_PHYPLLON;
> +	if (cpu_is_davinci_dm646x()) {
> +		phy_ctrl |= USBPHY_NDATAPOL | USBPHY_SESSION_VBUS;
> +		phy_ctrl |= is_peripheral_enabled() ? USBPHY_PERI_USBID :
> +						phy_ctrl;
> +		phy_ctrl &= ~USBPHY_VBDTCTEN;
> +	}
> +
>  	__raw_writel(phy_ctrl, USB_PHY_CTRL);
>  
>  	/* wait for PLL to lock before proceeding */
> @@ -152,7 +159,7 @@ void musb_platform_disable(struct musb *musb)
>   * when J10 is out, and TI documents it as handling OTG.
>   */
>  
> -#ifdef CONFIG_MACH_DAVINCI_EVM
> +#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
>  
>  static int vbus_state = -1;
>  
> @@ -162,7 +169,12 @@ static int vbus_state = -1;
>   */
>  static void evm_deferred_drvvbus(struct work_struct *ignored)
>  {
> -	gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> +	if (machine_is_davinci_evm())
> +		gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> +
> +	if (machine_is_davinci_dm6467_evm())
> +		usb_vbus_control(vbus_state);
> +

OK, this I don't like.  The current hack of board-specific code in
this file was bad enought, but it's time to fix this instead of
extending the hack.

What we need is a board-specific vbus control function, defined in the
board files and passed in platform_data.

That will allow us to get rid of board-specific code from this file.

>  	vbus_state = !vbus_state;
>  }
>  
> @@ -170,7 +182,7 @@ static void evm_deferred_drvvbus(struct work_struct *ignored)
>  
>  static void davinci_source_power(struct musb *musb, int is_on, int immediate)
>  {
> -#ifdef CONFIG_MACH_DAVINCI_EVM
> +#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
>  	if (is_on)
>  		is_on = 1;
>  
> @@ -178,12 +190,16 @@ static void davinci_source_power(struct musb *musb, int is_on, int immediate)
>  		return;
>  	vbus_state = !is_on;		/* 0/1 vs "-1 == unknown/init" */
>  
> -	if (machine_is_davinci_evm()) {
> +	if (machine_is_davinci_evm() || machine_is_davinci_dm6467_evm()) {
>  		static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
>  
> -		if (immediate)
> -			gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> -		else
> +		if (immediate) {
> +			if (machine_is_davinci_evm())
> +				gpio_set_value_cansleep(GPIO_nVBUS_DRV,
> +							vbus_state);
> +			if (machine_is_davinci_dm6467_evm())
> +				usb_vbus_control(vbus_state);
> +		} else
>  			schedule_work(&evm_vbus_work);

ditto... we shouldn't have any machine_is_* code in this driver.

>  	}
>  	if (immediate)
> diff --git a/drivers/usb/musb/davinci.h b/drivers/usb/musb/davinci.h
> index 046c844..b802b83 100644
> --- a/drivers/usb/musb/davinci.h
> +++ b/drivers/usb/musb/davinci.h
> @@ -16,6 +16,9 @@
>  
>  /* Integrated highspeed/otg PHY */
>  #define USBPHY_CTL_PADDR	(DAVINCI_SYSTEM_MODULE_BASE + 0x34)
> +#define USBPHY_NDATAPOL		BIT(18)
> +#define USBPHY_SESSION_VBUS	BIT(17)
> +#define USBPHY_PERI_USBID	BIT(16)
>  #define USBPHY_DATAPOL		BIT(11)	/* (dm355) switch D+/D- */
>  #define USBPHY_PHYCLKGD		BIT(8)
>  #define USBPHY_SESNDEN		BIT(7)	/* v(sess_end) comparator */
> @@ -104,4 +107,7 @@
>  
>  #define DAVINCI_BASE_OFFSET		0x400
>  
> +#ifdef CONFIG_MACH_DAVINCI_DM6467_EVM
> +extern void usb_vbus_control(u8 on);
> +#endif

then this can disappear as well.

>  #endif	/* __MUSB_HDRDF_H__ */

Kevin
Subbrathnam, Swaminathan Aug. 26, 2009, 11:22 a.m. UTC | #2
Kevin,
	I will re-organize the vbus control as suggested as a separate patch.
	
	It will have to be tested across DaVinci, OMAP platforms (probably Blackfin) as at that point it will be a generic way of controlling the Vbus line.

Regards
swami

-----Original Message-----
From: Kevin Hilman [mailto:khilman@deeprootsystems.com] 
Sent: Tuesday, August 25, 2009 5:29 PM
To: Subbrathnam, Swaminathan
Cc: linux-usb@vger.kernel.org; davinci-linux-open-source@linux.davincidsp.com
Subject: Re: [PATCH] MUSB: Add support for DM646x USB.

Swaminathan S <swami.iyer@ti.com> writes:

Again, need a descriptive changelog please.

>  Signed-off-by: Swaminathan S <swami.iyer@ti.com>
>
> ---
>  drivers/usb/musb/davinci.c |   30 +++++++++++++++++++++++-------
>  drivers/usb/musb/davinci.h |    6 ++++++
>  2 files changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
> index 6691381..2b8345a 100644
> --- a/drivers/usb/musb/davinci.c
> +++ b/drivers/usb/musb/davinci.c
> @@ -65,6 +65,13 @@ static inline void phy_on(void)
>  	/* power everything up; start the on-chip PHY and its PLL */
>  	phy_ctrl &= ~(USBPHY_OSCPDWN | USBPHY_OTGPDWN | USBPHY_PHYPDWN);
>  	phy_ctrl |= USBPHY_SESNDEN | USBPHY_VBDTCTEN | USBPHY_PHYPLLON;
> +	if (cpu_is_davinci_dm646x()) {
> +		phy_ctrl |= USBPHY_NDATAPOL | USBPHY_SESSION_VBUS;
> +		phy_ctrl |= is_peripheral_enabled() ? USBPHY_PERI_USBID :
> +						phy_ctrl;
> +		phy_ctrl &= ~USBPHY_VBDTCTEN;
> +	}
> +
>  	__raw_writel(phy_ctrl, USB_PHY_CTRL);
>  
>  	/* wait for PLL to lock before proceeding */
> @@ -152,7 +159,7 @@ void musb_platform_disable(struct musb *musb)
>   * when J10 is out, and TI documents it as handling OTG.
>   */
>  
> -#ifdef CONFIG_MACH_DAVINCI_EVM
> +#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
>  
>  static int vbus_state = -1;
>  
> @@ -162,7 +169,12 @@ static int vbus_state = -1;
>   */
>  static void evm_deferred_drvvbus(struct work_struct *ignored)
>  {
> -	gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> +	if (machine_is_davinci_evm())
> +		gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> +
> +	if (machine_is_davinci_dm6467_evm())
> +		usb_vbus_control(vbus_state);
> +

OK, this I don't like.  The current hack of board-specific code in
this file was bad enought, but it's time to fix this instead of
extending the hack.

What we need is a board-specific vbus control function, defined in the
board files and passed in platform_data.

That will allow us to get rid of board-specific code from this file.

>  	vbus_state = !vbus_state;
>  }
>  
> @@ -170,7 +182,7 @@ static void evm_deferred_drvvbus(struct work_struct *ignored)
>  
>  static void davinci_source_power(struct musb *musb, int is_on, int immediate)
>  {
> -#ifdef CONFIG_MACH_DAVINCI_EVM
> +#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
>  	if (is_on)
>  		is_on = 1;
>  
> @@ -178,12 +190,16 @@ static void davinci_source_power(struct musb *musb, int is_on, int immediate)
>  		return;
>  	vbus_state = !is_on;		/* 0/1 vs "-1 == unknown/init" */
>  
> -	if (machine_is_davinci_evm()) {
> +	if (machine_is_davinci_evm() || machine_is_davinci_dm6467_evm()) {
>  		static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
>  
> -		if (immediate)
> -			gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
> -		else
> +		if (immediate) {
> +			if (machine_is_davinci_evm())
> +				gpio_set_value_cansleep(GPIO_nVBUS_DRV,
> +							vbus_state);
> +			if (machine_is_davinci_dm6467_evm())
> +				usb_vbus_control(vbus_state);
> +		} else
>  			schedule_work(&evm_vbus_work);

ditto... we shouldn't have any machine_is_* code in this driver.

>  	}
>  	if (immediate)
> diff --git a/drivers/usb/musb/davinci.h b/drivers/usb/musb/davinci.h
> index 046c844..b802b83 100644
> --- a/drivers/usb/musb/davinci.h
> +++ b/drivers/usb/musb/davinci.h
> @@ -16,6 +16,9 @@
>  
>  /* Integrated highspeed/otg PHY */
>  #define USBPHY_CTL_PADDR	(DAVINCI_SYSTEM_MODULE_BASE + 0x34)
> +#define USBPHY_NDATAPOL		BIT(18)
> +#define USBPHY_SESSION_VBUS	BIT(17)
> +#define USBPHY_PERI_USBID	BIT(16)
>  #define USBPHY_DATAPOL		BIT(11)	/* (dm355) switch D+/D- */
>  #define USBPHY_PHYCLKGD		BIT(8)
>  #define USBPHY_SESNDEN		BIT(7)	/* v(sess_end) comparator */
> @@ -104,4 +107,7 @@
>  
>  #define DAVINCI_BASE_OFFSET		0x400
>  
> +#ifdef CONFIG_MACH_DAVINCI_DM6467_EVM
> +extern void usb_vbus_control(u8 on);
> +#endif

then this can disappear as well.

>  #endif	/* __MUSB_HDRDF_H__ */

Kevin
diff mbox

Patch

diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index 6691381..2b8345a 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -65,6 +65,13 @@  static inline void phy_on(void)
 	/* power everything up; start the on-chip PHY and its PLL */
 	phy_ctrl &= ~(USBPHY_OSCPDWN | USBPHY_OTGPDWN | USBPHY_PHYPDWN);
 	phy_ctrl |= USBPHY_SESNDEN | USBPHY_VBDTCTEN | USBPHY_PHYPLLON;
+	if (cpu_is_davinci_dm646x()) {
+		phy_ctrl |= USBPHY_NDATAPOL | USBPHY_SESSION_VBUS;
+		phy_ctrl |= is_peripheral_enabled() ? USBPHY_PERI_USBID :
+						phy_ctrl;
+		phy_ctrl &= ~USBPHY_VBDTCTEN;
+	}
+
 	__raw_writel(phy_ctrl, USB_PHY_CTRL);
 
 	/* wait for PLL to lock before proceeding */
@@ -152,7 +159,7 @@  void musb_platform_disable(struct musb *musb)
  * when J10 is out, and TI documents it as handling OTG.
  */
 
-#ifdef CONFIG_MACH_DAVINCI_EVM
+#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
 
 static int vbus_state = -1;
 
@@ -162,7 +169,12 @@  static int vbus_state = -1;
  */
 static void evm_deferred_drvvbus(struct work_struct *ignored)
 {
-	gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
+	if (machine_is_davinci_evm())
+		gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
+
+	if (machine_is_davinci_dm6467_evm())
+		usb_vbus_control(vbus_state);
+
 	vbus_state = !vbus_state;
 }
 
@@ -170,7 +182,7 @@  static void evm_deferred_drvvbus(struct work_struct *ignored)
 
 static void davinci_source_power(struct musb *musb, int is_on, int immediate)
 {
-#ifdef CONFIG_MACH_DAVINCI_EVM
+#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM)
 	if (is_on)
 		is_on = 1;
 
@@ -178,12 +190,16 @@  static void davinci_source_power(struct musb *musb, int is_on, int immediate)
 		return;
 	vbus_state = !is_on;		/* 0/1 vs "-1 == unknown/init" */
 
-	if (machine_is_davinci_evm()) {
+	if (machine_is_davinci_evm() || machine_is_davinci_dm6467_evm()) {
 		static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
 
-		if (immediate)
-			gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
-		else
+		if (immediate) {
+			if (machine_is_davinci_evm())
+				gpio_set_value_cansleep(GPIO_nVBUS_DRV,
+							vbus_state);
+			if (machine_is_davinci_dm6467_evm())
+				usb_vbus_control(vbus_state);
+		} else
 			schedule_work(&evm_vbus_work);
 	}
 	if (immediate)
diff --git a/drivers/usb/musb/davinci.h b/drivers/usb/musb/davinci.h
index 046c844..b802b83 100644
--- a/drivers/usb/musb/davinci.h
+++ b/drivers/usb/musb/davinci.h
@@ -16,6 +16,9 @@ 
 
 /* Integrated highspeed/otg PHY */
 #define USBPHY_CTL_PADDR	(DAVINCI_SYSTEM_MODULE_BASE + 0x34)
+#define USBPHY_NDATAPOL		BIT(18)
+#define USBPHY_SESSION_VBUS	BIT(17)
+#define USBPHY_PERI_USBID	BIT(16)
 #define USBPHY_DATAPOL		BIT(11)	/* (dm355) switch D+/D- */
 #define USBPHY_PHYCLKGD		BIT(8)
 #define USBPHY_SESNDEN		BIT(7)	/* v(sess_end) comparator */
@@ -104,4 +107,7 @@ 
 
 #define DAVINCI_BASE_OFFSET		0x400
 
+#ifdef CONFIG_MACH_DAVINCI_DM6467_EVM
+extern void usb_vbus_control(u8 on);
+#endif
 #endif	/* __MUSB_HDRDF_H__ */