linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x
@ 2011-10-11 11:26 Ajay Kumar Gupta
  2011-10-11 11:26 ` [PATCH 1/8] omap: musb: Adding support for ti81xx Ajay Kumar Gupta
                   ` (5 more replies)
  0 siblings, 6 replies; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	Ajay Kumar Gupta

This patch set adds support for musb interface for TI81XX and AM33XX
platforms and are dependent on recent patch series from Hemant Pedanekar
at [1] and [2] and Vaibhav Hiremath at [3]

TI81XX and AM33XX platform has dual musb instances, uses CPPI4.1 DMA and
has built in usb PHY. The current set of patches supports only the first
interface and in PIO mode.

[1] http://marc.info/?l=linux-omap&m=131411961308438&w=2
[2] http://marc.info/?l=linux-omap&m=131821081227729&w=2
[3] http://marc.info/?l=linux-omap&m=131652916305543&w=2

Changes from v3 for TI81xx:
	- Dropped hwmod data patch as that will be submitted along with
	  Hemant's hwmod baseport patches.
	- Added ioremap and iounmap for accessing SCM register
Changes from v1 for AM33xx:
	- Used cpu_is_am33xx() instead of cpu_is_am335x() to cover wider
	  wider range of devices.
	- Removed unneeded parens. 

Ajay Kumar Gupta (4):
  omap: musb: ti81xx: Add phy power function
  arm: omap: am335x: enable phy controls
  usb: musb: enable support for am335x
  am335xevm: Add support for musb interface

Ravi Babu (4):
  omap: musb: Adding support for ti81xx
  ti816evm: Add support for musb interface
  ti814evm: Add support for musb interface
  usb: musb: Add support for ti81xx platform

 arch/arm/mach-omap2/board-am335xevm.c   |    9 +
 arch/arm/mach-omap2/board-ti8148evm.c   |    9 +
 arch/arm/mach-omap2/board-ti8168evm.c   |    9 +
 arch/arm/mach-omap2/omap_phy_internal.c |   42 ++
 arch/arm/mach-omap2/usb-musb.c          |    3 +
 arch/arm/plat-omap/include/plat/usb.h   |   32 ++
 drivers/usb/musb/Kconfig                |    6 +
 drivers/usb/musb/Makefile               |    1 +
 drivers/usb/musb/musb_core.c            |    4 +-
 drivers/usb/musb/musb_dsps.c            |  693 +++++++++++++++++++++++++++++++
 10 files changed, 807 insertions(+), 1 deletions(-)
 create mode 100644 drivers/usb/musb/musb_dsps.c

--
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] 20+ messages in thread

* [PATCH 1/8] omap: musb: Adding support for ti81xx
  2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
@ 2011-10-11 11:26 ` Ajay Kumar Gupta
       [not found]   ` <1318332369-9732-2-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
       [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb; +Cc: linux-omap, balbi, Ravi Babu, Ajay Kumar Gupta

From: Ravi Babu <ravibabu@ti.com>

Added musb support for ti81xx platform which has two instances of musb
interface and uses CPPI4.1 DMA. The current patch set adds support for
single instance and in PIO mode only.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Ravi Babu <ravibabu@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
 arch/arm/mach-omap2/usb-musb.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c
index a65145b..8bceeca 100644
--- a/arch/arm/mach-omap2/usb-musb.c
+++ b/arch/arm/mach-omap2/usb-musb.c
@@ -143,6 +143,9 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
 	if (cpu_is_omap3517() || cpu_is_omap3505()) {
 		oh_name = "am35x_otg_hs";
 		name = "musb-am35x";
+	} else if (cpu_is_ti81xx()) {
+		oh_name = "usb_otg_hs";
+		name = "musb-ti81xx";
 	} else {
 		oh_name = "usb_otg_hs";
 		name = "musb-omap2430";
-- 
1.6.2.4


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

* [PATCH 2/8] omap: musb: ti81xx: Add phy power function
       [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
@ 2011-10-11 11:26   ` Ajay Kumar Gupta
       [not found]     ` <1318332369-9732-3-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
  2011-10-11 11:26   ` [PATCH 5/8] usb: musb: Add support for ti81xx platform Ajay Kumar Gupta
  2011-10-11 11:26   ` [PATCH 8/8] usb: musb: enable support for am335x Ajay Kumar Gupta
  2 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	Ajay Kumar Gupta, Ravi Babu

Adding ti81xx_musb_phy_power() which will be used by musb driver through
its function pointer in board_data.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
Signed-off-by: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
---
Changes from v3:
	- Added ioremap and inumap for SCM register access instead of using
	  omap_ctrl_read/write.

 arch/arm/mach-omap2/omap_phy_internal.c |   35 +++++++++++++++++++++++++++++++
 arch/arm/plat-omap/include/plat/usb.h   |   32 ++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c
index 58775e3..4c90477 100644
--- a/arch/arm/mach-omap2/omap_phy_internal.c
+++ b/arch/arm/mach-omap2/omap_phy_internal.c
@@ -260,3 +260,38 @@ 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 17d3c93..c616385 100644
--- a/arch/arm/plat-omap/include/plat/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -114,6 +114,7 @@ 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);
 
 /*
  * FIXME correct answer depends on hmc_mode,
@@ -273,6 +274,37 @@ static inline void omap2_usbfs_init(struct omap_usb_config *pdata)
 #define CONF2_OTGPWRDN		(1 << 2)
 #define CONF2_DATPOL		(1 << 1)
 
+/* TI81XX specific definitions */
+#define USBCTRL0	0x620
+#define USBSTAT0	0x624
+
+/* TI816X PHY controls bits */
+#define TI816X_USBPHY0_NORMAL_MODE	(1 << 0)
+#define TI816X_USBPHY_REFCLK_OSC	(1 << 8)
+
+/* TI814X PHY controls bits */
+#define USBPHY_CM_PWRDN		(1 << 0)
+#define USBPHY_OTG_PWRDN	(1 << 1)
+#define USBPHY_CHGDET_DIS	(1 << 2)
+#define USBPHY_CHGDET_RSTRT	(1 << 3)
+#define USBPHY_SRCONDM		(1 << 4)
+#define USBPHY_SINKONDP		(1 << 5)
+#define USBPHY_CHGISINK_EN	(1 << 6)
+#define USBPHY_CHGVSRC_EN	(1 << 7)
+#define USBPHY_DMPULLUP		(1 << 8)
+#define USBPHY_DPPULLUP		(1 << 9)
+#define USBPHY_CDET_EXTCTL	(1 << 10)
+#define USBPHY_GPIO_MODE	(1 << 12)
+#define USBPHY_DPOPBUFCTL	(1 << 13)
+#define USBPHY_DMOPBUFCTL	(1 << 14)
+#define USBPHY_DPINPUT		(1 << 15)
+#define USBPHY_DMINPUT		(1 << 16)
+#define USBPHY_DPGPIO_PD	(1 << 17)
+#define USBPHY_DMGPIO_PD	(1 << 18)
+#define USBPHY_OTGVDET_EN	(1 << 19)
+#define USBPHY_OTGSESSEND_EN	(1 << 20)
+#define USBPHY_DATA_POLARITY	(1 << 23)
+
 #if defined(CONFIG_ARCH_OMAP1) && defined(CONFIG_USB)
 u32 omap1_usb0_init(unsigned nwires, unsigned is_device);
 u32 omap1_usb1_init(unsigned nwires);
-- 
1.6.2.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] 20+ messages in thread

* [PATCH 3/8] ti816evm: Add support for musb interface
  2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
  2011-10-11 11:26 ` [PATCH 1/8] omap: musb: Adding support for ti81xx Ajay Kumar Gupta
       [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
@ 2011-10-11 11:26 ` Ajay Kumar Gupta
  2011-10-11 12:08   ` Igor Grinberg
  2011-10-11 11:26 ` [PATCH 4/8] ti814evm: " Ajay Kumar Gupta
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb; +Cc: linux-omap, balbi, Ravi Babu, Ajay Kumar Gupta

From: Ravi Babu <ravibabu@ti.com>

Adding musb support in ti816 EVM board file.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Ravi Babu <ravibabu@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
 arch/arm/mach-omap2/board-ti8168evm.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c
index 2c243df..1f3d423 100644
--- a/arch/arm/mach-omap2/board-ti8168evm.c
+++ b/arch/arm/mach-omap2/board-ti8168evm.c
@@ -23,6 +23,14 @@
 #include <plat/irqs.h>
 #include <plat/board.h>
 #include <plat/common.h>
+#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,
+};
 
 static struct omap_board_config_kernel ti8168_evm_config[] __initdata = {
 };
@@ -33,6 +41,7 @@ static void __init ti8168_evm_init(void)
 	omap_sdrc_init(NULL, NULL);
 	omap_board_config = ti8168_evm_config;
 	omap_board_config_size = ARRAY_SIZE(ti8168_evm_config);
+	usb_musb_init(&musb_board_data);
 }
 
 static void __init ti8168_evm_map_io(void)
-- 
1.6.2.4


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

* [PATCH 4/8] ti814evm: Add support for musb interface
  2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
                   ` (2 preceding siblings ...)
  2011-10-11 11:26 ` [PATCH 3/8] ti816evm: Add support for musb interface Ajay Kumar Gupta
@ 2011-10-11 11:26 ` Ajay Kumar Gupta
  2011-10-11 11:55   ` Igor Grinberg
  2011-10-11 11:26 ` [PATCH 6/8] am335xevm: " Ajay Kumar Gupta
  2011-10-11 11:26 ` [PATCH 7/8] arm: omap: am335x: enable phy controls Ajay Kumar Gupta
  5 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb; +Cc: linux-omap, balbi, Ravi Babu, Ajay Kumar Gupta

From: Ravi Babu <ravibabu@ti.com>

Adding musb support in ti814 EVM board file.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Ravi Babu <ravibabu@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
 arch/arm/mach-omap2/board-ti8148evm.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-ti8148evm.c b/arch/arm/mach-omap2/board-ti8148evm.c
index 5f0280e..03c85dd 100644
--- a/arch/arm/mach-omap2/board-ti8148evm.c
+++ b/arch/arm/mach-omap2/board-ti8148evm.c
@@ -23,6 +23,14 @@
 #include <plat/irqs.h>
 #include <plat/board.h>
 #include <plat/common.h>
+#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,
+};
 
 static struct omap_board_config_kernel ti8148_evm_config[] __initdata = {
 };
@@ -38,6 +46,7 @@ static void __init ti8148_evm_init(void)
 	omap_sdrc_init(NULL, NULL);
 	omap_board_config = ti8148_evm_config;
 	omap_board_config_size = ARRAY_SIZE(ti8148_evm_config);
+	usb_musb_init(&musb_board_data);
 }
 
 static void __init ti8148_evm_map_io(void)
-- 
1.6.2.4


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

