From 78f71dc38bc0ac6aa7a872b2922cf6b789d2ede9 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Wed, 21 Jan 2015 12:21:33 +0800 Subject: usb Signed-off-by: Andy Green --- arch/arm/boot/dts/msm8916.dtsi | 61 ++++++++++++++-------------------- arch/arm/configs/msm8916-qrd_defconfig | 4 +++ drivers/usb/chipidea/ci_hdrc_msm.c | 6 +++- drivers/usb/phy/phy-msm-usb.c | 59 +++++++++++++++++++++++++------- 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) -- cgit v1.2.3