[U-Boot] [PATCH] usb: ehci-marvell: use structs for registers

Marek Vasut marex at denx.de
Sun Jun 30 00:28:38 CEST 2013


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-uboot at 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


More information about the U-Boot mailing list