usb: gadget: Add HSIC Peripheral over SPS support

Add support in HSIC peripheral(device)
over SPS.
Only one USB core can be use - currently HSUSB
is enabled by default.
To enable HSIC core defconfig file should be changed.

Change-Id: I256aecd9e6dfd8bfd71719c32beed8b24225e11c
Signed-off-by: Ofir Cohen <ofirc@codeaurora.org>
diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c
index 8b0c9bd..4fc05ce 100644
--- a/arch/arm/mach-msm/devices-9615.c
+++ b/arch/arm/mach-msm/devices-9615.c
@@ -102,7 +102,9 @@
 };
 
 #define MSM_USB_BAM_BASE     0x12502000
-#define MSM_USB_BAM_SIZE     0x3DFFF
+#define MSM_USB_BAM_SIZE     SZ_16K
+#define MSM_HSIC_BAM_BASE    0x12542000
+#define MSM_HSIC_BAM_SIZE    SZ_16K
 
 static struct resource resources_otg[] = {
 	{
@@ -144,7 +146,7 @@
 	{
 		.name	= "usb_bam_addr",
 		.start	= MSM_USB_BAM_BASE,
-		.end	= MSM_USB_BAM_BASE + MSM_USB_BAM_SIZE,
+		.end	= MSM_USB_BAM_BASE + MSM_USB_BAM_SIZE - 1,
 		.flags	= IORESOURCE_MEM,
 	},
 	{
@@ -153,6 +155,18 @@
 		.end	= USB1_HS_BAM_IRQ,
 		.flags	= IORESOURCE_IRQ,
 	},
+	{
+		.name	= "hsic_bam_addr",
+		.start	= MSM_HSIC_BAM_BASE,
+		.end	= MSM_HSIC_BAM_BASE + MSM_HSIC_BAM_SIZE - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
+		.name	= "hsic_bam_irq",
+		.start	= USB_HSIC_BAM_IRQ,
+		.end	= USB_HSIC_BAM_IRQ,
+		.flags	= IORESOURCE_IRQ,
+	},
 };
 
 struct platform_device msm_device_usb_bam = {
diff --git a/arch/arm/mach-msm/include/mach/irqs-9615.h b/arch/arm/mach-msm/include/mach/irqs-9615.h
index 5fba24e..cd8f2a3 100644
--- a/arch/arm/mach-msm/include/mach/irqs-9615.h
+++ b/arch/arm/mach-msm/include/mach/irqs-9615.h
@@ -179,6 +179,7 @@
 #define TLMM_MSM_DIR_CONN_IRQ_21		(GIC_SPI_START + 224)
 #define MSM_SPARE0_IRQ				(GIC_SPI_START + 225)
 #define PMIC_SEC_IRQ_N				(GIC_SPI_START + 226)
+#define USB_HSIC_BAM_IRQ			(GIC_SPI_START + 231)
 #define USB_HSIC_IRQ				(GIC_SPI_START + 232)
 
 #define NR_MSM_IRQS 288
diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c
index b34c35e..6caa48f 100644
--- a/drivers/platform/msm/usb_bam.c
+++ b/drivers/platform/msm/usb_bam.c
@@ -170,20 +170,34 @@
 	struct msm_usb_bam_platform_data *pdata =
 		(struct msm_usb_bam_platform_data *)
 			(usb_bam_pdev->dev.platform_data);
+	struct resource *res;
+	int irq;
 
-	usb_virt_addr = ioremap_nocache(
-						pdata->usb_bam_phy_base,
-						pdata->usb_bam_phy_size);
+	res = platform_get_resource(usb_bam_pdev, IORESOURCE_MEM,
+						pdata->usb_active_bam);
+	if (!res) {
+		dev_err(&usb_bam_pdev->dev, "Unable to get memory resource\n");
+		return -ENODEV;
+	}
+
+	irq = platform_get_irq(usb_bam_pdev, pdata->usb_active_bam);
+	if (irq < 0) {
+		dev_err(&usb_bam_pdev->dev, "Unable to get IRQ resource\n");
+		return irq;
+	}
+
+	usb_virt_addr = ioremap(res->start, resource_size(res));
 	if (!usb_virt_addr) {
 		pr_err("%s: ioremap failed\n", __func__);
 		return -ENOMEM;
 	}
-	usb_props.phys_addr = pdata->usb_bam_phy_base;
+	usb_props.phys_addr = res->start;
 	usb_props.virt_addr = usb_virt_addr;
-	usb_props.virt_size = pdata->usb_bam_phy_size;
-	usb_props.irq = USB1_HS_BAM_IRQ;
-	usb_props.num_pipes = pdata->usb_bam_num_pipes;
+	usb_props.virt_size = resource_size(res);
+	usb_props.irq = irq;
 	usb_props.summing_threshold = USB_SUMMING_THRESHOLD;
+	usb_props.num_pipes = pdata->usb_bam_num_pipes;
+
 	ret = sps_register_bam_device(&usb_props, &h_usb);
 	if (ret < 0) {
 		pr_err("%s: register bam error %d\n", __func__, ret);
@@ -210,7 +224,7 @@
 
 	ret = usb_bam_init();
 	if (ret) {
-		dev_err(&pdev->dev, "failed to get platform resource mem\n");
+		dev_err(&pdev->dev, "failed to initialize usb bam\n");
 		return ret;
 	}
 
diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h
index 664cc8f..f4cc449 100644
--- a/include/linux/usb/msm_hsusb.h
+++ b/include/linux/usb/msm_hsusb.h
@@ -288,6 +288,12 @@
 	struct usb_bam_pipe_connect *connections;
 	unsigned long usb_bam_phy_base;
 	unsigned long usb_bam_phy_size;
+	int usb_active_bam;
 	int usb_bam_num_pipes;
 };
+
+enum usb_bam {
+	HSUSB_BAM = 0,
+	HSIC_BAM,
+};
 #endif