mbox series

[v2,0/9] Allwinner H6 USB support

Message ID 20180706153805.25842-1-icenowy@aosc.io
Headers show
Series Allwinner H6 USB support | expand

Message

Icenowy Zheng July 6, 2018, 3:37 p.m. UTC
This patchset introduces support for the USB ports (both USB2 and USB3)
on the Allwinner H6 SoC.

This revision adds the USB2 support, and places it before the USB3
support. So only the USB3 part will have changelog in this revision.

The first 5 PATCHes are the USB2 part, and the latter 4 PATCHes are the
USB3 part.

PATCH 1, 2, 6, 7 should go through the PHY tree, and the remaining
patches should go through the armsoc tree via sunxi tree.

Icenowy Zheng (9):
  phy: sun4i-usb: add support for missing USB PHY index
  phy: sun4i-usb: add support for H6 USB2 PHY
  arm64: allwinner: dts: h6: add USB2-related device nodes
  arm64: allwinner: dts: h6: add USB Vbus regulator
  arm64: allwinner: dts: h6: enable USB2 on Pine H64
  dt-bindings: phy: add binding for Allwinner USB3 PHY
  phy: allwinner: add phy driver for USB3 PHY on Allwinner H6 SoC
  arm64: allwinner: dts: h6: add USB3 device nodes
  arm64: allwinner: dts: h6: enable USB3 port on Pine H64

 .../bindings/phy/sun50i-usb3-phy.txt          |  24 +++
 .../boot/dts/allwinner/sun50i-h6-pine-h64.dts |  46 +++++
 arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi  | 114 ++++++++++
 drivers/phy/allwinner/Kconfig                 |  13 ++
 drivers/phy/allwinner/Makefile                |   1 +
 drivers/phy/allwinner/phy-sun4i-usb.c         |  26 ++-
 drivers/phy/allwinner/phy-sun50i-usb3.c       | 194 ++++++++++++++++++
 7 files changed, 416 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/phy/sun50i-usb3-phy.txt
 create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c

Comments

