Message ID | 1519199101-27065-2-git-send-email-yossim@codeaurora.org |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | None | expand |
On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: > On the db410c 96boards platform we have a TC7USB40MU on the board > to mux the D+/D- lines coming from the controller between a micro > usb "device" port and a USB hub for "host" roles[1]. During a > role switch, we need to toggle this mux to forward the D+/D- > lines to either the port or the hub. Add the necessary code to do > the role switch in chipidea core via the generic mux framework. > Board configurations like on db410c are expected to change roles > via the sysfs API described in > Documentation/ABI/testing/sysfs-platform-chipidea-usb2. > > [1] https://github.com/96boards/documentation/raw/master/ConsumerEdition/DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf > > Cc: Peter Rosin <peda@axentia.se> > Cc: Peter Chen <peter.chen@nxp.com> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: <devicetree@vger.kernel.org> > Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> > > Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> > --- > Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 ++++++ Please make bindings a separate patch. > drivers/usb/chipidea/Kconfig | 2 ++ > drivers/usb/chipidea/core.c | 6 ++++++ > drivers/usb/chipidea/host.c | 7 +++++++ > drivers/usb/chipidea/udc.c | 13 ++++++++++++- > include/linux/usb/chipidea.h | 2 ++ > 6 files changed, 35 insertions(+), 1 deletion(-) > > diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt > index 0e03344..2e93181 100644 > --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt > +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt > @@ -76,6 +76,10 @@ Optional properties: > needs to make sure it does not send more than 90% > maximum_periodic_data_per_frame. The use case is multiple transactions, but > less frame rate. > +- mux-controls: The mux control for toggling host/device output of this > + controller. It's expected that a mux state of 0 indicates device mode and a > + mux state of 1 indicates host mode. > +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. -names is pointless when there is only 1. > > i.mx specific properties > - fsl,usbmisc: phandler of non-core register device, with one > @@ -102,4 +106,6 @@ Example: > rx-burst-size-dword = <0x10>; > extcon = <0>, <&usb_id>; > phy-clkgate-delay-us = <400>; > + mux-controls = <&usb_switch>; > + mux-control-names = "usb_switch"; > }; -- 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
>On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: >> On the db410c 96boards platform we have a TC7USB40MU on the board >> to mux the D+/D- lines coming from the controller between a micro >> usb "device" port and a USB hub for "host" roles[1]. During a >> role switch, we need to toggle this mux to forward the D+/D- >> lines to either the port or the hub. Add the necessary code to do >> the role switch in chipidea core via the generic mux framework. >> Board configurations like on db410c are expected to change roles >> via the sysfs API described in >> Documentation/ABI/testing/sysfs-platform-chipidea-usb2. >> >> [1] https://github.com/96boards/documentation/raw/master/ConsumerEdition/DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf >> >> Cc: Peter Rosin <peda@axentia.se> >> Cc: Peter Chen <peter.chen@nxp.com> >> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >> Cc: <devicetree@vger.kernel.org> >> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> >> >> Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> >> --- >> Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 ++++++ > >Please make bindings a separate patch. sure > >> drivers/usb/chipidea/Kconfig | 2 ++ >> drivers/usb/chipidea/core.c | 6 ++++++ >> drivers/usb/chipidea/host.c | 7 +++++++ >> drivers/usb/chipidea/udc.c | 13 ++++++++++++- >> include/linux/usb/chipidea.h | 2 ++ >> 6 files changed, 35 insertions(+), 1 deletion(-) >> >> diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >> index 0e03344..2e93181 100644 >> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >> @@ -76,6 +76,10 @@ Optional properties: >> needs to make sure it does not send more than 90% >> maximum_periodic_data_per_frame. The use case is multiple transactions, but >> less frame rate. >> +- mux-controls: The mux control for toggling host/device output of this >> + controller. It's expected that a mux state of 0 indicates device mode and a >> + mux state of 1 indicates host mode. >> +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. > >-names is pointless when there is only 1. the names is used to find the attached mux in the dt . it is used in the following lines in mux/core.c if (mux_name) { index = of_property_match_string(np, "mux-control-names", mux_name); so I think iwe need to keep it, agreed? > >> >> i.mx specific properties >> - fsl,usbmisc: phandler of non-core register device, with one >> @@ -102,4 +106,6 @@ Example: >> rx-burst-size-dword = <0x10>; >> extcon = <0>, <&usb_id>; >> phy-clkgate-delay-us = <400>; >> + mux-controls = <&usb_switch>; >> + mux-control-names = "usb_switch"; >> }; _______________________________________________ Dragonboard-aosp mailing list Dragonboard-aosp@lists.96boards.org https://lists.96boards.org/mailman/listinfo/dragonboard-aosp
On 2018-03-06 16:16, Yossi Mansharoff wrote: >> On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: >>> On the db410c 96boards platform we have a TC7USB40MU on the board >>> to mux the D+/D- lines coming from the controller between a micro >>> usb "device" port and a USB hub for "host" roles[1]. During a >>> role switch, we need to toggle this mux to forward the D+/D- >>> lines to either the port or the hub. Add the necessary code to do >>> the role switch in chipidea core via the generic mux framework. >>> Board configurations like on db410c are expected to change roles >>> via the sysfs API described in >>> Documentation/ABI/testing/sysfs-platform-chipidea-usb2. >>> >>> [1] https://github.com/96boards/documentation/raw/master/ConsumerEdition/DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf >>> >>> Cc: Peter Rosin <peda@axentia.se> >>> Cc: Peter Chen <peter.chen@nxp.com> >>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>> Cc: <devicetree@vger.kernel.org> >>> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> >>> >>> Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> >>> --- >>> Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 ++++++ >> >> Please make bindings a separate patch. > sure >> >>> drivers/usb/chipidea/Kconfig | 2 ++ >>> drivers/usb/chipidea/core.c | 6 ++++++ >>> drivers/usb/chipidea/host.c | 7 +++++++ >>> drivers/usb/chipidea/udc.c | 13 ++++++++++++- >>> include/linux/usb/chipidea.h | 2 ++ >>> 6 files changed, 35 insertions(+), 1 deletion(-) >>> >>> diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>> index 0e03344..2e93181 100644 >>> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>> @@ -76,6 +76,10 @@ Optional properties: >>> needs to make sure it does not send more than 90% >>> maximum_periodic_data_per_frame. The use case is multiple transactions, but >>> less frame rate. >>> +- mux-controls: The mux control for toggling host/device output of this >>> + controller. It's expected that a mux state of 0 indicates device mode and a >>> + mux state of 1 indicates host mode. >>> +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. >> >> -names is pointless when there is only 1. > the names is used to find the attached mux in the dt . > it is used in the following lines in mux/core.c > if (mux_name) { > index = of_property_match_string(np, "mux-control-names", > mux_name); > so I think iwe need to keep it, agreed? If mux_name is NULL, index defaults to 0, i.e. the first (and presumably only) mux control is grabbed from the mux-controls list. So, you should be able to call mux_control_get_optional with a NULL mux_name argument for this to work. But please try it... Cheers, Peter >> >>> >>> i.mx specific properties >>> - fsl,usbmisc: phandler of non-core register device, with one >>> @@ -102,4 +106,6 @@ Example: >>> rx-burst-size-dword = <0x10>; >>> extcon = <0>, <&usb_id>; >>> phy-clkgate-delay-us = <400>; >>> + mux-controls = <&usb_switch>; >>> + mux-control-names = "usb_switch"; >>> }; > _______________________________________________ > Dragonboard-aosp mailing list > Dragonboard-aosp@lists.96boards.org > https://lists.96boards.org/mailman/listinfo/dragonboard-aosp > -- 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
>On 2018-03-06 16:16, Yossi Mansharoff wrote: >>> On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: >>>> On the db410c 96boards platform we have a TC7USB40MU on the board to >>>> mux the D+/D- lines coming from the controller between a micro usb >>>> "device" port and a USB hub for "host" roles[1]. During a role >>>> switch, we need to toggle this mux to forward the D+/D- lines to >>>> either the port or the hub. Add the necessary code to do the role >>>> switch in chipidea core via the generic mux framework. >>>> Board configurations like on db410c are expected to change roles via >>>> the sysfs API described in >>>> Documentation/ABI/testing/sysfs-platform-chipidea-usb2. >>>> >>>> [1] >>>> https://github.com/96boards/documentation/raw/master/ConsumerEdition >>>> /DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf >>>> >>>> Cc: Peter Rosin <peda@axentia.se> >>>> Cc: Peter Chen <peter.chen@nxp.com> >>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>>> Cc: <devicetree@vger.kernel.org> >>>> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> >>>> >>>> Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> >>>> --- >>>> Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 ++++++ >>> >>> Please make bindings a separate patch. >> sure >>> >>>> drivers/usb/chipidea/Kconfig | 2 ++ >>>> drivers/usb/chipidea/core.c | 6 ++++++ >>>> drivers/usb/chipidea/host.c | 7 +++++++ >>>> drivers/usb/chipidea/udc.c | 13 ++++++++++++- >>>> include/linux/usb/chipidea.h | 2 ++ >>>> 6 files changed, 35 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>> b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>> index 0e03344..2e93181 100644 >>>> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>> @@ -76,6 +76,10 @@ Optional properties: >>>> needs to make sure it does not send more than 90% >>>> maximum_periodic_data_per_frame. The use case is multiple transactions, but >>>> less frame rate. >>>> +- mux-controls: The mux control for toggling host/device output of >>>> +this >>>> + controller. It's expected that a mux state of 0 indicates device >>>> +mode and a >>>> + mux state of 1 indicates host mode. >>>> +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. >>> >>> -names is pointless when there is only 1. >> the names is used to find the attached mux in the dt . >> it is used in the following lines in mux/core.c if (mux_name) { >> index = of_property_match_string(np, "mux-control-names", >> mux_name); >> so I think iwe need to keep it, agreed? > >If mux_name is NULL, index defaults to 0, i.e. the first (and presumably >only) mux control is grabbed from the mux-controls list. > >So, you should be able to call mux_control_get_optional with a NULL mux_name argument for this to work. But please try it... > >Cheers, >Peter that's correct, my thought is that it would be safer to explicitly call the mux_control_get_optional function with a mux name, just for the case of multiple muxes. Thanks. For example another mux to switch off vBUS. Yossi > >>> >>>> >>>> i.mx specific properties >>>> - fsl,usbmisc: phandler of non-core register device, with one @@ >>>> -102,4 +106,6 @@ Example: >>>> rx-burst-size-dword = <0x10>; >>>> extcon = <0>, <&usb_id>; >>>> phy-clkgate-delay-us = <400>; >>>> + mux-controls = <&usb_switch>; >>>> + mux-control-names = "usb_switch"; >>>> }; >> _______________________________________________ >> Dragonboard-aosp mailing list >> Dragonboard-aosp@lists.96boards.org >> https://lists.96boards.org/mailman/listinfo/dragonboard-aosp >> > >
[finally remembered to switch email for Stephen Boyd] On 2018-03-07 10:22, Yossi Mansharoff wrote: >> On 2018-03-06 16:16, Yossi Mansharoff wrote: >>>> On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: >>>>> On the db410c 96boards platform we have a TC7USB40MU on the board to >>>>> mux the D+/D- lines coming from the controller between a micro usb >>>>> "device" port and a USB hub for "host" roles[1]. During a role >>>>> switch, we need to toggle this mux to forward the D+/D- lines to >>>>> either the port or the hub. Add the necessary code to do the role >>>>> switch in chipidea core via the generic mux framework. >>>>> Board configurations like on db410c are expected to change roles via >>>>> the sysfs API described in >>>>> Documentation/ABI/testing/sysfs-platform-chipidea-usb2. >>>>> >>>>> [1] >>>>> https://github.com/96boards/documentation/raw/master/ConsumerEdition >>>>> /DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf >>>>> >>>>> Cc: Peter Rosin <peda@axentia.se> >>>>> Cc: Peter Chen <peter.chen@nxp.com> >>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>>>> Cc: <devicetree@vger.kernel.org> >>>>> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> >>>>> >>>>> Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> >>>>> --- >>>>> Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 ++++++ >>>> >>>> Please make bindings a separate patch. >>> sure >>>> >>>>> drivers/usb/chipidea/Kconfig | 2 ++ >>>>> drivers/usb/chipidea/core.c | 6 ++++++ >>>>> drivers/usb/chipidea/host.c | 7 +++++++ >>>>> drivers/usb/chipidea/udc.c | 13 ++++++++++++- >>>>> include/linux/usb/chipidea.h | 2 ++ >>>>> 6 files changed, 35 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>> b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>> index 0e03344..2e93181 100644 >>>>> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>> @@ -76,6 +76,10 @@ Optional properties: >>>>> needs to make sure it does not send more than 90% >>>>> maximum_periodic_data_per_frame. The use case is multiple transactions, but >>>>> less frame rate. >>>>> +- mux-controls: The mux control for toggling host/device output of >>>>> +this >>>>> + controller. It's expected that a mux state of 0 indicates device >>>>> +mode and a >>>>> + mux state of 1 indicates host mode. >>>>> +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. >>>> >>>> -names is pointless when there is only 1. >>> the names is used to find the attached mux in the dt . >>> it is used in the following lines in mux/core.c if (mux_name) { >>> index = of_property_match_string(np, "mux-control-names", >>> mux_name); >>> so I think iwe need to keep it, agreed? >> >> If mux_name is NULL, index defaults to 0, i.e. the first (and presumably >> only) mux control is grabbed from the mux-controls list. >> >> So, you should be able to call mux_control_get_optional with a NULL mux_name argument for this to work. But please try it... >> >> Cheers, >> Peter > > that's correct, my thought is that it would be safer to explicitly call the mux_control_get_optional function with a mux name, just for the case of multiple muxes. > Thanks. > For example another mux to switch off vBUS. > Yossi Right. Rob, how do you propose to handle the future where a second mux with a different function is needed? Specifically, everything I come up with introduces some ugly compatibility crap in the future code to handle old devicetrees w/o the mux-control-names property. So, how to avoid that? I'm inclined to just requiring a mux-control-names up front to keep the future simple. Cheers, Peter > >> >>>> >>>>> >>>>> i.mx specific properties >>>>> - fsl,usbmisc: phandler of non-core register device, with one @@ >>>>> -102,4 +106,6 @@ Example: >>>>> rx-burst-size-dword = <0x10>; >>>>> extcon = <0>, <&usb_id>; >>>>> phy-clkgate-delay-us = <400>; >>>>> + mux-controls = <&usb_switch>; >>>>> + mux-control-names = "usb_switch"; >>>>> }; >>> _______________________________________________ >>> Dragonboard-aosp mailing list >>> Dragonboard-aosp@lists.96boards.org >>> https://lists.96boards.org/mailman/listinfo/dragonboard-aosp >>> >> >> -- 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
On 2018-03-07 12:30, Peter Rosin wrote: > [finally remembered to switch email for Stephen Boyd] > > On 2018-03-07 10:22, Yossi Mansharoff wrote: >>> On 2018-03-06 16:16, Yossi Mansharoff wrote: >>>>> On Wed, Feb 21, 2018 at 09:44:59AM +0200, Yossi Mansharoff wrote: >>>>>> On the db410c 96boards platform we have a TC7USB40MU on the board >>>>>> to >>>>>> mux the D+/D- lines coming from the controller between a micro usb >>>>>> "device" port and a USB hub for "host" roles[1]. During a role >>>>>> switch, we need to toggle this mux to forward the D+/D- lines to >>>>>> either the port or the hub. Add the necessary code to do the role >>>>>> switch in chipidea core via the generic mux framework. >>>>>> Board configurations like on db410c are expected to change roles >>>>>> via >>>>>> the sysfs API described in >>>>>> Documentation/ABI/testing/sysfs-platform-chipidea-usb2. >>>>>> >>>>>> [1] >>>>>> https://github.com/96boards/documentation/raw/master/ConsumerEdition >>>>>> /DragonBoard-410c/HardwareDocs/Schematics_DragonBoard.pdf >>>>>> >>>>>> Cc: Peter Rosin <peda@axentia.se> >>>>>> Cc: Peter Chen <peter.chen@nxp.com> >>>>>> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >>>>>> Cc: <devicetree@vger.kernel.org> >>>>>> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> >>>>>> >>>>>> Signed-off-by: Yossi Mansharoff <yossim@codeaurora.org> >>>>>> --- >>>>>> Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt | 6 >>>>>> ++++++ >>>>> >>>>> Please make bindings a separate patch. >>>> sure >>>>> >>>>>> drivers/usb/chipidea/Kconfig | 2 ++ >>>>>> drivers/usb/chipidea/core.c | 6 >>>>>> ++++++ >>>>>> drivers/usb/chipidea/host.c | 7 >>>>>> +++++++ >>>>>> drivers/usb/chipidea/udc.c | 13 >>>>>> ++++++++++++- >>>>>> include/linux/usb/chipidea.h | 2 ++ >>>>>> 6 files changed, 35 insertions(+), 1 deletion(-) >>>>>> >>>>>> diff --git >>>>>> a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>>> b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>>> index 0e03344..2e93181 100644 >>>>>> --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>>> +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt >>>>>> @@ -76,6 +76,10 @@ Optional properties: >>>>>> needs to make sure it does not send more than 90% >>>>>> maximum_periodic_data_per_frame. The use case is multiple >>>>>> transactions, but >>>>>> less frame rate. >>>>>> +- mux-controls: The mux control for toggling host/device output >>>>>> of >>>>>> +this >>>>>> + controller. It's expected that a mux state of 0 indicates >>>>>> device >>>>>> +mode and a >>>>>> + mux state of 1 indicates host mode. >>>>>> +- mux-control-names: Shall be "usb_switch" if mux-controls is >>>>>> specified. >>>>> >>>>> -names is pointless when there is only 1. >>>> the names is used to find the attached mux in the dt . >>>> it is used in the following lines in mux/core.c if (mux_name) { >>>> index = of_property_match_string(np, "mux-control-names", >>>> mux_name); >>>> so I think iwe need to keep it, agreed? >>> >>> If mux_name is NULL, index defaults to 0, i.e. the first (and >>> presumably >>> only) mux control is grabbed from the mux-controls list. >>> >>> So, you should be able to call mux_control_get_optional with a NULL >>> mux_name argument for this to work. But please try it... >>> >>> Cheers, >>> Peter >> >> that's correct, my thought is that it would be safer to explicitly >> call the mux_control_get_optional function with a mux name, just for >> the case of multiple muxes. >> Thanks. >> For example another mux to switch off vBUS. >> Yossi > > Right. Rob, how do you propose to handle the future where a second > mux with a different function is needed? Specifically, everything > I come up with introduces some ugly compatibility crap in the future > code to handle old devicetrees w/o the mux-control-names property. > So, how to avoid that? > > I'm inclined to just requiring a mux-control-names up front to keep > the future simple. > > Cheers, > Peter > is it ok to keep the "mux-control-names"? I want to make a new patch set for this, currently, I'm splitting this patch into two (one for bindings and one for chipidea). Thanks, Yossi >> >>> >>>>> >>>>>> >>>>>> i.mx specific properties >>>>>> - fsl,usbmisc: phandler of non-core register device, with one @@ >>>>>> -102,4 +106,6 @@ Example: >>>>>> rx-burst-size-dword = <0x10>; >>>>>> extcon = <0>, <&usb_id>; >>>>>> phy-clkgate-delay-us = <400>; >>>>>> + mux-controls = <&usb_switch>; >>>>>> + mux-control-names = "usb_switch"; >>>>>> }; >>>> _______________________________________________ >>>> Dragonboard-aosp mailing list >>>> Dragonboard-aosp@lists.96boards.org >>>> https://lists.96boards.org/mailman/listinfo/dragonboard-aosp >>>> >>> >>> -- 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
diff --git a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt index 0e03344..2e93181 100644 --- a/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt @@ -76,6 +76,10 @@ Optional properties: needs to make sure it does not send more than 90% maximum_periodic_data_per_frame. The use case is multiple transactions, but less frame rate. +- mux-controls: The mux control for toggling host/device output of this + controller. It's expected that a mux state of 0 indicates device mode and a + mux state of 1 indicates host mode. +- mux-control-names: Shall be "usb_switch" if mux-controls is specified. i.mx specific properties - fsl,usbmisc: phandler of non-core register device, with one @@ -102,4 +106,6 @@ Example: rx-burst-size-dword = <0x10>; extcon = <0>, <&usb_id>; phy-clkgate-delay-us = <400>; + mux-controls = <&usb_switch>; + mux-control-names = "usb_switch"; }; diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig index 51f4157..72aadfa 100644 --- a/drivers/usb/chipidea/Kconfig +++ b/drivers/usb/chipidea/Kconfig @@ -3,6 +3,8 @@ config USB_CHIPIDEA depends on ((USB_EHCI_HCD && USB_GADGET) || (USB_EHCI_HCD && !USB_GADGET) || (!USB_EHCI_HCD && USB_GADGET)) && HAS_DMA select EXTCON select RESET_CONTROLLER + select MULTIPLEXER + select MUX_GPIO help Say Y here if your system has a dual role high speed USB controller based on ChipIdea silicon IP. It supports: diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 43ea5fb..aa71b96 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -64,6 +64,7 @@ #include <linux/of.h> #include <linux/regulator/consumer.h> #include <linux/usb/ehci_def.h> +#include <linux/mux/consumer.h> #include "ci.h" #include "udc.h" @@ -690,6 +691,11 @@ static int ci_get_platdata(struct device *dev, if (of_find_property(dev->of_node, "non-zero-ttctrl-ttha", NULL)) platdata->flags |= CI_HDRC_SET_NON_ZERO_TTHA; + platdata->usb_switch = devm_mux_control_get_optional(dev, "usb_switch"); + if (IS_ERR(platdata->usb_switch)){ + return PTR_ERR(platdata->usb_switch); + } + ext_id = ERR_PTR(-ENODEV); ext_vbus = ERR_PTR(-ENODEV); if (of_property_read_bool(dev->of_node, "extcon")) { diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 18cb8e4..9ef3ecf 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c @@ -25,6 +25,7 @@ #include <linux/usb/hcd.h> #include <linux/usb/chipidea.h> #include <linux/regulator/consumer.h> +#include <linux/mux/consumer.h> #include "../host/ehci.h" @@ -175,6 +176,10 @@ static int host_start(struct ci_hdrc *ci) if (ci_otg_is_fsm_mode(ci)) { otg->host = &hcd->self; hcd->self.otg_port = 1; + } else { + ret = mux_control_select(ci->platdata->usb_switch, 1); + if (ret) + goto disable_reg; } } @@ -195,6 +200,8 @@ static void host_stop(struct ci_hdrc *ci) struct usb_hcd *hcd = ci->hcd; if (hcd) { + if (!ci_otg_is_fsm_mode(ci)) + mux_control_deselect(ci->platdata->usb_switch); if (ci->platdata->notify_event) ci->platdata->notify_event(ci, CI_HDRC_CONTROLLER_STOPPED_EVENT); diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index fe8a905..17f22e2 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -22,6 +22,7 @@ #include <linux/usb/gadget.h> #include <linux/usb/otg-fsm.h> #include <linux/usb/chipidea.h> +#include <linux/mux/consumer.h> #include "ci.h" #include "udc.h" @@ -1964,16 +1965,26 @@ void ci_hdrc_gadget_destroy(struct ci_hdrc *ci) static int udc_id_switch_for_device(struct ci_hdrc *ci) { + int ret = 0; + if (ci->is_otg) /* Clear and enable BSV irq */ hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE, OTGSC_BSVIS | OTGSC_BSVIE); - return 0; + if (!ci_otg_is_fsm_mode(ci)) + ret = mux_control_select(ci->platdata->usb_switch, 0); + + if (ci->is_otg && ret) + hw_write_otgsc(ci, OTGSC_BSVIE | OTGSC_BSVIS, OTGSC_BSVIS); + + return ret; } static void udc_id_switch_for_host(struct ci_hdrc *ci) { + mux_control_deselect(ci->platdata->usb_switch); + /* * host doesn't care B_SESSION_VALID event * so clear and disbale BSV irq diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h index d725cff..7e5d008 100644 --- a/include/linux/usb/chipidea.h +++ b/include/linux/usb/chipidea.h @@ -9,6 +9,7 @@ #include <linux/usb/otg.h> struct ci_hdrc; +struct mux_control; /** * struct ci_hdrc_cable - structure for external connector cable state tracking @@ -75,6 +76,7 @@ struct ci_hdrc_platform_data { /* VBUS and ID signal state tracking, using extcon framework */ struct ci_hdrc_cable vbus_extcon; struct ci_hdrc_cable id_extcon; + struct mux_control *usb_switch; u32 phy_clkgate_delay_us; };