Message ID | 1477013070-29836-3-git-send-email-andre.przywara@arm.com |
---|---|
State | Accepted |
Commit | 9d6c9d988f0cd2fae095f1c76dc6b786a890108b |
Delegated to: | Hans de Goede |
Headers | show |
On Fri, Oct 21, 2016 at 6:54 AM, Andre Przywara <andre.przywara@arm.com> wrote: > From: Amit Singh Tomar <amittomer25@gmail.com> > > Mostly by adding MACH_SUN50I to some existing #ifdefs enable support > for the the HCI0 USB host controller on the A64. > Fix up some minor 64-bit hiccups on the way. > Add the bare minimum DT bits to the A64 .dtsi and enable the controllers > and the PHY on the Pine64. > This is limited to the first USB controller at the moment, which is > connected to the lower USB socket on the Pine64 board. > [Andre: remove unneeded defines, enable OHCI, add commit message] > > Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com> > Signed-off-by: Andre Przywara <andre.przywara@arm.com> > --- > arch/arm/dts/sun50i-a64-pine64-common.dtsi | 12 ++++++++++++ > arch/arm/dts/sun50i-a64.dtsi | 29 +++++++++++++++++++++++++++++ > arch/arm/include/asm/arch-sunxi/cpu_sun4i.h | 2 +- > arch/arm/mach-sunxi/usb_phy.c | 5 +++-- > configs/pine64_plus_defconfig | 1 + > drivers/usb/host/ehci-sunxi.c | 7 ++++--- > drivers/usb/host/ohci-sunxi.c | 1 + > include/configs/sun50i.h | 5 +++++ > 8 files changed, 56 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/dts/sun50i-a64-pine64-common.dtsi b/arch/arm/dts/sun50i-a64-pine64-common.dtsi > index c0fde44..9ec81c6 100644 > --- a/arch/arm/dts/sun50i-a64-pine64-common.dtsi > +++ b/arch/arm/dts/sun50i-a64-pine64-common.dtsi > @@ -79,3 +79,15 @@ > pinctrl-0 = <&i2c1_pins>; > status = "okay"; > }; > + > +&usbphy { > + status = "okay"; > +}; > + > +&ohci1 { > + status = "okay"; > +}; > + > +&ehci1 { > + status = "okay"; > +}; > diff --git a/arch/arm/dts/sun50i-a64.dtsi b/arch/arm/dts/sun50i-a64.dtsi > index 7d0dc76..bef0d00 100644 > --- a/arch/arm/dts/sun50i-a64.dtsi > +++ b/arch/arm/dts/sun50i-a64.dtsi > @@ -653,5 +653,34 @@ > #address-cells = <1>; > #size-cells = <0>; > }; > + > + usbphy: phy@1c1b810 { > + compatible = "allwinner,sun50i-a64-usb-phy", > + "allwinner,sun8i-a33-usb-phy"; > + reg = <0x01c1b810 0x14>, <0x01c1b800 0x4>; > + reg-names = "phy_ctrl", "pmu1"; > + status = "disabled"; > + #phy-cells = <1>; > + }; > + > + ehci1: usb@01c1b000 { > + compatible = "allwinner,sun50i-a64-ehci", > + "generic-ehci"; > + reg = <0x01c1b000 0x100>; > + interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; > + phys = <&usbphy 1>; > + phy-names = "usb"; > + status = "disabled"; > + }; > + > + ohci1: usb@01c1b400 { > + compatible = "allwinner,sun50i-a64-ohci", > + "generic-ohci"; > + reg = <0x01c1b400 0x100>; > + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; > + phys = <&usbphy 1>; > + phy-names = "usb"; > + status = "enabled"; > + }; > }; > }; > diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > index 5f93830..7232f6d 100644 > --- a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > +++ b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > @@ -56,7 +56,7 @@ > #define SUNXI_USB2_BASE 0x01c1c000 > #endif > #ifdef CONFIG_SUNXI_GEN_SUN6I > -#ifdef CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > #define SUNXI_USBPHY_BASE 0x01c19000 > #define SUNXI_USB0_BASE 0x01c1a000 > #define SUNXI_USB1_BASE 0x01c1b000 > diff --git a/arch/arm/mach-sunxi/usb_phy.c b/arch/arm/mach-sunxi/usb_phy.c > index bd1bbee..278587b 100644 > --- a/arch/arm/mach-sunxi/usb_phy.c > +++ b/arch/arm/mach-sunxi/usb_phy.c > @@ -146,12 +146,13 @@ __maybe_unused static void usb_phy_write(struct sunxi_usb_phy *phy, int addr, > } > } > > -#if defined CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > static void sunxi_usb_phy_config(struct sunxi_usb_phy *phy) > { > +#if defined CONFIG_MACH_SUN8I_H3 > if (phy->id == 0) > clrbits_le32(SUNXI_USBPHY_BASE + REG_PHY_UNK_H3, 0x01); > - > +#endif > clrbits_le32(phy->base + REG_PMU_UNK_H3, 0x02); > } > #elif defined CONFIG_MACH_SUN8I_A83T > diff --git a/configs/pine64_plus_defconfig b/configs/pine64_plus_defconfig > index 6f82190..bd3e2e6 100644 > --- a/configs/pine64_plus_defconfig > +++ b/configs/pine64_plus_defconfig > @@ -10,3 +10,4 @@ CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-plus" > # CONFIG_CMD_FLASH is not set > # CONFIG_CMD_FPGA is not set > CONFIG_SUN8I_EMAC=y > +CONFIG_USB_EHCI_HCD=y > diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c > index f2d83e3..5bb97ff 100644 > --- a/drivers/usb/host/ehci-sunxi.c > +++ b/drivers/usb/host/ehci-sunxi.c > @@ -45,10 +45,10 @@ static int ehci_usb_probe(struct udevice *dev) > * clocks resp. phys. > */ > priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; > -#ifdef CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; > #endif > - priv->phy_index = ((u32)hccr - SUNXI_USB1_BASE) / BASE_DIST; > + priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST; > priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; > extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; > priv->phy_index++; /* Non otg phys start at 1 */ > @@ -63,7 +63,7 @@ static int ehci_usb_probe(struct udevice *dev) > sunxi_usb_phy_init(priv->phy_index); > sunxi_usb_phy_power_on(priv->phy_index); > > - hcor = (struct ehci_hcor *)((uint32_t)hccr + > + hcor = (struct ehci_hcor *)((uintptr_t)hccr + > HC_LENGTH(ehci_readl(&hccr->cr_capbase))); > > return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); > @@ -98,6 +98,7 @@ static const struct udevice_id ehci_usb_ids[] = { > { .compatible = "allwinner,sun8i-a83t-ehci", }, > { .compatible = "allwinner,sun8i-h3-ehci", }, > { .compatible = "allwinner,sun9i-a80-ehci", }, > + { .compatible = "allwinner,sun50i-a64-ehci", }, > { } > }; > > diff --git a/drivers/usb/host/ohci-sunxi.c b/drivers/usb/host/ohci-sunxi.c > index 0689374..0c45eec 100644 > --- a/drivers/usb/host/ohci-sunxi.c > +++ b/drivers/usb/host/ohci-sunxi.c > @@ -101,6 +101,7 @@ static const struct udevice_id ohci_usb_ids[] = { > { .compatible = "allwinner,sun8i-a83t-ohci", }, > { .compatible = "allwinner,sun8i-h3-ohci", }, > { .compatible = "allwinner,sun9i-a80-ohci", }, > + { .compatible = "allwinner,sun50i-a64-ohci", }, > { } > }; > > diff --git a/include/configs/sun50i.h b/include/configs/sun50i.h > index 0fdb4c7..3e5708b 100644 > --- a/include/configs/sun50i.h > +++ b/include/configs/sun50i.h > @@ -11,6 +11,11 @@ > * A64 specific configuration > */ > > +#ifdef CONFIG_USB_EHCI > +#define CONFIG_USB_EHCI_SUNXI > +#define CONFIG_USB_MAX_CONTROLLER_COUNT 1 Since the driver is dm-driven this config not need. thanks!a
Hello! > > Since the driver is dm-driven this config not need. I tried not to use this config but then driver don't get compiled. You're talking about CONFIG_USB_EHCI and CONFIG_USB_EHCI_SUNXI, right ? Thanks Amit.
On Tue, Oct 25, 2016 at 10:05 AM, Amit Tomer <amittomer25@gmail.com> wrote: > Hello! > >> >> Since the driver is dm-driven this config not need. > > I tried not to use this config but then driver don't get compiled. > > You're talking about CONFIG_USB_EHCI and CONFIG_USB_EHCI_SUNXI, right ? CONFIG_USB_MAX_CONTROLLER_COUNT, try to rebase u-boot.git/master. Will update the u-boot-sunxi soon thanks!
Hi, On 21-10-16 03:24, Andre Przywara wrote: > From: Amit Singh Tomar <amittomer25@gmail.com> > > Mostly by adding MACH_SUN50I to some existing #ifdefs enable support > for the the HCI0 USB host controller on the A64. > Fix up some minor 64-bit hiccups on the way. > Add the bare minimum DT bits to the A64 .dtsi and enable the controllers > and the PHY on the Pine64. > This is limited to the first USB controller at the moment, which is > connected to the lower USB socket on the Pine64 board. > [Andre: remove unneeded defines, enable OHCI, add commit message] > > Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com> > Signed-off-by: Andre Przywara <andre.przywara@arm.com> Other then CONFIG_USB_MAX_CONTROLLER_COUNT no longer being necessary (it should be dropped from include/configs/sun50i.h) this patch looks good to me and is: Reviewed-by: Hans de Goede <hdegoede@redhat.com> Note I cannot merged it till Marek merges the first patch in the series, which really needs to go through the u-boot-usb tree. Regards, Hans > --- > arch/arm/dts/sun50i-a64-pine64-common.dtsi | 12 ++++++++++++ > arch/arm/dts/sun50i-a64.dtsi | 29 +++++++++++++++++++++++++++++ > arch/arm/include/asm/arch-sunxi/cpu_sun4i.h | 2 +- > arch/arm/mach-sunxi/usb_phy.c | 5 +++-- > configs/pine64_plus_defconfig | 1 + > drivers/usb/host/ehci-sunxi.c | 7 ++++--- > drivers/usb/host/ohci-sunxi.c | 1 + > include/configs/sun50i.h | 5 +++++ > 8 files changed, 56 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/dts/sun50i-a64-pine64-common.dtsi b/arch/arm/dts/sun50i-a64-pine64-common.dtsi > index c0fde44..9ec81c6 100644 > --- a/arch/arm/dts/sun50i-a64-pine64-common.dtsi > +++ b/arch/arm/dts/sun50i-a64-pine64-common.dtsi > @@ -79,3 +79,15 @@ > pinctrl-0 = <&i2c1_pins>; > status = "okay"; > }; > + > +&usbphy { > + status = "okay"; > +}; > + > +&ohci1 { > + status = "okay"; > +}; > + > +&ehci1 { > + status = "okay"; > +}; > diff --git a/arch/arm/dts/sun50i-a64.dtsi b/arch/arm/dts/sun50i-a64.dtsi > index 7d0dc76..bef0d00 100644 > --- a/arch/arm/dts/sun50i-a64.dtsi > +++ b/arch/arm/dts/sun50i-a64.dtsi > @@ -653,5 +653,34 @@ > #address-cells = <1>; > #size-cells = <0>; > }; > + > + usbphy: phy@1c1b810 { > + compatible = "allwinner,sun50i-a64-usb-phy", > + "allwinner,sun8i-a33-usb-phy"; > + reg = <0x01c1b810 0x14>, <0x01c1b800 0x4>; > + reg-names = "phy_ctrl", "pmu1"; > + status = "disabled"; > + #phy-cells = <1>; > + }; > + > + ehci1: usb@01c1b000 { > + compatible = "allwinner,sun50i-a64-ehci", > + "generic-ehci"; > + reg = <0x01c1b000 0x100>; > + interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; > + phys = <&usbphy 1>; > + phy-names = "usb"; > + status = "disabled"; > + }; > + > + ohci1: usb@01c1b400 { > + compatible = "allwinner,sun50i-a64-ohci", > + "generic-ohci"; > + reg = <0x01c1b400 0x100>; > + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; > + phys = <&usbphy 1>; > + phy-names = "usb"; > + status = "enabled"; > + }; > }; > }; > diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > index 5f93830..7232f6d 100644 > --- a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > +++ b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h > @@ -56,7 +56,7 @@ > #define SUNXI_USB2_BASE 0x01c1c000 > #endif > #ifdef CONFIG_SUNXI_GEN_SUN6I > -#ifdef CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > #define SUNXI_USBPHY_BASE 0x01c19000 > #define SUNXI_USB0_BASE 0x01c1a000 > #define SUNXI_USB1_BASE 0x01c1b000 > diff --git a/arch/arm/mach-sunxi/usb_phy.c b/arch/arm/mach-sunxi/usb_phy.c > index bd1bbee..278587b 100644 > --- a/arch/arm/mach-sunxi/usb_phy.c > +++ b/arch/arm/mach-sunxi/usb_phy.c > @@ -146,12 +146,13 @@ __maybe_unused static void usb_phy_write(struct sunxi_usb_phy *phy, int addr, > } > } > > -#if defined CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > static void sunxi_usb_phy_config(struct sunxi_usb_phy *phy) > { > +#if defined CONFIG_MACH_SUN8I_H3 > if (phy->id == 0) > clrbits_le32(SUNXI_USBPHY_BASE + REG_PHY_UNK_H3, 0x01); > - > +#endif > clrbits_le32(phy->base + REG_PMU_UNK_H3, 0x02); > } > #elif defined CONFIG_MACH_SUN8I_A83T > diff --git a/configs/pine64_plus_defconfig b/configs/pine64_plus_defconfig > index 6f82190..bd3e2e6 100644 > --- a/configs/pine64_plus_defconfig > +++ b/configs/pine64_plus_defconfig > @@ -10,3 +10,4 @@ CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-plus" > # CONFIG_CMD_FLASH is not set > # CONFIG_CMD_FPGA is not set > CONFIG_SUN8I_EMAC=y > +CONFIG_USB_EHCI_HCD=y > diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c > index f2d83e3..5bb97ff 100644 > --- a/drivers/usb/host/ehci-sunxi.c > +++ b/drivers/usb/host/ehci-sunxi.c > @@ -45,10 +45,10 @@ static int ehci_usb_probe(struct udevice *dev) > * clocks resp. phys. > */ > priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; > -#ifdef CONFIG_MACH_SUN8I_H3 > +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) > extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; > #endif > - priv->phy_index = ((u32)hccr - SUNXI_USB1_BASE) / BASE_DIST; > + priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST; > priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; > extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; > priv->phy_index++; /* Non otg phys start at 1 */ > @@ -63,7 +63,7 @@ static int ehci_usb_probe(struct udevice *dev) > sunxi_usb_phy_init(priv->phy_index); > sunxi_usb_phy_power_on(priv->phy_index); > > - hcor = (struct ehci_hcor *)((uint32_t)hccr + > + hcor = (struct ehci_hcor *)((uintptr_t)hccr + > HC_LENGTH(ehci_readl(&hccr->cr_capbase))); > > return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); > @@ -98,6 +98,7 @@ static const struct udevice_id ehci_usb_ids[] = { > { .compatible = "allwinner,sun8i-a83t-ehci", }, > { .compatible = "allwinner,sun8i-h3-ehci", }, > { .compatible = "allwinner,sun9i-a80-ehci", }, > + { .compatible = "allwinner,sun50i-a64-ehci", }, > { } > }; > > diff --git a/drivers/usb/host/ohci-sunxi.c b/drivers/usb/host/ohci-sunxi.c > index 0689374..0c45eec 100644 > --- a/drivers/usb/host/ohci-sunxi.c > +++ b/drivers/usb/host/ohci-sunxi.c > @@ -101,6 +101,7 @@ static const struct udevice_id ohci_usb_ids[] = { > { .compatible = "allwinner,sun8i-a83t-ohci", }, > { .compatible = "allwinner,sun8i-h3-ohci", }, > { .compatible = "allwinner,sun9i-a80-ohci", }, > + { .compatible = "allwinner,sun50i-a64-ohci", }, > { } > }; > > diff --git a/include/configs/sun50i.h b/include/configs/sun50i.h > index 0fdb4c7..3e5708b 100644 > --- a/include/configs/sun50i.h > +++ b/include/configs/sun50i.h > @@ -11,6 +11,11 @@ > * A64 specific configuration > */ > > +#ifdef CONFIG_USB_EHCI > +#define CONFIG_USB_EHCI_SUNXI > +#define CONFIG_USB_MAX_CONTROLLER_COUNT 1 > +#endif > + > #define CONFIG_SUNXI_USB_PHYS 1 > > #define COUNTER_FREQUENCY CONFIG_TIMER_CLK_FREQ >
Hi, On 29-10-16 14:52, Hans de Goede wrote: > Hi, > > On 21-10-16 03:24, Andre Przywara wrote: >> From: Amit Singh Tomar <amittomer25@gmail.com> >> >> Mostly by adding MACH_SUN50I to some existing #ifdefs enable support >> for the the HCI0 USB host controller on the A64. >> Fix up some minor 64-bit hiccups on the way. >> Add the bare minimum DT bits to the A64 .dtsi and enable the controllers >> and the PHY on the Pine64. >> This is limited to the first USB controller at the moment, which is >> connected to the lower USB socket on the Pine64 board. >> [Andre: remove unneeded defines, enable OHCI, add commit message] >> >> Signed-off-by: Amit Singh Tomar <amittomer25@gmail.com> >> Signed-off-by: Andre Przywara <andre.przywara@arm.com> > > Other then CONFIG_USB_MAX_CONTROLLER_COUNT no longer being necessary > (it should be dropped from include/configs/sun50i.h) this patch looks > good to me and is: > > Reviewed-by: Hans de Goede <hdegoede@redhat.com> > > Note I cannot merged it till Marek merges the first patch in > the series, which really needs to go through the u-boot-usb tree. Marek just send out a pull-req with this patch in there so I've added this patch to my tree and will include it in the pull-req I will send out later today. Regards, Hans >> --- >> arch/arm/dts/sun50i-a64-pine64-common.dtsi | 12 ++++++++++++ >> arch/arm/dts/sun50i-a64.dtsi | 29 +++++++++++++++++++++++++++++ >> arch/arm/include/asm/arch-sunxi/cpu_sun4i.h | 2 +- >> arch/arm/mach-sunxi/usb_phy.c | 5 +++-- >> configs/pine64_plus_defconfig | 1 + >> drivers/usb/host/ehci-sunxi.c | 7 ++++--- >> drivers/usb/host/ohci-sunxi.c | 1 + >> include/configs/sun50i.h | 5 +++++ >> 8 files changed, 56 insertions(+), 6 deletions(-) >> >> diff --git a/arch/arm/dts/sun50i-a64-pine64-common.dtsi b/arch/arm/dts/sun50i-a64-pine64-common.dtsi >> index c0fde44..9ec81c6 100644 >> --- a/arch/arm/dts/sun50i-a64-pine64-common.dtsi >> +++ b/arch/arm/dts/sun50i-a64-pine64-common.dtsi >> @@ -79,3 +79,15 @@ >> pinctrl-0 = <&i2c1_pins>; >> status = "okay"; >> }; >> + >> +&usbphy { >> + status = "okay"; >> +}; >> + >> +&ohci1 { >> + status = "okay"; >> +}; >> + >> +&ehci1 { >> + status = "okay"; >> +}; >> diff --git a/arch/arm/dts/sun50i-a64.dtsi b/arch/arm/dts/sun50i-a64.dtsi >> index 7d0dc76..bef0d00 100644 >> --- a/arch/arm/dts/sun50i-a64.dtsi >> +++ b/arch/arm/dts/sun50i-a64.dtsi >> @@ -653,5 +653,34 @@ >> #address-cells = <1>; >> #size-cells = <0>; >> }; >> + >> + usbphy: phy@1c1b810 { >> + compatible = "allwinner,sun50i-a64-usb-phy", >> + "allwinner,sun8i-a33-usb-phy"; >> + reg = <0x01c1b810 0x14>, <0x01c1b800 0x4>; >> + reg-names = "phy_ctrl", "pmu1"; >> + status = "disabled"; >> + #phy-cells = <1>; >> + }; >> + >> + ehci1: usb@01c1b000 { >> + compatible = "allwinner,sun50i-a64-ehci", >> + "generic-ehci"; >> + reg = <0x01c1b000 0x100>; >> + interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; >> + phys = <&usbphy 1>; >> + phy-names = "usb"; >> + status = "disabled"; >> + }; >> + >> + ohci1: usb@01c1b400 { >> + compatible = "allwinner,sun50i-a64-ohci", >> + "generic-ohci"; >> + reg = <0x01c1b400 0x100>; >> + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; >> + phys = <&usbphy 1>; >> + phy-names = "usb"; >> + status = "enabled"; >> + }; >> }; >> }; >> diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h >> index 5f93830..7232f6d 100644 >> --- a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h >> +++ b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h >> @@ -56,7 +56,7 @@ >> #define SUNXI_USB2_BASE 0x01c1c000 >> #endif >> #ifdef CONFIG_SUNXI_GEN_SUN6I >> -#ifdef CONFIG_MACH_SUN8I_H3 >> +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) >> #define SUNXI_USBPHY_BASE 0x01c19000 >> #define SUNXI_USB0_BASE 0x01c1a000 >> #define SUNXI_USB1_BASE 0x01c1b000 >> diff --git a/arch/arm/mach-sunxi/usb_phy.c b/arch/arm/mach-sunxi/usb_phy.c >> index bd1bbee..278587b 100644 >> --- a/arch/arm/mach-sunxi/usb_phy.c >> +++ b/arch/arm/mach-sunxi/usb_phy.c >> @@ -146,12 +146,13 @@ __maybe_unused static void usb_phy_write(struct sunxi_usb_phy *phy, int addr, >> } >> } >> >> -#if defined CONFIG_MACH_SUN8I_H3 >> +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) >> static void sunxi_usb_phy_config(struct sunxi_usb_phy *phy) >> { >> +#if defined CONFIG_MACH_SUN8I_H3 >> if (phy->id == 0) >> clrbits_le32(SUNXI_USBPHY_BASE + REG_PHY_UNK_H3, 0x01); >> - >> +#endif >> clrbits_le32(phy->base + REG_PMU_UNK_H3, 0x02); >> } >> #elif defined CONFIG_MACH_SUN8I_A83T >> diff --git a/configs/pine64_plus_defconfig b/configs/pine64_plus_defconfig >> index 6f82190..bd3e2e6 100644 >> --- a/configs/pine64_plus_defconfig >> +++ b/configs/pine64_plus_defconfig >> @@ -10,3 +10,4 @@ CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-plus" >> # CONFIG_CMD_FLASH is not set >> # CONFIG_CMD_FPGA is not set >> CONFIG_SUN8I_EMAC=y >> +CONFIG_USB_EHCI_HCD=y >> diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c >> index f2d83e3..5bb97ff 100644 >> --- a/drivers/usb/host/ehci-sunxi.c >> +++ b/drivers/usb/host/ehci-sunxi.c >> @@ -45,10 +45,10 @@ static int ehci_usb_probe(struct udevice *dev) >> * clocks resp. phys. >> */ >> priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; >> -#ifdef CONFIG_MACH_SUN8I_H3 >> +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) >> extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; >> #endif >> - priv->phy_index = ((u32)hccr - SUNXI_USB1_BASE) / BASE_DIST; >> + priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST; >> priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; >> extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; >> priv->phy_index++; /* Non otg phys start at 1 */ >> @@ -63,7 +63,7 @@ static int ehci_usb_probe(struct udevice *dev) >> sunxi_usb_phy_init(priv->phy_index); >> sunxi_usb_phy_power_on(priv->phy_index); >> >> - hcor = (struct ehci_hcor *)((uint32_t)hccr + >> + hcor = (struct ehci_hcor *)((uintptr_t)hccr + >> HC_LENGTH(ehci_readl(&hccr->cr_capbase))); >> >> return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); >> @@ -98,6 +98,7 @@ static const struct udevice_id ehci_usb_ids[] = { >> { .compatible = "allwinner,sun8i-a83t-ehci", }, >> { .compatible = "allwinner,sun8i-h3-ehci", }, >> { .compatible = "allwinner,sun9i-a80-ehci", }, >> + { .compatible = "allwinner,sun50i-a64-ehci", }, >> { } >> }; >> >> diff --git a/drivers/usb/host/ohci-sunxi.c b/drivers/usb/host/ohci-sunxi.c >> index 0689374..0c45eec 100644 >> --- a/drivers/usb/host/ohci-sunxi.c >> +++ b/drivers/usb/host/ohci-sunxi.c >> @@ -101,6 +101,7 @@ static const struct udevice_id ohci_usb_ids[] = { >> { .compatible = "allwinner,sun8i-a83t-ohci", }, >> { .compatible = "allwinner,sun8i-h3-ohci", }, >> { .compatible = "allwinner,sun9i-a80-ohci", }, >> + { .compatible = "allwinner,sun50i-a64-ohci", }, >> { } >> }; >> >> diff --git a/include/configs/sun50i.h b/include/configs/sun50i.h >> index 0fdb4c7..3e5708b 100644 >> --- a/include/configs/sun50i.h >> +++ b/include/configs/sun50i.h >> @@ -11,6 +11,11 @@ >> * A64 specific configuration >> */ >> >> +#ifdef CONFIG_USB_EHCI >> +#define CONFIG_USB_EHCI_SUNXI >> +#define CONFIG_USB_MAX_CONTROLLER_COUNT 1 >> +#endif >> + >> #define CONFIG_SUNXI_USB_PHYS 1 >> >> #define COUNTER_FREQUENCY CONFIG_TIMER_CLK_FREQ >> >
diff --git a/arch/arm/dts/sun50i-a64-pine64-common.dtsi b/arch/arm/dts/sun50i-a64-pine64-common.dtsi index c0fde44..9ec81c6 100644 --- a/arch/arm/dts/sun50i-a64-pine64-common.dtsi +++ b/arch/arm/dts/sun50i-a64-pine64-common.dtsi @@ -79,3 +79,15 @@ pinctrl-0 = <&i2c1_pins>; status = "okay"; }; + +&usbphy { + status = "okay"; +}; + +&ohci1 { + status = "okay"; +}; + +&ehci1 { + status = "okay"; +}; diff --git a/arch/arm/dts/sun50i-a64.dtsi b/arch/arm/dts/sun50i-a64.dtsi index 7d0dc76..bef0d00 100644 --- a/arch/arm/dts/sun50i-a64.dtsi +++ b/arch/arm/dts/sun50i-a64.dtsi @@ -653,5 +653,34 @@ #address-cells = <1>; #size-cells = <0>; }; + + usbphy: phy@1c1b810 { + compatible = "allwinner,sun50i-a64-usb-phy", + "allwinner,sun8i-a33-usb-phy"; + reg = <0x01c1b810 0x14>, <0x01c1b800 0x4>; + reg-names = "phy_ctrl", "pmu1"; + status = "disabled"; + #phy-cells = <1>; + }; + + ehci1: usb@01c1b000 { + compatible = "allwinner,sun50i-a64-ehci", + "generic-ehci"; + reg = <0x01c1b000 0x100>; + interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usbphy 1>; + phy-names = "usb"; + status = "disabled"; + }; + + ohci1: usb@01c1b400 { + compatible = "allwinner,sun50i-a64-ohci", + "generic-ohci"; + reg = <0x01c1b400 0x100>; + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; + phys = <&usbphy 1>; + phy-names = "usb"; + status = "enabled"; + }; }; }; diff --git a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h index 5f93830..7232f6d 100644 --- a/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h +++ b/arch/arm/include/asm/arch-sunxi/cpu_sun4i.h @@ -56,7 +56,7 @@ #define SUNXI_USB2_BASE 0x01c1c000 #endif #ifdef CONFIG_SUNXI_GEN_SUN6I -#ifdef CONFIG_MACH_SUN8I_H3 +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) #define SUNXI_USBPHY_BASE 0x01c19000 #define SUNXI_USB0_BASE 0x01c1a000 #define SUNXI_USB1_BASE 0x01c1b000 diff --git a/arch/arm/mach-sunxi/usb_phy.c b/arch/arm/mach-sunxi/usb_phy.c index bd1bbee..278587b 100644 --- a/arch/arm/mach-sunxi/usb_phy.c +++ b/arch/arm/mach-sunxi/usb_phy.c @@ -146,12 +146,13 @@ __maybe_unused static void usb_phy_write(struct sunxi_usb_phy *phy, int addr, } } -#if defined CONFIG_MACH_SUN8I_H3 +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) static void sunxi_usb_phy_config(struct sunxi_usb_phy *phy) { +#if defined CONFIG_MACH_SUN8I_H3 if (phy->id == 0) clrbits_le32(SUNXI_USBPHY_BASE + REG_PHY_UNK_H3, 0x01); - +#endif clrbits_le32(phy->base + REG_PMU_UNK_H3, 0x02); } #elif defined CONFIG_MACH_SUN8I_A83T diff --git a/configs/pine64_plus_defconfig b/configs/pine64_plus_defconfig index 6f82190..bd3e2e6 100644 --- a/configs/pine64_plus_defconfig +++ b/configs/pine64_plus_defconfig @@ -10,3 +10,4 @@ CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-plus" # CONFIG_CMD_FLASH is not set # CONFIG_CMD_FPGA is not set CONFIG_SUN8I_EMAC=y +CONFIG_USB_EHCI_HCD=y diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c index f2d83e3..5bb97ff 100644 --- a/drivers/usb/host/ehci-sunxi.c +++ b/drivers/usb/host/ehci-sunxi.c @@ -45,10 +45,10 @@ static int ehci_usb_probe(struct udevice *dev) * clocks resp. phys. */ priv->ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_EHCI0; -#ifdef CONFIG_MACH_SUN8I_H3 +#if defined(CONFIG_MACH_SUN8I_H3) || defined(CONFIG_MACH_SUN50I) extra_ahb_gate_mask = 1 << AHB_GATE_OFFSET_USB_OHCI0; #endif - priv->phy_index = ((u32)hccr - SUNXI_USB1_BASE) / BASE_DIST; + priv->phy_index = ((uintptr_t)hccr - SUNXI_USB1_BASE) / BASE_DIST; priv->ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; extra_ahb_gate_mask <<= priv->phy_index * AHB_CLK_DIST; priv->phy_index++; /* Non otg phys start at 1 */ @@ -63,7 +63,7 @@ static int ehci_usb_probe(struct udevice *dev) sunxi_usb_phy_init(priv->phy_index); sunxi_usb_phy_power_on(priv->phy_index); - hcor = (struct ehci_hcor *)((uint32_t)hccr + + hcor = (struct ehci_hcor *)((uintptr_t)hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase))); return ehci_register(dev, hccr, hcor, NULL, 0, plat->init_type); @@ -98,6 +98,7 @@ static const struct udevice_id ehci_usb_ids[] = { { .compatible = "allwinner,sun8i-a83t-ehci", }, { .compatible = "allwinner,sun8i-h3-ehci", }, { .compatible = "allwinner,sun9i-a80-ehci", }, + { .compatible = "allwinner,sun50i-a64-ehci", }, { } }; diff --git a/drivers/usb/host/ohci-sunxi.c b/drivers/usb/host/ohci-sunxi.c index 0689374..0c45eec 100644 --- a/drivers/usb/host/ohci-sunxi.c +++ b/drivers/usb/host/ohci-sunxi.c @@ -101,6 +101,7 @@ static const struct udevice_id ohci_usb_ids[] = { { .compatible = "allwinner,sun8i-a83t-ohci", }, { .compatible = "allwinner,sun8i-h3-ohci", }, { .compatible = "allwinner,sun9i-a80-ohci", }, + { .compatible = "allwinner,sun50i-a64-ohci", }, { } }; diff --git a/include/configs/sun50i.h b/include/configs/sun50i.h index 0fdb4c7..3e5708b 100644 --- a/include/configs/sun50i.h +++ b/include/configs/sun50i.h @@ -11,6 +11,11 @@ * A64 specific configuration */ +#ifdef CONFIG_USB_EHCI +#define CONFIG_USB_EHCI_SUNXI +#define CONFIG_USB_MAX_CONTROLLER_COUNT 1 +#endif + #define CONFIG_SUNXI_USB_PHYS 1 #define COUNTER_FREQUENCY CONFIG_TIMER_CLK_FREQ