[PATCH V2] usb: ehci-omap: Add Support DM_USB and OF_CONTROL
Marek Vasut
marex at denx.de
Sun May 10 16:38:47 CEST 2020
On 5/10/20 4:33 PM, Adam Ford wrote:
[...]
> @@ -177,8 +180,13 @@ int omap_ehci_hcd_stop(void)
> * Based on "drivers/usb/host/ehci-omap.c" from Linux 3.1
> * See there for additional Copyrights.
> */
> +#if !CONFIG_IS_ENABLED(DM_USB) || !CONFIG_IS_ENABLED(OF_CONTROL)
> +
> int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
> struct ehci_hccr **hccr, struct ehci_hcor **hcor)
> +#else
> +int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata)
> +#endif
> {
> int ret;
> unsigned int i, reg = 0, rev = 0;
> @@ -285,10 +293,130 @@ int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
> for (i = 0; i < OMAP_HS_USB_PORTS; i++)
> if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))
> omap_ehci_soft_phy_reset(i);
> -
> +#if !CONFIG_IS_ENABLED(DM_USB) || !CONFIG_IS_ENABLED(OF_CONTROL)
> *hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);
> *hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10);
> +#endif
Maybe you can have common, DM and non-DM variant of this function to
avoid this extra ifdeffery ?
[...]
> +static int find_phy_mode(const char *phy_type)
> +{
> + int i;
> +
> + for (i = 0; i < OMAP_HS_USB_PORTS; i++) {
> + if (!strcmp(phy_type, phy_strings[i]))
> + return i;
> + }
Isn't there already some function to find node by name ?
> + return 0;
> +}
> +
> +static const struct ehci_ops omap_ehci_ops = {
> +};
> +
> +static int ehci_usb_probe(struct udevice *dev)
> +{
> + struct usb_platdata *plat = dev_get_platdata(dev);
> + const void *fdt = gd->fdt_blob;
> + struct omap_ehci *ehci;
> + struct ehci_omap_priv_data *priv = dev_get_priv(dev);
> + struct ehci_hccr *hccr;
> + struct ehci_hcor *hcor;
> + ofnode node;
> + ofnode parent_node = dev->node;
> + int ret = -1;
> + int off, i;
> + const char *mode;
> + char prop[11];
> +
> + priv->ehci = (struct omap_ehci *)devfdt_get_addr(dev);
> + priv->portnr = dev->seq;
> + priv->init_type = plat->init_type;
> +
> + /* Go through each port portX-mode to determing phy mode */
> + for (i = 0; i < 3; i++) {
> + snprintf(prop, sizeof(prop), "port%d-mode", i + 1);
> + mode = dev_read_string(dev, prop);
> + if (mode)
> + usbhs_bdata.port_mode[i] = find_phy_mode(mode);
> + }
> +
> + ofnode_for_each_subnode(node, parent_node) {
Should this be done in probe or in bind ? I think you might want a bind
implementation which binds the controller and you probe only some of
them on demand.
> + /* Locate node for ti,ehci-omap */
> + off = ofnode_to_offset(node);
> + ret = fdt_node_check_compatible(fdt, off, "ti,ehci-omap");
> +
> + if (!ret) {
> + /* If EHCI node is found, set the pointer to it */
> + ehci = (struct omap_ehci *)ofnode_get_addr(node);
> + hccr = (struct ehci_hccr *)&ehci->hccapbase;
> + hcor = (struct ehci_hcor *)&ehci->usbcmd;
> +
> + /* Do the actual EHCI initialization */
> + omap_ehci_hcd_init(0, &usbhs_bdata);
> + ret = ehci_register(dev, hccr, hcor, &omap_ehci_ops, 0,
> + USB_INIT_HOST);
You need to check return value here (in multiple controllers case, this
error will be ignored)
> + }
> + }
> +
> + return ret;
> +}
[...]
More information about the U-Boot
mailing list