From 010009b83010b2e56bf1843d01aa77c8cb2e0926 Mon Sep 17 00:00:00 2001 From: Ofir Cohen Date: Thu, 26 Jan 2012 16:49:17 +0200 Subject: [PATCH] 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 --- arch/arm/mach-msm/devices-9615.c | 18 +++++++++++-- arch/arm/mach-msm/include/mach/irqs-9615.h | 1 + drivers/platform/msm/usb_bam.c | 30 ++++++++++++++++------ include/linux/usb/msm_hsusb.h | 6 +++++ 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c index 8b0c9bd6c36..4fc05ce6dce 100644 --- a/arch/arm/mach-msm/devices-9615.c +++ b/arch/arm/mach-msm/devices-9615.c @@ -102,7 +102,9 @@ struct platform_device msm9615_device_dmov = { }; #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 @@ static struct resource resources_usb_bam[] = { { .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 @@ static struct resource resources_usb_bam[] = { .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 5fba24e0ef3..cd8f2a3f34b 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 b34c35ed414..6caa48f5f8d 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -170,20 +170,34 @@ static int usb_bam_init(void) 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 @@ static int usb_bam_probe(struct platform_device *pdev) 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 664cc8f20f7..f4cc44978e2 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h @@ -288,6 +288,12 @@ struct msm_usb_bam_platform_data { 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