usb: chipidea: imx: add HSIC support
Subsystems (4)
v4 cover usb: chipidea: imx: add HSIC support
Most of NXP (Freescale) i.mx USB part has HSIC support, in this series, we add support for them, it should cover all imx6 and imx7d SoC.
Changes for v4:
- Some code style improvements [Patch 3/4]
- Add HSIC example at dts [Patch 4/4]
Changes for v3:
- Delete the internal API ci_ehci_override_wakeup_flag, and just use register read/write APIs. [Patch 1/4, 3/4]
- Using dedicated API usbmisc_imx6_hsic_get_reg_offset to calculate offset for HSIC controller. [Patch 2/4]
- Improve the comments for binding-doc, and add the dts example [Patch 4/4]
Changes for v2:
- Compile error reported by kbuild robot [Patch 2/4]
- Comment from Frieder Schrempf about code structure [Patch 2/4]
- Comment from Fabio about adding example for pinctrl [Patch 4/4]
Peter Chen (4):
usb: chipidea: add flag for imx hsic implementation
usb: chipidea: imx: add HSIC support
usb: chipidea: host: override ehci->hub_control
doc: usb: ci-hdrc-usb2: Add pinctrl properties for HSIC pin groups
.../devicetree/bindings/usb/ci-hdrc-usb2.txt | 34 ++++- drivers/usb/chipidea/ci_hdrc_imx.c | 140 ++++++++++++++++++--- drivers/usb/chipidea/ci_hdrc_imx.h | 9 +- drivers/usb/chipidea/host.c | 92 ++++++++++++++ drivers/usb/chipidea/usbmisc_imx.c | 140 +++++++++++++++++++++ include/linux/usb/chipidea.h | 3 + 6 files changed, 398 insertions(+), 20 deletions(-)
Signature · 1 line
2.14.1
PATCH v4 1/4 usb: chipidea: add flag for imx hsic implementation
NXP (Freecale) imx HSIC design has some special requirements, add some flags at host code to handle them.
--- drivers/usb/chipidea/host.c | 17 +++++++++++++++++ include/linux/usb/chipidea.h | 3 +++ 2 files changed, 20 insertions(+)
drivers/usb/chipidea/host.c +17 -0
@@ -170,6 +170,11 @@ static int host_start(struct ci_hdrc *ci) otg->host = &hcd->self; hcd->self.otg_port =1 ; } + +if (ci->platdata->notify_event && + (ci->platdata->flags &CI_HDRC_IMX_IS_HSIC )) + ci->platdata->notify_event + (ci,CI_HDRC_IMX_HSIC_ACTIVE_EVENT ); }return ret;
@@ -218,6 +223,8 @@ void ci_hdrc_host_destroy(struct ci_hdrc *ci)static int ci_ehci_bus_suspend (struct usb_hcd *hcd) {struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct device *dev = hcd->self.controller; +struct ci_hdrc *ci =dev_get_drvdata (dev);int port;u32 tmp;
@@ -249,6 +256,16 @@ static int ci_ehci_bus_suspend(struct usb_hcd *hcd)* It needs a short delay between set RS bit and PHCD. */ usleep_range (150 ,200 ); +/* +* Need to clear WKCN and WKOC for imx HSIC, +* otherwise, there will be wakeup event. +*/ +if (ci->platdata->flags &CI_HDRC_IMX_IS_HSIC ) { + tmp =ehci_readl (ehci, reg); + tmp &= ~(PORT_WKDISC_E |PORT_WKCONN_E ); +ehci_writel (ehci, tmp, reg); + } +break ; } }
include/linux/usb/chipidea.h +3 -0
@@ -60,9 +60,12 @@ struct ci_hdrc_platform_data {#define CI_HDRC_OVERRIDE_RX_BURST BIT(11)#define CI_HDRC_OVERRIDE_PHY_CONTROL BIT(12)/* Glue layer manages phy */ #define CI_HDRC_REQUIRES_ALIGNED_DMA BIT(13) +#define CI_HDRC_IMX_IS_HSIC BIT(14)enum usb_dr_mode dr_mode;#define CI_HDRC_CONTROLLER_RESET_EVENT 0#define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 +#define CI_HDRC_IMX_HSIC_ACTIVE_EVENT 2 +#define CI_HDRC_IMX_HSIC_SUSPEND_EVENT 3int (*notify_event) (struct ci_hdrc *ci,unsigned event);struct regulator *reg_vbus;struct usb_otg_caps ci_otg_caps;
PATCH v4 2/4 usb: chipidea: imx: add HSIC support
In reply to Peter ChenTo support imx HSIC, there are some special requirement:
- The HSIC pad is 1.2v, it may need to supply from external
- The data/strobe pin needs to be pulled down first, and after host mode is initialized, the strobe pin needs to be pulled up
- During the USB suspend/resume, special setting is needed
--- drivers/usb/chipidea/ci_hdrc_imx.c | 140 ++++++++++++++++++++++++++++++++----- drivers/usb/chipidea/ci_hdrc_imx.h | 9 ++- drivers/usb/chipidea/usbmisc_imx.c | 140 +++++++++++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+), 19 deletions(-)
drivers/usb/chipidea/ci_hdrc_imx.c +124 -16
@@ -14,6 +14,7 @@#include <linux/usb/chipidea.h> #include <linux/usb/of.h> #include <linux/clk.h> +#include <linux/pinctrl/consumer.h> #include "ci.h" #include "ci_hdrc_imx.h"
@@ -85,6 +86,9 @@ struct ci_hdrc_imx_data {bool supports_runtime_pm;bool override_phy_control;bool in_lpm; +struct pinctrl *pinctrl; +struct pinctrl_state *pinctrl_hsic_active; +struct regulator *hsic_pad_regulator;/* SoC before i.mx6 (except imx23/imx28) needs three clks */ bool need_three_clks;struct clk *clk_ipg;
@@ -245,19 +249,49 @@ static void imx_disable_unprepare_clks(struct device *dev) } } +static int ci_hdrc_imx_notify_event (struct ci_hdrc *ci,unsigned int event) +{ +struct device *dev = ci->dev->parent; +struct ci_hdrc_imx_data *data =dev_get_drvdata (dev); +int ret =0 ; + +switch (event) { +case CI_HDRC_IMX_HSIC_ACTIVE_EVENT : + ret =pinctrl_select_state (data->pinctrl, + data->pinctrl_hsic_active); +if (ret) +dev_err (dev,"hsic_active select failed, err=%d\n" , + ret); +break ; +case CI_HDRC_IMX_HSIC_SUSPEND_EVENT : + ret =imx_usbmisc_hsic_set_connect (data->usbmisc_data); +if (ret) +dev_err (dev, +"hsic_set_connect failed, err=%d\n" , ret); +break ; +default : +break ; + } + +return ret; +} +static int ci_hdrc_imx_probe (struct platform_device *pdev) {struct ci_hdrc_imx_data *data;struct ci_hdrc_platform_data pdata = { .name =dev_name (&pdev->dev), .capoffset =DEF_CAPOFFSET , + .notify_event = ci_hdrc_imx_notify_event, };int ret;const struct of_device_id *of_id;const struct ci_hdrc_imx_platform_flag *imx_platform_flag;struct device_node *np = pdev->dev.of_node; +struct device *dev = &pdev->dev; +struct pinctrl_state *pinctrl_hsic_idle; - of_id =of_match_device (ci_hdrc_imx_dt_ids, &pdev->dev); + of_id =of_match_device (ci_hdrc_imx_dt_ids, dev);if (!of_id)return -ENODEV ;
@@ -268,19 +302,73 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)return -ENOMEM ;platform_set_drvdata (pdev, data); - data->usbmisc_data =usbmisc_get_init_data (&pdev->dev); + data->usbmisc_data =usbmisc_get_init_data (dev);if (IS_ERR (data->usbmisc_data))return PTR_ERR (data->usbmisc_data); - ret =imx_get_clks (&pdev->dev); +if (of_usb_get_phy_mode (dev->of_node) ==USBPHY_INTERFACE_MODE_HSIC ) { + pdata.flags |=CI_HDRC_IMX_IS_HSIC ; + data->usbmisc_data->hsic =1 ; + data->pinctrl =devm_pinctrl_get (dev); +if (IS_ERR (data->pinctrl)) { +dev_err (dev,"pinctrl get failed, err=%ld\n" , +PTR_ERR (data->pinctrl)); +return PTR_ERR (data->pinctrl); + } + + pinctrl_hsic_idle =pinctrl_lookup_state (data->pinctrl,"idle" ); +if (IS_ERR (pinctrl_hsic_idle)) { +dev_err (dev, +"pinctrl_hsic_idle lookup failed, err=%ld\n" , +PTR_ERR (pinctrl_hsic_idle)); +return PTR_ERR (pinctrl_hsic_idle); + } + + ret =pinctrl_select_state (data->pinctrl, pinctrl_hsic_idle); +if (ret) { +dev_err (dev,"hsic_idle select failed, err=%d\n" , ret); +return ret; + } + + data->pinctrl_hsic_active =pinctrl_lookup_state (data->pinctrl, +"active" ); +if (IS_ERR (data->pinctrl_hsic_active)) { +dev_err (dev, +"pinctrl_hsic_active lookup failed, err=%ld\n" , +PTR_ERR (data->pinctrl_hsic_active)); +return PTR_ERR (data->pinctrl_hsic_active); + } + + data->hsic_pad_regulator =devm_regulator_get (dev,"hsic" ); +if (PTR_ERR (data->hsic_pad_regulator) == -EPROBE_DEFER ) { +return -EPROBE_DEFER ; + }else if (PTR_ERR (data->hsic_pad_regulator) == -ENODEV ) { +/* no pad regualator is needed */ + data->hsic_pad_regulator =NULL ; + }else if (IS_ERR (data->hsic_pad_regulator)) { +dev_err (dev,"Get HSIC pad regulator error: %ld\n" , +PTR_ERR (data->hsic_pad_regulator)); +return PTR_ERR (data->hsic_pad_regulator); + } + +if (data->hsic_pad_regulator) { + ret =regulator_enable (data->hsic_pad_regulator); +if (ret) { +dev_err (dev, +"Failed to enable HSIC pad regulator\n" ); +return ret; + } + } + } + ret =imx_get_clks (dev);if (ret) -return ret; + goto disable_hsic_regulator; - ret =imx_prepare_enable_clks (&pdev->dev); + ret =imx_prepare_enable_clks (dev);if (ret) -return ret; + goto disable_hsic_regulator; - data->phy =devm_usb_get_phy_by_phandle (&pdev->dev,"fsl,usbphy" ,0 ); + data->phy =devm_usb_get_phy_by_phandle (dev,"fsl,usbphy" ,0 );if (IS_ERR (data->phy)) { ret =PTR_ERR (data->phy);/* Return -EINVAL if no usbphy is available */
@@ -305,40 +393,43 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) ret =imx_usbmisc_init (data->usbmisc_data);if (ret) { -dev_err (&pdev->dev,"usbmisc init failed, ret=%d\n" , ret); +dev_err (dev,"usbmisc init failed, ret=%d\n" , ret); goto err_clk; } - data->ci_pdev =ci_hdrc_add_device (&pdev->dev, + data->ci_pdev =ci_hdrc_add_device (dev, pdev->resource, pdev->num_resources, &pdata);if (IS_ERR (data->ci_pdev)) { ret =PTR_ERR (data->ci_pdev);if (ret != -EPROBE_DEFER ) -dev_err (&pdev->dev, -"ci_hdrc_add_device failed, err=%d\n" , ret); +dev_err (dev,"ci_hdrc_add_device failed, err=%d\n" , + ret); goto err_clk; } ret =imx_usbmisc_init_post (data->usbmisc_data);if (ret) { -dev_err (&pdev->dev,"usbmisc post failed, ret=%d\n" , ret); +dev_err (dev,"usbmisc post failed, ret=%d\n" , ret); goto disable_device; }if (data->supports_runtime_pm) { -pm_runtime_set_active (&pdev->dev); -pm_runtime_enable (&pdev->dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); } -device_set_wakeup_capable (&pdev->dev, true); +device_set_wakeup_capable (dev, true);return 0 ; disable_device:ci_hdrc_remove_device (data->ci_pdev); err_clk: -imx_disable_unprepare_clks (&pdev->dev); +imx_disable_unprepare_clks (dev); +disable_hsic_regulator: +if (data->hsic_pad_regulator) + ret =regulator_disable (data->hsic_pad_regulator);return ret; }
@@ -355,6 +446,8 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev)if (data->override_phy_control)usb_phy_shutdown (data->phy);imx_disable_unprepare_clks (&pdev->dev); +if (data->hsic_pad_regulator) +regulator_disable (data->hsic_pad_regulator);return 0 ; }
@@ -367,9 +460,16 @@ static void ci_hdrc_imx_shutdown(struct platform_device *pdev)static int __maybe_unused imx_controller_suspend (struct device *dev) {struct ci_hdrc_imx_data *data =dev_get_drvdata (dev); +int ret =0 ;dev_dbg (dev,"at %s\n" , __func__); + ret =imx_usbmisc_hsic_set_clk (data->usbmisc_data, false); +if (ret) { +dev_err (dev,"usbmisc hsic_set_clk failed, ret=%d\n" , ret); +return ret; + } +imx_disable_unprepare_clks (dev); data->in_lpm = true;
@@ -400,8 +500,16 @@ static int __maybe_unused imx_controller_resume(struct device *dev) goto clk_disable; } + ret =imx_usbmisc_hsic_set_clk (data->usbmisc_data, true); +if (ret) { +dev_err (dev,"usbmisc hsic_set_clk failed, ret=%d\n" , ret); + goto hsic_set_clk_fail; + } +return 0 ; +hsic_set_clk_fail: +imx_usbmisc_set_wakeup (data->usbmisc_data, true); clk_disable:imx_disable_unprepare_clks (dev);return ret;
drivers/usb/chipidea/ci_hdrc_imx.h +6 -3
@@ -14,10 +14,13 @@ struct imx_usbmisc_data { unsigned int oc_polarity:1; /* over current polarity if oc enabled */ unsigned int evdo:1; /* set external vbus divider option */ unsigned int ulpi:1; /* connected to an ULPI phy */ + unsigned int hsic:1; /* HSIC controlller */ }; -int imx_usbmisc_init (struct imx_usbmisc_data *); -int imx_usbmisc_init_post (struct imx_usbmisc_data *); -int imx_usbmisc_set_wakeup (struct imx_usbmisc_data *,bool ); +int imx_usbmisc_init (struct imx_usbmisc_data *data); +int imx_usbmisc_init_post (struct imx_usbmisc_data *data); +int imx_usbmisc_set_wakeup (struct imx_usbmisc_data *data,bool enabled); +int imx_usbmisc_hsic_set_connect (struct imx_usbmisc_data *data); +int imx_usbmisc_hsic_set_clk (struct imx_usbmisc_data *data,bool on);#endif /* __DRIVER_USB_CHIPIDEA_CI_HDRC_IMX_H */
drivers/usb/chipidea/usbmisc_imx.c +140 -0
198 lines not on this page · raw message
PATCH v4 3/4 usb: chipidea: host: override ehci->hub_control
In reply to Peter ChenThe chipidea controller has some special requirements during suspend/resume, override common ehci->hub_control to implement it.
--- drivers/usb/chipidea/host.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+)
drivers/usb/chipidea/host.c +75 -0
@@ -220,6 +220,80 @@ void ci_hdrc_host_destroy(struct ci_hdrc *ci)host_stop (ci); } +/* The below code is based on tegra ehci driver */ +static int ci_ehci_hub_control ( +struct usb_hcd *hcd, +u16 typeReq, +u16 wValue, +u16 wIndex, +char *buf, +u16 wLength +) +{ +struct ehci_hcd *ehci =hcd_to_ehci (hcd); +u32 __iomem *status_reg; +u32 temp; +unsigned long flags; +int retval =0 ; +struct device *dev = hcd->self.controller; +struct ci_hdrc *ci =dev_get_drvdata (dev); + + status_reg = &ehci->regs->port_status[(wIndex &0xff ) -1 ]; + +spin_lock_irqsave (&ehci->lock, flags); + +if (typeReq == SetPortFeature && wValue ==USB_PORT_FEAT_SUSPEND ) { + temp =ehci_readl (ehci, status_reg); +if ((temp &PORT_PE ) ==0 || (temp &PORT_RESET ) !=0 ) { + retval = -EPIPE ; + goto done; + } + + temp &= ~(PORT_RWC_BITS |PORT_WKCONN_E ); + temp |=PORT_WKDISC_E |PORT_WKOC_E ; +ehci_writel (ehci, temp |PORT_SUSPEND , status_reg); + +/* +* If a transaction is in progress, there may be a delay in +* suspending the port. Poll until the port is suspended. +*/ +if (ehci_handshake (ehci, status_reg,PORT_SUSPEND , +PORT_SUSPEND ,5000 )) +ehci_err (ehci,"timeout waiting for SUSPEND\n" ); + +if (ci->platdata->flags &CI_HDRC_IMX_IS_HSIC ) { +if (ci->platdata->notify_event) + ci->platdata->notify_event (ci, +CI_HDRC_IMX_HSIC_SUSPEND_EVENT ); + + temp =ehci_readl (ehci, status_reg); + temp &= ~(PORT_WKDISC_E |PORT_WKCONN_E ); +ehci_writel (ehci, temp, status_reg); + } + +set_bit ((wIndex &0xff ) -1 , &ehci->suspended_ports); + goto done; + } + +/* +* After resume has finished, it needs do some post resume +* operation for some SoCs. +*/ +else if (typeReq == ClearPortFeature && + wValue ==USB_PORT_FEAT_C_SUSPEND ) { +/* Make sure the resume has finished, it should be finished */ +if (ehci_handshake (ehci, status_reg,PORT_RESUME ,0 ,25000 )) +ehci_err (ehci,"timeout waiting for resume\n" ); + } + +spin_unlock_irqrestore (&ehci->lock, flags); + +/* Handle the hub control events here */ +return ehci_hub_control (hcd, typeReq, wValue, wIndex, buf, wLength); +done: +spin_unlock_irqrestore (&ehci->lock, flags); +return retval; +}static int ci_ehci_bus_suspend (struct usb_hcd *hcd) {struct ehci_hcd *ehci =hcd_to_ehci (hcd);
@@ -298,4 +372,5 @@ void ci_hdrc_host_driver_init(void)ehci_init_driver (&ci_ehci_hc_driver, &ehci_ci_overrides); orig_bus_suspend = ci_ehci_hc_driver.bus_suspend; ci_ehci_hc_driver.bus_suspend = ci_ehci_bus_suspend; + ci_ehci_hc_driver.hub_control = ci_ehci_hub_control; }
PATCH v4 4/4 doc: usb: ci-hdrc-usb2: Add pinctrl properties for HSIC pin groups
In reply to Peter ChenFor USB HSIC, the data and strobe pin needs to be pulled down at default, we consider it as "idle" state. When the USB host is ready to be used, the strobe pin needs to be pulled up, we consider it as "active" state.
--- .../devicetree/bindings/usb/ci-hdrc-usb2.txt | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt +33 -1
@@ -80,7 +80,10 @@ Optional properties: 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. -- pinctrl-names: Names for optional pin modes in "default", "host", "device" +- pinctrl-names: Names for optional pin modes in "default", "host", "device". + In case of HSIC-mode, "idle" and "active" pin modes are mandatory. In this + case, the "idle" state needs to pull down the data and strobe pin + and the "active" state needs to pull up the strobe pin. - pinctrl-n: alternate pin modes i.mx specific properties
@@ -110,4 +113,33 @@ Example: phy-clkgate-delay-us = <400>; mux-controls = <&usb_switch>; mux-control-names = "usb_switch"; + pinctrl-names = "idle", "active"; + pinctrl-0 = <&pinctrl_usbh2_1>; + pinctrl-1 = <&pinctrl_usbh2_2>; + }; + +Example for HSIC: + + usb@2184400 { + compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; + reg = <0x02184400 0x200>; + interrupts = <0 41 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clks IMX6QDL_CLK_USBOH3>; + fsl,usbphy = <&usbphynop1>; + fsl,usbmisc = <&usbmisc 2>; + phy_type = "hsic"; + dr_mode = "host"; + ahb-burst-config = <0x0>; + tx-burst-size-dword = <0x10>; + rx-burst-size-dword = <0x10>; + pinctrl-names = "idle", "active"; + pinctrl-0 = <&pinctrl_usbh2_idle>; + pinctrl-1 = <&pinctrl_usbh2_active>; + #address-cells = <1>; + #size-cells = <0>; + + usbnet: smsc@1 { + compatible = "usb424,9730"; + reg = <1>; + }; };
Re: [PATCH v4 4/4] doc: usb: ci-hdrc-usb2: Add pinctrl properties for HSIC pin groups
Hi Peter,
Quoted 27 lines · Peter Chen
For USB HSIC, the data and strobe pin needs to be pulled down at default, we consider it as "idle" state. When the USB host is ready to be used, the strobe pin needs to be pulled up, we consider it as "active" state.
Signed-off-by Peter Chen <[email protected]>--- .../devicetree/bindings/usb/ci-hdrc-usb2.txt | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-)Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt +4
-1@@ -80,7 +80,10 @@ Optional properties: 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. -- pinctrl-names: Names for optional pin modes in "default", "host", "device" +- pinctrl-names: Names for optional pin modes in "default", "host", "device". + In case of HSIC-mode, "idle" and "active" pin modes are mandatory. In this + case, the "idle" state needs to pull down the data and strobe pin + and the "active" state needs to pull up the strobe pin. - pinctrl-n: alternate pin modes i.mx specific properties
Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt Example: · line 119
Quoted 7 lines
Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt +4
-0@@ -110,4 +113,33 @@ Example: phy-clkgate-delay-us = <400>; mux-controls = <&usb_switch>; mux-control-names = "usb_switch"; + pinctrl-names = "idle", "active"; + pinctrl-0 = <&pinctrl_usbh2_1>; + pinctrl-1 = <&pinctrl_usbh2_2>; + };
With a separate example for HSIC, we should probably leave the standard example unchanged (I think that was one of the reasons for adding a separate example).
Regards,
Frieder
Quoted 27 lines
Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt +25
-0+ +Example for HSIC: + + usb@2184400 { + compatible = "fsl,imx6q-usb", "fsl,imx27-usb"; + reg = <0x02184400 0x200>; + interrupts = <0 41 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clks IMX6QDL_CLK_USBOH3>; + fsl,usbphy = <&usbphynop1>; + fsl,usbmisc = <&usbmisc 2>; + phy_type = "hsic"; + dr_mode = "host"; + ahb-burst-config = <0x0>; + tx-burst-size-dword = <0x10>; + rx-burst-size-dword = <0x10>; + pinctrl-names = "idle", "active"; + pinctrl-0 = <&pinctrl_usbh2_idle>; + pinctrl-1 = <&pinctrl_usbh2_active>; + #address-cells = <1>; + #size-cells = <0>; + + usbnet: smsc@1 { + compatible = "usb424,9730"; + reg = <1>; + }; };
Fabio Estevam
reviewerRe: [PATCH v4 4/4] doc: usb: ci-hdrc-usb2: Add pinctrl properties for HSIC pin groups
Quoted 3 lines · Schrempf Frieder
With a separate example for HSIC, we should probably leave the standard example unchanged (I think that was one of the reasons for adding a separate example).
Yes, I agree. That would make the binding doc clearer.
Thanks
RE: [PATCH v4 4/4] doc: usb: ci-hdrc-usb2: Add pinctrl properties for HSIC pin groups
Quoted 11 lines
Quoted 3 lines · Schrempf Frieder
With a separate example for HSIC, we should probably leave the standard example unchanged (I think that was one of the reasons for adding a separate example).
Yes, I agree. That would make the binding doc clearer.
Thanks
My fault, I forgot delete the old changes.
Peter