Dear Sascha Silbe, > Use structs instead of computing offsets for accessing individual > registers. The base address of the USB controller is still an offset > defined in SoC headers as it can differ between SoCs. > > Signed-off-by: Sascha Silbe <t-ub...@infra-silbe.de> > --- > Tested on CuBox Pro only. > > drivers/usb/host/ehci-marvell.c | 48 > +++++++++++++++++++++++++++++------------ 1 file changed, 34 > insertions(+), 14 deletions(-) > > diff --git a/drivers/usb/host/ehci-marvell.c > b/drivers/usb/host/ehci-marvell.c index 2b73e4a..e4d6881 100644 > --- a/drivers/usb/host/ehci-marvell.c > +++ b/drivers/usb/host/ehci-marvell.c > @@ -36,17 +36,35 @@ > > DECLARE_GLOBAL_DATA_PTR; > > -#define rdl(off) readl(MVUSB0_BASE + (off)) > -#define wrl(off, val) writel((val), MVUSB0_BASE + (off)) > - > -#define USB_WINDOW_CTRL(i) (0x320 + ((i) << 4)) > -#define USB_WINDOW_BASE(i) (0x324 + ((i) << 4)) > #define USB_TARGET_DRAM 0x0 > > +/* USB 2.0 Bridge Address Decoding registers */ > +struct mvusb_bad_window_regs { > + u32 control; > + u32 base; > + u32 reserved[2]; > +}; > + > +struct mvusb_bridge_regs { > + u32 bridge_control; > + u32 reserved1[3]; > + u32 int_cause; /* Bridge Interrupt Cause Register */ > + u32 int_mask; /* Bridge Interrupt Mask Register */ > + u32 reserved2; > + u32 error_addr; /* Bridge Error Address Register */ > + struct mvusb_bad_window_regs window[4]; > +}; > + > +struct mvusb_regs { > + u32 unused1[0x40]; > + u32 ehci_regs[0x80]; > + struct mvusb_bridge_regs bridge; > +}; > + > /* > * USB 2.0 Bridge Address Decoding registers setup > */ > -static void usb_brg_adrdec_setup(void) > +static void usb_brg_adrdec_setup(struct mvusb_regs *usb_base) > { > int i; > u32 size, base, attrib; > @@ -75,14 +93,15 @@ static void usb_brg_adrdec_setup(void) > > size = gd->bd->bi_dram[i].size; > base = gd->bd->bi_dram[i].start; > - if ((size) && (attrib)) > - wrl(USB_WINDOW_CTRL(i), > - MVCPU_WIN_CTRL_DATA(size, USB_TARGET_DRAM, > - attrib, MVCPU_WIN_ENABLE)); > + if (size && attrib) > + writel(MVCPU_WIN_CTRL_DATA(size, USB_TARGET_DRAM, > + attrib, MVCPU_WIN_ENABLE), > + usb_base->bridge.window[i].control); > else > - wrl(USB_WINDOW_CTRL(i), MVCPU_WIN_DISABLE); > + writel(MVCPU_WIN_DISABLE, > + usb_base->bridge.window[i].control); > > - wrl(USB_WINDOW_BASE(i), base); > + writel(base, usb_base->bridge.window[i].base); > } > }
OK > @@ -92,9 +111,10 @@ static void usb_brg_adrdec_setup(void) > */ > int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor > **hcor) { > - usb_brg_adrdec_setup(); > + struct mvusb_regs *usb_base = (struct mvusb_regs *)MVUSB0_BASE; > > - *hccr = (struct ehci_hccr *)(MVUSB0_BASE + 0x100); > + usb_brg_adrdec_setup(usb_base); > + *hccr = (struct ehci_hccr *)(&usb_base->ehci_regs); > *hcor = (struct ehci_hcor *)((uint32_t) *hccr > + HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); I'd keep this as-is, since the 0x100 is fairy standard offset in the USB case. Best regards, Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot