diff mbox series

[1/3] arm64: dts: mediatek: Introduce MT8195 LAPTOP and IOT's USB configurations

Message ID 20230105092809.14214-1-macpaul.lin@mediatek.com (mailing list archive)
State New, archived
Headers show
Series [1/3] arm64: dts: mediatek: Introduce MT8195 LAPTOP and IOT's USB configurations | expand

Commit Message

Macpaul Lin Jan. 5, 2023, 9:28 a.m. UTC
Introduce the split MT8195 laptop and iot USB configurations.
The hardware specifications for LAPTOP devices is different from IOT
devices. The major differences include some hardware constrains for
dual-role switch for USB controllers in different configurations,
especially for power management and other control flows as well.

Here are some hardware specifiction differences listed:
  1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device mode).
  2. IOT devices must support multiple gadget devices and host mode.
  3. Dual-role switch is not fully supported. Only USB PORT0 support
     dual-role switch.
  4. Power management is designed in primary and secondary dominator.
     For a dual-role port, the device controller is the primary controller
     for power management; while the host controller is the secondary.
     LAPTOP devices should remove device nodes for avoiding abnormal
     behavior.

This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.

To remove common USB configurations for mt8195.dtsi and switch includes
dtsi these new files for the boards will come in next patch.

Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
---
 .../boot/dts/mediatek/mt8195-iot-usb.dtsi     | 122 ++++++++++++++++++
 .../boot/dts/mediatek/mt8195-laptop-usb.dtsi  | 102 +++++++++++++++
 2 files changed, 224 insertions(+)
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
 create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-laptop-usb.dtsi

Comments

Krzysztof Kozlowski Jan. 6, 2023, 12:56 p.m. UTC | #1
On 05/01/2023 10:28, Macpaul Lin wrote:
> Introduce the split MT8195 laptop and iot USB configurations.
> The hardware specifications for LAPTOP devices is different from IOT
> devices. The major differences include some hardware constrains for
> dual-role switch for USB controllers in different configurations,
> especially for power management and other control flows as well.
> 
> Here are some hardware specifiction differences listed:
>   1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device mode).
>   2. IOT devices must support multiple gadget devices and host mode.
>   3. Dual-role switch is not fully supported. Only USB PORT0 support
>      dual-role switch.
>   4. Power management is designed in primary and secondary dominator.
>      For a dual-role port, the device controller is the primary controller
>      for power management; while the host controller is the secondary.
>      LAPTOP devices should remove device nodes for avoiding abnormal
>      behavior.
> 
> This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
> 
> To remove common USB configurations for mt8195.dtsi and switch includes
> dtsi these new files for the boards will come in next patch.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> ---
>  .../boot/dts/mediatek/mt8195-iot-usb.dtsi     | 122 ++++++++++++++++++
>  .../boot/dts/mediatek/mt8195-laptop-usb.dtsi  | 102 +++++++++++++++
>  2 files changed, 224 insertions(+)
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
>  create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-laptop-usb.dtsi
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
> new file mode 100644
> index 000000000000..f9bd79542044
> --- /dev/null
> +++ b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
> @@ -0,0 +1,122 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> +/*
> + * Copyright (C) 2022 MediaTek Inc.
> + */
> +
> +#include "mt8195.dtsi"
> +
> +/ {
> +	soc {
> +		ssusb: ssusb@11200000 {

Node name: usb

> +			compatible ="mediatek,mt8183-mtu3", "mediatek,mtu3";
> +			reg = <0 0x11201000 0 0x2dff>,
> +			      <0 0x11203e00 0 0x0100>;
> +			reg-names = "mac", "ippc";
> +			interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH 0>;
> +			phys = <&u2port0 PHY_TYPE_USB2>,
> +			       <&u3port0 PHY_TYPE_USB3>;
> +			clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
> +				 <&topckgen CLK_TOP_SSUSB_REF>,
> +				 <&infracfg_ao CLK_INFRA_AO_SSUSB_XHCI>;
> +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
> +			#address-cells = <2>;
> +			#size-cells = <2>;
> +			ranges;
> +			status = "disabled";
> +
> +			xhci0: xhci@11200000 {
> +				compatible = "mediatek,mt8195-xhci",
> +					     "mediatek,mtk-xhci";
> +				reg = <0 0x11200000 0 0x1000>;
> +				reg-names = "mac";
> +				interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH 0>;
> +				assigned-clocks = <&topckgen CLK_TOP_USB_TOP>,
> +						  <&topckgen CLK_TOP_SSUSB_XHCI>;
> +				assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
> +							 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
> +				clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
> +					 <&infracfg_ao CLK_INFRA_AO_SSUSB_XHCI>,
> +					 <&topckgen CLK_TOP_SSUSB_REF>,
> +					 <&apmixedsys CLK_APMIXED_USB1PLL>;
> +				clock-names = "sys_ck", "xhci_ck", "ref_ck", "mcu_ck";
> +				status = "disabled";
> +			};
> +		};
> +
> +		xhci1: xhci1@11290000 {

Node names should be generic, so just "xhci"
https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html#generic-names-recommendation

> +			compatible = "mediatek,mt8195-xhci",
> +				     "mediatek,mtk-xhci";
> +			reg = <0 0x11290000 0 0x1000>,
> +			      <0 0x11293e00 0 0x0100>;
> +			reg-names = "mac", "ippc";
> +			interrupts = <GIC_SPI 530 IRQ_TYPE_LEVEL_HIGH 0>;
> +			phys = <&u2port1 PHY_TYPE_USB2>,
> +			       <&u3port1 PHY_TYPE_USB3>;
> +			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_1P>,
> +					  <&topckgen CLK_TOP_SSUSB_XHCI_1P>;
> +			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
> +						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
> +			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_1P_BUS>,
> +				 <&pericfg_ao CLK_PERI_AO_SSUSB_1P_XHCI>,
> +				 <&topckgen CLK_TOP_SSUSB_P1_REF>,
> +				 <&apmixedsys CLK_APMIXED_USB1PLL>;
> +			clock-names = "sys_ck", "xhci_ck", "ref_ck", "mcu_ck";
> +			status = "disabled";
> +		};
> +
> +		ssusb1: usb1@112a1000 {

usb

> +			compatible = "mediatek,mt8183-mtu3", "mediatek,mtu3";
> +			reg = <0 0x112a1000 0 0x2dff>,
> +				  <0 0x112a3e00 0 0x0100>;
> +			reg-names = "mac", "ippc";
> +			interrupts = <GIC_SPI 532 IRQ_TYPE_LEVEL_HIGH 0>;
> +			phys = <&u2port2 PHY_TYPE_USB2>;
> +			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_2P>;
> +			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
> +			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_2P_BUS>,
> +				 <&topckgen CLK_TOP_SSUSB_P2_REF>,
> +				 <&pericfg_ao CLK_PERI_AO_SSUSB_2P_XHCI>;
> +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
> +			mediatek,syscon-wakeup = <&pericfg 0x400 4>;
> +			#address-cells = <2>;
> +			#size-cells = <2>;
> +			ranges;
> +			status = "disabled";
> +
> +			xhci2: xhci2@112a0000 {

xhci

> +				compatible = "mediatek,mt8195-xhci","mediatek,mtk-xhci";
> +				reg = <0 0x112a0000 0 0x1000>;
> +				reg-names = "mac";
> +				interrupts-extended = <&gic GIC_SPI 533 IRQ_TYPE_LEVEL_HIGH 0>,
> +					      <&pio 220 IRQ_TYPE_EDGE_FALLING>;
> +				assigned-clocks = <&topckgen CLK_TOP_SSUSB_XHCI_2P>;
> +				assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
> +				clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_2P_XHCI>;
> +				clock-names = "sys_ck";
> +				status = "disabled";
> +			};
> +		};
> +
> +		xhci3: xhci3@112b0000 {

xhci
> +			compatible = "mediatek,mt8195-xhci",
> +				     "mediatek,mtk-xhci";
> +			reg = <0 0x112b0000 0 0x1000>,
> +			      <0 0x112b3e00 0 0x0100>;
> +			reg-names = "mac", "ippc";
> +			interrupts = <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH 0>;
> +			phys = <&u2port3 PHY_TYPE_USB2>;
> +			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_3P>,
> +					  <&topckgen CLK_TOP_SSUSB_XHCI_3P>;
> +			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
> +						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
> +			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_3P_BUS>,
> +				 <&pericfg_ao CLK_PERI_AO_SSUSB_3P_XHCI>,
> +				 <&topckgen CLK_TOP_SSUSB_P3_REF>;
> +			clock-names = "sys_ck", "xhci_ck", "ref_ck";
> +			mediatek,syscon-wakeup = <&pericfg 0x400 106>;
> +			wakeup-source;
> +			usb2-lpm-disable;
> +			status = "disabled";
> +		};


Best regards,
Krzysztof
AngeloGioacchino Del Regno Jan. 9, 2023, 3:13 p.m. UTC | #2
Il 05/01/23 10:28, Macpaul Lin ha scritto:
> Introduce the split MT8195 laptop and iot USB configurations.
> The hardware specifications for LAPTOP devices is different from IOT
> devices. The major differences include some hardware constrains for
> dual-role switch for USB controllers in different configurations,
> especially for power management and other control flows as well.
> 
> Here are some hardware specifiction differences listed:
>    1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device mode).
>    2. IOT devices must support multiple gadget devices and host mode.
>    3. Dual-role switch is not fully supported. Only USB PORT0 support
>       dual-role switch.
>    4. Power management is designed in primary and secondary dominator.
>       For a dual-role port, the device controller is the primary controller
>       for power management; while the host controller is the secondary.
>       LAPTOP devices should remove device nodes for avoiding abnormal
>       behavior.
> 
> This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
> 
> To remove common USB configurations for mt8195.dtsi and switch includes
> dtsi these new files for the boards will come in next patch.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>

I'm mostly sure that there's no reason to split the two configurations.

I agree in that Tomato doesn't support gadget mode on the Type-A port and I
honestly don't currently know (and I'll test that later!) if it would be possible
to act as gadget on any of the two Type-C ports.
Of course I agree on the fact that a laptop acting as a gadget may not be useful,
but that's not something that I want to judge, as someone may find a usecase.

In any case, even if Tomato does *not* support gadget mode on *any* port at all,
I wonder why we wouldn't be able to probe MTU3 (and correctly describe the SoC)
on Chromebooks but only on MT8195-based IoT boards...
...and in case there's any real issue, we can always force host mode (with a
generic  devicetree property!) on the MTU3 on Tomato.

Finally, if we're able to add MTU3 to Tomato boards, this means that we won't be
seeing these two DTSI files and that USB nodes are still going to all lie in the
main `mt8195.dtsi` file, without all this duplication that I'm seeing here.

What do you think?

Regards,
Angelo
Chunfeng Yun Jan. 11, 2023, 2:19 a.m. UTC | #3
On Fri, 2023-01-06 at 13:56 +0100, Krzysztof Kozlowski wrote:
> On 05/01/2023 10:28, Macpaul Lin wrote:
> > Introduce the split MT8195 laptop and iot USB configurations.
> > The hardware specifications for LAPTOP devices is different from
> > IOT
> > devices. The major differences include some hardware constrains for
> > dual-role switch for USB controllers in different configurations,
> > especially for power management and other control flows as well.
> > 
> > Here are some hardware specifiction differences listed:
> >   1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device
> > mode).
> >   2. IOT devices must support multiple gadget devices and host
> > mode.
> >   3. Dual-role switch is not fully supported. Only USB PORT0
> > support
> >      dual-role switch.
> >   4. Power management is designed in primary and secondary
> > dominator.
> >      For a dual-role port, the device controller is the primary
> > controller
> >      for power management; while the host controller is the
> > secondary.
> >      LAPTOP devices should remove device nodes for avoiding
> > abnormal
> >      behavior.
> > 
> > This modifcation is to add USB configurations "mt8195-laptop-
> > usb.dtsi"
> > for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
> > 
> > To remove common USB configurations for mt8195.dtsi and switch
> > includes
> > dtsi these new files for the boards will come in next patch.
> > 
> > Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> > ---
> >  .../boot/dts/mediatek/mt8195-iot-usb.dtsi     | 122
> > ++++++++++++++++++
> >  .../boot/dts/mediatek/mt8195-laptop-usb.dtsi  | 102
> > +++++++++++++++
> >  2 files changed, 224 insertions(+)
> >  create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-iot-
> > usb.dtsi
> >  create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-laptop-
> > usb.dtsi
> > 
> > diff --git a/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
> > b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
> > new file mode 100644
> > index 000000000000..f9bd79542044
> > --- /dev/null
> > +++ b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
> > @@ -0,0 +1,122 @@
> > +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> > +/*
> > + * Copyright (C) 2022 MediaTek Inc.
> > + */
> > +
> > +#include "mt8195.dtsi"
> > +
> > +/ {
> > +	soc {
> > +		ssusb: ssusb@11200000 {
> 
> Node name: usb
> 
> > +			compatible ="mediatek,mt8183-mtu3",
> > "mediatek,mtu3";
> > +			reg = <0 0x11201000 0 0x2dff>,
> > +			      <0 0x11203e00 0 0x0100>;
> > +			reg-names = "mac", "ippc";
> > +			interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH
> > 0>;
> > +			phys = <&u2port0 PHY_TYPE_USB2>,
> > +			       <&u3port0 PHY_TYPE_USB3>;
> > +			clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
> > +				 <&topckgen CLK_TOP_SSUSB_REF>,
> > +				 <&infracfg_ao
> > CLK_INFRA_AO_SSUSB_XHCI>;
> > +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
> > +			#address-cells = <2>;
> > +			#size-cells = <2>;
> > +			ranges;
> > +			status = "disabled";
> > +
> > +			xhci0: xhci@11200000 {
s/xhci/usb
> > +				compatible = "mediatek,mt8195-xhci",
> > +					     "mediatek,mtk-xhci";
> > +				reg = <0 0x11200000 0 0x1000>;
> > +				reg-names = "mac";
> > +				interrupts = <GIC_SPI 129
> > IRQ_TYPE_LEVEL_HIGH 0>;
> > +				assigned-clocks = <&topckgen
> > CLK_TOP_USB_TOP>,
> > +						  <&topckgen
> > CLK_TOP_SSUSB_XHCI>;
> > +				assigned-clock-parents = <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>,
> > +							 <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>;
> > +				clocks = <&infracfg_ao
> > CLK_INFRA_AO_SSUSB>,
> > +					 <&infracfg_ao
> > CLK_INFRA_AO_SSUSB_XHCI>,
> > +					 <&topckgen CLK_TOP_SSUSB_REF>,
> > +					 <&apmixedsys
> > CLK_APMIXED_USB1PLL>;
> > +				clock-names = "sys_ck", "xhci_ck",
> > "ref_ck", "mcu_ck";
> > +				status = "disabled";
> > +			};
> > +		};
> > +
> > +		xhci1: xhci1@11290000 {
> 
> Node names should be generic, so just "xhci"
also use "usb", no generic name "xhci" in the following spec

> 
https://urldefense.com/v3/__https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html*generic-names-recommendation__;Iw!!CTRNKA9wMg0ARbw!n5NxtuBHI5f9tS659pqDgRDZNAFxnXriet0G48KA64n1CEWYYsL0vXY0I-Mw99H8a8UDW5KR_79k7IvYg8Er5gNvmkXE9HZH$ 
>  
> 
> > +			compatible = "mediatek,mt8195-xhci",
> > +				     "mediatek,mtk-xhci";
> > +			reg = <0 0x11290000 0 0x1000>,
> > +			      <0 0x11293e00 0 0x0100>;
> > +			reg-names = "mac", "ippc";
> > +			interrupts = <GIC_SPI 530 IRQ_TYPE_LEVEL_HIGH
> > 0>;
> > +			phys = <&u2port1 PHY_TYPE_USB2>,
> > +			       <&u3port1 PHY_TYPE_USB3>;
> > +			assigned-clocks = <&topckgen
> > CLK_TOP_USB_TOP_1P>,
> > +					  <&topckgen
> > CLK_TOP_SSUSB_XHCI_1P>;
> > +			assigned-clock-parents = <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>,
> > +						 <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>;
> > +			clocks = <&pericfg_ao
> > CLK_PERI_AO_SSUSB_1P_BUS>,
> > +				 <&pericfg_ao
> > CLK_PERI_AO_SSUSB_1P_XHCI>,
> > +				 <&topckgen CLK_TOP_SSUSB_P1_REF>,
> > +				 <&apmixedsys CLK_APMIXED_USB1PLL>;
> > +			clock-names = "sys_ck", "xhci_ck", "ref_ck",
> > "mcu_ck";
> > +			status = "disabled";
> > +		};
> > +
> > +		ssusb1: usb1@112a1000 {
> 
> usb
> 
> > +			compatible = "mediatek,mt8183-mtu3",
> > "mediatek,mtu3";
> > +			reg = <0 0x112a1000 0 0x2dff>,
> > +				  <0 0x112a3e00 0 0x0100>;
> > +			reg-names = "mac", "ippc";
> > +			interrupts = <GIC_SPI 532 IRQ_TYPE_LEVEL_HIGH
> > 0>;
> > +			phys = <&u2port2 PHY_TYPE_USB2>;
> > +			assigned-clocks = <&topckgen
> > CLK_TOP_USB_TOP_2P>;
> > +			assigned-clock-parents = <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>;
> > +			clocks = <&pericfg_ao
> > CLK_PERI_AO_SSUSB_2P_BUS>,
> > +				 <&topckgen CLK_TOP_SSUSB_P2_REF>,
> > +				 <&pericfg_ao
> > CLK_PERI_AO_SSUSB_2P_XHCI>;
> > +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
> > +			mediatek,syscon-wakeup = <&pericfg 0x400 4>;
> > +			#address-cells = <2>;
> > +			#size-cells = <2>;
> > +			ranges;
> > +			status = "disabled";
> > +
> > +			xhci2: xhci2@112a0000 {
> 
> xhci
use "usb", no need change it when move from mt8195.dtsi

> 
> > +				compatible = "mediatek,mt8195-
> > xhci","mediatek,mtk-xhci";
> > +				reg = <0 0x112a0000 0 0x1000>;
> > +				reg-names = "mac";
> > +				interrupts-extended = <&gic GIC_SPI 533
> > IRQ_TYPE_LEVEL_HIGH 0>,
> > +					      <&pio 220
> > IRQ_TYPE_EDGE_FALLING>;
> > +				assigned-clocks = <&topckgen
> > CLK_TOP_SSUSB_XHCI_2P>;
> > +				assigned-clock-parents = <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>;
> > +				clocks = <&pericfg_ao
> > CLK_PERI_AO_SSUSB_2P_XHCI>;
> > +				clock-names = "sys_ck";
> > +				status = "disabled";
> > +			};
> > +		};
> > +
> > +		xhci3: xhci3@112b0000 {
> 
> xhci
usb
> > +			compatible = "mediatek,mt8195-xhci",
> > +				     "mediatek,mtk-xhci";
> > +			reg = <0 0x112b0000 0 0x1000>,
> > +			      <0 0x112b3e00 0 0x0100>;
> > +			reg-names = "mac", "ippc";
> > +			interrupts = <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH
> > 0>;
> > +			phys = <&u2port3 PHY_TYPE_USB2>;
> > +			assigned-clocks = <&topckgen
> > CLK_TOP_USB_TOP_3P>,
> > +					  <&topckgen
> > CLK_TOP_SSUSB_XHCI_3P>;
> > +			assigned-clock-parents = <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>,
> > +						 <&topckgen
> > CLK_TOP_UNIVPLL_D5_D4>;
> > +			clocks = <&pericfg_ao
> > CLK_PERI_AO_SSUSB_3P_BUS>,
> > +				 <&pericfg_ao
> > CLK_PERI_AO_SSUSB_3P_XHCI>,
> > +				 <&topckgen CLK_TOP_SSUSB_P3_REF>;
> > +			clock-names = "sys_ck", "xhci_ck", "ref_ck";
> > +			mediatek,syscon-wakeup = <&pericfg 0x400 106>;
> > +			wakeup-source;
> > +			usb2-lpm-disable;
> > +			status = "disabled";
> > +		};
> 
> 
> Best regards,
> Krzysztof
>
Macpaul Lin Jan. 11, 2023, 3:53 a.m. UTC | #4
On 1/11/23 10:19, Chunfeng Yun (云春峰) and Krzysztof Kozlowski wrote:
> On Fri, 2023-01-06 at 13:56 +0100, Krzysztof Kozlowski wrote:
>> On 05/01/2023 10:28, Macpaul Lin wrote:
>>> Introduce the split MT8195 laptop and iot USB configurations.
>>> The hardware specifications for LAPTOP devices is different from
>>> IOT
>>> devices. The major differences include some hardware constrains for
>>> dual-role switch for USB controllers in different configurations,
>>> especially for power management and other control flows as well.
>>>
>>> Here are some hardware specifiction differences listed:
>>>    1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device
>>> mode).
>>>    2. IOT devices must support multiple gadget devices and host
>>> mode.
>>>    3. Dual-role switch is not fully supported. Only USB PORT0
>>> support
>>>       dual-role switch.
>>>    4. Power management is designed in primary and secondary
>>> dominator.
>>>       For a dual-role port, the device controller is the primary
>>> controller
>>>       for power management; while the host controller is the
>>> secondary.
>>>       LAPTOP devices should remove device nodes for avoiding
>>> abnormal
>>>       behavior.
>>>
>>> This modifcation is to add USB configurations "mt8195-laptop-
>>> usb.dtsi"
>>> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
>>>
>>> To remove common USB configurations for mt8195.dtsi and switch
>>> includes
>>> dtsi these new files for the boards will come in next patch.
>>>
>>> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
>>> ---
>>>   .../boot/dts/mediatek/mt8195-iot-usb.dtsi     | 122
>>> ++++++++++++++++++
>>>   .../boot/dts/mediatek/mt8195-laptop-usb.dtsi  | 102
>>> +++++++++++++++
>>>   2 files changed, 224 insertions(+)
>>>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-iot-
>>> usb.dtsi
>>>   create mode 100644 arch/arm64/boot/dts/mediatek/mt8195-laptop-
>>> usb.dtsi
>>>
>>> diff --git a/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
>>> b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
>>> new file mode 100644
>>> index 000000000000..f9bd79542044
>>> --- /dev/null
>>> +++ b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
>>> @@ -0,0 +1,122 @@
>>> +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
>>> +/*
>>> + * Copyright (C) 2022 MediaTek Inc.
>>> + */
>>> +
>>> +#include "mt8195.dtsi"
>>> +
>>> +/ {
>>> +	soc {
>>> +		ssusb: ssusb@11200000 {
>>
>> Node name: usb

Got it.

>>
>>> +			compatible ="mediatek,mt8183-mtu3",
>>> "mediatek,mtu3";
>>> +			reg = <0 0x11201000 0 0x2dff>,
>>> +			      <0 0x11203e00 0 0x0100>;
>>> +			reg-names = "mac", "ippc";
>>> +			interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH
>>> 0>;
>>> +			phys = <&u2port0 PHY_TYPE_USB2>,
>>> +			       <&u3port0 PHY_TYPE_USB3>;
>>> +			clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
>>> +				 <&topckgen CLK_TOP_SSUSB_REF>,
>>> +				 <&infracfg_ao
>>> CLK_INFRA_AO_SSUSB_XHCI>;
>>> +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
>>> +			#address-cells = <2>;
>>> +			#size-cells = <2>;
>>> +			ranges;
>>> +			status = "disabled";
>>> +
>>> +			xhci0: xhci@11200000 {
> s/xhci/usb
>>> +				compatible = "mediatek,mt8195-xhci",
>>> +					     "mediatek,mtk-xhci";
>>> +				reg = <0 0x11200000 0 0x1000>;
>>> +				reg-names = "mac";
>>> +				interrupts = <GIC_SPI 129
>>> IRQ_TYPE_LEVEL_HIGH 0>;
>>> +				assigned-clocks = <&topckgen
>>> CLK_TOP_USB_TOP>,
>>> +						  <&topckgen
>>> CLK_TOP_SSUSB_XHCI>;
>>> +				assigned-clock-parents = <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>,
>>> +							 <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>;
>>> +				clocks = <&infracfg_ao
>>> CLK_INFRA_AO_SSUSB>,
>>> +					 <&infracfg_ao
>>> CLK_INFRA_AO_SSUSB_XHCI>,
>>> +					 <&topckgen CLK_TOP_SSUSB_REF>,
>>> +					 <&apmixedsys
>>> CLK_APMIXED_USB1PLL>;
>>> +				clock-names = "sys_ck", "xhci_ck",
>>> "ref_ck", "mcu_ck";
>>> +				status = "disabled";
>>> +			};
>>> +		};
>>> +
>>> +		xhci1: xhci1@11290000 {
>>
>> Node names should be generic, so just "xhci"
> also use "usb", no generic name "xhci" in the following spec
> 

Thanks for the reminding. I'll align the naming assignment in origin 
mt8195.dtsi and in the following specification.

>>
> https://urldefense.com/v3/__https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetree-basics.html*generic-names-recommendation__;Iw!!CTRNKA9wMg0ARbw!n5NxtuBHI5f9tS659pqDgRDZNAFxnXriet0G48KA64n1CEWYYsL0vXY0I-Mw99H8a8UDW5KR_79k7IvYg8Er5gNvmkXE9HZH$
>>   
>>
>>> +			compatible = "mediatek,mt8195-xhci",
>>> +				     "mediatek,mtk-xhci";
>>> +			reg = <0 0x11290000 0 0x1000>,
>>> +			      <0 0x11293e00 0 0x0100>;
>>> +			reg-names = "mac", "ippc";
>>> +			interrupts = <GIC_SPI 530 IRQ_TYPE_LEVEL_HIGH
>>> 0>;
>>> +			phys = <&u2port1 PHY_TYPE_USB2>,
>>> +			       <&u3port1 PHY_TYPE_USB3>;
>>> +			assigned-clocks = <&topckgen
>>> CLK_TOP_USB_TOP_1P>,
>>> +					  <&topckgen
>>> CLK_TOP_SSUSB_XHCI_1P>;
>>> +			assigned-clock-parents = <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>,
>>> +						 <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>;
>>> +			clocks = <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_1P_BUS>,
>>> +				 <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_1P_XHCI>,
>>> +				 <&topckgen CLK_TOP_SSUSB_P1_REF>,
>>> +				 <&apmixedsys CLK_APMIXED_USB1PLL>;
>>> +			clock-names = "sys_ck", "xhci_ck", "ref_ck",
>>> "mcu_ck";
>>> +			status = "disabled";
>>> +		};
>>> +
>>> +		ssusb1: usb1@112a1000 {
>>
>> usb
>>

Got it.

>>> +			compatible = "mediatek,mt8183-mtu3",
>>> "mediatek,mtu3";
>>> +			reg = <0 0x112a1000 0 0x2dff>,
>>> +				  <0 0x112a3e00 0 0x0100>;
>>> +			reg-names = "mac", "ippc";
>>> +			interrupts = <GIC_SPI 532 IRQ_TYPE_LEVEL_HIGH
>>> 0>;
>>> +			phys = <&u2port2 PHY_TYPE_USB2>;
>>> +			assigned-clocks = <&topckgen
>>> CLK_TOP_USB_TOP_2P>;
>>> +			assigned-clock-parents = <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>;
>>> +			clocks = <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_2P_BUS>,
>>> +				 <&topckgen CLK_TOP_SSUSB_P2_REF>,
>>> +				 <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_2P_XHCI>;
>>> +			clock-names = "sys_ck", "ref_ck", "mcu_ck";
>>> +			mediatek,syscon-wakeup = <&pericfg 0x400 4>;
>>> +			#address-cells = <2>;
>>> +			#size-cells = <2>;
>>> +			ranges;
>>> +			status = "disabled";
>>> +
>>> +			xhci2: xhci2@112a0000 {
>>
>> xhci
> use "usb", no need change it when move from mt8195.dtsi
> 

Got it.

>>
>>> +				compatible = "mediatek,mt8195-
>>> xhci","mediatek,mtk-xhci";
>>> +				reg = <0 0x112a0000 0 0x1000>;
>>> +				reg-names = "mac";
>>> +				interrupts-extended = <&gic GIC_SPI 533
>>> IRQ_TYPE_LEVEL_HIGH 0>,
>>> +					      <&pio 220
>>> IRQ_TYPE_EDGE_FALLING>;
>>> +				assigned-clocks = <&topckgen
>>> CLK_TOP_SSUSB_XHCI_2P>;
>>> +				assigned-clock-parents = <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>;
>>> +				clocks = <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_2P_XHCI>;
>>> +				clock-names = "sys_ck";
>>> +				status = "disabled";
>>> +			};
>>> +		};
>>> +
>>> +		xhci3: xhci3@112b0000 {
>>
>> xhci
> usb

Got it.

>>> +			compatible = "mediatek,mt8195-xhci",
>>> +				     "mediatek,mtk-xhci";
>>> +			reg = <0 0x112b0000 0 0x1000>,
>>> +			      <0 0x112b3e00 0 0x0100>;
>>> +			reg-names = "mac", "ippc";
>>> +			interrupts = <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH
>>> 0>;
>>> +			phys = <&u2port3 PHY_TYPE_USB2>;
>>> +			assigned-clocks = <&topckgen
>>> CLK_TOP_USB_TOP_3P>,
>>> +					  <&topckgen
>>> CLK_TOP_SSUSB_XHCI_3P>;
>>> +			assigned-clock-parents = <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>,
>>> +						 <&topckgen
>>> CLK_TOP_UNIVPLL_D5_D4>;
>>> +			clocks = <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_3P_BUS>,
>>> +				 <&pericfg_ao
>>> CLK_PERI_AO_SSUSB_3P_XHCI>,
>>> +				 <&topckgen CLK_TOP_SSUSB_P3_REF>;
>>> +			clock-names = "sys_ck", "xhci_ck", "ref_ck";
>>> +			mediatek,syscon-wakeup = <&pericfg 0x400 106>;
>>> +			wakeup-source;
>>> +			usb2-lpm-disable;
>>> +			status = "disabled";
>>> +		};
>>
>>
>> Best regards,
>> Krzysztof
>>

Thanks
Macpaul Lin
Macpaul Lin Jan. 11, 2023, 5:37 a.m. UTC | #5
On 1/9/23 23:13, AngeloGioacchino Del Regno wrote:
> Il 05/01/23 10:28, Macpaul Lin ha scritto:
>> Introduce the split MT8195 laptop and iot USB configurations.
>> The hardware specifications for LAPTOP devices is different from IOT
>> devices. The major differences include some hardware constrains for
>> dual-role switch for USB controllers in different configurations,
>> especially for power management and other control flows as well.
>>
>> Here are some hardware specifiction differences listed:
>>    1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device 
>> mode).
>>    2. IOT devices must support multiple gadget devices and host mode.
>>    3. Dual-role switch is not fully supported. Only USB PORT0 support
>>       dual-role switch.
>>    4. Power management is designed in primary and secondary dominator.
>>       For a dual-role port, the device controller is the primary 
>> controller
>>       for power management; while the host controller is the secondary.
>>       LAPTOP devices should remove device nodes for avoiding abnormal
>>       behavior.
>>
>> This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
>> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
>>
>> To remove common USB configurations for mt8195.dtsi and switch includes
>> dtsi these new files for the boards will come in next patch.
>>
>> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> 
> I'm mostly sure that there's no reason to split the two configurations.
>
> I agree in that Tomato doesn't support gadget mode on the Type-A port and I
> honestly don't currently know (and I'll test that later!) if it would be 
> possible
> to act as gadget on any of the two Type-C ports.
> Of course I agree on the fact that a laptop acting as a gadget may not 
> be useful,
> but that's not something that I want to judge, as someone may find a 
> usecase.
> 
> In any case, even if Tomato does *not* support gadget mode on *any* port 
> at all,
> I wonder why we wouldn't be able to probe MTU3 (and correctly describe 
> the SoC)
> on Chromebooks but only on MT8195-based IoT boards...
> ...and in case there's any real issue, we can always force host mode 
> (with a
> generic  devicetree property!) on the MTU3 on Tomato.

We are sorry it cannot be achieved by even setting "force host mode" to 
usb device node. At least, it cannot be done on MT8195.

The basic reason is the power requirements for USB host on a LAPTOP are 
different from those on an IoT device.

The main cause is low power management. The hardware of each device port 
is different on MT8195. Even the bit fields definition in registers were 
different.

Some details such as sequence need to be coordinated with the SPM 
firmware. When a device hardware is involved in runtime PM, function 
like remote wakeup and other suspend/resume behavior will be abnormal 
for a LAPTOP device. If we split the dtsi for different devices, people 
can choose different configuration in SPM firmware in coreboot or in 
TF-A to meet the requirement. Hence we'd better not to get more messy 
code in Linux driver.

> Finally, if we're able to add MTU3 to Tomato boards, this means that we 
> won't be
> seeing these two DTSI files and that USB nodes are still going to all 
> lie in the
> main `mt8195.dtsi` file, without all this duplication that I'm seeing here.
> 
> What do you think?
> 
> Regards,
> Angelo
> 

Thanks for the suggestion, we hope the next platform in the future could 
avoid this issue and reduce some duplicate dts.

Macpaul Lin
Matthias Brugger Feb. 1, 2023, 12:52 p.m. UTC | #6
Hi all,

On 11/01/2023 06:37, Macpaul Lin wrote:
> 
> 
> On 1/9/23 23:13, AngeloGioacchino Del Regno wrote:
>> Il 05/01/23 10:28, Macpaul Lin ha scritto:
>>> Introduce the split MT8195 laptop and iot USB configurations.
>>> The hardware specifications for LAPTOP devices is different from IOT
>>> devices. The major differences include some hardware constrains for
>>> dual-role switch for USB controllers in different configurations,
>>> especially for power management and other control flows as well.
>>>
>>> Here are some hardware specifiction differences listed:
>>>    1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device mode).
>>>    2. IOT devices must support multiple gadget devices and host mode.
>>>    3. Dual-role switch is not fully supported. Only USB PORT0 support
>>>       dual-role switch.
>>>    4. Power management is designed in primary and secondary dominator.
>>>       For a dual-role port, the device controller is the primary controller
>>>       for power management; while the host controller is the secondary.
>>>       LAPTOP devices should remove device nodes for avoiding abnormal
>>>       behavior.
>>>
>>> This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
>>> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
>>>
>>> To remove common USB configurations for mt8195.dtsi and switch includes
>>> dtsi these new files for the boards will come in next patch.
>>>
>>> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
>>
>> I'm mostly sure that there's no reason to split the two configurations.
>>
>> I agree in that Tomato doesn't support gadget mode on the Type-A port and I
>> honestly don't currently know (and I'll test that later!) if it would be possible
>> to act as gadget on any of the two Type-C ports.
>> Of course I agree on the fact that a laptop acting as a gadget may not be useful,
>> but that's not something that I want to judge, as someone may find a usecase.
>>
>> In any case, even if Tomato does *not* support gadget mode on *any* port at all,
>> I wonder why we wouldn't be able to probe MTU3 (and correctly describe the SoC)
>> on Chromebooks but only on MT8195-based IoT boards...
>> ...and in case there's any real issue, we can always force host mode (with a
>> generic  devicetree property!) on the MTU3 on Tomato.
> 
> We are sorry it cannot be achieved by even setting "force host mode" to usb 
> device node. At least, it cannot be done on MT8195.
> 
> The basic reason is the power requirements for USB host on a LAPTOP are 
> different from those on an IoT device.
> 
> The main cause is low power management. The hardware of each device port is 
> different on MT8195. Even the bit fields definition in registers were different.
> 
> Some details such as sequence need to be coordinated with the SPM firmware. When 
> a device hardware is involved in runtime PM, function like remote wakeup and 
> other suspend/resume behavior will be abnormal for a LAPTOP device. If we split 
> the dtsi for different devices, people can choose different configuration in SPM 
> firmware in coreboot or in TF-A to meet the requirement. Hence we'd better not 
> to get more messy code in Linux driver.
> 

I'm not sure I understand everything here. If the XHCI device is a child of the 
mtu3 node then we have problems with some SPM firmware that is not coordinated 
with the runtime PM functions of the kernel?

Fixing that in the device tree sounds wrong here. I think the real fix would be, 
to fix the SPM firmware, so that it can deal with that.

Or is there more to it? If so what? In that case can we try to ignore the 
runtime PM in the MTU3 kernel driver?

I'm not an USB expert but to me it looks very strange that we can have the XHCI 
devices nodes as 'standalone' or as children of mtu3. We should try to describe 
the HW as it is in DT.

Regards,
Matthias

>> Finally, if we're able to add MTU3 to Tomato boards, this means that we won't be
>> seeing these two DTSI files and that USB nodes are still going to all lie in the
>> main `mt8195.dtsi` file, without all this duplication that I'm seeing here.
>>
>> What do you think?
>>
>> Regards,
>> Angelo
>>
> 
> Thanks for the suggestion, we hope the next platform in the future could avoid 
> this issue and reduce some duplicate dts.
> 
> Macpaul Lin
Macpaul Lin Feb. 9, 2023, 10:44 a.m. UTC | #7
On 2/1/23 20:52, Matthias Brugger wrote:
> Hi all,
> 
> On 11/01/2023 06:37, Macpaul Lin wrote:
>>
>>
>> On 1/9/23 23:13, AngeloGioacchino Del Regno wrote:
>>> Il 05/01/23 10:28, Macpaul Lin ha scritto:
>>>> Introduce the split MT8195 laptop and iot USB configurations.
>>>> The hardware specifications for LAPTOP devices is different from IOT
>>>> devices. The major differences include some hardware constrains for
>>>> dual-role switch for USB controllers in different configurations,
>>>> especially for power management and other control flows as well.
>>>>
>>>> Here are some hardware specifiction differences listed:
>>>>    1. LAPTOP (Cherry Tomato boards) don't support USB gadget (device 
>>>> mode).
>>>>    2. IOT devices must support multiple gadget devices and host mode.
>>>>    3. Dual-role switch is not fully supported. Only USB PORT0 support
>>>>       dual-role switch.
>>>>    4. Power management is designed in primary and secondary dominator.
>>>>       For a dual-role port, the device controller is the primary 
>>>> controller
>>>>       for power management; while the host controller is the secondary.
>>>>       LAPTOP devices should remove device nodes for avoiding abnormal
>>>>       behavior.
>>>>
>>>> This modifcation is to add USB configurations "mt8195-laptop-usb.dtsi"
>>>> for LAPTOP devices, and add "mt8195-iot-usb.dtsi" for IOT devices.
>>>>
>>>> To remove common USB configurations for mt8195.dtsi and switch includes
>>>> dtsi these new files for the boards will come in next patch.
>>>>
>>>> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
>>>
>>> I'm mostly sure that there's no reason to split the two configurations.
>>>
>>> I agree in that Tomato doesn't support gadget mode on the Type-A port 
>>> and I
>>> honestly don't currently know (and I'll test that later!) if it would 
>>> be possible
>>> to act as gadget on any of the two Type-C ports.
>>> Of course I agree on the fact that a laptop acting as a gadget may 
>>> not be useful,
>>> but that's not something that I want to judge, as someone may find a 
>>> usecase.
>>>
>>> In any case, even if Tomato does *not* support gadget mode on *any* 
>>> port at all,
>>> I wonder why we wouldn't be able to probe MTU3 (and correctly 
>>> describe the SoC)
>>> on Chromebooks but only on MT8195-based IoT boards...
>>> ...and in case there's any real issue, we can always force host mode 
>>> (with a
>>> generic  devicetree property!) on the MTU3 on Tomato.
>>
>> We are sorry it cannot be achieved by even setting "force host mode" 
>> to usb device node. At least, it cannot be done on MT8195.
>>
>> The basic reason is the power requirements for USB host on a LAPTOP 
>> are different from those on an IoT device.
>>
>> The main cause is low power management. The hardware of each device 
>> port is different on MT8195. Even the bit fields definition in 
>> registers were different.
>>
>> Some details such as sequence need to be coordinated with the SPM 
>> firmware. When a device hardware is involved in runtime PM, function 
>> like remote wakeup and other suspend/resume behavior will be abnormal 
>> for a LAPTOP device. If we split the dtsi for different devices, 
>> people can choose different configuration in SPM firmware in coreboot 
>> or in TF-A to meet the requirement. Hence we'd better not to get more 
>> messy code in Linux driver.
>>
> 
> I'm not sure I understand everything here. If the XHCI device is a child 
> of the mtu3 node then we have problems with some SPM firmware that is 
> not coordinated with the runtime PM functions of the kernel?

The behavior of runtime PM function, especially the behavior of USB 
remote wake up will be different if mtu3 node is involved, for MT8195.

> Fixing that in the device tree sounds wrong here. I think the real fix 
> would be, to fix the SPM firmware, so that it can deal with that.
> 
> Or is there more to it? If so what? In that case can we try to ignore 
> the runtime PM in the MTU3 kernel driver?
> 
> I'm not an USB expert but to me it looks very strange that we can have 
> the XHCI devices nodes as 'standalone' or as children of mtu3. We should 
> try to describe the HW as it is in DT.

After a discussion with MTU3 maintainer Chunfeng, we think there might 
be a way to give it a try to refactor the mtu3 driver.
That is to create an extra USB platform device to handle mtu3 and 
xhci-mtk as the children at the same level. Both mtu3 platform device 
xhci-mtk platform device will become the children of a common USB 
platform device. However, we are not sure if this could work and solved the
dependencies. It requires some development time and MediaTek need
to allocate some developer's resource to verify this approach.


> Regards,
> Matthias
> 
>>> Finally, if we're able to add MTU3 to Tomato boards, this means that 
>>> we won't be
>>> seeing these two DTSI files and that USB nodes are still going to all 
>>> lie in the
>>> main `mt8195.dtsi` file, without all this duplication that I'm seeing 
>>> here.
>>>
>>> What do you think?
>>>
>>> Regards,
>>> Angelo
>>>
>>
>> Thanks for the suggestion, we hope the next platform in the future 
>> could avoid this issue and reduce some duplicate dts.
>>
>> Macpaul Lin

Thanks
Macpaul Lin
diff mbox series

Patch

diff --git a/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
new file mode 100644
index 000000000000..f9bd79542044
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8195-iot-usb.dtsi
@@ -0,0 +1,122 @@ 
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include "mt8195.dtsi"
+
+/ {
+	soc {
+		ssusb: ssusb@11200000 {
+			compatible ="mediatek,mt8183-mtu3", "mediatek,mtu3";
+			reg = <0 0x11201000 0 0x2dff>,
+			      <0 0x11203e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port0 PHY_TYPE_USB2>,
+			       <&u3port0 PHY_TYPE_USB3>;
+			clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
+				 <&topckgen CLK_TOP_SSUSB_REF>,
+				 <&infracfg_ao CLK_INFRA_AO_SSUSB_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck";
+			#address-cells = <2>;
+			#size-cells = <2>;
+			ranges;
+			status = "disabled";
+
+			xhci0: xhci@11200000 {
+				compatible = "mediatek,mt8195-xhci",
+					     "mediatek,mtk-xhci";
+				reg = <0 0x11200000 0 0x1000>;
+				reg-names = "mac";
+				interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH 0>;
+				assigned-clocks = <&topckgen CLK_TOP_USB_TOP>,
+						  <&topckgen CLK_TOP_SSUSB_XHCI>;
+				assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+							 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+				clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
+					 <&infracfg_ao CLK_INFRA_AO_SSUSB_XHCI>,
+					 <&topckgen CLK_TOP_SSUSB_REF>,
+					 <&apmixedsys CLK_APMIXED_USB1PLL>;
+				clock-names = "sys_ck", "xhci_ck", "ref_ck", "mcu_ck";
+				status = "disabled";
+			};
+		};
+
+		xhci1: xhci1@11290000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x11290000 0 0x1000>,
+			      <0 0x11293e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 530 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port1 PHY_TYPE_USB2>,
+			       <&u3port1 PHY_TYPE_USB3>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_1P>,
+					  <&topckgen CLK_TOP_SSUSB_XHCI_1P>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_1P_BUS>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_1P_XHCI>,
+				 <&topckgen CLK_TOP_SSUSB_P1_REF>,
+				 <&apmixedsys CLK_APMIXED_USB1PLL>;
+			clock-names = "sys_ck", "xhci_ck", "ref_ck", "mcu_ck";
+			status = "disabled";
+		};
+
+		ssusb1: usb1@112a1000 {
+			compatible = "mediatek,mt8183-mtu3", "mediatek,mtu3";
+			reg = <0 0x112a1000 0 0x2dff>,
+				  <0 0x112a3e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 532 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port2 PHY_TYPE_USB2>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_2P>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_2P_BUS>,
+				 <&topckgen CLK_TOP_SSUSB_P2_REF>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_2P_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 4>;
+			#address-cells = <2>;
+			#size-cells = <2>;
+			ranges;
+			status = "disabled";
+
+			xhci2: xhci2@112a0000 {
+				compatible = "mediatek,mt8195-xhci","mediatek,mtk-xhci";
+				reg = <0 0x112a0000 0 0x1000>;
+				reg-names = "mac";
+				interrupts-extended = <&gic GIC_SPI 533 IRQ_TYPE_LEVEL_HIGH 0>,
+					      <&pio 220 IRQ_TYPE_EDGE_FALLING>;
+				assigned-clocks = <&topckgen CLK_TOP_SSUSB_XHCI_2P>;
+				assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+				clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_2P_XHCI>;
+				clock-names = "sys_ck";
+				status = "disabled";
+			};
+		};
+
+		xhci3: xhci3@112b0000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x112b0000 0 0x1000>,
+			      <0 0x112b3e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port3 PHY_TYPE_USB2>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_3P>,
+					  <&topckgen CLK_TOP_SSUSB_XHCI_3P>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_3P_BUS>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_3P_XHCI>,
+				 <&topckgen CLK_TOP_SSUSB_P3_REF>;
+			clock-names = "sys_ck", "xhci_ck", "ref_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 106>;
+			wakeup-source;
+			usb2-lpm-disable;
+			status = "disabled";
+		};
+	};
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8195-laptop-usb.dtsi b/arch/arm64/boot/dts/mediatek/mt8195-laptop-usb.dtsi
new file mode 100644
index 000000000000..5e6999bfd83c
--- /dev/null
+++ b/arch/arm64/boot/dts/mediatek/mt8195-laptop-usb.dtsi
@@ -0,0 +1,102 @@ 
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2022 MediaTek Inc.
+ */
+
+#include "mt8195.dtsi"
+
+/ {
+	soc {
+		xhci0: usb@11200000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x11200000 0 0x1000>,
+			      <0 0x11203e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port0 PHY_TYPE_USB2>,
+			       <&u3port0 PHY_TYPE_USB3>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP>,
+					  <&topckgen CLK_TOP_SSUSB_XHCI>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&infracfg_ao CLK_INFRA_AO_SSUSB>,
+				 <&topckgen CLK_TOP_SSUSB_REF>,
+				 <&apmixedsys CLK_APMIXED_USB1PLL>,
+				 <&clk26m>,
+				 <&infracfg_ao CLK_INFRA_AO_SSUSB_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck", "dma_ck",
+				      "xhci_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 103>;
+			wakeup-source;
+			status = "disabled";
+		};
+
+		xhci1: usb@11290000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x11290000 0 0x1000>,
+			      <0 0x11293e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 530 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port1 PHY_TYPE_USB2>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_1P>,
+					  <&topckgen CLK_TOP_SSUSB_XHCI_1P>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_1P_BUS>,
+				 <&topckgen CLK_TOP_SSUSB_P1_REF>,
+				 <&apmixedsys CLK_APMIXED_USB1PLL>,
+				 <&clk26m>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_1P_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck", "dma_ck",
+				      "xhci_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 104>;
+			wakeup-source;
+			status = "disabled";
+		};
+
+		xhci2: usb@112a0000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x112a0000 0 0x1000>,
+			      <0 0x112a3e00 0 0x0100>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_2P_BUS>,
+				 <&topckgen CLK_TOP_SSUSB_P2_REF>,
+				 <&clk26m>,
+				 <&clk26m>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_2P_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck", "dma_ck",
+				      "xhci_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 105>;
+			wakeup-source;
+			status = "disabled";
+		};
+
+		xhci3: usb@112b0000 {
+			compatible = "mediatek,mt8195-xhci",
+				     "mediatek,mtk-xhci";
+			reg = <0 0x112b0000 0 0x1000>,
+			      <0 0x112b3e00 0 0x0100>;
+			reg-names = "mac", "ippc";
+			interrupts = <GIC_SPI 536 IRQ_TYPE_LEVEL_HIGH 0>;
+			phys = <&u2port3 PHY_TYPE_USB2>;
+			assigned-clocks = <&topckgen CLK_TOP_USB_TOP_3P>,
+					  <&topckgen CLK_TOP_SSUSB_XHCI_3P>;
+			assigned-clock-parents = <&topckgen CLK_TOP_UNIVPLL_D5_D4>,
+						 <&topckgen CLK_TOP_UNIVPLL_D5_D4>;
+			clocks = <&pericfg_ao CLK_PERI_AO_SSUSB_3P_BUS>,
+				 <&topckgen CLK_TOP_SSUSB_P3_REF>,
+				 <&clk26m>,
+				 <&clk26m>,
+				 <&pericfg_ao CLK_PERI_AO_SSUSB_3P_XHCI>;
+			clock-names = "sys_ck", "ref_ck", "mcu_ck", "dma_ck",
+				      "xhci_ck";
+			mediatek,syscon-wakeup = <&pericfg 0x400 106>;
+			wakeup-source;
+			status = "disabled";
+		};
+	};
+};