ARM: dts: colibri-imx6ull: Enable dual-role switching

Message ID 20221102155226.51587-1-dev@pschenker.ch
State New
Headers
Series ARM: dts: colibri-imx6ull: Enable dual-role switching |

Commit Message

Philippe Schenker Nov. 2, 2022, 3:52 p.m. UTC
  From: Philippe Schenker <philippe.schenker@toradex.com>

The Colibri standard provides a GPIO called USBC_DET to switch from
USB Host to USB Device and back. The Colibri iMX6ULL does have the SoC
ball USB_OTG1_VBUS connected in series with a capacitor to ground.

This means that we need to provide to the extcon framework VBUS and ID
events using the single GPIO we have. The Extcon USB GPIO driver does
use id-gpio also for VBUS event, as in our case where vbus-gpio is
absent.

Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>

---

 arch/arm/boot/dts/imx6ull-colibri.dtsi | 8 ++++++++
 1 file changed, 8 insertions(+)
  

Comments

Alexander Stein Nov. 3, 2022, 7:46 a.m. UTC | #1
Hi Philippe,

Am Mittwoch, 2. November 2022, 16:52:26 CET schrieb Philippe Schenker:
> From: Philippe Schenker <philippe.schenker@toradex.com>
> 
> The Colibri standard provides a GPIO called USBC_DET to switch from
> USB Host to USB Device and back. The Colibri iMX6ULL does have the SoC
> ball USB_OTG1_VBUS connected in series with a capacitor to ground.
> 
> This means that we need to provide to the extcon framework VBUS and ID
> events using the single GPIO we have. The Extcon USB GPIO driver does
> use id-gpio also for VBUS event, as in our case where vbus-gpio is
> absent.
> 
> Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
> 
> ---
> 
>  arch/arm/boot/dts/imx6ull-colibri.dtsi | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> b/arch/arm/boot/dts/imx6ull-colibri.dtsi index 577a424b0e1d..feb1fcd9a684
> 100644
> --- a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> +++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi
> @@ -24,6 +24,13 @@ backlight: backlight {
>  		status = "okay";
>  	};
> 
> +	extcon_usbc_det: usbc-det {
> +		compatible = "linux,extcon-usb-gpio";
> +		id-gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>; /* SODIMM 137 / 
USBC_DET */
> +		pinctrl-names = "default";
> +		pinctrl-0 = <&pinctrl_snvs_usbc_det>;
> +	};
> +
>  	gpio-keys {
>  		compatible = "gpio-keys";
>  		pinctrl-names = "default";
> @@ -275,6 +282,7 @@ &uart5 {
>  /* Colibri USBC */
>  &usbotg1 {
>  	dr_mode = "otg";
> +	extcon = <&extcon_usbc_det>, <&extcon_usbc_det>;

How came you up with this double entries? Is there some documentation you need 
two phandles?
I have a problem on imx8mm (same USB host controller) where on USB device mode 
no device is attached on host side. I fixed it by using usb-role-switch 
instead [1].
But it also works on imx8mm using extcon with two phandles instead of just 
one.

Regards,
Alexander

[1] https://patchwork.kernel.org/project/linux-arm-kernel/patch/
20221101093031.278241-1-alexander.stein@ew.tq-group.com/
>  	srp-disable;
>  	hnp-disable;
>  	adp-disable;
  
Francesco Dolcini Nov. 3, 2022, 8:04 a.m. UTC | #2
On Thu, Nov 03, 2022 at 08:46:58AM +0100, Alexander Stein wrote:
> Hi Philippe,
> 
> Am Mittwoch, 2. November 2022, 16:52:26 CET schrieb Philippe Schenker:
> > From: Philippe Schenker <philippe.schenker@toradex.com>
> > 
> > The Colibri standard provides a GPIO called USBC_DET to switch from
> > USB Host to USB Device and back. The Colibri iMX6ULL does have the SoC
> > ball USB_OTG1_VBUS connected in series with a capacitor to ground.
> > 
> > This means that we need to provide to the extcon framework VBUS and ID
> > events using the single GPIO we have. The Extcon USB GPIO driver does
> > use id-gpio also for VBUS event, as in our case where vbus-gpio is
> > absent.
> > 
> > Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
> > 
> > ---
> > 
> >  arch/arm/boot/dts/imx6ull-colibri.dtsi | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > b/arch/arm/boot/dts/imx6ull-colibri.dtsi index 577a424b0e1d..feb1fcd9a684
> > 100644
> > --- a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > +++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > @@ -24,6 +24,13 @@ backlight: backlight {
> >  		status = "okay";
> >  	};
> > 
> > +	extcon_usbc_det: usbc-det {
> > +		compatible = "linux,extcon-usb-gpio";
> > +		id-gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>; /* SODIMM 137 / 
> USBC_DET */
> > +		pinctrl-names = "default";
> > +		pinctrl-0 = <&pinctrl_snvs_usbc_det>;
> > +	};
> > +
> >  	gpio-keys {
> >  		compatible = "gpio-keys";
> >  		pinctrl-names = "default";
> > @@ -275,6 +282,7 @@ &uart5 {
> >  /* Colibri USBC */
> >  &usbotg1 {
> >  	dr_mode = "otg";
> > +	extcon = <&extcon_usbc_det>, <&extcon_usbc_det>;
> 
> How came you up with this double entries? Is there some documentation you need 
> two phandles?

extcon-usb-gpio provides both vbus/otg_id with a single handle, however
the integration in chipidea is somehow weird, the first entry is supposed to be
used to read the vbus, the second one to read the otg_id.

So if you need to read both you really need to have the handle twice ...

Francesco
  
Shawn Guo Nov. 11, 2022, 5:17 a.m. UTC | #3
On Thu, Nov 03, 2022 at 09:04:53AM +0100, Francesco Dolcini wrote:
> On Thu, Nov 03, 2022 at 08:46:58AM +0100, Alexander Stein wrote:
> > Hi Philippe,
> > 
> > Am Mittwoch, 2. November 2022, 16:52:26 CET schrieb Philippe Schenker:
> > > From: Philippe Schenker <philippe.schenker@toradex.com>
> > > 
> > > The Colibri standard provides a GPIO called USBC_DET to switch from
> > > USB Host to USB Device and back. The Colibri iMX6ULL does have the SoC
> > > ball USB_OTG1_VBUS connected in series with a capacitor to ground.
> > > 
> > > This means that we need to provide to the extcon framework VBUS and ID
> > > events using the single GPIO we have. The Extcon USB GPIO driver does
> > > use id-gpio also for VBUS event, as in our case where vbus-gpio is
> > > absent.
> > > 
> > > Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
> > > 
> > > ---
> > > 
> > >  arch/arm/boot/dts/imx6ull-colibri.dtsi | 8 ++++++++
> > >  1 file changed, 8 insertions(+)
> > > 
> > > diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > > b/arch/arm/boot/dts/imx6ull-colibri.dtsi index 577a424b0e1d..feb1fcd9a684
> > > 100644
> > > --- a/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > > +++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi
> > > @@ -24,6 +24,13 @@ backlight: backlight {
> > >  		status = "okay";
> > >  	};
> > > 
> > > +	extcon_usbc_det: usbc-det {
> > > +		compatible = "linux,extcon-usb-gpio";
> > > +		id-gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>; /* SODIMM 137 / 
> > USBC_DET */
> > > +		pinctrl-names = "default";
> > > +		pinctrl-0 = <&pinctrl_snvs_usbc_det>;
> > > +	};
> > > +
> > >  	gpio-keys {
> > >  		compatible = "gpio-keys";
> > >  		pinctrl-names = "default";
> > > @@ -275,6 +282,7 @@ &uart5 {
> > >  /* Colibri USBC */
> > >  &usbotg1 {
> > >  	dr_mode = "otg";
> > > +	extcon = <&extcon_usbc_det>, <&extcon_usbc_det>;
> > 
> > How came you up with this double entries? Is there some documentation you need 
> > two phandles?
> 
> extcon-usb-gpio provides both vbus/otg_id with a single handle, however
> the integration in chipidea is somehow weird, the first entry is supposed to be
> used to read the vbus, the second one to read the otg_id.
> 
> So if you need to read both you really need to have the handle twice ...

Thanks for the input, Francesco!

Philippe,

Do you consider to use usb-role-switch as suggested by Alexander,
considering the weirdness of how chipidea driver supports extcon-usb-gpio?

Shawn
  

Patch

diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi b/arch/arm/boot/dts/imx6ull-colibri.dtsi
index 577a424b0e1d..feb1fcd9a684 100644
--- a/arch/arm/boot/dts/imx6ull-colibri.dtsi
+++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi
@@ -24,6 +24,13 @@  backlight: backlight {
 		status = "okay";
 	};
 
+	extcon_usbc_det: usbc-det {
+		compatible = "linux,extcon-usb-gpio";
+		id-gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>; /* SODIMM 137 / USBC_DET */
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_snvs_usbc_det>;
+	};
+
 	gpio-keys {
 		compatible = "gpio-keys";
 		pinctrl-names = "default";
@@ -275,6 +282,7 @@  &uart5 {
 /* Colibri USBC */
 &usbotg1 {
 	dr_mode = "otg";
+	extcon = <&extcon_usbc_det>, <&extcon_usbc_det>;
 	srp-disable;
 	hnp-disable;
 	adp-disable;