[PATCH 28/51] ARM: mx25: dynamically allocate mxc-ehci devices

Michael Trimarchi trimarchi at gandalf.sssup.it
Fri Nov 26 10:24:41 EST 2010


Hi

On 11/26/2010 04:04 PM, Jaume Ribot wrote:
> Dear Uwe,
>
> I think there is an error in the Freescale documentation, as new 0x200 offset (as it might be according reference manual) makes usbh2 stops working.
>
> Other users have experienced simmilar issues:
> http://forums.freescale.com/t5/i-MX-Microprocessors/i-MX25-USBOH-host-core-port-on-chip-serial-PHY-Control/m-p/59365
>
> I think old 0x400 offset value were correct.
> Anyone can confirm?
I can say that I'm using the mainline (814ce2521121c2459e16cea8c7221e157edbeddd) without this patch and the usbhost work
on my mx25 board.

These are my settings:

static struct mxc_usbh_platform_data usbh2_pdata = {
         .portsc = MXC_EHCI_MODE_SERIAL,
         .flags  = MXC_EHCI_INTERFACE_DIFF_UNI | MXC_EHCI_INTERNAL_PHY |
                   MXC_EHCI_PP_HST | MXC_EHCI_XCSH |
                   MXC_EHCI_IPPUE_DOWN | MXC_EHCI_POWER_PINS_ENABLED,
};

/* USB */
MX25_PAD_PWM__USBH2_OC,
MX25_PAD_CONTRAST__USBH2_PWR,

I have done some test with an usb pendrive

Michael

