summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/boot/dts/msm8916.dtsi61
-rw-r--r--arch/arm/configs/msm8916-qrd_defconfig4
-rw-r--r--drivers/usb/chipidea/ci_hdrc_msm.c6
-rw-r--r--drivers/usb/phy/phy-msm-usb.c59
4 files changed, 81 insertions, 49 deletions
diff --git a/arch/arm/boot/dts/msm8916.dtsi b/arch/arm/boot/dts/msm8916.dtsi
index 39c50b06dde1..2da31fe709e4 100644
--- a/arch/arm/boot/dts/msm8916.dtsi
+++ b/arch/arm/boot/dts/msm8916.dtsi
@@ -899,45 +899,34 @@
qcom,ipi-ping;
};
- usb_otg: usb@78d9000 {
- compatible = "qcom,usb-otg-snps";
-
- reg = <0x78d9000 0x400>;
- interrupts = <0 134 0>,<0 140 0>;
- interrupt-names = "core_irq", "async_irq";
-
- vddcx-supply = <&pm8916_s1_corner>;
- v1p8-supply = <&pm8916_l7>;
- v3p3-supply = <&pm8916_l13>;
- qcom,vdd-levels = <1 5 7>;
-
- qcom,phy-init-sequence =
+ usb_otg:usb@78 {
+ compatible = "qcom,usb-otg-snps";
+ reg = <0x78d9000 0x400>;
+ interrupts = <0 140 0>;
+ dr_mode = "peripheral";
+ clocks = <&clock_gcc clk_gcc_usb_hs_ahb_clk>,
+ <&clock_gcc clk_gcc_usb_hs_system_clk>,
+ <&clock_gcc clk_gcc_usb2a_phy_sleep_clk>;
+
+ clock-names = "iface", "core", "phy";
+
+ vddcx-supply = <&pm8916_s1_corner>;
+ v1p8-supply = <&pm8916_l7>;
+ v3p3-supply = <&pm8916_l13>;
+ qcom,vdd-levels = <1 5 7>;
+
+ qcom,phy-init-sequence =
<0x44 0x80 0x6B 0x81 0x24 0x82 0x13 0x83 0xffffffff>;
- qcom,otg-phy-type = <2>;
- qcom,otg-mode = <1>;
- qcom,otg-control = <2>;
- qcom,dp-manual-pullup;
-
- qcom,msm-bus,name = "usb2";
- qcom,msm-bus,num-cases = <3>;
- qcom,msm-bus,num-paths = <1>;
- qcom,msm-bus,vectors-KBps =
- <87 512 0 0>,
- <87 512 80000 0>,
- <87 512 6000 6000>;
- clocks = <&clock_gcc clk_gcc_usb_hs_ahb_clk>,
- <&clock_gcc clk_gcc_usb_hs_system_clk>,
- <&clock_gcc clk_gcc_usb2a_phy_sleep_clk>,
- <&clock_rpm clk_bimc_usb_a_clk>,
- <&clock_rpm clk_snoc_usb_a_clk>,
- <&clock_rpm clk_pcnoc_usb_a_clk>,
- <&clock_rpm clk_xo_otg_clk>;
- clock-names = "iface", "core", "phy",
- "bimc_clk", "snoc_clk", "pcnoc_clk",
- "xo";
- qcom,bus-clk-rate = <400000000 200000000 100000000>;
+ qcom,otg-control = <2>; /* controlled by phy */
};
+ gadget0: gadget@78 {
+ compatible = "qcom,ci-hdrc";
+ reg = <0x78d9000 0x400>;
+ dr_mode = "peripheral";
+ interrupts = <0 134 0>;
+ usb-phy = <&usb_otg>;
+ };
};
diff --git a/arch/arm/configs/msm8916-qrd_defconfig b/arch/arm/configs/msm8916-qrd_defconfig
index 77885672956a..b4d679dc3c0e 100644
--- a/arch/arm/configs/msm8916-qrd_defconfig
+++ b/arch/arm/configs/msm8916-qrd_defconfig
@@ -144,7 +144,11 @@ CONFIG_USB=y
CONFIG_USB_OTG=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_MSM=y
+CONFIG_USB_CHIPIDEA=y
+CONFIG_USB_CHIPIDEA_UDC=y
+CONFIG_USB_CHIPIDEA_DEBUG=y
CONFIG_USB_MSM_OTG=y
+CONFIG_USB_ULPI=y
CONFIG_USB_GADGET=y
CONFIG_USB_ETH=y
CONFIG_MMC=y
diff --git a/drivers/usb/chipidea/ci_hdrc_msm.c b/drivers/usb/chipidea/ci_hdrc_msm.c
index d79ecc08a1be..ff4abdd4f96f 100644
--- a/drivers/usb/chipidea/ci_hdrc_msm.c
+++ b/drivers/usb/chipidea/ci_hdrc_msm.c
@@ -15,6 +15,8 @@
#include "ci.h"
+#define DEBUG 1
+
#define MSM_USB_BASE (ci->hw_bank.abs)
static void ci_hdrc_msm_notify_event(struct ci_hdrc *ci, unsigned event)
@@ -64,8 +66,10 @@ static int ci_hdrc_msm_probe(struct platform_device *pdev)
* management.
*/
phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
- if (IS_ERR(phy))
+ if (IS_ERR(phy)) {
+ dev_err(&pdev->dev, "Failed to get usb-phy %d\n", PTR_ERR(phy));
return PTR_ERR(phy);
+ }
ci_hdrc_msm_platdata.usb_phy = phy;
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index 000fd892455f..904f3a0ce650 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -263,13 +263,19 @@ static int msm_otg_link_clk_reset(struct msm_otg *motg, bool assert)
{
int ret;
- if (motg->pdata->link_clk_reset)
+ if (motg->pdata->link_clk_reset) {
ret = motg->pdata->link_clk_reset(motg->clk, assert);
- else if (assert)
+ goto bail;
+ }
+
+ if (!motg->link_rst)
+ return 0;
+
+ if (assert)
ret = reset_control_assert(motg->link_rst);
else
ret = reset_control_deassert(motg->link_rst);
-
+bail:
if (ret)
dev_err(motg->phy.dev, "usb link clk reset %s failed\n",
assert ? "assert" : "deassert");
@@ -281,11 +287,13 @@ static int msm_otg_phy_clk_reset(struct msm_otg *motg)
{
int ret = 0;
- if (motg->pdata->phy_clk_reset)
+ if (motg->pdata->phy_clk_reset) {
ret = motg->pdata->phy_clk_reset(motg->phy_reset_clk);
- else if (motg->phy_rst)
+ goto bail;
+ }
+ if (motg->phy_rst)
ret = reset_control_reset(motg->phy_rst);
-
+bail:
if (ret)
dev_err(motg->phy.dev, "usb phy clk reset failed\n");
@@ -756,6 +764,7 @@ static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
{
struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
struct msm_otg_platform_data *pdata = motg->pdata;
+ int temp;
if (!phy->otg->gadget)
return;
@@ -767,6 +776,32 @@ static void msm_otg_start_peripheral(struct usb_phy *phy, int on)
* to enable/disable internal HUB. Disable internal
* HUB before kicking the gadget.
*/
+
+/* ulpi manual dp registers */
+#define ULPI_MISC_A 0x96
+#define ULPI_MISC_A_VBUSVLDEXT BIT(0)
+#define ULPI_MISC_A_VBUSVLDEXTSEL BIT(1)
+#define GENCFG2_SESS_VLD_CTRL_EN BIT(7)
+#define USBCMD_SESS_VLD_CTRL BIT(25)
+#define USB_GENCONFIG2 (MSM_USB_BASE + 0x00A0)
+
+
+ usb_phy_io_write(phy,
+ ULPI_MISC_A_VBUSVLDEXT |
+ ULPI_MISC_A_VBUSVLDEXTSEL,
+ ULPI_SET(ULPI_MISC_A));
+
+ temp = readl_relaxed(USB_GENCONFIG2);
+ temp |= GENCFG2_SESS_VLD_CTRL_EN;
+ writel_relaxed(temp, USB_GENCONFIG2);
+
+ temp = readl_relaxed(USB_USBCMD);
+ temp |= USBCMD_SESS_VLD_CTRL;
+ writel_relaxed(temp, USB_USBCMD);
+
+ mb();
+
+
if (pdata->setup_gpio)
pdata->setup_gpio(OTG_STATE_B_PERIPHERAL);
usb_gadget_vbus_connect(phy->otg->gadget);
@@ -1463,13 +1498,13 @@ static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg)
id = of_match_device(msm_otg_dt_match, &pdev->dev);
pdata->phy_type = (enum msm_usb_phy_type) id->data;
- motg->link_rst = devm_reset_control_get(&pdev->dev, "link");
- if (IS_ERR(motg->link_rst))
- return PTR_ERR(motg->link_rst);
+// motg->link_rst = devm_reset_control_get(&pdev->dev, "link");
+// if (IS_ERR(motg->link_rst))
+// return PTR_ERR(motg->link_rst);
- motg->phy_rst = devm_reset_control_get(&pdev->dev, "phy");
- if (IS_ERR(motg->phy_rst))
- motg->phy_rst = NULL;
+// motg->phy_rst = devm_reset_control_get(&pdev->dev, "phy");
+// if (IS_ERR(motg->phy_rst))
+// motg->phy_rst = NULL;
pdata->mode = of_usb_get_dr_mode(node);
if (pdata->mode == USB_DR_MODE_UNKNOWN)