diff mbox

[U-Boot,2/2] sunxi: A64: enable USB support

Message ID 1477013070-29836-3-git-send-email-andre.przywara@arm.com
State Accepted
Commit 9d6c9d988f0cd2fae095f1c76dc6b786a890108b
Delegated to: Hans de Goede
Headers show

Commit Message

Andre Przywara Oct. 21, 2016, 1:24 a.m. UTC
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(-)

Comments

Jagan Teki Oct. 21, 2016, 9:41 a.m. UTC | #1
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
Amit Tomer Oct. 25, 2016, 4:35 a.m. UTC | #2
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.
Jagan Teki Oct. 26, 2016, 6:48 a.m. UTC | #3
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!
Hans de Goede Oct. 29, 2016, 12:52 p.m. UTC | #4
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
>
Hans de Goede Oct. 30, 2016, 9:53 a.m. UTC | #5
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 mbox

Patch

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