Chen-Yu Tsai July 7, 2018, 3:31 a.m. UTC | #1
On Fri, Jul 6, 2018 at 11:37 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
> Allwinner H6 has two USB2 ports, one OTG and one host-only.
>
> Add device tree nodes related to them.
>
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> ---
>  arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 90 ++++++++++++++++++++
>  1 file changed, 90 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> index c72da8cd9ef5..62fc0f5e10ba 100644
> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> @@ -174,6 +174,96 @@
>                         status = "disabled";
>                 };
>
> +               usb2otg: usb@5100000 {
> +                       compatible = "allwinner,sun8i-a33-musb";
> +                       reg = <0x05100000 0x0400>;
> +                       clocks = <&ccu CLK_BUS_OTG>;
> +                       resets = <&ccu RST_BUS_OTG>;
> +                       interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
> +                       interrupt-names = "mc";
> +                       phys = <&usb2phy 0>;
> +                       phy-names = "usb";
> +                       extcon = <&usb2phy 0>;
> +                       status = "disabled";
> +               };
> +
> +               usb2phy: phy@5100400 {
> +                       compatible = "allwinner,sun50i-h6-usb-phy";
> +                       reg = <0x05100400 0x14>,
> +                             <0x05101800 0x4>,
> +                             <0x05311800 0x4>;
> +                       reg-names = "phy_ctrl",
> +                                   "pmu0",
> +                                   "pmu3";
> +                       clocks = <&ccu CLK_USB_PHY0>,
> +                                <&ccu CLK_USB_PHY3>;
> +                       clock-names = "usb0_phy",
> +                                     "usb3_phy";
> +                       resets = <&ccu RST_USB_PHY0>,
> +                                <&ccu RST_USB_PHY3>;
> +                       reset-names = "usb0_reset",
> +                                     "usb3_reset";
> +                       status = "disabled";
> +                       #phy-cells = <1>;
> +               };
> +
> +               ehci0: usb@5101000 {
> +                       compatible = "allwinner,sun50i-h6-ehci", "generic-ehci";
> +                       reg = <0x05101000 0x100>;
> +                       interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
> +                       clocks = <&ccu CLK_BUS_OHCI0>,
> +                                <&ccu CLK_BUS_EHCI0>,
> +                                <&ccu CLK_USB_OHCI0>;
> +                       resets = <&ccu RST_BUS_OHCI0>,
> +                                <&ccu RST_BUS_EHCI0>;
> +                       status = "disabled";
> +               };
> +
> +               ohci0: usb@5101400 {
> +                       compatible = "allwinner,sun50i-h6-ohci", "generic-ohci";
> +                       reg = <0x05101400 0x100>;
> +                       interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
> +                       clocks = <&ccu CLK_BUS_OHCI0>,
> +                                <&ccu CLK_USB_OHCI0>;
> +                       resets = <&ccu RST_BUS_OHCI0>;
> +                       status = "disabled";
> +               };
> +
> +               usb3phy: phy@5210000 {

Maybe you should split this one out and put it in the USB 3.0 patch?

ChenYu

> +                       compatible = "allwinner,sun50i-h6-usb3-phy";
> +                       reg = <0x5210000 0x10000>;
> +                       clocks = <&ccu CLK_USB_PHY1>;
> +                       resets = <&ccu RST_USB_PHY1>;
> +                       #phy-cells = <0>;
> +                       status = "disabled";
> +               };
> +
> +               ehci3: usb@5311000 {
> +                       compatible = "allwinner,sun50i-h6-ehci", "generic-ehci";
> +                       reg = <0x05311000 0x100>;
> +                       interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
> +                       clocks = <&ccu CLK_BUS_OHCI3>,
> +                                <&ccu CLK_BUS_EHCI3>,
> +                                <&ccu CLK_USB_OHCI3>;
> +                       resets = <&ccu RST_BUS_OHCI3>,
> +                                <&ccu RST_BUS_EHCI3>;
> +                       phys = <&usb2phy 3>;
> +                       phy-names = "usb";
> +                       status = "disabled";
> +               };
> +
> +               ohci3: usb@5311400 {
> +                       compatible = "allwinner,sun50i-h6-ohci", "generic-ohci";
> +                       reg = <0x05311400 0x100>;
> +                       interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
> +                       clocks = <&ccu CLK_BUS_OHCI3>,
> +                                <&ccu CLK_USB_OHCI3>;
> +                       resets = <&ccu RST_BUS_OHCI3>;
> +                       phys = <&usb2phy 3>;
> +                       phy-names = "usb";
> +                       status = "disabled";
> +               };
> +
>                 r_ccu: clock@7010000 {
>                         compatible = "allwinner,sun50i-h6-r-ccu";
>                         reg = <0x07010000 0x400>;
> --
> 2.17.1
>
> --
> You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Icenowy Zheng July 7, 2018, 3:33 a.m. UTC | #2
于 2018年7月7日 GMT+08:00 上午11:31:39, Chen-Yu Tsai <wens@csie.org> 写到:
>On Fri, Jul 6, 2018 at 11:37 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
>> Allwinner H6 has two USB2 ports, one OTG and one host-only.
>>
>> Add device tree nodes related to them.
>>
>> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
>> ---
>>  arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 90
>++++++++++++++++++++
>>  1 file changed, 90 insertions(+)
>>
>> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> index c72da8cd9ef5..62fc0f5e10ba 100644
>> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> @@ -174,6 +174,96 @@
>>                         status = "disabled";
>>                 };
>>
>> +               usb2otg: usb@5100000 {
>> +                       compatible = "allwinner,sun8i-a33-musb";
>> +                       reg = <0x05100000 0x0400>;
>> +                       clocks = <&ccu CLK_BUS_OTG>;
>> +                       resets = <&ccu RST_BUS_OTG>;
>> +                       interrupts = <GIC_SPI 23
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       interrupt-names = "mc";
>> +                       phys = <&usb2phy 0>;
>> +                       phy-names = "usb";
>> +                       extcon = <&usb2phy 0>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               usb2phy: phy@5100400 {
>> +                       compatible = "allwinner,sun50i-h6-usb-phy";
>> +                       reg = <0x05100400 0x14>,
>> +                             <0x05101800 0x4>,
>> +                             <0x05311800 0x4>;
>> +                       reg-names = "phy_ctrl",
>> +                                   "pmu0",
>> +                                   "pmu3";
>> +                       clocks = <&ccu CLK_USB_PHY0>,
>> +                                <&ccu CLK_USB_PHY3>;
>> +                       clock-names = "usb0_phy",
>> +                                     "usb3_phy";
>> +                       resets = <&ccu RST_USB_PHY0>,
>> +                                <&ccu RST_USB_PHY3>;
>> +                       reset-names = "usb0_reset",
>> +                                     "usb3_reset";
>> +                       status = "disabled";
>> +                       #phy-cells = <1>;
>> +               };
>> +
>> +               ehci0: usb@5101000 {
>> +                       compatible = "allwinner,sun50i-h6-ehci",
>"generic-ehci";
>> +                       reg = <0x05101000 0x100>;
>> +                       interrupts = <GIC_SPI 24
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       clocks = <&ccu CLK_BUS_OHCI0>,
>> +                                <&ccu CLK_BUS_EHCI0>,
>> +                                <&ccu CLK_USB_OHCI0>;
>> +                       resets = <&ccu RST_BUS_OHCI0>,
>> +                                <&ccu RST_BUS_EHCI0>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               ohci0: usb@5101400 {
>> +                       compatible = "allwinner,sun50i-h6-ohci",
>"generic-ohci";
>> +                       reg = <0x05101400 0x100>;
>> +                       interrupts = <GIC_SPI 25
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       clocks = <&ccu CLK_BUS_OHCI0>,
>> +                                <&ccu CLK_USB_OHCI0>;
>> +                       resets = <&ccu RST_BUS_OHCI0>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               usb3phy: phy@5210000 {
>
>Maybe you should split this one out and put it in the USB 3.0 patch?

Sorry, -EREBASE.

>
>ChenYu
>
>> +                       compatible = "allwinner,sun50i-h6-usb3-phy";
>> +                       reg = <0x5210000 0x10000>;
>> +                       clocks = <&ccu CLK_USB_PHY1>;
>> +                       resets = <&ccu RST_USB_PHY1>;
>> +                       #phy-cells = <0>;
>> +                       status = "disabled";
>> +               };
>> +
>> +               ehci3: usb@5311000 {
>> +                       compatible = "allwinner,sun50i-h6-ehci",
>"generic-ehci";
>> +                       reg = <0x05311000 0x100>;
>> +                       interrupts = <GIC_SPI 28
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       clocks = <&ccu CLK_BUS_OHCI3>,
>> +                                <&ccu CLK_BUS_EHCI3>,
>> +                                <&ccu CLK_USB_OHCI3>;
>> +                       resets = <&ccu RST_BUS_OHCI3>,
>> +                                <&ccu RST_BUS_EHCI3>;
>> +                       phys = <&usb2phy 3>;
>> +                       phy-names = "usb";
>> +                       status = "disabled";
>> +               };
>> +
>> +               ohci3: usb@5311400 {
>> +                       compatible = "allwinner,sun50i-h6-ohci",
>"generic-ohci";
>> +                       reg = <0x05311400 0x100>;
>> +                       interrupts = <GIC_SPI 29
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       clocks = <&ccu CLK_BUS_OHCI3>,
>> +                                <&ccu CLK_USB_OHCI3>;
>> +                       resets = <&ccu RST_BUS_OHCI3>;
>> +                       phys = <&usb2phy 3>;
>> +                       phy-names = "usb";
>> +                       status = "disabled";
>> +               };
>> +
>>                 r_ccu: clock@7010000 {
>>                         compatible = "allwinner,sun50i-h6-r-ccu";
>>                         reg = <0x07010000 0x400>;
>> --
>> 2.17.1
>>
>> --
>> You received this message because you are subscribed to the Google
>Groups "linux-sunxi" group.
>> To unsubscribe from this group and stop receiving emails from it,
>send an email to linux-sunxi+unsubscribe@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>_______________________________________________
>linux-arm-kernel mailing list
>linux-arm-kernel@lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chen-Yu Tsai July 7, 2018, 3:35 a.m. UTC | #3
On Fri, Jul 6, 2018 at 11:38 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
> Allwinner H6 SoC features USB3 functionality, with a DWC3 controller and
> a custom PHY.
>
> Add device tree nodes for them.
>
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> ---
> Changes in v2:
> - Rebased on top of the USB2 support patch.
> - Dropped the dwc3-of-simple device.
>
>  arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 24 ++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> index 62fc0f5e10ba..6738e97ee37f 100644
> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> @@ -229,6 +229,30 @@
>                         status = "disabled";
>                 };
>
> +               dwc3: dwc3 {
> +                       compatible = "snps,dwc3";
> +                       reg = <0x5200000 0x10000>;
> +                       interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
> +                       /* The only clock is shared. */
> +                       clocks = <&ccu CLK_BUS_XHCI>,
> +                                <&ccu CLK_BUS_XHCI>,
> +                                <&ccu CLK_BUS_XHCI>;
> +                       clock-names = "ref", "bus_early", "suspend";

The diagram in the user manual also shows the low speed 32k oscillator
being fed into DWC3. Maybe someone with more knowledge of what the IP
block expects can give us a clue about which one of these it is.

ChenYu

> +                       resets = <&ccu RST_BUS_XHCI>;
> +                       /*
> +                        * The datasheet of the chip doesn't declare the
> +                        * peripheral function, and there's no boards known
> +                        * to have a USB Type-B port routed to the port.
> +                        * In addition, no one has tested the peripheral
> +                        * function yet.
> +                        * So set the dr_mode to "host" in the DTSI file.
> +                        */
> +                       dr_mode = "host";
> +                       phys = <&usb3phy>;
> +                       phy-names = "usb3-phy";
> +                       status = "disabled";
> +               };
> +
>                 usb3phy: phy@5210000 {
>                         compatible = "allwinner,sun50i-h6-usb3-phy";
>                         reg = <0x5210000 0x10000>;
> --
> 2.17.1
>
> --
> You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Icenowy Zheng July 7, 2018, 3:37 a.m. UTC | #4
于 2018年7月7日 GMT+08:00 上午11:35:22, Chen-Yu Tsai <wens@csie.org> 写到:
>On Fri, Jul 6, 2018 at 11:38 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
>> Allwinner H6 SoC features USB3 functionality, with a DWC3 controller
>and
>> a custom PHY.
>>
>> Add device tree nodes for them.
>>
>> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
>> ---
>> Changes in v2:
>> - Rebased on top of the USB2 support patch.
>> - Dropped the dwc3-of-simple device.
>>
>>  arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 24
>++++++++++++++++++++
>>  1 file changed, 24 insertions(+)
>>
>> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> index 62fc0f5e10ba..6738e97ee37f 100644
>> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
>> @@ -229,6 +229,30 @@
>>                         status = "disabled";
>>                 };
>>
>> +               dwc3: dwc3 {
>> +                       compatible = "snps,dwc3";
>> +                       reg = <0x5200000 0x10000>;
>> +                       interrupts = <GIC_SPI 26
>IRQ_TYPE_LEVEL_HIGH>;
>> +                       /* The only clock is shared. */
>> +                       clocks = <&ccu CLK_BUS_XHCI>,
>> +                                <&ccu CLK_BUS_XHCI>,
>> +                                <&ccu CLK_BUS_XHCI>;
>> +                       clock-names = "ref", "bus_early", "suspend";
>
>The diagram in the user manual also shows the low speed 32k oscillator
>being fed into DWC3. Maybe someone with more knowledge of what the IP
>block expects can give us a clue about which one of these it is.

If possible, I think it's suspend clock.

I have checked RK3399 clk tree and USB3 ref is just a gate
on 24M osc, and bus clock is surely CLK_BUS_XHCI.

>
>ChenYu
>
>> +                       resets = <&ccu RST_BUS_XHCI>;
>> +                       /*
>> +                        * The datasheet of the chip doesn't declare
>the
>> +                        * peripheral function, and there's no boards
>known
>> +                        * to have a USB Type-B port routed to the
>port.
>> +                        * In addition, no one has tested the
>peripheral
>> +                        * function yet.
>> +                        * So set the dr_mode to "host" in the DTSI
>file.
>> +                        */
>> +                       dr_mode = "host";
>> +                       phys = <&usb3phy>;
>> +                       phy-names = "usb3-phy";
>> +                       status = "disabled";
>> +               };
>> +
>>                 usb3phy: phy@5210000 {
>>                         compatible = "allwinner,sun50i-h6-usb3-phy";
>>                         reg = <0x5210000 0x10000>;
>> --
>> 2.17.1
>>
>> --
>> You received this message because you are subscribed to the Google
>Groups "linux-sunxi" group.
>> To unsubscribe from this group and stop receiving emails from it,
>send an email to linux-sunxi+unsubscribe@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chen-Yu Tsai July 7, 2018, 3:38 a.m. UTC | #5
On Fri, Jul 6, 2018 at 11:38 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
> Pine H64 board has both the USB2 OTG port and the USB2 host port on H6

Nit: USB* pins. A "port" implies something you can plug into.

ChenYu

> SoC wired out to USB Type-A port.
>
> Enable them.
>
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chen-Yu Tsai July 9, 2018, 2:52 a.m. UTC | #6
On Fri, Jul 6, 2018 at 11:37 PM, Icenowy Zheng <icenowy@aosc.io> wrote:
> This patchset introduces support for the USB ports (both USB2 and USB3)
> on the Allwinner H6 SoC.
>
> This revision adds the USB2 support, and places it before the USB3
> support. So only the USB3 part will have changelog in this revision.
>
> The first 5 PATCHes are the USB2 part, and the latter 4 PATCHes are the
> USB3 part.
>
> PATCH 1, 2, 6, 7 should go through the PHY tree, and the remaining
> patches should go through the armsoc tree via sunxi tree.
>
> Icenowy Zheng (9):
>   phy: sun4i-usb: add support for missing USB PHY index
>   phy: sun4i-usb: add support for H6 USB2 PHY
>   arm64: allwinner: dts: h6: add USB2-related device nodes
>   arm64: allwinner: dts: h6: add USB Vbus regulator
>   arm64: allwinner: dts: h6: enable USB2 on Pine H64
>   dt-bindings: phy: add binding for Allwinner USB3 PHY
>   phy: allwinner: add phy driver for USB3 PHY on Allwinner H6 SoC
>   arm64: allwinner: dts: h6: add USB3 device nodes
>   arm64: allwinner: dts: h6: enable USB3 port on Pine H64

Apart from my comments in a few patches, this series is

Reviewed-by: Chen-Yu Tsai <wens@csie.org>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kishon Vijay Abraham I July 9, 2018, 4:31 a.m. UTC | #7
Hi,

On Friday 06 July 2018 09:08 PM, Icenowy Zheng wrote:
> Allwinner H6 SoC contains a USB3 PHY (with USB2 DP/DM lines also
> controlled).
> 
> Add a driver for it.
> 
> The register operations in this driver is mainly extracted from the BSP
> USB3 driver.
> 
> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> ---
> Changes in v2:
> - Splitted out the DT binding.
> 
>  drivers/phy/allwinner/Kconfig           |  13 ++
>  drivers/phy/allwinner/Makefile          |   1 +
>  drivers/phy/allwinner/phy-sun50i-usb3.c | 194 ++++++++++++++++++++++++
>  3 files changed, 208 insertions(+)
>  create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c
> 
> diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig
> index cdc1e745ba47..cf373bcee034 100644
> --- a/drivers/phy/allwinner/Kconfig
> +++ b/drivers/phy/allwinner/Kconfig
> @@ -29,3 +29,16 @@ config PHY_SUN9I_USB
>  	  sun9i SoCs.
>  
>  	  This driver controls each individual USB 2 host PHY.
> +
> +config PHY_SUN50I_USB3
> +	tristate "Allwinner sun50i SoC USB3 PHY driver"
> +	depends on ARCH_SUNXI && HAS_IOMEM && OF
> +	depends on RESET_CONTROLLER
> +	depends on USB_SUPPORT
> +	select USB_COMMON

Doesn't look like this driver depends on USB_SUPPORT.
> +	select GENERIC_PHY
> +	help
> +	  Enable this to support the USB3.0-capable transceiver that is
> +	  part of some Allwinner sun50i SoCs.
> +
> +	  This driver controls each individual USB 2+3 host PHY combo.
> diff --git a/drivers/phy/allwinner/Makefile b/drivers/phy/allwinner/Makefile
> index 8605529c01a1..a8d01e9073c2 100644
> --- a/drivers/phy/allwinner/Makefile
> +++ b/drivers/phy/allwinner/Makefile
> @@ -1,2 +1,3 @@
>  obj-$(CONFIG_PHY_SUN4I_USB)		+= phy-sun4i-usb.o
>  obj-$(CONFIG_PHY_SUN9I_USB)		+= phy-sun9i-usb.o
> +obj-$(CONFIG_PHY_SUN50I_USB3)		+= phy-sun50i-usb3.o
> diff --git a/drivers/phy/allwinner/phy-sun50i-usb3.c b/drivers/phy/allwinner/phy-sun50i-usb3.c
> new file mode 100644
> index 000000000000..226c99c2d664
> --- /dev/null
> +++ b/drivers/phy/allwinner/phy-sun50i-usb3.c
> @@ -0,0 +1,194 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Allwinner sun50i(H6) USB 3.0 phy driver
> + *
> + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
> + *
> + * Based on phy-sun9i-usb.c, which is:
> + *
> + * Copyright (C) 2014-2015 Chen-Yu Tsai <wens@csie.org>
> + *
> + * Based on code from Allwinner BSP, which is:
> + *
> + * Copyright (c) 2010-2015 Allwinner Technology Co., Ltd.

Does the BSP also use GPL license?
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/phy/phy.h>
> +#include <linux/usb/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/reset.h>
> +
> +/* Interface Status and Control Registers */
> +#define SUNXI_ISCR			0x00
> +#define SUNXI_PIPE_CLOCK_CONTROL	0x14
> +#define SUNXI_PHY_TUNE_LOW		0x18
> +#define SUNXI_PHY_TUNE_HIGH		0x1c
> +#define SUNXI_PHY_EXTERNAL_CONTROL	0x20
> +
> +/* USB2.0 Interface Status and Control Register */
> +#define SUNXI_ISCR_FORCE_VBUS		(3 << 12)
> +
> +/* PIPE Clock Control Register */
> +#define SUNXI_PCC_PIPE_CLK_OPEN		(1 << 6)
> +
> +/* PHY External Control Register */
> +#define SUNXI_PEC_EXTERN_VBUS		(3 << 1)
> +#define SUNXI_PEC_SSC_EN		(1 << 24)
> +#define SUNXI_PEC_REF_SSP_EN		(1 << 26)
> +
> +/* PHY Tune High Register */
> +#define SUNXI_TX_DEEMPH_3P5DB(n)	((n) << 19)
> +#define SUNXI_TX_DEEMPH_3P5DB_MASK	GENMASK(24, 19)
> +#define SUNXI_TX_DEEMPH_6DB(n)		((n) << 13)
> +#define SUNXI_TX_DEEMPH_6GB_MASK	GENMASK(18, 13)
> +#define SUNXI_TX_SWING_FULL(n)		((n) << 6)
> +#define SUNXI_TX_SWING_FULL_MASK	GENMASK(12, 6)
> +#define SUNXI_LOS_BIAS(n)		((n) << 3)
> +#define SUNXI_LOS_BIAS_MASK		GENMASK(5, 3)
> +#define SUNXI_TXVBOOSTLVL(n)		((n) << 0)
> +#define SUNXI_TXVBOOSTLVL_MASK		GENMASK(0, 2)
> +
> +struct sun50i_usb3_phy {
> +	struct phy *phy;
> +	void __iomem *regs;
> +	struct reset_control *reset;
> +	struct clk *clk;
> +};
> +
> +static void sun50i_usb3_phy_open(struct sun50i_usb3_phy *phy)
> +{
> +	u32 val;
> +
> +	val = readl(phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
> +	val |= SUNXI_PEC_EXTERN_VBUS;
> +	val |= SUNXI_PEC_SSC_EN | SUNXI_PEC_REF_SSP_EN;
> +	writel(val, phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
> +
> +	val = readl(phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
> +	val |= SUNXI_PCC_PIPE_CLK_OPEN;
> +	writel(val, phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
> +
> +	val = readl(phy->regs + SUNXI_ISCR);
> +	val |= SUNXI_ISCR_FORCE_VBUS;
> +	writel(val, phy->regs + SUNXI_ISCR);
> +
> +	/*
> +	 * All the magic numbers written to the PHY_TUNE_{LOW_HIGH}
> +	 * registers are directly taken from the BSP USB3 driver from
> +	 * Allwiner.

%s/Allwiner/Allwinner/
> +	 */
> +	writel(0x0047fc87, phy->regs + SUNXI_PHY_TUNE_LOW);

PHY_TUNE_LOW should also configure individual parameters like how you've done
below for PHY_TUNE_HIGH.

Thanks
Kishon
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chen-Yu Tsai July 9, 2018, 4:36 a.m. UTC | #8
On Mon, Jul 9, 2018 at 12:31 PM, Kishon Vijay Abraham I <kishon@ti.com> wrote:
> Hi,
>
> On Friday 06 July 2018 09:08 PM, Icenowy Zheng wrote:
>> Allwinner H6 SoC contains a USB3 PHY (with USB2 DP/DM lines also
>> controlled).
>>
>> Add a driver for it.
>>
>> The register operations in this driver is mainly extracted from the BSP
>> USB3 driver.
>>
>> Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
>> ---
>> Changes in v2:
>> - Splitted out the DT binding.
>>
>>  drivers/phy/allwinner/Kconfig           |  13 ++
>>  drivers/phy/allwinner/Makefile          |   1 +
>>  drivers/phy/allwinner/phy-sun50i-usb3.c | 194 ++++++++++++++++++++++++
>>  3 files changed, 208 insertions(+)
>>  create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c
>>
>> diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig
>> index cdc1e745ba47..cf373bcee034 100644
>> --- a/drivers/phy/allwinner/Kconfig
>> +++ b/drivers/phy/allwinner/Kconfig
>> @@ -29,3 +29,16 @@ config PHY_SUN9I_USB
>>         sun9i SoCs.
>>
>>         This driver controls each individual USB 2 host PHY.
>> +
>> +config PHY_SUN50I_USB3
>> +     tristate "Allwinner sun50i SoC USB3 PHY driver"
>> +     depends on ARCH_SUNXI && HAS_IOMEM && OF
>> +     depends on RESET_CONTROLLER
>> +     depends on USB_SUPPORT
>> +     select USB_COMMON
>
> Doesn't look like this driver depends on USB_SUPPORT.
>> +     select GENERIC_PHY
>> +     help
>> +       Enable this to support the USB3.0-capable transceiver that is
>> +       part of some Allwinner sun50i SoCs.
>> +
>> +       This driver controls each individual USB 2+3 host PHY combo.
>> diff --git a/drivers/phy/allwinner/Makefile b/drivers/phy/allwinner/Makefile
>> index 8605529c01a1..a8d01e9073c2 100644
>> --- a/drivers/phy/allwinner/Makefile
>> +++ b/drivers/phy/allwinner/Makefile
>> @@ -1,2 +1,3 @@
>>  obj-$(CONFIG_PHY_SUN4I_USB)          += phy-sun4i-usb.o
>>  obj-$(CONFIG_PHY_SUN9I_USB)          += phy-sun9i-usb.o
>> +obj-$(CONFIG_PHY_SUN50I_USB3)                += phy-sun50i-usb3.o
>> diff --git a/drivers/phy/allwinner/phy-sun50i-usb3.c b/drivers/phy/allwinner/phy-sun50i-usb3.c
>> new file mode 100644
>> index 000000000000..226c99c2d664
>> --- /dev/null
>> +++ b/drivers/phy/allwinner/phy-sun50i-usb3.c
>> @@ -0,0 +1,194 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * Allwinner sun50i(H6) USB 3.0 phy driver
>> + *
>> + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
>> + *
>> + * Based on phy-sun9i-usb.c, which is:
>> + *
>> + * Copyright (C) 2014-2015 Chen-Yu Tsai <wens@csie.org>
>> + *
>> + * Based on code from Allwinner BSP, which is:
>> + *
>> + * Copyright (c) 2010-2015 Allwinner Technology Co., Ltd.
>
> Does the BSP also use GPL license?

Yes they released it under the GPL license. It's still available here:

    https://github.com/allwinner-zh/linux-3.4-sunxi

But is now unmaintained.

ChenYu


>> + */
>> +
>> +#include <linux/clk.h>
>> +#include <linux/err.h>
>> +#include <linux/io.h>
>> +#include <linux/module.h>
>> +#include <linux/phy/phy.h>
>> +#include <linux/usb/of.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/reset.h>
>> +
>> +/* Interface Status and Control Registers */
>> +#define SUNXI_ISCR                   0x00
>> +#define SUNXI_PIPE_CLOCK_CONTROL     0x14
>> +#define SUNXI_PHY_TUNE_LOW           0x18
>> +#define SUNXI_PHY_TUNE_HIGH          0x1c
>> +#define SUNXI_PHY_EXTERNAL_CONTROL   0x20
>> +
>> +/* USB2.0 Interface Status and Control Register */
>> +#define SUNXI_ISCR_FORCE_VBUS                (3 << 12)
>> +
>> +/* PIPE Clock Control Register */
>> +#define SUNXI_PCC_PIPE_CLK_OPEN              (1 << 6)
>> +
>> +/* PHY External Control Register */
>> +#define SUNXI_PEC_EXTERN_VBUS                (3 << 1)
>> +#define SUNXI_PEC_SSC_EN             (1 << 24)
>> +#define SUNXI_PEC_REF_SSP_EN         (1 << 26)
>> +
>> +/* PHY Tune High Register */
>> +#define SUNXI_TX_DEEMPH_3P5DB(n)     ((n) << 19)
>> +#define SUNXI_TX_DEEMPH_3P5DB_MASK   GENMASK(24, 19)
>> +#define SUNXI_TX_DEEMPH_6DB(n)               ((n) << 13)
>> +#define SUNXI_TX_DEEMPH_6GB_MASK     GENMASK(18, 13)
>> +#define SUNXI_TX_SWING_FULL(n)               ((n) << 6)
>> +#define SUNXI_TX_SWING_FULL_MASK     GENMASK(12, 6)
>> +#define SUNXI_LOS_BIAS(n)            ((n) << 3)
>> +#define SUNXI_LOS_BIAS_MASK          GENMASK(5, 3)
>> +#define SUNXI_TXVBOOSTLVL(n)         ((n) << 0)
>> +#define SUNXI_TXVBOOSTLVL_MASK               GENMASK(0, 2)
>> +
>> +struct sun50i_usb3_phy {
>> +     struct phy *phy;
>> +     void __iomem *regs;
>> +     struct reset_control *reset;
>> +     struct clk *clk;
>> +};
>> +
>> +static void sun50i_usb3_phy_open(struct sun50i_usb3_phy *phy)
>> +{
>> +     u32 val;
>> +
>> +     val = readl(phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
>> +     val |= SUNXI_PEC_EXTERN_VBUS;
>> +     val |= SUNXI_PEC_SSC_EN | SUNXI_PEC_REF_SSP_EN;
>> +     writel(val, phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
>> +
>> +     val = readl(phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
>> +     val |= SUNXI_PCC_PIPE_CLK_OPEN;
>> +     writel(val, phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
>> +
>> +     val = readl(phy->regs + SUNXI_ISCR);
>> +     val |= SUNXI_ISCR_FORCE_VBUS;
>> +     writel(val, phy->regs + SUNXI_ISCR);
>> +
>> +     /*
>> +      * All the magic numbers written to the PHY_TUNE_{LOW_HIGH}
>> +      * registers are directly taken from the BSP USB3 driver from
>> +      * Allwiner.
>
> %s/Allwiner/Allwinner/
>> +      */
>> +     writel(0x0047fc87, phy->regs + SUNXI_PHY_TUNE_LOW);
>
> PHY_TUNE_LOW should also configure individual parameters like how you've done
> below for PHY_TUNE_HIGH.
>
> Thanks
> Kishon
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Icenowy Zheng July 9, 2018, 4:40 a.m. UTC | #9
在 2018-07-09一的 10:01 +0530,'Kishon Vijay Abraham I' via linux-sunxi写道:
> Hi,
> 
> On Friday 06 July 2018 09:08 PM, Icenowy Zheng wrote:
> > Allwinner H6 SoC contains a USB3 PHY (with USB2 DP/DM lines also
> > controlled).
> > 
> > Add a driver for it.
> > 
> > The register operations in this driver is mainly extracted from the
> > BSP
> > USB3 driver.
> > 
> > Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
> > ---
> > Changes in v2:
> > - Splitted out the DT binding.
> > 
> >  drivers/phy/allwinner/Kconfig           |  13 ++
> >  drivers/phy/allwinner/Makefile          |   1 +
> >  drivers/phy/allwinner/phy-sun50i-usb3.c | 194
> > ++++++++++++++++++++++++
> >  3 files changed, 208 insertions(+)
> >  create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c
> > 
> > diff --git a/drivers/phy/allwinner/Kconfig
> > b/drivers/phy/allwinner/Kconfig
> > index cdc1e745ba47..cf373bcee034 100644
> > --- a/drivers/phy/allwinner/Kconfig
> > +++ b/drivers/phy/allwinner/Kconfig
> > @@ -29,3 +29,16 @@ config PHY_SUN9I_USB
> >  	  sun9i SoCs.
> >  
> >  	  This driver controls each individual USB 2 host PHY.
> > +
> > +config PHY_SUN50I_USB3
> > +	tristate "Allwinner sun50i SoC USB3 PHY driver"
> > +	depends on ARCH_SUNXI && HAS_IOMEM && OF
> > +	depends on RESET_CONTROLLER
> > +	depends on USB_SUPPORT
> > +	select USB_COMMON
> 
> Doesn't look like this driver depends on USB_SUPPORT.

Yes, it doesn't depend on USB_SUPPORT; however, it's a USB PHY.

> > +	select GENERIC_PHY
> > +	help
> > +	  Enable this to support the USB3.0-capable transceiver
> > that is
> > +	  part of some Allwinner sun50i SoCs.
> > +
> > +	  This driver controls each individual USB 2+3 host PHY
> > combo.
> > diff --git a/drivers/phy/allwinner/Makefile
> > b/drivers/phy/allwinner/Makefile
> > index 8605529c01a1..a8d01e9073c2 100644
> > --- a/drivers/phy/allwinner/Makefile
> > +++ b/drivers/phy/allwinner/Makefile
> > @@ -1,2 +1,3 @@
> >  obj-$(CONFIG_PHY_SUN4I_USB)		+= phy-sun4i-usb.o
> >  obj-$(CONFIG_PHY_SUN9I_USB)		+= phy-sun9i-usb.o
> > +obj-$(CONFIG_PHY_SUN50I_USB3)		+= phy-sun50i-usb3.o
> > diff --git a/drivers/phy/allwinner/phy-sun50i-usb3.c
> > b/drivers/phy/allwinner/phy-sun50i-usb3.c
> > new file mode 100644
> > index 000000000000..226c99c2d664
> > --- /dev/null
> > +++ b/drivers/phy/allwinner/phy-sun50i-usb3.c
> > @@ -0,0 +1,194 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Allwinner sun50i(H6) USB 3.0 phy driver
> > + *
> > + * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.io>
> > + *
> > + * Based on phy-sun9i-usb.c, which is:
> > + *
> > + * Copyright (C) 2014-2015 Chen-Yu Tsai <wens@csie.org>
> > + *
> > + * Based on code from Allwinner BSP, which is:
> > + *
> > + * Copyright (c) 2010-2015 Allwinner Technology Co., Ltd.
> 
> Does the BSP also use GPL license?

See [1].

[1] https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/dri
vers/usb/host/xhci_sunxi.c

> > + */
> > +
> > +#include <linux/clk.h>
> > +#include <linux/err.h>
> > +#include <linux/io.h>
> > +#include <linux/module.h>
> > +#include <linux/phy/phy.h>
> > +#include <linux/usb/of.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/reset.h>
> > +
> > +/* Interface Status and Control Registers */
> > +#define SUNXI_ISCR			0x00
> > +#define SUNXI_PIPE_CLOCK_CONTROL	0x14
> > +#define SUNXI_PHY_TUNE_LOW		0x18
> > +#define SUNXI_PHY_TUNE_HIGH		0x1c
> > +#define SUNXI_PHY_EXTERNAL_CONTROL	0x20
> > +
> > +/* USB2.0 Interface Status and Control Register */
> > +#define SUNXI_ISCR_FORCE_VBUS		(3 << 12)
> > +
> > +/* PIPE Clock Control Register */
> > +#define SUNXI_PCC_PIPE_CLK_OPEN		(1 << 6)
> > +
> > +/* PHY External Control Register */
> > +#define SUNXI_PEC_EXTERN_VBUS		(3 << 1)
> > +#define SUNXI_PEC_SSC_EN		(1 << 24)
> > +#define SUNXI_PEC_REF_SSP_EN		(1 << 26)
> > +
> > +/* PHY Tune High Register */
> > +#define SUNXI_TX_DEEMPH_3P5DB(n)	((n) << 19)
> > +#define SUNXI_TX_DEEMPH_3P5DB_MASK	GENMASK(24, 19)
> > +#define SUNXI_TX_DEEMPH_6DB(n)		((n) << 13)
> > +#define SUNXI_TX_DEEMPH_6GB_MASK	GENMASK(18, 13)
> > +#define SUNXI_TX_SWING_FULL(n)		((n) << 6)
> > +#define SUNXI_TX_SWING_FULL_MASK	GENMASK(12, 6)
> > +#define SUNXI_LOS_BIAS(n)		((n) << 3)
> > +#define SUNXI_LOS_BIAS_MASK		GENMASK(5, 3)
> > +#define SUNXI_TXVBOOSTLVL(n)		((n) << 0)
> > +#define SUNXI_TXVBOOSTLVL_MASK		GENMASK(0, 2)
> > +
> > +struct sun50i_usb3_phy {
> > +	struct phy *phy;
> > +	void __iomem *regs;
> > +	struct reset_control *reset;
> > +	struct clk *clk;
> > +};
> > +
> > +static void sun50i_usb3_phy_open(struct sun50i_usb3_phy *phy)
> > +{
> > +	u32 val;
> > +
> > +	val = readl(phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
> > +	val |= SUNXI_PEC_EXTERN_VBUS;
> > +	val |= SUNXI_PEC_SSC_EN | SUNXI_PEC_REF_SSP_EN;
> > +	writel(val, phy->regs + SUNXI_PHY_EXTERNAL_CONTROL);
> > +
> > +	val = readl(phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
> > +	val |= SUNXI_PCC_PIPE_CLK_OPEN;
> > +	writel(val, phy->regs + SUNXI_PIPE_CLOCK_CONTROL);
> > +
> > +	val = readl(phy->regs + SUNXI_ISCR);
> > +	val |= SUNXI_ISCR_FORCE_VBUS;
> > +	writel(val, phy->regs + SUNXI_ISCR);
> > +
> > +	/*
> > +	 * All the magic numbers written to the
> > PHY_TUNE_{LOW_HIGH}
> > +	 * registers are directly taken from the BSP USB3 driver
> > from
> > +	 * Allwiner.
> 
> %s/Allwiner/Allwinner/
> > +	 */
> > +	writel(0x0047fc87, phy->regs + SUNXI_PHY_TUNE_LOW);
> 
> PHY_TUNE_LOW should also configure individual parameters like how
> you've done
> below for PHY_TUNE_HIGH.

Sorry the BSP doesn't contain any macros on it, only a comment says "It
is set 0x0047fc87 on bare-metal."

> 
> Thanks
> Kishon
> 
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html