Message ID | 20180608022341.27225-2-anarsoul@gmail.com |
---|---|
State | Accepted |
Commit | 1ed9c11188853d0a69baf93a64f4bcfefa0c5a99 |
Delegated to: | Marek Vasut |
Headers | show |
Series | [U-Boot,v3,1/4] sunxi: clock: Fix EHCI and OHCI clocks on A64 | expand |
On Thu, Jun 07, 2018 at 07:23:39PM -0700, Vasily Khoruzhick wrote: > We can use compatibles instead. > > Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> > --- > v3: use ehci_sunxi_cfg instead of id > > drivers/usb/host/ehci-sunxi.c | 83 ++++++++++++++++++++++++++--------- > 1 file changed, 63 insertions(+), 20 deletions(-) > > diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c > index 360efc9116..35fbe03331 100644 > --- a/drivers/usb/host/ehci-sunxi.c > +++ b/drivers/usb/host/ehci-sunxi.c > @@ -22,11 +22,17 @@ > #define AHB_CLK_DIST 1 > #endif > > +struct ehci_sunxi_cfg { > + bool has_reset; > + u32 extra_ahb_gate_mask; > +}; > + > struct ehci_sunxi_priv { > struct ehci_ctrl ehci; > struct sunxi_ccm_reg *ccm; > int ahb_gate_mask; /* Mask of ahb_gate0 clk gate bits for this hcd */ Ideally this should be moved to the ehci_sunxi_cfg (and this is true for OHCI as well) function for consistency, but that can be done in a subsequent patch. It looks good otherwise, thanks! Maxime
On Fri, Jun 8, 2018 at 7:24 AM, Maxime Ripard <maxime.ripard@bootlin.com> wrote: > On Thu, Jun 07, 2018 at 07:23:39PM -0700, Vasily Khoruzhick wrote: >> We can use compatibles instead. >> >> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> >> --- >> v3: use ehci_sunxi_cfg instead of id >> >> drivers/usb/host/ehci-sunxi.c | 83 ++++++++++++++++++++++++++--------- >> 1 file changed, 63 insertions(+), 20 deletions(-) >> >> diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c >> index 360efc9116..35fbe03331 100644 >> --- a/drivers/usb/host/ehci-sunxi.c >> +++ b/drivers/usb/host/ehci-sunxi.c >> @@ -22,11 +22,17 @@ >> #define AHB_CLK_DIST 1 >> #endif >> >> +struct ehci_sunxi_cfg { >> + bool has_reset; >> + u32 extra_ahb_gate_mask; >> +}; >> + >> struct ehci_sunxi_priv { >> struct ehci_ctrl ehci; >> struct sunxi_ccm_reg *ccm; >> int ahb_gate_mask; /* Mask of ahb_gate0 clk gate bits for this hcd */ > > Ideally this should be moved to the ehci_sunxi_cfg (and this is true > for OHCI as well) function for consistency, but that can be done in a > subsequent patch. ahb_gate_mask is per-controller, i.e. it differs for EHCI0 and EHCI1 so it can't be moved to ehci_sunxi_cfg. > It looks good otherwise, thanks! > Maxime > > -- > Maxime Ripard, Bootlin (formerly Free Electrons) > Embedded Linux and Kernel engineering > https://bootlin.com
On Fri, Jun 08, 2018 at 08:24:26AM -0700, Vasily Khoruzhick wrote: > On Fri, Jun 8, 2018 at 7:24 AM, Maxime Ripard <maxime.ripard@bootlin.com> wrote: > > On Thu, Jun 07, 2018 at 07:23:39PM -0700, Vasily Khoruzhick wrote: > >> We can use compatibles instead. > >> > >> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> > >> --- > >> v3: use ehci_sunxi_cfg instead of id > >> > >> drivers/usb/host/ehci-sunxi.c | 83 ++++++++++++++++++++++++++--------- > >> 1 file changed, 63 insertions(+), 20 deletions(-) > >> > >> diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c > >> index 360efc9116..35fbe03331 100644 > >> --- a/drivers/usb/host/ehci-sunxi.c > >> +++ b/drivers/usb/host/ehci-sunxi.c > >> @@ -22,11 +22,17 @@ > >> #define AHB_CLK_DIST 1 > >> #endif > >> > >> +struct ehci_sunxi_cfg { > >> + bool has_reset; > >> + u32 extra_ahb_gate_mask; > >> +}; > >> + > >> struct ehci_sunxi_priv { > >> struct ehci_ctrl ehci; > >> struct sunxi_ccm_reg *ccm; > >> int ahb_gate_mask; /* Mask of ahb_gate0 clk gate bits for this hcd */ > > > > Ideally this should be moved to the ehci_sunxi_cfg (and this is true > > for OHCI as well) function for consistency, but that can be done in a > > subsequent patch. > > ahb_gate_mask is per-controller, i.e. it differs for EHCI0 and EHCI1 > so it can't be moved to ehci_sunxi_cfg. Ah, right. Nevermind then :) Maxime
diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c index 360efc9116..35fbe03331 100644 --- a/drivers/usb/host/ehci-sunxi.c +++ b/drivers/usb/host/ehci-sunxi.c @@ -22,11 +22,17 @@ #define AHB_CLK_DIST 1 #endif +struct ehci_sunxi_cfg { + bool has_reset; + u32 extra_ahb_gate_mask; +}; + struct ehci_sunxi_priv { struct ehci_ctrl ehci; struct sunxi_ccm_reg *ccm; int ahb_gate_mask; /* Mask of ahb_gate0 clk gate bits for this hcd */ struct phy phy; + const struct ehci_sunxi_cfg *cfg; }; static int ehci_usb_probe(struct udevice *dev) @@ -38,6 +44,7 @@ static int ehci_usb_probe(struct udevice *dev) int extra_ahb_gate_mask = 0; int phys, ret; + priv->cfg = (const struct ehci_sunxi_cfg *)dev_get_driver_data(dev); priv->ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; if (IS_ERR(priv->ccm)) return PTR_ERR(priv->ccm); @@ -72,18 +79,15 @@ no_phy: * clocks resp. phys. */ priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; -#if defined(CONFIG_MACH_SUNXI_H3_H5) || defined(CONFIG_MACH_SUN50I) - extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; -#endif + extra_ahb_gate_mask = priv->cfg->extra_ahb_gate_mask; priv->ahb_gate_mask <<= phys * AHB_CLK_DIST; extra_ahb_gate_mask <<= phys * AHB_CLK_DIST; setbits_le32(&priv->ccm->ahb_gate0, priv->ahb_gate_mask | extra_ahb_gate_mask); -#ifdef CONFIG_SUNXI_GEN_SUN6I - setbits_le32(&priv->ccm->ahb_reset0_cfg, - priv->ahb_gate_mask | extra_ahb_gate_mask); -#endif + if (priv->cfg->has_reset) + setbits_le32(&priv->ccm->ahb_reset0_cfg, + priv->ahb_gate_mask | extra_ahb_gate_mask); hcor = (struct ehci_hcor *)((uintptr_t)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); @@ -108,25 +112,64 @@ static int ehci_usb_remove(struct udevice *dev) if (ret) return ret; -#ifdef CONFIG_SUNXI_GEN_SUN6I - clrbits_le32(&priv->ccm->ahb_reset0_cfg, priv->ahb_gate_mask); -#endif + if (priv->cfg->has_reset) + clrbits_le32(&priv->ccm->ahb_reset0_cfg, priv->ahb_gate_mask); clrbits_le32(&priv->ccm->ahb_gate0, priv->ahb_gate_mask); return 0; } +static const struct ehci_sunxi_cfg sun4i_a10_cfg = { + .has_reset = false, +}; + +static const struct ehci_sunxi_cfg sun6i_a31_cfg = { + .has_reset = true, +}; + +static const struct ehci_sunxi_cfg sun8i_h3_cfg = { + .has_reset = true, + .extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0, +}; + 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,sun8i-a83t-ehci", }, - { .compatible = "allwinner,sun8i-h3-ehci", }, - { .compatible = "allwinner,sun9i-a80-ehci", }, - { .compatible = "allwinner,sun50i-a64-ehci", }, - { } + { + .compatible = "allwinner,sun4i-a10-ehci", + .data = (ulong)&sun4i_a10_cfg, + }, + { + .compatible = "allwinner,sun5i-a13-ehci", + .data = (ulong)&sun4i_a10_cfg, + }, + { + .compatible = "allwinner,sun6i-a31-ehci", + .data = (ulong)&sun6i_a31_cfg, + }, + { + .compatible = "allwinner,sun7i-a20-ehci", + .data = (ulong)&sun4i_a10_cfg, + }, + { + .compatible = "allwinner,sun8i-a23-ehci", + .data = (ulong)&sun6i_a31_cfg, + }, + { + .compatible = "allwinner,sun8i-a83t-ehci", + .data = (ulong)&sun6i_a31_cfg, + }, + { + .compatible = "allwinner,sun8i-h3-ehci", + .data = (ulong)&sun8i_h3_cfg, + }, + { + .compatible = "allwinner,sun9i-a80-ehci", + .data = (ulong)&sun6i_a31_cfg, + }, + { + .compatible = "allwinner,sun50i-a64-ehci", + .data = (ulong)&sun8i_h3_cfg, + }, + { /* sentinel */ } }; U_BOOT_DRIVER(ehci_sunxi) = {
We can use compatibles instead. Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> --- v3: use ehci_sunxi_cfg instead of id drivers/usb/host/ehci-sunxi.c | 83 ++++++++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 20 deletions(-)