From 4e64f8fe95dd310cd234ed4d191f312e704ab19d Mon Sep 17 00:00:00 2001
From: Ashokkumar G <0xfee1dead.sa@gmail.com>
Date: Mon, 26 Jan 2015 11:51:13 -0700
Subject: [PATCH 7/9] arch:arm:mmp: Adding USB Host and OTG peripheral for
 pxa168

Adding USB host, USB OTG peripherals memory, register information
for pxa168 SOC

Enable USB Host, USB OTG in gplugd

Signed-off-by: Ashokkumar G <0xfee1dead.sa@gmail.com>
---
 arch/arm/mach-mmp/devices.c             | 35 ++++++++++++++++++
 arch/arm/mach-mmp/gplugd.c              | 64 +++++++++++++++++++++++++++++++++
 arch/arm/mach-mmp/include/mach/pxa168.h |  4 +++
 3 files changed, 103 insertions(+)

diff --git a/arch/arm/mach-mmp/devices.c b/arch/arm/mach-mmp/devices.c
index 2bcb766af05d..7d8499f9c34c 100644
--- a/arch/arm/mach-mmp/devices.c
+++ b/arch/arm/mach-mmp/devices.c
@@ -241,6 +241,41 @@ void pxa_usb_phy_deinit(void __iomem *phy_reg)
 #if IS_ENABLED(CONFIG_USB_SUPPORT)
 static u64 usb_dma_mask = ~(u32)0;
 
+#if IS_ENABLED(CONFIG_USB_EHCI_MV)
+struct resource pxa168_u2h_resources[] = {
+	/* regbase */
+	[0] = {
+		.start  = PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET,
+		.end    = PXA168_U2H_REGBASE + USB_REG_RANGE,
+		.flags  = IORESOURCE_MEM,
+		.name   = "capregs",
+	},
+	/* phybase */
+	[1] = {
+		.start  = PXA168_U2H_PHYBASE,
+		.end    = PXA168_U2H_PHYBASE + USB_PHY_RANGE,
+		.flags  = IORESOURCE_MEM,
+		.name   = "phyregs",
+	},
+	[2] = {
+		.start  = IRQ_PXA168_USB2,
+		.end    = IRQ_PXA168_USB2,
+		.flags  = IORESOURCE_IRQ,
+	},
+};
+
+struct platform_device pxa168_device_u2h = {
+	.name = "pxa-sph",
+	.id   = -1,
+	.resource      = pxa168_u2h_resources,
+	.num_resources = ARRAY_SIZE(pxa168_u2h_resources),
+	.dev  = {
+		.dma_mask = &usb_dma_mask,
+		.coherent_dma_mask = 0xffffffff,
+	},
+};
+#endif
+
 #if IS_ENABLED(CONFIG_USB_MV_UDC)
 struct resource pxa168_u2o_resources[] = {
 	/* regbase */
diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c
index ba4ce4e63bbe..b9c3c9257eec 100644
--- a/arch/arm/mach-mmp/gplugd.c
+++ b/arch/arm/mach-mmp/gplugd.c
@@ -173,6 +173,56 @@ static void __init select_disp_freq(void)
 	}
 }
 
+#ifdef CONFIG_USB_SUPPORT
+
+#if defined(CONFIG_USB_EHCI_HCD) && defined(CONFIG_USB_EHCI_MV)
+
+static char *pxa168_u2h_clock_name[] = {
+	[0] = "U2HCLK",
+};
+
+static struct mv_usb_platform_data pxa168_u2h_pdata = {
+	.mode           = MV_USB_MODE_HOST,
+	.phy_init       = pxa_usb_phy_init,
+	.phy_deinit     = pxa_usb_phy_deinit,
+	.set_vbus       = NULL,
+};
+#endif
+
+#if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O)
+static char *pxa168_u2o_clock_name[] = {
+	[0] = "U2OCLK",
+};
+
+static struct mv_usb_platform_data pxa168_u2o_udc_pdata = {
+	.vbus			= NULL,
+	.mode			= MV_USB_MODE_OTG,
+	.otg_force_a_bus_req	= 1,
+	.phy_init		= pxa_usb_phy_init,
+	.phy_deinit		= pxa_usb_phy_deinit,
+	.set_vbus		= NULL,
+};
+static struct mv_usb_platform_data pxa168_u2o_pdata = {
+	.vbus			= NULL,
+	.mode			= MV_USB_MODE_OTG,
+	.otg_force_a_bus_req	= 1,
+	.phy_init		= pxa_usb_phy_init,
+	.phy_deinit		= pxa_usb_phy_deinit,
+	.set_vbus		= NULL,
+};
+static struct mv_usb_platform_data pxa168_u2o_otg_pdata = {
+	.vbus			= NULL,
+	.mode			= MV_USB_MODE_OTG,
+	.otg_force_a_bus_req	= 1,
+	.phy_init		= pxa_usb_phy_init,
+	.phy_deinit		= pxa_usb_phy_deinit,
+
+	.set_vbus		= NULL,
+};
+
+#endif
+#endif
+
 static struct pxa2xx_spi_master pxa_ssp_master_info = {
 	.num_chipselect	= 1,
 	.enable_dma = 1,
@@ -340,6 +390,20 @@ static void __init gplugd_init(void)
 	pxa168_add_sdh(1, &gplugd_sdh_platdata);
 	pxa168_add_sdh(2, &gplugd_sdh_platdata);
 
+#if defined(CONFIG_USB_EHCI_HCD) && defined(CONFIG_USB_EHCI_MV)
+	pxa168_device_u2h.dev.platform_data = &pxa168_u2h_pdata;
+	platform_device_register(&pxa168_device_u2h);
+#endif
+#ifdef CONFIG_USB_MV_UDC
+	pxa168_device_u2o.dev.platform_data = &pxa168_u2o_udc_pdata;
+	platform_device_register(&pxa168_device_u2o);
+#endif
+
+#ifdef CONFIG_USB_EHCI_MV_U2O
+	pxa168_device_u2oehci.dev.platform_data = &pxa168_u2o_pdata;
+	platform_device_register(&pxa168_device_u2oehci);
+#endif
+
 	pxa168_add_eth(&gplugd_eth_platform_data);
 }
 
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
index def8f462943d..feed849620c1 100644
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
@@ -42,6 +42,10 @@ extern struct pxa_device_desc pxa168_device_sdh1;
 extern struct pxa_device_desc pxa168_device_sdh2;
 extern struct pxa_device_desc pxa168_device_sdh3;
 extern struct pxa_device_desc pxa168_device_sdh4;
+extern struct platform_device pxa168_device_u2o;
+extern struct platform_device pxa168_device_u2h;
+extern struct platform_device pxa168_device_u2oehci;
+extern struct platform_device pxa168_device_u2ootg;
 /* pdata can be NULL */
 extern int __init pxa168_add_usb_host(struct mv_usb_platform_data *pdata);
 
-- 
2.14.1