Loading Documentation/devicetree/bindings/usb/msm-hsusb.txt +11 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,14 @@ Optional properties : configured for detection of dp line transition during VDD minimization. - qcom,hsusb-otg-mpm-dmsehv-int: If present, indicates mpm interrupt to be configured for detection of dm line transition during VDD minimization. - pinctrl-names : This should be defined if a target uses gpio and pinctrl framework. See "pinctrl" in Documentation/devicetree/bindings/pinctrl/msm-pinctrl.txt. It should specify the names of the configs that pinctrl can install in driver Following are the pinctrl config that can be installed "hsusb_active" : Active configuration of pins, this should specify active config of vddmin gpio (if used) defined in their pin groups. "hsusb_sleep" : Disabled configuration of pins, this should specify sleep config of vddmin gpio (if used) defined in their pin groups. - qcom,hsusb-otg-vddmin-gpio = If present, indicates a gpio that will be used to supply voltage to the D+ line during VDD minimization and peripheral bus suspend. If not exists, then VDD minimization will not be allowed Loading Loading @@ -136,6 +144,9 @@ Example HSUSB OTG controller device node : qcom,msm-bus,vectors = <87 512 0 0>, <87 512 60000000 960000000>; pinctrl-names = "hsusb_active","hsusb_sleep"; pinctrl-0 = <&vddmin_act>; pinctrl-0 = <&vddmin_sus>; qcom,hsusb-otg-vddmin-gpio = <&pm8019_mpps 6 0>; qcom,hsusb-otg-rw-during-lpm-workaround = <1>; qcom,disable-retention-with-vdd-min; Loading drivers/usb/phy/phy-msm-usb.c +40 −24 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/of.h> #include <linux/dma-mapping.h> #include <linux/clk/msm-clk.h> #include <linux/pinctrl/consumer.h> #include <linux/irqchip/msm-mpm-irq.h> #include <soc/qcom/scm.h> Loading Loading @@ -1493,13 +1494,6 @@ static void msm_otg_start_host(struct usb_otg *otg, int on) ulpi_write(otg->phy, OTG_COMP_DISABLE, ULPI_SET(ULPI_PWR_CLK_MNG_REG)); /* * Some boards have a switch cotrolled by gpio * to enable/disable internal HUB. Enable internal * HUB before kicking the host. */ if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_A_HOST); usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); } else { dev_dbg(otg->phy->dev, "host off\n"); Loading @@ -1508,9 +1502,6 @@ static void msm_otg_start_host(struct usb_otg *otg, int on) /* HCD core reset all bits of PORTSC. select ULPI phy */ writel_relaxed(0x80000000, USB_PORTSC); if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_UNDEFINED); if (pdata->otg_control == OTG_PHY_CONTROL) ulpi_write(otg->phy, OTG_COMP_DISABLE, ULPI_CLR(ULPI_PWR_CLK_MNG_REG)); Loading Loading @@ -1701,6 +1692,7 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) { struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy); struct msm_otg_platform_data *pdata = motg->pdata; struct pinctrl_state *set_state; int ret; if (!otg->gadget) Loading @@ -1708,13 +1700,6 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) if (on) { dev_dbg(otg->phy->dev, "gadget on\n"); /* * Some boards have a switch cotrolled by gpio * to enable/disable internal HUB. Disable internal * HUB before kicking the gadget. */ if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_B_PERIPHERAL); /* Configure BUS performance parameters for MAX bandwidth */ if (debug_bus_voting_enabled) Loading @@ -1727,26 +1712,45 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) * minimazation during peripheral bus suspend. */ if (pdata->vddmin_gpio) { if (motg->phy_pinctrl) { set_state = pinctrl_lookup_state(motg->phy_pinctrl, "hsusb_active"); if (IS_ERR(set_state)) { pr_err("cannot get phy pinctrl active state\n"); return; } pinctrl_select_state(motg->phy_pinctrl, set_state); } ret = gpio_request(pdata->vddmin_gpio, "MSM_OTG_VDD_MIN_GPIO"); if (ret < 0) { dev_err(otg->phy->dev, "gpio req failed for vdd min:%d\n", dev_err(otg->phy->dev, "gpio req failed for vdd min:%d\n", ret); pdata->vddmin_gpio = 0; } } } else { dev_dbg(otg->phy->dev, "gadget off\n"); usb_gadget_vbus_disconnect(otg->gadget); /* Configure BUS performance parameters to default */ msm_otg_bus_vote(motg, USB_MIN_PERF_VOTE); if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_UNDEFINED); if (pdata->vddmin_gpio) if (pdata->vddmin_gpio) { gpio_free(pdata->vddmin_gpio); if (motg->phy_pinctrl) { set_state = pinctrl_lookup_state(motg->phy_pinctrl, "hsusb_sleep"); if (IS_ERR(set_state)) pr_err("cannot get phy pinctrl sleep state\n"); else pinctrl_select_state(motg->phy_pinctrl, set_state); } } } } Loading Loading @@ -4648,6 +4652,18 @@ static int msm_otg_probe(struct platform_device *pdev) goto free_hsusb_vdd; } /* Get pinctrl if target uses pinctrl */ motg->phy_pinctrl = devm_pinctrl_get(&pdev->dev); if (IS_ERR(motg->phy_pinctrl)) { if (of_property_read_bool(pdev->dev.of_node, "pinctrl-names")) { dev_err(&pdev->dev, "Error encountered while getting pinctrl"); ret = PTR_ERR(motg->phy_pinctrl); goto free_ldo_init; } dev_dbg(&pdev->dev, "Target does not use pinctrl\n"); motg->phy_pinctrl = NULL; } if (pdata->mhl_enable) { mhl_usb_hs_switch = devm_regulator_get(motg->phy.dev, "mhl_usb_hs_switch"); Loading include/linux/usb/msm_hsusb.h +1 −1 Original line number Diff line number Diff line Loading @@ -249,7 +249,6 @@ struct msm_otg_platform_data { enum otg_control_type otg_control; enum usb_mode_type default_mode; enum msm_usb_phy_type phy_type; void (*setup_gpio)(enum usb_otg_state state); int pmic_id_irq; unsigned int mpm_otgsessvld_int; unsigned int mpm_dpshv_int; Loading Loading @@ -477,6 +476,7 @@ struct msm_otg { bool ext_chg_opened; bool ext_chg_active; struct completion ext_chg_wait; struct pinctrl *phy_pinctrl; int ui_enabled; bool pm_done; struct qpnp_vadc_chip *vadc_dev; Loading Loading
Documentation/devicetree/bindings/usb/msm-hsusb.txt +11 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,14 @@ Optional properties : configured for detection of dp line transition during VDD minimization. - qcom,hsusb-otg-mpm-dmsehv-int: If present, indicates mpm interrupt to be configured for detection of dm line transition during VDD minimization. - pinctrl-names : This should be defined if a target uses gpio and pinctrl framework. See "pinctrl" in Documentation/devicetree/bindings/pinctrl/msm-pinctrl.txt. It should specify the names of the configs that pinctrl can install in driver Following are the pinctrl config that can be installed "hsusb_active" : Active configuration of pins, this should specify active config of vddmin gpio (if used) defined in their pin groups. "hsusb_sleep" : Disabled configuration of pins, this should specify sleep config of vddmin gpio (if used) defined in their pin groups. - qcom,hsusb-otg-vddmin-gpio = If present, indicates a gpio that will be used to supply voltage to the D+ line during VDD minimization and peripheral bus suspend. If not exists, then VDD minimization will not be allowed Loading Loading @@ -136,6 +144,9 @@ Example HSUSB OTG controller device node : qcom,msm-bus,vectors = <87 512 0 0>, <87 512 60000000 960000000>; pinctrl-names = "hsusb_active","hsusb_sleep"; pinctrl-0 = <&vddmin_act>; pinctrl-0 = <&vddmin_sus>; qcom,hsusb-otg-vddmin-gpio = <&pm8019_mpps 6 0>; qcom,hsusb-otg-rw-during-lpm-workaround = <1>; qcom,disable-retention-with-vdd-min; Loading
drivers/usb/phy/phy-msm-usb.c +40 −24 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <linux/of.h> #include <linux/dma-mapping.h> #include <linux/clk/msm-clk.h> #include <linux/pinctrl/consumer.h> #include <linux/irqchip/msm-mpm-irq.h> #include <soc/qcom/scm.h> Loading Loading @@ -1493,13 +1494,6 @@ static void msm_otg_start_host(struct usb_otg *otg, int on) ulpi_write(otg->phy, OTG_COMP_DISABLE, ULPI_SET(ULPI_PWR_CLK_MNG_REG)); /* * Some boards have a switch cotrolled by gpio * to enable/disable internal HUB. Enable internal * HUB before kicking the host. */ if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_A_HOST); usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); } else { dev_dbg(otg->phy->dev, "host off\n"); Loading @@ -1508,9 +1502,6 @@ static void msm_otg_start_host(struct usb_otg *otg, int on) /* HCD core reset all bits of PORTSC. select ULPI phy */ writel_relaxed(0x80000000, USB_PORTSC); if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_UNDEFINED); if (pdata->otg_control == OTG_PHY_CONTROL) ulpi_write(otg->phy, OTG_COMP_DISABLE, ULPI_CLR(ULPI_PWR_CLK_MNG_REG)); Loading Loading @@ -1701,6 +1692,7 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) { struct msm_otg *motg = container_of(otg->phy, struct msm_otg, phy); struct msm_otg_platform_data *pdata = motg->pdata; struct pinctrl_state *set_state; int ret; if (!otg->gadget) Loading @@ -1708,13 +1700,6 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) if (on) { dev_dbg(otg->phy->dev, "gadget on\n"); /* * Some boards have a switch cotrolled by gpio * to enable/disable internal HUB. Disable internal * HUB before kicking the gadget. */ if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_B_PERIPHERAL); /* Configure BUS performance parameters for MAX bandwidth */ if (debug_bus_voting_enabled) Loading @@ -1727,26 +1712,45 @@ static void msm_otg_start_peripheral(struct usb_otg *otg, int on) * minimazation during peripheral bus suspend. */ if (pdata->vddmin_gpio) { if (motg->phy_pinctrl) { set_state = pinctrl_lookup_state(motg->phy_pinctrl, "hsusb_active"); if (IS_ERR(set_state)) { pr_err("cannot get phy pinctrl active state\n"); return; } pinctrl_select_state(motg->phy_pinctrl, set_state); } ret = gpio_request(pdata->vddmin_gpio, "MSM_OTG_VDD_MIN_GPIO"); if (ret < 0) { dev_err(otg->phy->dev, "gpio req failed for vdd min:%d\n", dev_err(otg->phy->dev, "gpio req failed for vdd min:%d\n", ret); pdata->vddmin_gpio = 0; } } } else { dev_dbg(otg->phy->dev, "gadget off\n"); usb_gadget_vbus_disconnect(otg->gadget); /* Configure BUS performance parameters to default */ msm_otg_bus_vote(motg, USB_MIN_PERF_VOTE); if (pdata->setup_gpio) pdata->setup_gpio(OTG_STATE_UNDEFINED); if (pdata->vddmin_gpio) if (pdata->vddmin_gpio) { gpio_free(pdata->vddmin_gpio); if (motg->phy_pinctrl) { set_state = pinctrl_lookup_state(motg->phy_pinctrl, "hsusb_sleep"); if (IS_ERR(set_state)) pr_err("cannot get phy pinctrl sleep state\n"); else pinctrl_select_state(motg->phy_pinctrl, set_state); } } } } Loading Loading @@ -4648,6 +4652,18 @@ static int msm_otg_probe(struct platform_device *pdev) goto free_hsusb_vdd; } /* Get pinctrl if target uses pinctrl */ motg->phy_pinctrl = devm_pinctrl_get(&pdev->dev); if (IS_ERR(motg->phy_pinctrl)) { if (of_property_read_bool(pdev->dev.of_node, "pinctrl-names")) { dev_err(&pdev->dev, "Error encountered while getting pinctrl"); ret = PTR_ERR(motg->phy_pinctrl); goto free_ldo_init; } dev_dbg(&pdev->dev, "Target does not use pinctrl\n"); motg->phy_pinctrl = NULL; } if (pdata->mhl_enable) { mhl_usb_hs_switch = devm_regulator_get(motg->phy.dev, "mhl_usb_hs_switch"); Loading
include/linux/usb/msm_hsusb.h +1 −1 Original line number Diff line number Diff line Loading @@ -249,7 +249,6 @@ struct msm_otg_platform_data { enum otg_control_type otg_control; enum usb_mode_type default_mode; enum msm_usb_phy_type phy_type; void (*setup_gpio)(enum usb_otg_state state); int pmic_id_irq; unsigned int mpm_otgsessvld_int; unsigned int mpm_dpshv_int; Loading Loading @@ -477,6 +476,7 @@ struct msm_otg { bool ext_chg_opened; bool ext_chg_active; struct completion ext_chg_wait; struct pinctrl *phy_pinctrl; int ui_enabled; bool pm_done; struct qpnp_vadc_chip *vadc_dev; Loading