From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Fri, 01 May 2015 10:37:19 +0200 Subject: [U-Boot] [PATCH 8/8] sunxi: ehci: Convert to the driver-model In-Reply-To: References: <1430404524-31413-1-git-send-email-hdegoede@redhat.com> <1430404524-31413-9-git-send-email-hdegoede@redhat.com> Message-ID: <55433B3F.9010709@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 01-05-15 06:12, Simon Glass wrote: > Hi Hans, > > On 30 April 2015 at 08:35, Hans de Goede wrote: >> Convert sunxi-boards which use the sunxi-ehci code to the driver-model. >> >> Signed-off-by: Hans de Goede >> --- >> 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 > >> >> 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 >> #include >> #include >> +#include >> #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? Both are fixed in my sunxi tree now. Regards, Hans > >> +} >> + >> +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 >