* [PATCH 5/8] usb: musb: Add support for ti81xx platform
       [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
  2011-10-11 11:26   ` [PATCH 2/8] omap: musb: ti81xx: Add phy power function Ajay Kumar Gupta
@ 2011-10-11 11:26   ` Ajay Kumar Gupta
  2011-12-12 18:49     ` Tony Lindgren
  2011-10-11 11:26   ` [PATCH 8/8] usb: musb: enable support for am335x Ajay Kumar Gupta
  2 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, Ravi Babu,
	Ajay Kumar Gupta

From: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>

TI81XX platform has two musb interfaces and uses CPPI4.1 DMA engine.
It has builtin USB PHYs as AM35x. The current set of patches adds support
for one instance and only in PIO mode.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
Signed-off-by: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
---
Same as v3. dropping <plat/usb.h> will be done in a
seperate patch as discussed in the list.

 drivers/usb/musb/Kconfig     |    6 +
 drivers/usb/musb/Makefile    |    1 +
 drivers/usb/musb/musb_core.c |    4 +-
 drivers/usb/musb/musb_dsps.c |  693 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 703 insertions(+), 1 deletions(-)
 create mode 100644 drivers/usb/musb/musb_dsps.c

diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
index fc34b8b..d6abdec 100644
--- a/drivers/usb/musb/Kconfig
+++ b/drivers/usb/musb/Kconfig
@@ -8,6 +8,7 @@ config USB_MUSB_HDRC
 	depends on USB && USB_GADGET
 	depends on (ARM || (BF54x && !BF544) || (BF52x && !BF522 && !BF523))
 	select NOP_USB_XCEIV if (ARCH_DAVINCI || MACH_OMAP3EVM || BLACKFIN)
+	select NOP_USB_XCEIV if SOC_OMAPTI81XX
 	select TWL4030_USB if MACH_OMAP_3430SDP
 	select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
 	select USB_OTG_UTILS
@@ -54,6 +55,10 @@ config USB_MUSB_AM35X
 	tristate "AM35x"
 	depends on ARCH_OMAP
 
+config USB_MUSB_DSPS
+	tristate "TI DSPS platforms"
+	depends on SOC_OMAPTI81XX
+
 config USB_MUSB_BLACKFIN
 	tristate "Blackfin"
 	depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523)
@@ -68,6 +73,7 @@ config MUSB_PIO_ONLY
 	bool 'Disable DMA (always use PIO)'
 	depends on USB_MUSB_HDRC
 	default USB_MUSB_TUSB6010 || USB_MUSB_DA8XX || USB_MUSB_AM35X
+	default SOC_OMAPTI81XX
 	help
 	  All data is copied between memory and FIFO by the CPU.
 	  DMA controllers are ignored.
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
index d8fd9d0..d92d110 100644
--- a/drivers/usb/musb/Makefile
+++ b/drivers/usb/musb/Makefile
@@ -13,6 +13,7 @@ musb_hdrc-$(CONFIG_DEBUG_FS)			+= musb_debugfs.o
 # Hardware Glue Layer
 obj-$(CONFIG_USB_MUSB_OMAP2PLUS)		+= omap2430.o
 obj-$(CONFIG_USB_MUSB_AM35X)			+= am35x.o
+obj-$(CONFIG_USB_MUSB_DSPS)			+= musb_dsps.o
 obj-$(CONFIG_USB_MUSB_TUSB6010)			+= tusb6010.o
 obj-$(CONFIG_USB_MUSB_DAVINCI)			+= davinci.o
 obj-$(CONFIG_USB_MUSB_DA8XX)			+= da8xx.o
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 20a2873..b04790d 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -1014,7 +1014,9 @@ static void musb_shutdown(struct platform_device *pdev)
 	|| defined(CONFIG_USB_MUSB_OMAP2PLUS)		\
 	|| defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE)	\
 	|| defined(CONFIG_USB_MUSB_AM35X)		\
-	|| defined(CONFIG_USB_MUSB_AM35X_MODULE)
+	|| defined(CONFIG_USB_MUSB_AM35X_MODULE)	\
+	|| defined(CONFIG_USB_MUSB_DSPS)		\
+	|| defined(CONFIG_USB_MUSB_DSPS_MODULE)
 static ushort __initdata fifo_mode = 4;
 #elif defined(CONFIG_USB_MUSB_UX500)			\
 	|| defined(CONFIG_USB_MUSB_UX500_MODULE)
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
new file mode 100644
index 0000000..fb59e34
--- /dev/null
+++ b/drivers/usb/musb/musb_dsps.c
@@ -0,0 +1,693 @@
+/*
+ * Texas Instruments DSPS platforms "glue layer"
+ *
+ * Copyright (C) 2011, by Texas Instruments
+ *
+ * Based on the am35x "glue layer" code.
+ *
+ * This file is part of the Inventra Controller Driver for Linux.
+ *
+ * The Inventra Controller Driver for Linux is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU
+ * General Public License version 2 as published by the Free Software
+ * Foundation.
+ *
+ * The Inventra Controller Driver for Linux is distributed in
+ * the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with The Inventra Controller Driver for Linux ; if not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place,
+ * Suite 330, Boston, MA  02111-1307  USA
+ *
+ * musb_dsps.c will be a common file for all the TI DSPS platforms
+ * such as dm64x, dm36x, dm35x, da8x, am35x and ti81x.
+ * For now only ti81x is using this and in future davinci.c, am35x.c
+ * da8xx.c would be merged to this file after testing.
+ */
+
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/pm_runtime.h>
+
+#include <plat/usb.h>
+
+#include "musb_core.h"
+
+/**
+ * avoid using musb_readx()/musb_writex() as glue layer should not be
+ * dependent on musb core layer symbols.
+ */
+static inline u8 dsps_readb(const void __iomem *addr, unsigned offset)
+	{ return __raw_readb(addr + offset); }
+
+static inline u32 dsps_readl(const void __iomem *addr, unsigned offset)
+	{ return __raw_readl(addr + offset); }
+
+static inline void dsps_writeb(void __iomem *addr, unsigned offset, u8 data)
+	{ __raw_writeb(data, addr + offset); }
+
+static inline void dsps_writel(void __iomem *addr, unsigned offset, u32 data)
+	{ __raw_writel(data, addr + offset); }
+
+/**
+ * DSPS musb wrapper register offset.
+ * FIXME: This should be expanded to have all the wrapper registers from TI DSPS
+ * musb ips.
+ */
+struct dsps_musb_wrapper {
+	u16	revision;
+	u16	control;
+	u16	status;
+	u16	eoi;
+	u16	epintr_set;
+	u16	epintr_clear;
+	u16	epintr_status;
+	u16	coreintr_set;
+	u16	coreintr_clear;
+	u16	coreintr_status;
+	u16	phy_utmi;
+	u16	mode;
+
+	/* bit positions for control */
+	unsigned	reset:5;
+
+	/* bit positions for interrupt */
+	unsigned	usb_shift:5;
+	u32		usb_mask;
+	u32		usb_bitmap;
+	unsigned	drvvbus:5;
+
+	unsigned	txep_shift:5;
+	u32		txep_mask;
+	u32		txep_bitmap;
+
+	unsigned	rxep_shift:5;
+	u32		rxep_mask;
+	u32		rxep_bitmap;
+
+	/* bit positions for phy_utmi */
+	unsigned	otg_disable:5;
+
+	/* bit positions for mode */
+	unsigned	iddig:5;
+	/* miscellaneous stuff */
+	u32		musb_core_offset;
+	u8		poll_seconds;
+};
+
+/**
+ * DSPS glue structure.
+ */
+struct dsps_glue {
+	struct device *dev;
+	struct platform_device *musb;	/* child musb pdev */
+	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
+	struct timer_list timer;	/* otg_workaround timer */
+};
+
+/**
+ * dsps_musb_enable - enable interrupts
+ */
+static void dsps_musb_enable(struct musb *musb)
+{
+	struct device *dev = musb->controller;
+	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;
+	void __iomem *reg_base = musb->ctrl_base;
+	u32 epmask, coremask;
+
+	/* Workaround: setup IRQs through both register sets. */
+	epmask = ((musb->epmask & wrp->txep_mask) << wrp->txep_shift) |
+	       ((musb->epmask & wrp->rxep_mask) << wrp->rxep_shift);
+	coremask = (wrp->usb_bitmap & ~MUSB_INTR_SOF);
+
+	dsps_writel(reg_base, wrp->epintr_set, epmask);
+	dsps_writel(reg_base, wrp->coreintr_set, coremask);
+	/* Force the DRVVBUS IRQ so we can start polling for ID change. */
+	if (is_otg_enabled(musb))
+		dsps_writel(reg_base, wrp->coreintr_set,
+			    (1 << wrp->drvvbus) << wrp->usb_shift);
+}
+
+/**
+ * dsps_musb_disable - disable HDRC and flush interrupts
+ */
+static void dsps_musb_disable(struct musb *musb)
+{
+	struct device *dev = musb->controller;
+	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;
+	void __iomem *reg_base = musb->ctrl_base;
+
+	dsps_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap);
+	dsps_writel(reg_base, wrp->epintr_clear,
+			 wrp->txep_bitmap | wrp->rxep_bitmap);
+	dsps_writeb(musb->mregs, MUSB_DEVCTL, 0);
+	dsps_writel(reg_base, wrp->eoi, 0);
+}
+
+static void otg_timer(unsigned long _musb)
+{
+	struct musb *musb = (void *)_musb;
+	void __iomem *mregs = musb->mregs;
+	struct device *dev = musb->controller;
+	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;
+	u8 devctl;
+	unsigned long flags;
+
+	/*
+	 * We poll because DSPS IP's won't expose several OTG-critical
+	 * status change events (from the transceiver) otherwise.
+	 */
+	devctl = dsps_readb(mregs, MUSB_DEVCTL);
+	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
+				otg_state_string(musb->xceiv->state));
+
+	spin_lock_irqsave(&musb->lock, flags);
+	switch (musb->xceiv->state) {
+	case OTG_STATE_A_WAIT_BCON:
+		devctl &= ~MUSB_DEVCTL_SESSION;
+		dsps_writeb(musb->mregs, MUSB_DEVCTL, devctl);
+
+		devctl = dsps_readb(musb->mregs, MUSB_DEVCTL);
+		if (devctl & MUSB_DEVCTL_BDEVICE) {
+			musb->xceiv->state = OTG_STATE_B_IDLE;
+			MUSB_DEV_MODE(musb);
+		} else {
+			musb->xceiv->state = OTG_STATE_A_IDLE;
+			MUSB_HST_MODE(musb);
+		}
+		break;
+	case OTG_STATE_A_WAIT_VFALL:
+		musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+		dsps_writel(musb->ctrl_base, wrp->coreintr_set,
+			    MUSB_INTR_VBUSERROR << wrp->usb_shift);
+		break;
+	case OTG_STATE_B_IDLE:
+		if (!is_peripheral_enabled(musb))
+			break;
+
+		devctl = dsps_readb(mregs, MUSB_DEVCTL);
+		if (devctl & MUSB_DEVCTL_BDEVICE)
+			mod_timer(&glue->timer,
+					jiffies + wrp->poll_seconds * HZ);
+		else
+			musb->xceiv->state = OTG_STATE_A_IDLE;
+		break;
+	default:
+		break;
+	}
+	spin_unlock_irqrestore(&musb->lock, flags);
+}
+
+static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
+{
+	struct device *dev = musb->controller;
+	struct platform_device *pdev = to_platform_device(dev->parent);
+	struct dsps_glue *glue = platform_get_drvdata(pdev);
+	static unsigned long last_timer;
+
+	if (!is_otg_enabled(musb))
+		return;
+
+	if (timeout == 0)
+		timeout = jiffies + msecs_to_jiffies(3);
+
+	/* Never idle if active, or when VBUS timeout is not set as host */
+	if (musb->is_active || (musb->a_wait_bcon == 0 &&
+				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
+		dev_dbg(musb->controller, "%s active, deleting timer\n",
+				otg_state_string(musb->xceiv->state));
+		del_timer(&glue->timer);
+		last_timer = jiffies;
+		return;
+	}
+
+	if (time_after(last_timer, timeout) && timer_pending(&glue->timer)) {
+		dev_dbg(musb->controller,
+			"Longer idle timer already pending, ignoring...\n");
+		return;
+	}
+	last_timer = timeout;
+
+	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
+		otg_state_string(musb->xceiv->state),
+			jiffies_to_msecs(timeout - jiffies));
+	mod_timer(&glue->timer, timeout);
+}
+
+static irqreturn_t dsps_interrupt(int irq, void *hci)
+{
+	struct musb  *musb = hci;
+	void __iomem *reg_base = musb->ctrl_base;
+	struct device *dev = musb->controller;
+	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;
+	unsigned long flags;
+	irqreturn_t ret = IRQ_NONE;
+	u32 epintr, usbintr;
+
+	spin_lock_irqsave(&musb->lock, flags);
+
+	/* Get endpoint interrupts */
+	epintr = dsps_readl(reg_base, wrp->epintr_status);
+	musb->int_rx = (epintr & wrp->rxep_bitmap) >> wrp->rxep_shift;
+	musb->int_tx = (epintr & wrp->txep_bitmap) >> wrp->txep_shift;
+
+	if (epintr)
+		dsps_writel(reg_base, wrp->epintr_status, epintr);
+
+	/* Get usb core interrupts */
+	usbintr = dsps_readl(reg_base, wrp->coreintr_status);
+	if (!usbintr && !epintr)
+		goto eoi;
+
+	musb->int_usb =	(usbintr & wrp->usb_bitmap) >> wrp->usb_shift;
+	if (usbintr)
+		dsps_writel(reg_base, wrp->coreintr_status, usbintr);
+
+	dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
+			usbintr, epintr);
+	/*
+	 * DRVVBUS IRQs are the only proxy we have (a very poor one!) for
+	 * DSPS IP's missing ID change IRQ.  We need an ID change IRQ to
+	 * switch appropriately between halves of the OTG state machine.
+	 * Managing DEVCTL.SESSION per Mentor docs requires that we know its
+	 * value but DEVCTL.BDEVICE is invalid without DEVCTL.SESSION set.
+	 * Also, DRVVBUS pulses for SRP (but not at 5V) ...
+	 */
+	if ((usbintr & MUSB_INTR_BABBLE) && is_host_enabled(musb))
+		pr_info("CAUTION: musb: Babble Interrupt Occured\n");
+
+	if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) {
+		int drvvbus = dsps_readl(reg_base, wrp->status);
+		void __iomem *mregs = musb->mregs;
+		u8 devctl = dsps_readb(mregs, MUSB_DEVCTL);
+		int err;
+
+		err = is_host_enabled(musb) && (musb->int_usb &
+						MUSB_INTR_VBUSERROR);
+		if (err) {
+			/*
+			 * The Mentor core doesn't debounce VBUS as needed
+			 * to cope with device connect current spikes. This
+			 * means it's not uncommon for bus-powered devices
+			 * to get VBUS errors during enumeration.
+			 *
+			 * This is a workaround, but newer RTL from Mentor
+			 * seems to allow a better one: "re"-starting sessions
+			 * without waiting for VBUS to stop registering in
+			 * devctl.
+			 */
+			musb->int_usb &= ~MUSB_INTR_VBUSERROR;
+			musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
+			mod_timer(&glue->timer,
+					jiffies + wrp->poll_seconds * HZ);
+			WARNING("VBUS error workaround (delay coming)\n");
+		} else if (is_host_enabled(musb) && drvvbus) {
+			musb->is_active = 1;
+			MUSB_HST_MODE(musb);
+			musb->xceiv->default_a = 1;
+			musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
+			del_timer(&glue->timer);
+		} else {
+			musb->is_active = 0;
+			MUSB_DEV_MODE(musb);
+			musb->xceiv->default_a = 0;
+			musb->xceiv->state = OTG_STATE_B_IDLE;
+		}
+
+		/* NOTE: this must complete power-on within 100 ms. */
+		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
+				drvvbus ? "on" : "off",
+				otg_state_string(musb->xceiv->state),
+				err ? " ERROR" : "",
+				devctl);
+		ret = IRQ_HANDLED;
+	}
+
+	if (musb->int_tx || musb->int_rx || musb->int_usb)
+		ret |= musb_interrupt(musb);
+
+ eoi:
+	/* EOI needs to be written for the IRQ to be re-asserted. */
+	if (ret == IRQ_HANDLED || epintr || usbintr)
+		dsps_writel(reg_base, wrp->eoi, 1);
+
+	/* Poll for ID change */
+	if (is_otg_enabled(musb) && musb->xceiv->state == OTG_STATE_B_IDLE)
+		mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
+
+	spin_unlock_irqrestore(&musb->lock, flags);
+
+	return ret;
+}
+
+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;
+
+	/* mentor core register starts at offset of 0x400 from musb base */
+	musb->mregs += wrp->musb_core_offset;
+
+	/* NOP driver needs change if supporting dual instance */
+	usb_nop_xceiv_register();
+	musb->xceiv = otg_get_transceiver();
+	if (!musb->xceiv)
+		return -ENODEV;
+
+	status = pm_runtime_get_sync(dev);
+	if (status < 0) {
+		dev_err(dev, "pm_runtime_get_sync FAILED");
+		goto err0;
+	}
+
+	/* Returns zero if e.g. not clocked */
+	rev = dsps_readl(reg_base, wrp->revision);
+	if (!rev) {
+		status = -ENODEV;
+		goto err0;
+	}
+
+	if (is_host_enabled(musb))
+		setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
+
+	/* Reset the 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->isr = dsps_interrupt;
+
+	/* reset the otgdisable bit, needed for host mode to work */
+	val = dsps_readl(reg_base, wrp->phy_utmi);
+	val &= ~(1 << wrp->otg_disable);
+	dsps_writel(musb->ctrl_base, wrp->phy_utmi, val);
+
+	/* clear level interrupt */
+	dsps_writel(reg_base, wrp->eoi, 0);
+
+	return 0;
+err0:
+	pm_runtime_disable(dev);
+	return status;
+}
+
+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);
+
+	if (is_host_enabled(musb))
+		del_timer_sync(&glue->timer);
+
+	/* Shutdown the on-chip PHY and its PLL. */
+	if (data->set_phy_power)
+		data->set_phy_power(0);
+
+	/* NOP driver needs change if supporting dual instance */
+	otg_put_transceiver(musb->xceiv);
+	usb_nop_xceiv_unregister();
+
+	return 0;
+}
+
+static struct musb_platform_ops dsps_ops = {
+	.init		= dsps_musb_init,
+	.exit		= dsps_musb_exit,
+
+	.enable		= dsps_musb_enable,
+	.disable	= dsps_musb_disable,
+
+	.try_idle	= dsps_musb_try_idle,
+};
+
+static u64 musb_dmamask = DMA_BIT_MASK(32);
+
+static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
+{
+	struct device *dev = glue->dev;
+	struct platform_device *pdev = to_platform_device(dev);
+	struct musb_hdrc_platform_data  *pdata = dev->platform_data;
+	struct platform_device	*musb;
+	struct resource *res;
+	struct resource	resources[2];
+	char res_name[10];
+	int ret;
+
+	/* get memory resource */
+	sprintf(res_name, "musb%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;
+	}
+	res->parent = NULL;
+	resources[0] = *res;
+
+	/* get irq resource */
+	sprintf(res_name, "musb%d-irq", id);
+	res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
+	if (!res) {
+		dev_err(dev, "%s get irq resource failed\n", res_name);
+		ret = -ENODEV;
+		goto err0;
+	}
+	strcpy((u8 *)res->name, "mc");
+	res->parent = NULL;
+	resources[1] = *res;
+
+	/* allocate the child platform device */
+	musb = platform_device_alloc("musb-hdrc", -1);
+	if (!musb) {
+		dev_err(dev, "failed to allocate musb device\n");
+		goto err0;
+	}
+
+	musb->dev.parent		= dev;
+	musb->dev.dma_mask		= &musb_dmamask;
+	musb->dev.coherent_dma_mask	= musb_dmamask;
+
+	glue->musb			= musb;
+
+	pdata->platform_ops		= &dsps_ops;
+
+	ret = platform_device_add_resources(musb, resources, 2);
+	if (ret) {
+		dev_err(dev, "failed to add resources\n");
+		goto err1;
+	}
+
+	ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
+	if (ret) {
+		dev_err(dev, "failed to add platform_data\n");
+		goto err1;
+	}
+
+	ret = platform_device_add(musb);
+	if (ret) {
+		dev_err(dev, "failed to register musb device\n");
+		goto err1;
+	}
+
+	return 0;
+
+err1:
+	platform_device_put(musb);
+err0:
+	return ret;
+}
+
+static void __devexit dsps_delete_musb_pdev(struct dsps_glue *glue)
+{
+	platform_device_del(glue->musb);
+	platform_device_put(glue->musb);
+}
+
+static int __devinit dsps_probe(struct platform_device *pdev)
+{
+	const struct platform_device_id *id = platform_get_device_id(pdev);
+	const struct dsps_musb_wrapper *wrp =
+				(struct dsps_musb_wrapper *)id->driver_data;
+	struct dsps_glue *glue;
+	struct resource *iomem;
+	int ret;
+
+	/* allocate glue */
+	glue = kzalloc(sizeof(*glue), GFP_KERNEL);
+	if (!glue) {
+		dev_err(&pdev->dev, "unable to allocate glue memory\n");
+		ret = -ENOMEM;
+		goto err0;
+	}
+
+	/* get memory resource */
+	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!iomem) {
+		dev_err(&pdev->dev, "failed to get usbss mem resourse\n");
+		ret = -ENODEV;
+		goto err1;
+	}
+
+	glue->dev = &pdev->dev;
+
+	glue->wrp = kmemdup(wrp, sizeof(*wrp), GFP_KERNEL);
+	if (!glue->wrp) {
+		dev_err(&pdev->dev, "failed to duplicate wrapper struct memory\n");
+		ret = -ENOMEM;
+		goto err1;
+	}
+	platform_set_drvdata(pdev, glue);
+
+	/* create the child platform device for first instances of musb */
+	ret = dsps_create_musb_pdev(glue, 0);
+	if (ret != 0) {
+		dev_err(&pdev->dev, "failed to create child pdev\n");
+		goto err2;
+	}
+
+	/* enable the usbss clocks */
+	pm_runtime_enable(&pdev->dev);
+
+	return 0;
+
+err2:
+	kfree(glue->wrp);
+err1:
+	kfree(glue);
+err0:
+	return ret;
+}
+static int __devexit dsps_remove(struct platform_device *pdev)
+{
+	struct dsps_glue *glue = platform_get_drvdata(pdev);
+
+	/* delete the child platform device */
+	dsps_delete_musb_pdev(glue);
+
+	/* disable usbss clocks */
+	pm_runtime_put(&pdev->dev);
+	pm_runtime_disable(&pdev->dev);
+	kfree(glue->wrp);
+	kfree(glue);
+	return 0;
+}
+
+#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;
+
+	/* Shutdown the on-chip PHY and its PLL. */
+	if (data->set_phy_power)
+		data->set_phy_power(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;
+
+	/* Start the on-chip PHY and its PLL. */
+	if (data->set_phy_power)
+		data->set_phy_power(1);
+
+	return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume);
+
+static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = {
+	.revision		= 0x00,
+	.control		= 0x14,
+	.status			= 0x18,
+	.eoi			= 0x24,
+	.epintr_set		= 0x38,
+	.epintr_clear		= 0x40,
+	.epintr_status		= 0x30,
+	.coreintr_set		= 0x3c,
+	.coreintr_clear		= 0x44,
+	.coreintr_status	= 0x34,
+	.phy_utmi		= 0xe0,
+	.mode			= 0xe8,
+	.reset			= 0,
+	.otg_disable		= 21,
+	.iddig			= 8,
+	.usb_shift		= 0,
+	.usb_mask		= 0x1ff,
+	.usb_bitmap		= (0x1ff << 0),
+	.drvvbus		= 8,
+	.txep_shift		= 0,
+	.txep_mask		= 0xffff,
+	.txep_bitmap		= (0xffff << 0),
+	.rxep_shift		= 16,
+	.rxep_mask		= 0xfffe,
+	.rxep_bitmap		= (0xfffe << 16),
+	.musb_core_offset	= 0x400,
+	.poll_seconds		= 2,
+};
+
+static const struct platform_device_id musb_dsps_id_table[] __devinitconst = {
+	{
+		.name	= "musb-ti81xx",
+		.driver_data	= (kernel_ulong_t) &ti81xx_driver_data,
+	},
+	{  },	/* Terminating Entry */
+};
+MODULE_DEVICE_TABLE(platform, musb_dsps_id_table);
+
+static struct platform_driver dsps_usbss_driver = {
+	.probe		= dsps_probe,
+	.remove         = __devexit_p(dsps_remove),
+	.driver         = {
+		.name   = "musb-dsps",
+		.pm	= &dsps_pm_ops,
+	},
+	.id_table	= musb_dsps_id_table,
+};
+
+MODULE_DESCRIPTION("TI DSPS MUSB Glue Layer");
+MODULE_AUTHOR("Ravi B <ravibabu-l0cyMroinI0@public.gmane.org>");
+MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>");
+MODULE_LICENSE("GPL v2");
+
+static int __init dsps_init(void)
+{
+	return platform_driver_register(&dsps_usbss_driver);
+}
+subsys_initcall(dsps_init);
+
+static void __exit dsps_exit(void)
+{
+	platform_driver_unregister(&dsps_usbss_driver);
+}
+module_exit(dsps_exit);
-- 
1.6.2.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] 20+ messages in thread

* [PATCH 6/8] am335xevm: Add support for musb interface
  2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
                   ` (3 preceding siblings ...)
  2011-10-11 11:26 ` [PATCH 4/8] ti814evm: " Ajay Kumar Gupta
@ 2011-10-11 11:26 ` Ajay Kumar Gupta
       [not found]   ` <1318332369-9732-7-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
  2011-10-11 11:26 ` [PATCH 7/8] arm: omap: am335x: enable phy controls Ajay Kumar Gupta
  5 siblings, 1 reply; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb; +Cc: linux-omap, balbi, Ajay Kumar Gupta

Adding musb support in am335x EVM board file.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
 arch/arm/mach-omap2/board-am335xevm.c |    9 +++++++++
 arch/arm/mach-omap2/usb-musb.c        |    2 +-
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/board-am335xevm.c b/arch/arm/mach-omap2/board-am335xevm.c
index a4102ef..298dc51 100644
--- a/arch/arm/mach-omap2/board-am335xevm.c
+++ b/arch/arm/mach-omap2/board-am335xevm.c
@@ -24,6 +24,14 @@
 #include <plat/irqs.h>
 #include <plat/board.h>
 #include <plat/common.h>
+#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,
+};
 
 #include "mux.h"
 
@@ -73,6 +81,7 @@ static void __init am335x_evm_init(void)
 	omap_sdrc_init(NULL, NULL);
 	omap_board_config = am335x_evm_config;
 	omap_board_config_size = ARRAY_SIZE(am335x_evm_config);
+	usb_musb_init(&musb_board_data);
 }
 
 static void __init am335x_evm_map_io(void)
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c
index 8bceeca..5cd373e 100644
--- a/arch/arm/mach-omap2/usb-musb.c
+++ b/arch/arm/mach-omap2/usb-musb.c
@@ -143,7 +143,7 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
 	if (cpu_is_omap3517() || cpu_is_omap3505()) {
 		oh_name = "am35x_otg_hs";
 		name = "musb-am35x";
-	} else if (cpu_is_ti81xx()) {
+	} else if (cpu_is_ti81xx() || cpu_is_am33xx()) {
 		oh_name = "usb_otg_hs";
 		name = "musb-ti81xx";
 	} else {
-- 
1.6.2.4


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

* [PATCH 7/8] arm: omap: am335x: enable phy controls
  2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
                   ` (4 preceding siblings ...)
  2011-10-11 11:26 ` [PATCH 6/8] am335xevm: " Ajay Kumar Gupta
@ 2011-10-11 11:26 ` Ajay Kumar Gupta
  5 siblings, 0 replies; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb; +Cc: linux-omap, balbi, Ajay Kumar Gupta

Switch on the phy for am335x.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
---
Changes from v1:
	- Added ioremap for AM33x SCM base.

 arch/arm/mach-omap2/omap_phy_internal.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c
index 4c90477..7129408 100644
--- a/arch/arm/mach-omap2/omap_phy_internal.c
+++ b/arch/arm/mach-omap2/omap_phy_internal.c
@@ -266,7 +266,11 @@ void ti81xx_musb_phy_power(u8 on)
 	void __iomem *scm_base = NULL;
 	u32 usbphycfg;
 
-	scm_base = ioremap(TI81XX_SCM_BASE, SZ_2K);
+	if (cpu_is_ti81xx())
+		scm_base = ioremap(TI81XX_SCM_BASE, SZ_2K);
+	else if (cpu_is_am33xx())
+		scm_base = ioremap(AM33XX_SCM_BASE, SZ_2K);
+
 	if (!scm_base) {
 		pr_err("system control module ioremap failed\n");
 		return;
@@ -278,16 +282,19 @@ void ti81xx_musb_phy_power(u8 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_ti814x() || cpu_is_am33xx()) {
+			usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
+			usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
+			if (cpu_is_ti814x()) {
+				usbphycfg &= ~(USBPHY_DPINPUT | USBPHY_DMINPUT);
+				usbphycfg |= USBPHY_DPOPBUFCTL
+					| USBPHY_DMOPBUFCTL;
+			}
 		}
 	} else {
 		if (cpu_is_ti816x())
 			usbphycfg &= ~TI816X_USBPHY0_NORMAL_MODE;
-		else if (cpu_is_ti814x())
+		else if (cpu_is_ti814x() || cpu_is_am33xx())
 			usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
 
 	}
-- 
1.6.2.4


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

* [PATCH 8/8] usb: musb: enable support for am335x
       [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
  2011-10-11 11:26   ` [PATCH 2/8] omap: musb: ti81xx: Add phy power function Ajay Kumar Gupta
  2011-10-11 11:26   ` [PATCH 5/8] usb: musb: Add support for ti81xx platform Ajay Kumar Gupta
@ 2011-10-11 11:26   ` Ajay Kumar Gupta
  2 siblings, 0 replies; 20+ messages in thread
From: Ajay Kumar Gupta @ 2011-10-11 11:26 UTC (permalink / raw)
  To: linux-usb-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	Ajay Kumar Gupta

Enabled the flag so that musb_dsps glue file can be used for am335x

Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
---
Changes from v1
	- Removed unneeded parens.

 drivers/usb/musb/Kconfig |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
index d6abdec..e3a863c 100644
--- a/drivers/usb/musb/Kconfig
+++ b/drivers/usb/musb/Kconfig
@@ -8,7 +8,7 @@ config USB_MUSB_HDRC
 	depends on USB && USB_GADGET
 	depends on (ARM || (BF54x && !BF544) || (BF52x && !BF522 && !BF523))
 	select NOP_USB_XCEIV if (ARCH_DAVINCI || MACH_OMAP3EVM || BLACKFIN)
-	select NOP_USB_XCEIV if SOC_OMAPTI81XX
+	select NOP_USB_XCEIV if (SOC_OMAPTI81XX || SOC_OMAPAM33XX)
 	select TWL4030_USB if MACH_OMAP_3430SDP
 	select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
 	select USB_OTG_UTILS
@@ -57,7 +57,7 @@ config USB_MUSB_AM35X
 
 config USB_MUSB_DSPS
 	tristate "TI DSPS platforms"
-	depends on SOC_OMAPTI81XX
+	depends on SOC_OMAPTI81XX || SOC_OMAPAM33XX
 
 config USB_MUSB_BLACKFIN
 	tristate "Blackfin"
@@ -73,7 +73,7 @@ config MUSB_PIO_ONLY
 	bool 'Disable DMA (always use PIO)'
 	depends on USB_MUSB_HDRC
 	default USB_MUSB_TUSB6010 || USB_MUSB_DA8XX || USB_MUSB_AM35X
-	default SOC_OMAPTI81XX
+	default SOC_OMAPTI81XX || SOC_OMAPAM33XX
 	help
 	  All data is copied between memory and FIFO by the CPU.
 	  DMA controllers are ignored.
-- 
1.6.2.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] 20+ messages in thread

* Re: [PATCH 4/8] ti814evm: Add support for musb interface
  2011-10-11 11:26 ` [PATCH 4/8] ti814evm: " Ajay Kumar Gupta
@ 2011-10-11 11:55   ` Igor Grinberg
  2011-10-11 14:41     ` Gupta, Ajay Kumar
  0 siblings, 1 reply; 20+ messages in thread
From: Igor Grinberg @ 2011-10-11 11:55 UTC (permalink / raw)
  To: Ajay Kumar Gupta; +Cc: linux-usb, linux-omap, balbi, Ravi Babu

Hi Ajay,

On 10/11/11 13:26, Ajay Kumar Gupta wrote:
> From: Ravi Babu <ravibabu@ti.com>
> 
> Adding musb support in ti814 EVM board file.
> 
> Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> Signed-off-by: Ravi Babu <ravibabu@ti.com>
> Acked-by: Felipe Balbi <balbi@ti.com>
> ---
>  arch/arm/mach-omap2/board-ti8148evm.c |    9 +++++++++

This file does not exist and probably will not exist in the future,
see [1] and [2].
So this patch can be dropped.
Your 3/8 patch provides the support for both boards.

[1] - http://www.spinics.net/lists/linux-omap/msg58348.html
[2] - http://www.spinics.net/lists/arm-kernel/msg143915.html

-- 
Regards,
Igor.

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

* Re: [PATCH 3/8] ti816evm: Add support for musb interface
  2011-10-11 11:26 ` [PATCH 3/8] ti816evm: Add support for musb interface Ajay Kumar Gupta
@ 2011-10-11 12:08   ` Igor Grinberg
  2011-10-11 16:28     ` Gupta, Ajay Kumar
  0 siblings, 1 reply; 20+ messages in thread
From: Igor Grinberg @ 2011-10-11 12:08 UTC (permalink / raw)
  To: Ajay Kumar Gupta
  Cc: linux-usb, linux-omap, balbi, Ravi Babu, Hemant Pedanekar,
	Tony Lindgren

Hi Ajay,

On 10/11/11 13:26, Ajay Kumar Gupta wrote:
> From: Ravi Babu <ravibabu@ti.com>
> 
> Adding musb support in ti816 EVM board file.
> 
> Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> Signed-off-by: Ravi Babu <ravibabu@ti.com>
> Acked-by: Felipe Balbi <balbi@ti.com>

This patch can result in a merge conflict, therefore I think
this one should be taken through Tony's tree.

Also you should work together with Hemant Pedanekar and
someone of you should rebase on top of the other otherwise
one of the patches (yours or Hemant's) possibly will not apply.

> ---
>  arch/arm/mach-omap2/board-ti8168evm.c |    9 +++++++++
>  1 files changed, 9 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c
> index 2c243df..1f3d423 100644
> --- a/arch/arm/mach-omap2/board-ti8168evm.c
> +++ b/arch/arm/mach-omap2/board-ti8168evm.c
> @@ -23,6 +23,14 @@
>  #include <plat/irqs.h>
>  #include <plat/board.h>
>  #include <plat/common.h>
> +#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,
> +};
>  
>  static struct omap_board_config_kernel ti8168_evm_config[] __initdata = {
>  };
> @@ -33,6 +41,7 @@ static void __init ti8168_evm_init(void)
>  	omap_sdrc_init(NULL, NULL);
>  	omap_board_config = ti8168_evm_config;
>  	omap_board_config_size = ARRAY_SIZE(ti8168_evm_config);
> +	usb_musb_init(&musb_board_data);
>  }
>  
>  static void __init ti8168_evm_map_io(void)

-- 
Regards,
Igor.

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

* RE: [PATCH 4/8] ti814evm: Add support for musb interface
  2011-10-11 11:55   ` Igor Grinberg
@ 2011-10-11 14:41     ` Gupta, Ajay Kumar
  0 siblings, 0 replies; 20+ messages in thread
From: Gupta, Ajay Kumar @ 2011-10-11 14:41 UTC (permalink / raw)
  To: Igor Grinberg
  Cc: linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
	Balbi, Felipe, B, Ravi

Hi Igor,
> 
> On 10/11/11 13:26, Ajay Kumar Gupta wrote:
> > From: Ravi Babu <ravibabu@ti.com>
> >
> > Adding musb support in ti814 EVM board file.
> >
> > Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> > Signed-off-by: Ravi Babu <ravibabu@ti.com>
> > Acked-by: Felipe Balbi <balbi@ti.com>
> > ---
> >  arch/arm/mach-omap2/board-ti8148evm.c |    9 +++++++++
> 
> This file does not exist and probably will not exist in the future,
> see [1] and [2].
> So this patch can be dropped.
> Your 3/8 patch provides the support for both boards.

Thanks for this.

Felipe/Tony, Please drop this 4/8 patch.

Ajay
> 
> [1] - http://www.spinics.net/lists/linux-omap/msg58348.html
> [2] - http://www.spinics.net/lists/arm-kernel/msg143915.html
> 
> --
> Regards,
> Igor.

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

* RE: [PATCH 3/8] ti816evm: Add support for musb interface
  2011-10-11 12:08   ` Igor Grinberg
@ 2011-10-11 16:28     ` Gupta, Ajay Kumar
  2011-10-11 17:07       ` Gupta, Ajay Kumar
  0 siblings, 1 reply; 20+ messages in thread
From: Gupta, Ajay Kumar @ 2011-10-11 16:28 UTC (permalink / raw)
  To: Igor Grinberg
  Cc: linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
	Balbi, Felipe, B, Ravi, Pedanekar, Hemant, Tony Lindgren

Hi,
> On 10/11/11 13:26, Ajay Kumar Gupta wrote:
> > From: Ravi Babu <ravibabu@ti.com>
> >
> > Adding musb support in ti816 EVM board file.
> >
> > Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> > Signed-off-by: Ravi Babu <ravibabu@ti.com>
> > Acked-by: Felipe Balbi <balbi@ti.com>
> 
> This patch can result in a merge conflict, therefore I think
> this one should be taken through Tony's tree.
> 
> Also you should work together with Hemant Pedanekar and
> someone of you should rebase on top of the other otherwise
> one of the patches (yours or Hemant's) possibly will not apply.

Ok sure. I will submit the patches (v5) after creating it on top of
Hemant's and Vaibhav's patches.

Thanks,
Ajay
> 
> > ---
> >  arch/arm/mach-omap2/board-ti8168evm.c |    9 +++++++++
> >  1 files changed, 9 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-
> omap2/board-ti8168evm.c
> > index 2c243df..1f3d423 100644
> > --- a/arch/arm/mach-omap2/board-ti8168evm.c
> > +++ b/arch/arm/mach-omap2/board-ti8168evm.c
> > @@ -23,6 +23,14 @@
> >  #include <plat/irqs.h>
> >  #include <plat/board.h>
> >  #include <plat/common.h>
> > +#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,
> > +};
> >
> >  static struct omap_board_config_kernel ti8168_evm_config[] __initdata
> = {
> >  };
> > @@ -33,6 +41,7 @@ static void __init ti8168_evm_init(void)
> >  	omap_sdrc_init(NULL, NULL);
> >  	omap_board_config = ti8168_evm_config;
> >  	omap_board_config_size = ARRAY_SIZE(ti8168_evm_config);
> > +	usb_musb_init(&musb_board_data);
> >  }
> >
> >  static void __init ti8168_evm_map_io(void)
> 
> --
> Regards,
> Igor.

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

* RE: [PATCH 3/8] ti816evm: Add support for musb interface
  2011-10-11 16:28     ` Gupta, Ajay Kumar
@ 2011-10-11 17:07       ` Gupta, Ajay Kumar
       [not found]         ` <19F8576C6E063C45BE387C64729E739404ECCE5662-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Gupta, Ajay Kumar @ 2011-10-11 17:07 UTC (permalink / raw)
  To: Igor Grinberg
  Cc: linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
	Balbi, Felipe, B, Ravi, Pedanekar, Hemant, Tony Lindgren

Hi,
> > > Adding musb support in ti816 EVM board file.
> > >
> > > Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> > > Signed-off-by: Ravi Babu <ravibabu@ti.com>
> > > Acked-by: Felipe Balbi <balbi@ti.com>
> >
> > This patch can result in a merge conflict, therefore I think
> > this one should be taken through Tony's tree.
> >
> > Also you should work together with Hemant Pedanekar and
> > someone of you should rebase on top of the other otherwise
> > one of the patches (yours or Hemant's) possibly will not apply.
> 
> Ok sure. I will submit the patches (v5) after creating it on top of
> Hemant's and Vaibhav's patches.

Here is the v5 of this patch created against latest Hemant's patch set.

--------------------------------------------------------
>From 3006845992157acc4a2b44d0be119e22bb34d1f4 Mon Sep 17 00:00:00 2001
From: Ravi Babu <ravibabu@ti.com>
Date: Wed, 17 Aug 2011 17:58:02 +0530
Subject: [PATCH 3/8 v5] ti816evm: Add support for musb interface

Adding musb support in ti816 EVM board file.

Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Ravi Babu <ravibabu@ti.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
 arch/arm/mach-omap2/board-ti8168evm.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c
index b858921..cab909f 100644
--- a/arch/arm/mach-omap2/board-ti8168evm.c
+++ b/arch/arm/mach-omap2/board-ti8168evm.c
@@ -23,6 +23,14 @@
 #include <plat/irqs.h>
 #include <plat/board.h>
 #include <plat/common.h>
+#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,
+};

 static struct omap_board_config_kernel ti81xx_evm_config[] __initdata = {
 };
@@ -33,6 +41,7 @@ static void __init ti81xx_evm_init(void)
        omap_sdrc_init(NULL, NULL);
        omap_board_config = ti81xx_evm_config;
        omap_board_config_size = ARRAY_SIZE(ti81xx_evm_config);
+       usb_musb_init(&musb_board_data);
 }

 MACHINE_START(TI8168EVM, "ti8168evm")
--
1.6.2.4
--------------------------------------------------------

> 
> Thanks,
> Ajay
> >
> > > ---
> > >  arch/arm/mach-omap2/board-ti8168evm.c |    9 +++++++++
> > >  1 files changed, 9 insertions(+), 0 deletions(-)
> > >
> > > diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-
> > omap2/board-ti8168evm.c
> > > index 2c243df..1f3d423 100644
> > > --- a/arch/arm/mach-omap2/board-ti8168evm.c
> > > +++ b/arch/arm/mach-omap2/board-ti8168evm.c
> > > @@ -23,6 +23,14 @@
> > >  #include <plat/irqs.h>
> > >  #include <plat/board.h>
> > >  #include <plat/common.h>
> > > +#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,
> > > +};
> > >
> > >  static struct omap_board_config_kernel ti8168_evm_config[]
> __initdata
> > = {
> > >  };
> > > @@ -33,6 +41,7 @@ static void __init ti8168_evm_init(void)
> > >  	omap_sdrc_init(NULL, NULL);
> > >  	omap_board_config = ti8168_evm_config;
> > >  	omap_board_config_size = ARRAY_SIZE(ti8168_evm_config);
> > > +	usb_musb_init(&musb_board_data);
> > >  }
> > >
> > >  static void __init ti8168_evm_map_io(void)
> >
> > --
> > Regards,
> > Igor.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 1/8] omap: musb: Adding support for ti81xx
       [not found]   ` <1318332369-9732-2-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
@ 2011-12-12 18:47     ` Tony Lindgren
  0 siblings, 0 replies; 20+ messages in thread
From: Tony Lindgren @ 2011-12-12 18:47 UTC (permalink / raw)
  To: Ajay Kumar Gupta
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, Ravi Babu

* Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org> [111011 03:53]:
> From: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
> 
> Added musb support for ti81xx platform which has two instances of musb
> interface and uses CPPI4.1 DMA. The current patch set adds support for
> single instance and in PIO mode only.

Applying into musb branch.

Tony
 
> Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
> Signed-off-by: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
> Acked-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
> ---
>  arch/arm/mach-omap2/usb-musb.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c
> index a65145b..8bceeca 100644
> --- a/arch/arm/mach-omap2/usb-musb.c
> +++ b/arch/arm/mach-omap2/usb-musb.c
> @@ -143,6 +143,9 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
>  	if (cpu_is_omap3517() || cpu_is_omap3505()) {
>  		oh_name = "am35x_otg_hs";
>  		name = "musb-am35x";
> +	} else if (cpu_is_ti81xx()) {
> +		oh_name = "usb_otg_hs";
> +		name = "musb-ti81xx";
>  	} else {
>  		oh_name = "usb_otg_hs";
>  		name = "musb-omap2430";
> -- 
> 1.6.2.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
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] 20+ messages in thread

* Re: [PATCH 2/8] omap: musb: ti81xx: Add phy power function
       [not found]     ` <1318332369-9732-3-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
@ 2011-12-12 18:47       ` Tony Lindgren
  0 siblings, 0 replies; 20+ messages in thread
From: Tony Lindgren @ 2011-12-12 18:47 UTC (permalink / raw)
  To: Ajay Kumar Gupta
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, Ravi Babu

* Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org> [111011 03:53]:
> Adding ti81xx_musb_phy_power() which will be used by musb driver through
> its function pointer in board_data.

Applying into musb branch.

Tony
--
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] 20+ messages in thread

* Re: [PATCH 3/8] ti816evm: Add support for musb interface
       [not found]         ` <19F8576C6E063C45BE387C64729E739404ECCE5662-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
@ 2011-12-12 18:48           ` Tony Lindgren
  0 siblings, 0 replies; 20+ messages in thread
From: Tony Lindgren @ 2011-12-12 18:48 UTC (permalink / raw)
  To: Gupta, Ajay Kumar
  Cc: Igor Grinberg, linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Balbi, Felipe,
	B, Ravi, Pedanekar, Hemant

* Gupta, Ajay Kumar <ajay.gupta-l0cyMroinI0@public.gmane.org> [111011 09:33]:
> Hi,
> > > > Adding musb support in ti816 EVM board file.
> > > >
> > > > Signed-off-by: Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>
> > > > Signed-off-by: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
> > > > Acked-by: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>
> > >
> > > This patch can result in a merge conflict, therefore I think
> > > this one should be taken through Tony's tree.
> > >
> > > Also you should work together with Hemant Pedanekar and
> > > someone of you should rebase on top of the other otherwise
> > > one of the patches (yours or Hemant's) possibly will not apply.
> > 
> > Ok sure. I will submit the patches (v5) after creating it on top of
> > Hemant's and Vaibhav's patches.
> 
> Here is the v5 of this patch created against latest Hemant's patch set.

Applying into musb branch.

Tony
--
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] 20+ messages in thread

* Re: [PATCH 5/8] usb: musb: Add support for ti81xx platform
  2011-10-11 11:26   ` [PATCH 5/8] usb: musb: Add support for ti81xx platform Ajay Kumar Gupta
@ 2011-12-12 18:49     ` Tony Lindgren
       [not found]       ` <20111212184900.GE32251-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Tony Lindgren @ 2011-12-12 18:49 UTC (permalink / raw)
  To: Ajay Kumar Gupta; +Cc: linux-usb, linux-omap, balbi, Ravi Babu

* Ajay Kumar Gupta <ajay.gupta@ti.com> [111011 03:53]:
> From: Ravi Babu <ravibabu@ti.com>
> 
> TI81XX platform has two musb interfaces and uses CPPI4.1 DMA engine.
> It has builtin USB PHYs as AM35x. The current set of patches adds support
> for one instance and only in PIO mode.

This one should get queued by Felipe via the USB tree.

Tony
 
> Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
> Signed-off-by: Ravi Babu <ravibabu@ti.com>
> ---
> Same as v3. dropping <plat/usb.h> will be done in a
> seperate patch as discussed in the list.
> 
>  drivers/usb/musb/Kconfig     |    6 +
>  drivers/usb/musb/Makefile    |    1 +
>  drivers/usb/musb/musb_core.c |    4 +-
>  drivers/usb/musb/musb_dsps.c |  693 ++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 703 insertions(+), 1 deletions(-)
>  create mode 100644 drivers/usb/musb/musb_dsps.c
> 
> diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
> index fc34b8b..d6abdec 100644
> --- a/drivers/usb/musb/Kconfig
> +++ b/drivers/usb/musb/Kconfig
> @@ -8,6 +8,7 @@ config USB_MUSB_HDRC
>  	depends on USB && USB_GADGET
>  	depends on (ARM || (BF54x && !BF544) || (BF52x && !BF522 && !BF523))
>  	select NOP_USB_XCEIV if (ARCH_DAVINCI || MACH_OMAP3EVM || BLACKFIN)
> +	select NOP_USB_XCEIV if SOC_OMAPTI81XX
>  	select TWL4030_USB if MACH_OMAP_3430SDP
>  	select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA
>  	select USB_OTG_UTILS
> @@ -54,6 +55,10 @@ config USB_MUSB_AM35X
>  	tristate "AM35x"
>  	depends on ARCH_OMAP
>  
> +config USB_MUSB_DSPS
> +	tristate "TI DSPS platforms"
> +	depends on SOC_OMAPTI81XX
> +
>  config USB_MUSB_BLACKFIN
>  	tristate "Blackfin"
>  	depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523)
> @@ -68,6 +73,7 @@ config MUSB_PIO_ONLY
>  	bool 'Disable DMA (always use PIO)'
>  	depends on USB_MUSB_HDRC
>  	default USB_MUSB_TUSB6010 || USB_MUSB_DA8XX || USB_MUSB_AM35X
> +	default SOC_OMAPTI81XX
>  	help
>  	  All data is copied between memory and FIFO by the CPU.
>  	  DMA controllers are ignored.
> diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
> index d8fd9d0..d92d110 100644
> --- a/drivers/usb/musb/Makefile
> +++ b/drivers/usb/musb/Makefile
> @@ -13,6 +13,7 @@ musb_hdrc-$(CONFIG_DEBUG_FS)			+= musb_debugfs.o
>  # Hardware Glue Layer
>  obj-$(CONFIG_USB_MUSB_OMAP2PLUS)		+= omap2430.o
>  obj-$(CONFIG_USB_MUSB_AM35X)			+= am35x.o
> +obj-$(CONFIG_USB_MUSB_DSPS)			+= musb_dsps.o
>  obj-$(CONFIG_USB_MUSB_TUSB6010)			+= tusb6010.o
>  obj-$(CONFIG_USB_MUSB_DAVINCI)			+= davinci.o
>  obj-$(CONFIG_USB_MUSB_DA8XX)			+= da8xx.o
> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
> index 20a2873..b04790d 100644
> --- a/drivers/usb/musb/musb_core.c
> +++ b/drivers/usb/musb/musb_core.c
> @@ -1014,7 +1014,9 @@ static void musb_shutdown(struct platform_device *pdev)
>  	|| defined(CONFIG_USB_MUSB_OMAP2PLUS)		\
>  	|| defined(CONFIG_USB_MUSB_OMAP2PLUS_MODULE)	\
>  	|| defined(CONFIG_USB_MUSB_AM35X)		\
> -	|| defined(CONFIG_USB_MUSB_AM35X_MODULE)
> +	|| defined(CONFIG_USB_MUSB_AM35X_MODULE)	\
> +	|| defined(CONFIG_USB_MUSB_DSPS)		\
> +	|| defined(CONFIG_USB_MUSB_DSPS_MODULE)
>  static ushort __initdata fifo_mode = 4;
>  #elif defined(CONFIG_USB_MUSB_UX500)			\
>  	|| defined(CONFIG_USB_MUSB_UX500_MODULE)
> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> new file mode 100644
> index 0000000..fb59e34
> --- /dev/null
> +++ b/drivers/usb/musb/musb_dsps.c
> @@ -0,0 +1,693 @@
> +/*
> + * Texas Instruments DSPS platforms "glue layer"
> + *
> + * Copyright (C) 2011, by Texas Instruments
> + *
> + * Based on the am35x "glue layer" code.
> + *
> + * This file is part of the Inventra Controller Driver for Linux.
> + *
> + * The Inventra Controller Driver for Linux is free software; you
> + * can redistribute it and/or modify it under the terms of the GNU
> + * General Public License version 2 as published by the Free Software
> + * Foundation.
> + *
> + * The Inventra Controller Driver for Linux is distributed in
> + * the hope that it will be useful, but WITHOUT ANY WARRANTY;
> + * without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> + * License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with The Inventra Controller Driver for Linux ; if not,
> + * write to the Free Software Foundation, Inc., 59 Temple Place,
> + * Suite 330, Boston, MA  02111-1307  USA
> + *
> + * musb_dsps.c will be a common file for all the TI DSPS platforms
> + * such as dm64x, dm36x, dm35x, da8x, am35x and ti81x.
> + * For now only ti81x is using this and in future davinci.c, am35x.c
> + * da8xx.c would be merged to this file after testing.
> + */
> +
> +#include <linux/init.h>
> +#include <linux/io.h>
> +#include <linux/platform_device.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/pm_runtime.h>
> +
> +#include <plat/usb.h>
> +
> +#include "musb_core.h"
> +
> +/**
> + * avoid using musb_readx()/musb_writex() as glue layer should not be
> + * dependent on musb core layer symbols.
> + */
> +static inline u8 dsps_readb(const void __iomem *addr, unsigned offset)
> +	{ return __raw_readb(addr + offset); }
> +
> +static inline u32 dsps_readl(const void __iomem *addr, unsigned offset)
> +	{ return __raw_readl(addr + offset); }
> +
> +static inline void dsps_writeb(void __iomem *addr, unsigned offset, u8 data)
> +	{ __raw_writeb(data, addr + offset); }
> +
> +static inline void dsps_writel(void __iomem *addr, unsigned offset, u32 data)
> +	{ __raw_writel(data, addr + offset); }
> +
> +/**
> + * DSPS musb wrapper register offset.
> + * FIXME: This should be expanded to have all the wrapper registers from TI DSPS
> + * musb ips.
> + */
> +struct dsps_musb_wrapper {
> +	u16	revision;
> +	u16	control;
> +	u16	status;
> +	u16	eoi;
> +	u16	epintr_set;
> +	u16	epintr_clear;
> +	u16	epintr_status;
> +	u16	coreintr_set;
> +	u16	coreintr_clear;
> +	u16	coreintr_status;
> +	u16	phy_utmi;
> +	u16	mode;
> +
> +	/* bit positions for control */
> +	unsigned	reset:5;
> +
> +	/* bit positions for interrupt */
> +	unsigned	usb_shift:5;
> +	u32		usb_mask;
> +	u32		usb_bitmap;
> +	unsigned	drvvbus:5;
> +
> +	unsigned	txep_shift:5;
> +	u32		txep_mask;
> +	u32		txep_bitmap;
> +
> +	unsigned	rxep_shift:5;
> +	u32		rxep_mask;
> +	u32		rxep_bitmap;
> +
> +	/* bit positions for phy_utmi */
> +	unsigned	otg_disable:5;
> +
> +	/* bit positions for mode */
> +	unsigned	iddig:5;
> +	/* miscellaneous stuff */
> +	u32		musb_core_offset;
> +	u8		poll_seconds;
> +};
> +
> +/**
> + * DSPS glue structure.
> + */
> +struct dsps_glue {
> +	struct device *dev;
> +	struct platform_device *musb;	/* child musb pdev */
> +	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
> +	struct timer_list timer;	/* otg_workaround timer */
> +};
> +
> +/**
> + * dsps_musb_enable - enable interrupts
> + */
> +static void dsps_musb_enable(struct musb *musb)
> +{
> +	struct device *dev = musb->controller;
> +	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;
> +	void __iomem *reg_base = musb->ctrl_base;
> +	u32 epmask, coremask;
> +
> +	/* Workaround: setup IRQs through both register sets. */
> +	epmask = ((musb->epmask & wrp->txep_mask) << wrp->txep_shift) |
> +	       ((musb->epmask & wrp->rxep_mask) << wrp->rxep_shift);
> +	coremask = (wrp->usb_bitmap & ~MUSB_INTR_SOF);
> +
> +	dsps_writel(reg_base, wrp->epintr_set, epmask);
> +	dsps_writel(reg_base, wrp->coreintr_set, coremask);
> +	/* Force the DRVVBUS IRQ so we can start polling for ID change. */
> +	if (is_otg_enabled(musb))
> +		dsps_writel(reg_base, wrp->coreintr_set,
> +			    (1 << wrp->drvvbus) << wrp->usb_shift);
> +}
> +
> +/**
> + * dsps_musb_disable - disable HDRC and flush interrupts
> + */
> +static void dsps_musb_disable(struct musb *musb)
> +{
> +	struct device *dev = musb->controller;
> +	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;
> +	void __iomem *reg_base = musb->ctrl_base;
> +
> +	dsps_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap);
> +	dsps_writel(reg_base, wrp->epintr_clear,
> +			 wrp->txep_bitmap | wrp->rxep_bitmap);
> +	dsps_writeb(musb->mregs, MUSB_DEVCTL, 0);
> +	dsps_writel(reg_base, wrp->eoi, 0);
> +}
> +
> +static void otg_timer(unsigned long _musb)
> +{
> +	struct musb *musb = (void *)_musb;
> +	void __iomem *mregs = musb->mregs;
> +	struct device *dev = musb->controller;
> +	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;
> +	u8 devctl;
> +	unsigned long flags;
> +
> +	/*
> +	 * We poll because DSPS IP's won't expose several OTG-critical
> +	 * status change events (from the transceiver) otherwise.
> +	 */
> +	devctl = dsps_readb(mregs, MUSB_DEVCTL);
> +	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
> +				otg_state_string(musb->xceiv->state));
> +
> +	spin_lock_irqsave(&musb->lock, flags);
> +	switch (musb->xceiv->state) {
> +	case OTG_STATE_A_WAIT_BCON:
> +		devctl &= ~MUSB_DEVCTL_SESSION;
> +		dsps_writeb(musb->mregs, MUSB_DEVCTL, devctl);
> +
> +		devctl = dsps_readb(musb->mregs, MUSB_DEVCTL);
> +		if (devctl & MUSB_DEVCTL_BDEVICE) {
> +			musb->xceiv->state = OTG_STATE_B_IDLE;
> +			MUSB_DEV_MODE(musb);
> +		} else {
> +			musb->xceiv->state = OTG_STATE_A_IDLE;
> +			MUSB_HST_MODE(musb);
> +		}
> +		break;
> +	case OTG_STATE_A_WAIT_VFALL:
> +		musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> +		dsps_writel(musb->ctrl_base, wrp->coreintr_set,
> +			    MUSB_INTR_VBUSERROR << wrp->usb_shift);
> +		break;
> +	case OTG_STATE_B_IDLE:
> +		if (!is_peripheral_enabled(musb))
> +			break;
> +
> +		devctl = dsps_readb(mregs, MUSB_DEVCTL);
> +		if (devctl & MUSB_DEVCTL_BDEVICE)
> +			mod_timer(&glue->timer,
> +					jiffies + wrp->poll_seconds * HZ);
> +		else
> +			musb->xceiv->state = OTG_STATE_A_IDLE;
> +		break;
> +	default:
> +		break;
> +	}
> +	spin_unlock_irqrestore(&musb->lock, flags);
> +}
> +
> +static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout)
> +{
> +	struct device *dev = musb->controller;
> +	struct platform_device *pdev = to_platform_device(dev->parent);
> +	struct dsps_glue *glue = platform_get_drvdata(pdev);
> +	static unsigned long last_timer;
> +
> +	if (!is_otg_enabled(musb))
> +		return;
> +
> +	if (timeout == 0)
> +		timeout = jiffies + msecs_to_jiffies(3);
> +
> +	/* Never idle if active, or when VBUS timeout is not set as host */
> +	if (musb->is_active || (musb->a_wait_bcon == 0 &&
> +				musb->xceiv->state == OTG_STATE_A_WAIT_BCON)) {
> +		dev_dbg(musb->controller, "%s active, deleting timer\n",
> +				otg_state_string(musb->xceiv->state));
> +		del_timer(&glue->timer);
> +		last_timer = jiffies;
> +		return;
> +	}
> +
> +	if (time_after(last_timer, timeout) && timer_pending(&glue->timer)) {
> +		dev_dbg(musb->controller,
> +			"Longer idle timer already pending, ignoring...\n");
> +		return;
> +	}
> +	last_timer = timeout;
> +
> +	dev_dbg(musb->controller, "%s inactive, starting idle timer for %u ms\n",
> +		otg_state_string(musb->xceiv->state),
> +			jiffies_to_msecs(timeout - jiffies));
> +	mod_timer(&glue->timer, timeout);
> +}
> +
> +static irqreturn_t dsps_interrupt(int irq, void *hci)
> +{
> +	struct musb  *musb = hci;
> +	void __iomem *reg_base = musb->ctrl_base;
> +	struct device *dev = musb->controller;
> +	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;
> +	unsigned long flags;
> +	irqreturn_t ret = IRQ_NONE;
> +	u32 epintr, usbintr;
> +
> +	spin_lock_irqsave(&musb->lock, flags);
> +
> +	/* Get endpoint interrupts */
> +	epintr = dsps_readl(reg_base, wrp->epintr_status);
> +	musb->int_rx = (epintr & wrp->rxep_bitmap) >> wrp->rxep_shift;
> +	musb->int_tx = (epintr & wrp->txep_bitmap) >> wrp->txep_shift;
> +
> +	if (epintr)
> +		dsps_writel(reg_base, wrp->epintr_status, epintr);
> +
> +	/* Get usb core interrupts */
> +	usbintr = dsps_readl(reg_base, wrp->coreintr_status);
> +	if (!usbintr && !epintr)
> +		goto eoi;
> +
> +	musb->int_usb =	(usbintr & wrp->usb_bitmap) >> wrp->usb_shift;
> +	if (usbintr)
> +		dsps_writel(reg_base, wrp->coreintr_status, usbintr);
> +
> +	dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
> +			usbintr, epintr);
> +	/*
> +	 * DRVVBUS IRQs are the only proxy we have (a very poor one!) for
> +	 * DSPS IP's missing ID change IRQ.  We need an ID change IRQ to
> +	 * switch appropriately between halves of the OTG state machine.
> +	 * Managing DEVCTL.SESSION per Mentor docs requires that we know its
> +	 * value but DEVCTL.BDEVICE is invalid without DEVCTL.SESSION set.
> +	 * Also, DRVVBUS pulses for SRP (but not at 5V) ...
> +	 */
> +	if ((usbintr & MUSB_INTR_BABBLE) && is_host_enabled(musb))
> +		pr_info("CAUTION: musb: Babble Interrupt Occured\n");
> +
> +	if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) {
> +		int drvvbus = dsps_readl(reg_base, wrp->status);
> +		void __iomem *mregs = musb->mregs;
> +		u8 devctl = dsps_readb(mregs, MUSB_DEVCTL);
> +		int err;
> +
> +		err = is_host_enabled(musb) && (musb->int_usb &
> +						MUSB_INTR_VBUSERROR);
> +		if (err) {
> +			/*
> +			 * The Mentor core doesn't debounce VBUS as needed
> +			 * to cope with device connect current spikes. This
> +			 * means it's not uncommon for bus-powered devices
> +			 * to get VBUS errors during enumeration.
> +			 *
> +			 * This is a workaround, but newer RTL from Mentor
> +			 * seems to allow a better one: "re"-starting sessions
> +			 * without waiting for VBUS to stop registering in
> +			 * devctl.
> +			 */
> +			musb->int_usb &= ~MUSB_INTR_VBUSERROR;
> +			musb->xceiv->state = OTG_STATE_A_WAIT_VFALL;
> +			mod_timer(&glue->timer,
> +					jiffies + wrp->poll_seconds * HZ);
> +			WARNING("VBUS error workaround (delay coming)\n");
> +		} else if (is_host_enabled(musb) && drvvbus) {
> +			musb->is_active = 1;
> +			MUSB_HST_MODE(musb);
> +			musb->xceiv->default_a = 1;
> +			musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;
> +			del_timer(&glue->timer);
> +		} else {
> +			musb->is_active = 0;
> +			MUSB_DEV_MODE(musb);
> +			musb->xceiv->default_a = 0;
> +			musb->xceiv->state = OTG_STATE_B_IDLE;
> +		}
> +
> +		/* NOTE: this must complete power-on within 100 ms. */
> +		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
> +				drvvbus ? "on" : "off",
> +				otg_state_string(musb->xceiv->state),
> +				err ? " ERROR" : "",
> +				devctl);
> +		ret = IRQ_HANDLED;
> +	}
> +
> +	if (musb->int_tx || musb->int_rx || musb->int_usb)
> +		ret |= musb_interrupt(musb);
> +
> + eoi:
> +	/* EOI needs to be written for the IRQ to be re-asserted. */
> +	if (ret == IRQ_HANDLED || epintr || usbintr)
> +		dsps_writel(reg_base, wrp->eoi, 1);
> +
> +	/* Poll for ID change */
> +	if (is_otg_enabled(musb) && musb->xceiv->state == OTG_STATE_B_IDLE)
> +		mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ);
> +
> +	spin_unlock_irqrestore(&musb->lock, flags);
> +
> +	return ret;
> +}
> +
> +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;
> +
> +	/* mentor core register starts at offset of 0x400 from musb base */
> +	musb->mregs += wrp->musb_core_offset;
> +
> +	/* NOP driver needs change if supporting dual instance */
> +	usb_nop_xceiv_register();
> +	musb->xceiv = otg_get_transceiver();
> +	if (!musb->xceiv)
> +		return -ENODEV;
> +
> +	status = pm_runtime_get_sync(dev);
> +	if (status < 0) {
> +		dev_err(dev, "pm_runtime_get_sync FAILED");
> +		goto err0;
> +	}
> +
> +	/* Returns zero if e.g. not clocked */
> +	rev = dsps_readl(reg_base, wrp->revision);
> +	if (!rev) {
> +		status = -ENODEV;
> +		goto err0;
> +	}
> +
> +	if (is_host_enabled(musb))
> +		setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
> +
> +	/* Reset the 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->isr = dsps_interrupt;
> +
> +	/* reset the otgdisable bit, needed for host mode to work */
> +	val = dsps_readl(reg_base, wrp->phy_utmi);
> +	val &= ~(1 << wrp->otg_disable);
> +	dsps_writel(musb->ctrl_base, wrp->phy_utmi, val);
> +
> +	/* clear level interrupt */
> +	dsps_writel(reg_base, wrp->eoi, 0);
> +
> +	return 0;
> +err0:
> +	pm_runtime_disable(dev);
> +	return status;
> +}
> +
> +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);
> +
> +	if (is_host_enabled(musb))
> +		del_timer_sync(&glue->timer);
> +
> +	/* Shutdown the on-chip PHY and its PLL. */
> +	if (data->set_phy_power)
> +		data->set_phy_power(0);
> +
> +	/* NOP driver needs change if supporting dual instance */
> +	otg_put_transceiver(musb->xceiv);
> +	usb_nop_xceiv_unregister();
> +
> +	return 0;
> +}
> +
> +static struct musb_platform_ops dsps_ops = {
> +	.init		= dsps_musb_init,
> +	.exit		= dsps_musb_exit,
> +
> +	.enable		= dsps_musb_enable,
> +	.disable	= dsps_musb_disable,
> +
> +	.try_idle	= dsps_musb_try_idle,
> +};
> +
> +static u64 musb_dmamask = DMA_BIT_MASK(32);
> +
> +static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
> +{
> +	struct device *dev = glue->dev;
> +	struct platform_device *pdev = to_platform_device(dev);
> +	struct musb_hdrc_platform_data  *pdata = dev->platform_data;
> +	struct platform_device	*musb;
> +	struct resource *res;
> +	struct resource	resources[2];
> +	char res_name[10];
> +	int ret;
> +
> +	/* get memory resource */
> +	sprintf(res_name, "musb%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;
> +	}
> +	res->parent = NULL;
> +	resources[0] = *res;
> +
> +	/* get irq resource */
> +	sprintf(res_name, "musb%d-irq", id);
> +	res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
> +	if (!res) {
> +		dev_err(dev, "%s get irq resource failed\n", res_name);
> +		ret = -ENODEV;
> +		goto err0;
> +	}
> +	strcpy((u8 *)res->name, "mc");
> +	res->parent = NULL;
> +	resources[1] = *res;
> +
> +	/* allocate the child platform device */
> +	musb = platform_device_alloc("musb-hdrc", -1);
> +	if (!musb) {
> +		dev_err(dev, "failed to allocate musb device\n");
> +		goto err0;
> +	}
> +
> +	musb->dev.parent		= dev;
> +	musb->dev.dma_mask		= &musb_dmamask;
> +	musb->dev.coherent_dma_mask	= musb_dmamask;
> +
> +	glue->musb			= musb;
> +
> +	pdata->platform_ops		= &dsps_ops;
> +
> +	ret = platform_device_add_resources(musb, resources, 2);
> +	if (ret) {
> +		dev_err(dev, "failed to add resources\n");
> +		goto err1;
> +	}
> +
> +	ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
> +	if (ret) {
> +		dev_err(dev, "failed to add platform_data\n");
> +		goto err1;
> +	}
> +
> +	ret = platform_device_add(musb);
> +	if (ret) {
> +		dev_err(dev, "failed to register musb device\n");
> +		goto err1;
> +	}
> +
> +	return 0;
> +
> +err1:
> +	platform_device_put(musb);
> +err0:
> +	return ret;
> +}
> +
> +static void __devexit dsps_delete_musb_pdev(struct dsps_glue *glue)
> +{
> +	platform_device_del(glue->musb);
> +	platform_device_put(glue->musb);
> +}
> +
> +static int __devinit dsps_probe(struct platform_device *pdev)
> +{
> +	const struct platform_device_id *id = platform_get_device_id(pdev);
> +	const struct dsps_musb_wrapper *wrp =
> +				(struct dsps_musb_wrapper *)id->driver_data;
> +	struct dsps_glue *glue;
> +	struct resource *iomem;
> +	int ret;
> +
> +	/* allocate glue */
> +	glue = kzalloc(sizeof(*glue), GFP_KERNEL);
> +	if (!glue) {
> +		dev_err(&pdev->dev, "unable to allocate glue memory\n");
> +		ret = -ENOMEM;
> +		goto err0;
> +	}
> +
> +	/* get memory resource */
> +	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +	if (!iomem) {
> +		dev_err(&pdev->dev, "failed to get usbss mem resourse\n");
> +		ret = -ENODEV;
> +		goto err1;
> +	}
> +
> +	glue->dev = &pdev->dev;
> +
> +	glue->wrp = kmemdup(wrp, sizeof(*wrp), GFP_KERNEL);
> +	if (!glue->wrp) {
> +		dev_err(&pdev->dev, "failed to duplicate wrapper struct memory\n");
> +		ret = -ENOMEM;
> +		goto err1;
> +	}
> +	platform_set_drvdata(pdev, glue);
> +
> +	/* create the child platform device for first instances of musb */
> +	ret = dsps_create_musb_pdev(glue, 0);
> +	if (ret != 0) {
> +		dev_err(&pdev->dev, "failed to create child pdev\n");
> +		goto err2;
> +	}
> +
> +	/* enable the usbss clocks */
> +	pm_runtime_enable(&pdev->dev);
> +
> +	return 0;
> +
> +err2:
> +	kfree(glue->wrp);
> +err1:
> +	kfree(glue);
> +err0:
> +	return ret;
> +}
> +static int __devexit dsps_remove(struct platform_device *pdev)
> +{
> +	struct dsps_glue *glue = platform_get_drvdata(pdev);
> +
> +	/* delete the child platform device */
> +	dsps_delete_musb_pdev(glue);
> +
> +	/* disable usbss clocks */
> +	pm_runtime_put(&pdev->dev);
> +	pm_runtime_disable(&pdev->dev);
> +	kfree(glue->wrp);
> +	kfree(glue);
> +	return 0;
> +}
> +
> +#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;
> +
> +	/* Shutdown the on-chip PHY and its PLL. */
> +	if (data->set_phy_power)
> +		data->set_phy_power(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;
> +
> +	/* Start the on-chip PHY and its PLL. */
> +	if (data->set_phy_power)
> +		data->set_phy_power(1);
> +
> +	return 0;
> +}
> +#endif
> +
> +static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume);
> +
> +static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = {
> +	.revision		= 0x00,
> +	.control		= 0x14,
> +	.status			= 0x18,
> +	.eoi			= 0x24,
> +	.epintr_set		= 0x38,
> +	.epintr_clear		= 0x40,
> +	.epintr_status		= 0x30,
> +	.coreintr_set		= 0x3c,
> +	.coreintr_clear		= 0x44,
> +	.coreintr_status	= 0x34,
> +	.phy_utmi		= 0xe0,
> +	.mode			= 0xe8,
> +	.reset			= 0,
> +	.otg_disable		= 21,
> +	.iddig			= 8,
> +	.usb_shift		= 0,
> +	.usb_mask		= 0x1ff,
> +	.usb_bitmap		= (0x1ff << 0),
> +	.drvvbus		= 8,
> +	.txep_shift		= 0,
> +	.txep_mask		= 0xffff,
> +	.txep_bitmap		= (0xffff << 0),
> +	.rxep_shift		= 16,
> +	.rxep_mask		= 0xfffe,
> +	.rxep_bitmap		= (0xfffe << 16),
> +	.musb_core_offset	= 0x400,
> +	.poll_seconds		= 2,
> +};
> +
> +static const struct platform_device_id musb_dsps_id_table[] __devinitconst = {
> +	{
> +		.name	= "musb-ti81xx",
> +		.driver_data	= (kernel_ulong_t) &ti81xx_driver_data,
> +	},
> +	{  },	/* Terminating Entry */
> +};
> +MODULE_DEVICE_TABLE(platform, musb_dsps_id_table);
> +
> +static struct platform_driver dsps_usbss_driver = {
> +	.probe		= dsps_probe,
> +	.remove         = __devexit_p(dsps_remove),
> +	.driver         = {
> +		.name   = "musb-dsps",
> +		.pm	= &dsps_pm_ops,
> +	},
> +	.id_table	= musb_dsps_id_table,
> +};
> +
> +MODULE_DESCRIPTION("TI DSPS MUSB Glue Layer");
> +MODULE_AUTHOR("Ravi B <ravibabu@ti.com>");
> +MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>");
> +MODULE_LICENSE("GPL v2");
> +
> +static int __init dsps_init(void)
> +{
> +	return platform_driver_register(&dsps_usbss_driver);
> +}
> +subsys_initcall(dsps_init);
> +
> +static void __exit dsps_exit(void)
> +{
> +	platform_driver_unregister(&dsps_usbss_driver);
> +}
> +module_exit(dsps_exit);
> -- 
> 1.6.2.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH 6/8] am335xevm: Add support for musb interface
       [not found]   ` <1318332369-9732-7-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
@ 2011-12-12 18:49     ` Tony Lindgren
  0 siblings, 0 replies; 20+ messages in thread