>
> On 17/11/2010 22:29, Uwe Kleine-König wrote:
>> According to the reference manual of the i.MX25 the host controller uses an
>> offset of 0x200 not 0x400 as was specified in the resources for mxc_usbh2.
>>
>> Needs-Testing: yes
>> Signed-off-by: Uwe Kleine-König<u.kleine-koenig at pengutronix.de>
>> ---
>>   arch/arm/mach-mx25/Kconfig                    |    6 ++-
>>   arch/arm/mach-mx25/devices-imx25.h            |    7 ++++
>>   arch/arm/mach-mx25/devices.c                  |   44 ++----------------------
>>   arch/arm/mach-mx25/devices.h                  |    2 -
>>   arch/arm/mach-mx25/mach-cpuimx25.c            |    9 ++---
>>   arch/arm/mach-mx25/mach-mx25_3ds.c            |    2 +-
>>   arch/arm/plat-mxc/devices/platform-mxc-ehci.c |    7 ++++
>>   arch/arm/plat-mxc/ehci.c                      |    4 +-
>>   arch/arm/plat-mxc/include/mach/mx25.h         |    6 +++-
>>   9 files changed, 34 insertions(+), 53 deletions(-)
>>
>> diff --git a/arch/arm/mach-mx25/Kconfig b/arch/arm/mach-mx25/Kconfig
>> index 38ca09a..b55585b 100644
>> --- a/arch/arm/mach-mx25/Kconfig
>> +++ b/arch/arm/mach-mx25/Kconfig
>> @@ -5,16 +5,18 @@ comment "MX25 platforms:"
>>   config MACH_MX25_3DS
>>       bool "Support MX25PDK (3DS) Platform"
>>       select IMX_HAVE_PLATFORM_IMX_UART
>> +    select IMX_HAVE_PLATFORM_MXC_EHCI
>>       select IMX_HAVE_PLATFORM_MXC_NAND
>>       select IMX_HAVE_PLATFORM_ESDHC
>>
>>   config MACH_EUKREA_CPUIMX25
>>       bool "Support Eukrea CPUIMX25 Platform"
>> +    select IMX_HAVE_PLATFORM_ESDHC
>> +    select IMX_HAVE_PLATFORM_FLEXCAN
>>       select IMX_HAVE_PLATFORM_IMX_I2C
>>       select IMX_HAVE_PLATFORM_IMX_UART
>> +    select IMX_HAVE_PLATFORM_MXC_EHCI
>>       select IMX_HAVE_PLATFORM_MXC_NAND
>> -    select IMX_HAVE_PLATFORM_FLEXCAN
>> -    select IMX_HAVE_PLATFORM_ESDHC
>>       select MXC_ULPI if USB_ULPI
>>
>>   choice
>> diff --git a/arch/arm/mach-mx25/devices-imx25.h b/arch/arm/mach-mx25/devices-imx25.h
>> index f62ce93..ac343ae 100644
>> --- a/arch/arm/mach-mx25/devices-imx25.h
>> +++ b/arch/arm/mach-mx25/devices-imx25.h
>> @@ -39,6 +39,13 @@ extern const struct imx_imx_uart_1irq_data imx25_imx_uart_data[] __initconst;
>>   #define imx25_add_imx_uart3(pdata)    imx25_add_imx_uart(3, pdata)
>>   #define imx25_add_imx_uart4(pdata)    imx25_add_imx_uart(4, pdata)
>>
>> +extern const struct imx_mxc_ehci_data imx25_mxc_ehci_otg_data __initconst;
>> +#define imx25_add_mxc_ehci_otg(pdata)    \
>> +    imx_add_mxc_ehci(&imx25_mxc_ehci_otg_data, pdata)
>> +extern const struct imx_mxc_ehci_data imx25_mxc_ehci_hs_data __initconst;
>> +#define imx25_add_mxc_ehci_hs(pdata)    \
>> +    imx_add_mxc_ehci(&imx25_mxc_ehci_hs_data, pdata)
>> +
>>   extern const struct imx_mxc_nand_data imx25_mxc_nand_data __initconst;
>>   #define imx25_add_mxc_nand(pdata)    \
>>       imx_add_mxc_nand(&imx25_mxc_nand_data, pdata)
>> diff --git a/arch/arm/mach-mx25/devices.c b/arch/arm/mach-mx25/devices.c
>> index 92eb1a9..4611c76 100644
>> --- a/arch/arm/mach-mx25/devices.c
>> +++ b/arch/arm/mach-mx25/devices.c
>> @@ -26,27 +26,16 @@ static u64 otg_dmamask = DMA_BIT_MASK(32);
>>
>>   static struct resource mxc_otg_resources[] = {
>>       {
>> -        .start = MX25_OTG_BASE_ADDR,
>> -        .end = MX25_OTG_BASE_ADDR + 0x1ff,
>> +        .start = MX25_USB_OTG_BASE_ADDR,
>> +        .end = MX25_USB_OTG_BASE_ADDR + 0x1ff,
>>           .flags = IORESOURCE_MEM,
>>       }, {
>> -        .start = 37,
>> -        .end = 37,
>> +        .start = MX25_INT_USB_OTG,
>> +        .end = MX25_INT_USB_OTG,
>>           .flags = IORESOURCE_IRQ,
>>       },
>>   };
>>
>> -struct platform_device mxc_otg = {
>> -    .name = "mxc-ehci",
>> -    .id = 0,
>> -    .dev = {
>> -        .coherent_dma_mask = 0xffffffff,
>> -        .dma_mask =&otg_dmamask,
>> -    },
>> -    .resource = mxc_otg_resources,
>> -    .num_resources = ARRAY_SIZE(mxc_otg_resources),
>> -};
>> -
>>   /* OTG gadget device */
>>   struct platform_device otg_udc_device = {
>>       .name = "fsl-usb2-udc",
>> @@ -59,31 +48,6 @@ struct platform_device otg_udc_device = {
>>       .num_resources = ARRAY_SIZE(mxc_otg_resources),
>>   };
>>
>> -static u64 usbh2_dmamask = DMA_BIT_MASK(32);
>> -
>> -static struct resource mxc_usbh2_resources[] = {
>> -    {
>> -        .start = MX25_OTG_BASE_ADDR + 0x400,
>> -        .end = MX25_OTG_BASE_ADDR + 0x5ff,
>> -        .flags = IORESOURCE_MEM,
>> -    }, {
>> -        .start = 35,
>> -        .end = 35,
>> -        .flags = IORESOURCE_IRQ,
>> -    },
>> -};
>> -
>> -struct platform_device mxc_usbh2 = {
>> -    .name = "mxc-ehci",
>> -    .id = 1,
>> -    .dev = {
>> -        .coherent_dma_mask = 0xffffffff,
>> -        .dma_mask =&usbh2_dmamask,
>> -    },
>> -    .resource = mxc_usbh2_resources,
>> -    .num_resources = ARRAY_SIZE(mxc_usbh2_resources),
>> -};
>> -
>>   static struct resource mxc_pwm_resources0[] = {
>>       {
>>           .start    = 0x53fe0000,
>> diff --git a/arch/arm/mach-mx25/devices.h b/arch/arm/mach-mx25/devices.h
>> index 7b70a43..e6ad640 100644
>> --- a/arch/arm/mach-mx25/devices.h
>> +++ b/arch/arm/mach-mx25/devices.h
>> @@ -1,6 +1,4 @@
>> -extern struct platform_device mxc_otg;
>>   extern struct platform_device otg_udc_device;
>> -extern struct platform_device mxc_usbh2;
>>   extern struct platform_device mxc_pwm_device0;
>>   extern struct platform_device mxc_pwm_device1;
>>   extern struct platform_device mxc_pwm_device2;
>> diff --git a/arch/arm/mach-mx25/mach-cpuimx25.c b/arch/arm/mach-mx25/mach-cpuimx25.c
>> index f6f9ad6..0ee0fe7 100644
>> --- a/arch/arm/mach-mx25/mach-cpuimx25.c
>> +++ b/arch/arm/mach-mx25/mach-cpuimx25.c
>> @@ -39,7 +39,6 @@
>>   #include<mach/mx25.h>
>>   #include<mach/mxc_nand.h>
>>   #include<mach/imxfb.h>
>> -#include<mach/mxc_ehci.h>
>>   #include<mach/iomux-mx25.h>
>>
>>   #include "devices-imx25.h"
>> @@ -87,12 +86,12 @@ static struct i2c_board_info eukrea_cpuimx25_i2c_devices[] = {
>>       },
>>   };
>>
>> -static struct mxc_usbh_platform_data otg_pdata = {
>> +static const struct mxc_usbh_platform_data otg_pdata __initconst = {
>>       .portsc    = MXC_EHCI_MODE_UTMI,
>>       .flags    = MXC_EHCI_INTERFACE_DIFF_UNI,
>>   };
>>
>> -static struct mxc_usbh_platform_data usbh2_pdata = {
>> +static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
>>       .portsc    = MXC_EHCI_MODE_SERIAL,
>>       .flags    = MXC_EHCI_INTERFACE_SINGLE_UNI | MXC_EHCI_INTERNAL_PHY |
>>             MXC_EHCI_IPPUE_DOWN,
>> @@ -134,11 +133,11 @@ static void __init eukrea_cpuimx25_init(void)
>>       imx25_add_imx_i2c0(&eukrea_cpuimx25_i2c0_data);
>>
>>       if (otg_mode_host)
>> -        mxc_register_device(&mxc_otg,&otg_pdata);
>> +        imx25_add_mxc_ehci_otg(&otg_pdata);
>>       else
>>           mxc_register_device(&otg_udc_device,&otg_device_pdata);
>>
>> -    mxc_register_device(&mxc_usbh2,&usbh2_pdata);
>> +    imx25_add_mxc_ehci_hs(&usbh2_pdata);
>>
>>   #ifdef CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD
>>       eukrea_mbimxsd25_baseboard_init();
>> diff --git a/arch/arm/mach-mx25/mach-mx25_3ds.c b/arch/arm/mach-mx25/mach-mx25_3ds.c
>> index f8be1eb..574c41f 100644
>> --- a/arch/arm/mach-mx25/mach-mx25_3ds.c
>> +++ b/arch/arm/mach-mx25/mach-mx25_3ds.c
>> @@ -192,7 +192,7 @@ static void __init mx25pdk_init(void)
>>               ARRAY_SIZE(mx25pdk_pads));
>>
>>       imx25_add_imx_uart0(&uart_pdata);
>> -    mxc_register_device(&mxc_usbh2, NULL);
>> +    imx25_add_mxc_ehci_hs(NULL);
>>       imx25_add_mxc_nand(&mx25pdk_nand_board_info);
>>       mxc_register_device(&mx25_rtc_device, NULL);
>>       mxc_register_device(&mx25_fb_device,&mx25pdk_fb_pdata);
>> diff --git a/arch/arm/plat-mxc/devices/platform-mxc-ehci.c b/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
>> index 0cb67bb..825a048ca 100644
>> --- a/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
>> +++ b/arch/arm/plat-mxc/devices/platform-mxc-ehci.c
>> @@ -16,6 +16,13 @@
>>           .irq = soc ## _INT_USB_ ## hs,                \
>>       }
>>
>> +#ifdef CONFIG_ARCH_MX25
>> +const struct imx_mxc_ehci_data imx25_mxc_ehci_otg_data __initconst =
>> +    imx_mxc_ehci_data_entry_single(MX25, 0, OTG);
>> +const struct imx_mxc_ehci_data imx25_mxc_ehci_hs_data __initconst =
>> +    imx_mxc_ehci_data_entry_single(MX25, 1, HS);
>> +#endif /* ifdef CONFIG_ARCH_MX25 */
>> +
>>   #ifdef CONFIG_SOC_IMX27
>>   const struct imx_mxc_ehci_data imx27_mxc_ehci_otg_data __initconst =
>>       imx_mxc_ehci_data_entry_single(MX27, 0, OTG);
>> diff --git a/arch/arm/plat-mxc/ehci.c b/arch/arm/plat-mxc/ehci.c
>> index 9915607..f699235 100644
>> --- a/arch/arm/plat-mxc/ehci.c
>> +++ b/arch/arm/plat-mxc/ehci.c
>> @@ -71,7 +71,7 @@ int mxc_initialize_usb_hw(int port, unsigned int flags)
>>       unsigned int v;
>>   #if defined(CONFIG_ARCH_MX25)
>>       if (cpu_is_mx25()) {
>> -        v = readl(MX25_IO_ADDRESS(MX25_OTG_BASE_ADDR +
>> +        v = readl(MX25_IO_ADDRESS(MX25_USB_BASE_ADDR +
>>                        USBCTRL_OTGBASE_OFFSET));
>>
>>           switch (port) {
>> @@ -108,7 +108,7 @@ int mxc_initialize_usb_hw(int port, unsigned int flags)
>>               return -EINVAL;
>>           }
>>
>> -        writel(v, MX25_IO_ADDRESS(MX25_OTG_BASE_ADDR +
>> +        writel(v, MX25_IO_ADDRESS(MX25_USB_BASE_ADDR +
>>                        USBCTRL_OTGBASE_OFFSET));
>>           return 0;
>>       }
>> diff --git a/arch/arm/plat-mxc/include/mach/mx25.h b/arch/arm/plat-mxc/include/mach/mx25.h
>> index a2404b0..0d31f82 100644
>> --- a/arch/arm/plat-mxc/include/mach/mx25.h
>> +++ b/arch/arm/plat-mxc/include/mach/mx25.h
>> @@ -43,7 +43,9 @@
>>   #define MX25_LCDC_BASE_ADDR        0x53fbc000
>>   #define MX25_KPP_BASE_ADDR        0x43fa8000
>>   #define MX25_SDMA_BASE_ADDR        0x53fd4000
>> -#define MX25_OTG_BASE_ADDR        0x53ff4000
>> +#define MX25_USB_BASE_ADDR        0x53ff4000
>> +#define MX25_USB_OTG_BASE_ADDR            (MX25_USB_BASE_ADDR + 0x0000)
>> +#define MX25_USB_HS_BASE_ADDR            (MX25_USB_BASE_ADDR + 0x0200)
>>   #define MX25_CSI_BASE_ADDR        0x53ff8000
>>
>>   #define MX25_IO_P2V(x)            IMX_IO_P2V(x)
>> @@ -67,6 +69,8 @@
>>   #define MX25_INT_UART2        32
>>   #define MX25_INT_NFC        33
>>   #define MX25_INT_SDMA        34
>> +#define MX25_INT_USB_HS        35
>> +#define MX25_INT_USB_OTG    37
>>   #define MX25_INT_LCDC        39
>>   #define MX25_INT_UART5        40
>>   #define MX25_INT_CAN1        43
>
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: mx25_usbh2.patch
Type: text/x-patch
Size: 3001 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101126/a1cd8200/attachment-0001.bin>


More information about the linux-arm-kernel mailing list