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