From: Tony Lindgren @ 2011-12-12 18:49 UTC (permalink / raw)
  To: Ajay Kumar Gupta
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0

* Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org> [111011 03:53]:
> Adding musb support in am335x EVM board file.

These last two patches are pending on the machine_id
change for the board file.

Tony
--
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] 20+ messages in thread

* Re: [PATCH 5/8] usb: musb: Add support for ti81xx platform
       [not found]       ` <20111212184900.GE32251-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
@ 2011-12-12 19:09         ` Felipe Balbi
  0 siblings, 0 replies; 20+ messages in thread
From: Felipe Balbi @ 2011-12-12 19:09 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Ajay Kumar Gupta, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0, Ravi Babu

[-- Attachment #1: Type: text/plain, Size: 701 bytes --]

On Mon, Dec 12, 2011 at 10:49:01AM -0800, Tony Lindgren wrote:
> * Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org> [111011 03:53]:
> > From: Ravi Babu <ravibabu-l0cyMroinI0@public.gmane.org>
> > 
> > TI81XX platform has two musb interfaces and uses CPPI4.1 DMA engine.
> > It has builtin USB PHYs as AM35x. The current set of patches adds support
> > for one instance and only in PIO mode.
> 
> This one should get queued by Felipe via the USB tree.

Yeah, I was mostly waiting until you applied your part so we wouldn't
have a file without a user in the tree ;-)

Let's just refresh this one a bit and add devicetree match table so it's
ready for the long run

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

end of thread, other threads:[~2011-12-12 19:09 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-11 11:26 [PATCH 0/8 v4] usb: musb: Adding support for ti81xx and am335x Ajay Kumar Gupta
2011-10-11 11:26 ` [PATCH 1/8] omap: musb: Adding support for ti81xx Ajay Kumar Gupta
     [not found]   ` <1318332369-9732-2-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
2011-12-12 18:47     ` Tony Lindgren
     [not found] ` <1318332369-9732-1-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
2011-10-11 11:26   ` [PATCH 2/8] omap: musb: ti81xx: Add phy power function Ajay Kumar Gupta
     [not found]     ` <1318332369-9732-3-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
2011-12-12 18:47       ` Tony Lindgren
2011-10-11 11:26   ` [PATCH 5/8] usb: musb: Add support for ti81xx platform Ajay Kumar Gupta
2011-12-12 18:49     ` Tony Lindgren
     [not found]       ` <20111212184900.GE32251-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2011-12-12 19:09         ` Felipe Balbi
2011-10-11 11:26   ` [PATCH 8/8] usb: musb: enable support for am335x Ajay Kumar Gupta
2011-10-11 11:26 ` [PATCH 3/8] ti816evm: Add support for musb interface Ajay Kumar Gupta
2011-10-11 12:08   ` Igor Grinberg
2011-10-11 16:28     ` Gupta, Ajay Kumar
2011-10-11 17:07       ` Gupta, Ajay Kumar
     [not found]         ` <19F8576C6E063C45BE387C64729E739404ECCE5662-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2011-12-12 18:48           ` Tony Lindgren
2011-10-11 11:26 ` [PATCH 4/8] ti814evm: " Ajay Kumar Gupta
2011-10-11 11:55   ` Igor Grinberg
2011-10-11 14:41     ` Gupta, Ajay Kumar
2011-10-11 11:26 ` [PATCH 6/8] am335xevm: " Ajay Kumar Gupta
     [not found]   ` <1318332369-9732-7-git-send-email-ajay.gupta-l0cyMroinI0@public.gmane.org>
2011-12-12 18:49     ` Tony Lindgren
2011-10-11 11:26 ` [PATCH 7/8] arm: omap: am335x: enable phy controls Ajay Kumar Gupta

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).