ARM: mx25: dynamically allocate mxc-ehci devices
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 10 Nov 2010 20:27:55 +0000 (21:27 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 17 Nov 2010 09:01:36 +0000 (10:01 +0100)
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@pengutronix.de>
arch/arm/mach-mx25/Kconfig
arch/arm/mach-mx25/devices-imx25.h
arch/arm/mach-mx25/devices.c
arch/arm/mach-mx25/devices.h
arch/arm/mach-mx25/mach-cpuimx25.c
arch/arm/mach-mx25/mach-mx25_3ds.c
arch/arm/plat-mxc/devices/platform-mxc-ehci.c
arch/arm/plat-mxc/ehci.c
arch/arm/plat-mxc/include/mach/mx25.h

index 38ca09a5df9d1ebe07c74279b6e1296555e387ec..b55585bf93fd6932300482fc9f205f1ca0372fb0 100644 (file)
@@ -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
index f62ce93ccbcdfa885197a849385c38934b1765cc..ac343ae7fe43cf5681a4b34412bb3bc214c73c7e 100644 (file)
@@ -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)
index 92eb1a90b52ca708344371d8b38af2a27f520362..4611c763ff1747897861ee6b8cb3cb6eb40182bc 100644 (file)
@@ -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,
index 7b70a43c3a4be3bccf692c4dea2e62f2af1615f5..e6ad64061963cdaf09f445ae41d2b4fd5a3b5ea4 100644 (file)
@@ -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;
index f6f9ad60c25e37f724217c0e5f7a05393992812c..0ee0fe73952d4fbcf4aacb90829645f718bbbdd2 100644 (file)
@@ -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();
index f8be1eb0c062685eb6193dd2664bc544a46f1458..574c41f510dffa83458f731d246696d0e75f1dbd 100644 (file)
@@ -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);
index 0cb67bb6e5b14fac503bcd7a69aaecf30c499fd7..825a048cab1ddfce7f37523f3d5af302ac5a9956 100644 (file)
                .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);
index 9915607683de39e08d1145b115bd289fec360da2..f699235fdf5d43a4e1b3ce609c8ff2bae9251047 100644 (file)
@@ -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;
        }
index a2404b0d9808539a95ff11d981778e9cbc7f2128..0d31f828d2187f40b75ec2b1555cff23dd24c2b5 100644 (file)
@@ -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