Hi Lucas, On Tue, Oct 30, 2012 at 2:22 AM, Lucas Stach <d...@lynxeye.de> wrote: > There is no need to init a USB controller before the upper layers indicate > that they are actually going to use it. > > board_usb_init now only parses the device tree and sets up the common pll. > > Signed-off-by: Lucas Stach <d...@lynxeye.de> > --- > arch/arm/cpu/armv7/tegra20/usb.c | 47 > +++++++++++++++------------------------- > 1 Datei geändert, 18 Zeilen hinzugefügt(+), 29 Zeilen entfernt(-) > > diff --git a/arch/arm/cpu/armv7/tegra20/usb.c > b/arch/arm/cpu/armv7/tegra20/usb.c > index cf800b1..e372b8b 100644 > --- a/arch/arm/cpu/armv7/tegra20/usb.c > +++ b/arch/arm/cpu/armv7/tegra20/usb.c > @@ -417,44 +417,29 @@ static int init_ulpi_usb_controller(struct fdt_usb > *config) > } > #endif > > -/** > - * Add a new USB port to the list of available ports. > - * > - * @param config USB port configuration > - * @return 0 if ok, -1 if error (too many ports) > - */ > -static int add_port(struct fdt_usb *config) > +int tegrausb_start_port(int portnum, u32 *hccr, u32 *hcor) > { > - if (port_count == USB_PORTS_MAX) { > - printf("tegrausb: Cannot register more than %d ports\n", > - USB_PORTS_MAX); > + struct fdt_usb *config; > + struct usb_ctlr *usbctlr; > + > + if (portnum >= port_count) > return -1; > - } > + > + config = &port[portnum]; > > if (config->utmi && init_utmi_usb_controller(config)) { > - printf("tegrausb: Cannot init port\n"); > + printf("tegrausb: Cannot init port %d\n", portnum); > return -1; > } > > if (config->ulpi && init_ulpi_usb_controller(config)) { > - printf("tegrausb: Cannot init port\n"); > + printf("tegrausb: Cannot init port %d\n", portnum); > return -1; > } > > - port[port_count++] = *config; > - > - return 0; > -} > + set_host_mode(config);
This is good, but now I think you will re-init the USB peripheral at every 'usb start'. Perhaps you should remember whether it has been inited and only do it the first time? Regards, Simon > > -int tegrausb_start_port(int portnum, u32 *hccr, u32 *hcor) > -{ > - struct usb_ctlr *usbctlr; > - > - if (portnum >= port_count) > - return -1; > - set_host_mode(&port[portnum]); > - > - usbctlr = port[portnum].reg; > + usbctlr = config->reg; > *hccr = (u32)&usbctlr->cap_length; > *hcor = (u32)&usbctlr->usb_cmd; > return 0; > @@ -539,6 +524,12 @@ int board_usb_init(const void *blob) > count = fdtdec_find_aliases_for_id(blob, "usb", > COMPAT_NVIDIA_TEGRA20_USB, node_list, USB_PORTS_MAX); > for (i = 0; i < count; i++) { > + if (port_count == USB_PORTS_MAX) { > + printf("tegrausb: Cannot register more than %d > ports\n", > + USB_PORTS_MAX); > + return -1; > + } > + > debug("USB %d: ", i); > node = node_list[i]; > if (!node) > @@ -549,9 +540,7 @@ int board_usb_init(const void *blob) > return -1; > } > > - if (add_port(&config)) > - return -1; > - set_host_mode(&config); > + port[port_count++] = config; > } > > return 0; > -- > 1.7.11.7 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot