ehci-orion: mbus decode window support
authorLennert Buytenhek <buytenh@wantstofly.org>
Thu, 27 Mar 2008 18:51:39 +0000 (14:51 -0400)
committerNicolas Pitre <nico@marvell.com>
Thu, 27 Mar 2008 18:51:39 +0000 (14:51 -0400)
Make it possible to pass mbus_dram_target_info to the ehci-orion
driver via the platform data, make the ehci-orion driver program
the window registers based on this data if it is passed in, and
make the Orion platform setup code use this method instead of
programming the EHCI mbus window registers by hand.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Reviewed-by: Tzachi Perelstein <tzachi@marvell.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Nicolas Pitre <nico@marvell.com>
arch/arm/mach-orion/addr-map.c
arch/arm/mach-orion/common.c
arch/arm/mach-orion/common.h
drivers/usb/host/ehci-orion.c
include/asm-arm/arch-orion/platform.h

index 69cd0876f6b9075d5a41c1ca49bb04c0285466c3..40bcb986ab966f31d00517b5fc6df36a7f70cead 100644 (file)
 #define ETH_MAX_WIN            6
 #define ETH_MAX_REMAP_WIN      4
 
-/*
- * USB Address Decode Windows registers
- */
-#define USB_WIN_CTRL(i, w)     ((i == 0) ? ORION_USB0_REG(0x320 + ((w) << 4)) \
-                                       : ORION_USB1_REG(0x320 + ((w) << 4)))
-#define USB_WIN_BASE(i, w)     ((i == 0) ? ORION_USB0_REG(0x324 + ((w) << 4)) \
-                                       : ORION_USB1_REG(0x324 + ((w) << 4)))
-#define USB_MAX_WIN            4
-
 /*
  * SATA Address Decode Windows registers
  */
@@ -262,46 +253,6 @@ void __init orion_setup_cpu_wins(void)
        orion_mbus_dram_info.num_cs = cs;
 }
 
-void __init orion_setup_usb_wins(void)
-{
-       int i;
-       u32 usb_if, dev, rev;
-       u32 max_usb_if = 1;
-
-       orion_pcie_id(&dev, &rev);
-       if (dev == MV88F5182_DEV_ID)
-               max_usb_if = 2;
-
-       for (usb_if = 0; usb_if < max_usb_if; usb_if++) {
-               /*
-                * First, disable and clear windows
-                */
-               for (i = 0; i < USB_MAX_WIN; i++) {
-                       orion_write(USB_WIN_BASE(usb_if, i), 0);
-                       orion_write(USB_WIN_CTRL(usb_if, i), 0);
-               }
-
-               /*
-                * Setup windows for DDR banks.
-                */
-               for (i = 0; i < DDR_MAX_CS; i++) {
-                       u32 base, size;
-                       size = orion_read(DDR_SIZE_CS(i));
-                       base = orion_read(DDR_BASE_CS(i));
-                       if (size & DDR_BANK_EN) {
-                               base = DDR_REG_TO_BASE(base);
-                               size = DDR_REG_TO_SIZE(size);
-                               orion_write(USB_WIN_CTRL(usb_if, i),
-                                               ((size-1) & 0xffff0000) |
-                                               (ATTR_DDR_CS(i) << 8) |
-                                               (TARGET_DDR << 4) | WIN_EN);
-                               orion_write(USB_WIN_BASE(usb_if, i),
-                                               base & 0xffff0000);
-                       }
-               }
-       }
-}
-
 void __init orion_setup_eth_wins(void)
 {
        int i;
index cc16588e8c0c6f5778ad90c571833414d99b8d43..d33c01dfc3f264eaff04792d4a8e1917418616f2 100644 (file)
@@ -23,6 +23,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/arch/hardware.h>
+#include <asm/arch/platform.h>
 #include "common.h"
 
 /*****************************************************************************
@@ -149,6 +150,10 @@ static struct resource orion_ehci1_resources[] = {
        },
 };
 
+static struct orion_ehci_data orion_ehci_data = {
+       .dram           = &orion_mbus_dram_info,
+};
+
 static u64 ehci_dmamask = 0xffffffffUL;
 
 static struct platform_device orion_ehci0 = {
@@ -157,6 +162,7 @@ static struct platform_device orion_ehci0 = {
        .dev            = {
                .dma_mask               = &ehci_dmamask,
                .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &orion_ehci_data,
        },
        .resource       = orion_ehci0_resources,
        .num_resources  = ARRAY_SIZE(orion_ehci0_resources),
@@ -168,6 +174,7 @@ static struct platform_device orion_ehci1 = {
        .dev            = {
                .dma_mask               = &ehci_dmamask,
                .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &orion_ehci_data,
        },
        .resource       = orion_ehci1_resources,
        .num_resources  = ARRAY_SIZE(orion_ehci1_resources),
@@ -334,7 +341,6 @@ void __init orion_init(void)
         * Setup Orion address map
         */
        orion_setup_cpu_wins();
-       orion_setup_usb_wins();
        orion_setup_eth_wins();
        if (dev == MV88F5182_DEV_ID)
                orion_setup_sata_wins();
index 961daaa0b91bd78601469493ec970517a1cdb809..c100355754f3256c21964bdaae0081fde59732f8 100644 (file)
@@ -33,7 +33,6 @@ extern struct mbus_dram_target_info orion_mbus_dram_info;
 void orion_setup_cpu_win(enum orion_target target, u32 base, u32 size, int remap);
 void orion_setup_cpu_wins(void);
 void orion_setup_eth_wins(void);
-void orion_setup_usb_wins(void);
 void orion_setup_sata_wins(void);
 
 /*
index e129981f139f7a87f6be48e974abbe5768209c8b..0f0eb89c8cf3c7ea0e53b9b872ddcb40322ed9cf 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/mbus.h>
 #include <asm/arch/orion.h>
+#include <asm/arch/platform.h>
 
 #define rdl(off)       __raw_readl(hcd->regs + (off))
 #define wrl(off, val)  __raw_writel((val), hcd->regs + (off))
 
-#define USB_CAUSE              0x310
-#define USB_MASK               0x314
 #define USB_CMD                        0x140
 #define USB_MODE               0x1a8
+#define USB_CAUSE              0x310
+#define USB_MASK               0x314
+#define USB_WINDOW_CTRL(i)     (0x320 + ((i) << 4))
+#define USB_WINDOW_BASE(i)     (0x324 + ((i) << 4))
 #define USB_IPG                        0x360
 #define USB_PHY_PWR_CTRL       0x400
 #define USB_PHY_TX_CTRL                0x420
@@ -162,8 +166,30 @@ static const struct hc_driver ehci_orion_hc_driver = {
        .bus_resume = ehci_bus_resume,
 };
 
+static void __init
+ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
+                               struct mbus_dram_target_info *dram)
+{
+       int i;
+
+       for (i = 0; i < 4; i++) {
+               wrl(USB_WINDOW_CTRL(i), 0);
+               wrl(USB_WINDOW_BASE(i), 0);
+       }
+
+       for (i = 0; i < dram->num_cs; i++) {
+               struct mbus_dram_window *cs = dram->cs + i;
+
+               wrl(USB_WINDOW_CTRL(i), ((cs->size - 1) & 0xffff0000) |
+                                       (cs->mbus_attr << 8) |
+                                       (dram->mbus_dram_target_id << 4) | 1);
+               wrl(USB_WINDOW_BASE(i), cs->base);
+       }
+}
+
 static int __init ehci_orion_drv_probe(struct platform_device *pdev)
 {
+       struct orion_ehci_data *pd = pdev->dev.platform_data;
        struct resource *res;
        struct usb_hcd *hcd;
        struct ehci_hcd *ehci;
@@ -226,6 +252,12 @@ static int __init ehci_orion_drv_probe(struct platform_device *pdev)
        ehci->is_tdi_rh_tt = 1;
        ehci->sbrn = 0x20;
 
+       /*
+        * (Re-)program MBUS remapping windows if we are asked to.
+        */
+       if (pd != NULL && pd->dram != NULL)
+               ehci_orion_conf_mbus_windows(hcd, pd->dram);
+
        /*
         * setup Orion USB controller
         */
index 143c38e2fa0baccd6460b23712d707455a457a19..0e33fe536ef7f9537cfee15abbb48c7276d6b2fc 100644 (file)
 #ifndef __ASM_ARCH_PLATFORM_H__
 #define __ASM_ARCH_PLATFORM_H__
 
+/*
+ * Orion EHCI platform driver data.
+ */
+struct orion_ehci_data {
+       struct mbus_dram_target_info    *dram;
+};
+
+
 /*
  * Device bus NAND private data
  */
@@ -22,4 +30,5 @@ struct orion_nand_data {
        u8 width;       /* buswidth */
 };
 
+
 #endif