Hi Hans, On 30 April 2015 at 08:35, Hans de Goede <hdego...@redhat.com> wrote: > Convert sunxi-boards which use the sunxi-ehci code to the driver-model. > > Signed-off-by: Hans de Goede <hdego...@redhat.com> > --- > board/sunxi/Kconfig | 3 ++ > drivers/usb/host/ehci-sunxi.c | 95 > ++++++++++++++++++++++++++++++------------- > 2 files changed, 69 insertions(+), 29 deletions(-)
A few nits, but otherwise: Acked-by: Simon Glass <s...@chromium.org> > > diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig > index 18e5561..6dcbff3 100644 > --- a/board/sunxi/Kconfig > +++ b/board/sunxi/Kconfig > @@ -559,4 +559,7 @@ config DM_ETH > config DM_SERIAL > default y > > +config DM_USB > + default y if !USB_MUSB_SUNXI > + > endif > diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c > index 0edb643..9c6703c 100644 > --- a/drivers/usb/host/ehci-sunxi.c > +++ b/drivers/usb/host/ehci-sunxi.c > @@ -14,53 +14,90 @@ > #include <asm/arch/clock.h> > #include <asm/arch/usb_phy.h> > #include <asm/io.h> > +#include <dm.h> > #include "ehci.h" > > -int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr > **hccr, > - struct ehci_hcor **hcor) > +struct ehci_sunxi_priv { > + struct ehci_ctrl ehci; Comment for these two: ? > + int ahb_gate_mask; > + int phy_index; > +}; > + > +static int ehci_usb_ofdata_to_platdata(struct udevice *dev) > +{ > + return 0; Maybe can drop this function if not used? Or do you plan to use it later? > +} > + > +static int ehci_usb_probe(struct udevice *dev) > { > struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; > - int ahb_gate_offset; > + struct usb_platdata *plat = dev_get_platdata(dev); > + struct ehci_sunxi_priv *priv = dev_get_priv(dev); > + struct ehci_hccr *hccr = (struct ehci_hccr *)dev_get_addr(dev); > + struct ehci_hcor *hcor; > + > + if (hccr == (void *)SUNXI_USB1_BASE) { > + priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; > + priv->phy_index = 1; > + } else { > + priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI1; > + priv->phy_index = 2; > + } > > - ahb_gate_offset = index ? AHB_GATE_OFFSET_USB_EHCI1 : > - AHB_GATE_OFFSET_USB_EHCI0; > - setbits_le32(&ccm->ahb_gate0, 1 << ahb_gate_offset); > + setbits_le32(&ccm->ahb_gate0, priv->ahb_gate_mask); > #ifdef CONFIG_SUNXI_GEN_SUN6I > - setbits_le32(&ccm->ahb_reset0_cfg, 1 << ahb_gate_offset); > + setbits_le32(&ccm->ahb_reset0_cfg, priv->ahb_gate_mask); > #endif > > - sunxi_usb_phy_init(index + 1); > - sunxi_usb_phy_power_on(index + 1); > + sunxi_usb_phy_init(priv->phy_index); > + sunxi_usb_phy_power_on(priv->phy_index); > > - if (index == 0) > - *hccr = (void *)SUNXI_USB1_BASE; > - else > - *hccr = (void *)SUNXI_USB2_BASE; > + hcor = (struct ehci_hcor *)((uint32_t)hccr + > + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); > > - *hcor = (struct ehci_hcor *)((uint32_t) *hccr > - + > HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); > - > - debug("sunxi-ehci: init hccr %x and hcor %x hc_length %d\n", > - (uint32_t)*hccr, (uint32_t)*hcor, > - (uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); > - > - return 0; > + return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); > } > > -int ehci_hcd_stop(int index) > +static int ehci_usb_remove(struct udevice *dev) > { > struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; > - int ahb_gate_offset; > + struct ehci_sunxi_priv *priv = dev_get_priv(dev); > + int ret; > > - sunxi_usb_phy_power_off(index + 1); > - sunxi_usb_phy_exit(index + 1); > + ret = ehci_deregister(dev); > + if (ret) > + return ret; > + > + sunxi_usb_phy_power_off(priv->phy_index); > + sunxi_usb_phy_exit(priv->phy_index); > > - ahb_gate_offset = index ? AHB_GATE_OFFSET_USB_EHCI1 : > - AHB_GATE_OFFSET_USB_EHCI0; > #ifdef CONFIG_SUNXI_GEN_SUN6I > - clrbits_le32(&ccm->ahb_reset0_cfg, 1 << ahb_gate_offset); > + clrbits_le32(&ccm->ahb_reset0_cfg, priv->ahb_gate_mask); > #endif > - clrbits_le32(&ccm->ahb_gate0, 1 << ahb_gate_offset); > + clrbits_le32(&ccm->ahb_gate0, priv->ahb_gate_mask); > > return 0; > } > + > +static const struct udevice_id ehci_usb_ids[] = { > + { .compatible = "allwinner,sun4i-a10-ehci", }, > + { .compatible = "allwinner,sun5i-a13-ehci", }, > + { .compatible = "allwinner,sun6i-a31-ehci", }, > + { .compatible = "allwinner,sun7i-a20-ehci", }, > + { .compatible = "allwinner,sun8i-a23-ehci", }, > + { .compatible = "allwinner,sun9i-a80-ehci", }, > + { } > +}; > + > +U_BOOT_DRIVER(usb_ehci) = { > + .name = "ehci_sunxi", > + .id = UCLASS_USB, > + .of_match = ehci_usb_ids, > + .ofdata_to_platdata = ehci_usb_ofdata_to_platdata, > + .probe = ehci_usb_probe, > + .remove = ehci_usb_remove, > + .ops = &ehci_usb_ops, > + .platdata_auto_alloc_size = sizeof(struct usb_platdata), > + .priv_auto_alloc_size = sizeof(struct ehci_sunxi_priv), > + .flags = DM_FLAG_ALLOC_PRIV_DMA, > +}; > -- > 2.3.6 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot