From patchwork Wed Aug 26 10:18:01 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Subbrathnam, Swaminathan" X-Patchwork-Id: 43914 Received: from comal.ext.ti.com (comal.ext.ti.com [198.47.26.152]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n7Q9p2gh011737 for ; Wed, 26 Aug 2009 09:51:02 GMT Received: from dlep33.itg.ti.com ([157.170.170.112]) by comal.ext.ti.com (8.13.7/8.13.7) with ESMTP id n7Q9nRBV012518; Wed, 26 Aug 2009 04:49:32 -0500 Received: from linux.omap.com (localhost [127.0.0.1]) by dlep33.itg.ti.com (8.13.7/8.13.7) with ESMTP id n7Q9nQqA027486; Wed, 26 Aug 2009 04:49:27 -0500 (CDT) Received: from linux.omap.com (localhost [127.0.0.1]) by linux.omap.com (Postfix) with ESMTP id 3410180627; Wed, 26 Aug 2009 04:49:26 -0500 (CDT) X-Original-To: davinci-linux-open-source@linux.davincidsp.com Delivered-To: davinci-linux-open-source@linux.davincidsp.com Received: from dbdp31.itg.ti.com (dbdp31.itg.ti.com [172.24.170.98]) by linux.omap.com (Postfix) with ESMTP id A426780626 for ; Wed, 26 Aug 2009 04:49:22 -0500 (CDT) Received: from localhost.localdomain (localhost [127.0.0.1]) by dbdp31.itg.ti.com (8.13.8/8.13.8) with ESMTP id n7Q9nJvq019412; Wed, 26 Aug 2009 15:19:20 +0530 (IST) From: Swaminathan S To: linux-usb@vger.kernel.org Date: Wed, 26 Aug 2009 15:48:01 +0530 Message-Id: <1251281881-13554-1-git-send-email-swami.iyer@ti.com> X-Mailer: git-send-email 1.6.0.rc1.64.g61192 Cc: davinci-linux-open-source@linux.davincidsp.com Subject: [PATCH] MUSB: Add support for DM646x USB. X-BeenThere: davinci-linux-open-source@linux.davincidsp.com X-Mailman-Version: 2.1.4 Precedence: list List-Id: davinci-linux-open-source.linux.davincidsp.com List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: davinci-linux-open-source-bounces@linux.davincidsp.com Errors-To: davinci-linux-open-source-bounces@linux.davincidsp.com DM646x USB controller is based on Mentor USB Controller (MUSB). This patch adds support for DM646x USB controller to the MUSB driver. DM646x USB controller doest not support OTG and hence the roles(Host/Device) need to be specified as part of Kernel compile and the same needs to be set up when DM646x boots up. The VBUS is controlled through a CPLD on the DM646x EVM. This patch implements the VBUS control accordingly. Signed-off-by: Swaminathan S --- --- drivers/usb/musb/davinci.c | 32 ++++++++++++++++++++++++-------- drivers/usb/musb/davinci.h | 6 ++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 6691381..87bbd7c 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c @@ -41,7 +41,7 @@ #include "musb_core.h" -#ifdef CONFIG_MACH_DAVINCI_EVM +#if defined(CONFIG_MACH_DAVINCI_EVM) || defined(CONFIG_MACH_DAVINCI_DM6467_EVM) #define GPIO_nVBUS_DRV 160 #endif @@ -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__ */