Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: phy: msm: Select secondary PHY via TCSR

Select the secondary PHY using the TCSR register, if phy-num=1
in the DTS (or phy_number is set in the platform data). The
SOC has 2 PHYs which can be used with the OTG port, and this
code allows configuring the correct one.

Note: This resolves the problem I was seeing where I couldn't
get the USB driver working at all on a dragonboard, from cold
boot. This patch depends on patch 5/14 from Ivan's msm USB
patch set. It does not use DT for the register address, as
there's no evidence that this address changes between SoC
versions.

Signed-off-by: Tim Bird <tim.bird@sonymobile.com>
Signed-off-by: Ivan T. Ivanov <iivanov@mm-sol.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>

authored by

Tim Bird and committed by
Felipe Balbi
30bf8667 9f27984b

+17
+14
drivers/usb/phy/phy-msm-usb.c
··· 1489 1489 struct resource *res; 1490 1490 struct msm_otg *motg; 1491 1491 struct usb_phy *phy; 1492 + void __iomem *phy_select; 1492 1493 1493 1494 motg = devm_kzalloc(&pdev->dev, sizeof(struct msm_otg), GFP_KERNEL); 1494 1495 if (!motg) { ··· 1553 1552 motg->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res)); 1554 1553 if (IS_ERR(motg->regs)) 1555 1554 return PTR_ERR(motg->regs); 1555 + 1556 + /* 1557 + * NOTE: The PHYs can be multiplexed between the chipidea controller 1558 + * and the dwc3 controller, using a single bit. It is important that 1559 + * the dwc3 driver does not set this bit in an incompatible way. 1560 + */ 1561 + if (motg->phy_number) { 1562 + phy_select = devm_ioremap_nocache(&pdev->dev, USB2_PHY_SEL, 4); 1563 + if (IS_ERR(phy_select)) 1564 + return PTR_ERR(phy_select); 1565 + /* Enable second PHY with the OTG port */ 1566 + writel_relaxed(0x1, phy_select); 1567 + } 1556 1568 1557 1569 dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs); 1558 1570
+3
include/linux/usb/msm_hsusb_hw.h
··· 16 16 #ifndef __LINUX_USB_GADGET_MSM72K_UDC_H__ 17 17 #define __LINUX_USB_GADGET_MSM72K_UDC_H__ 18 18 19 + /* USB phy selector - in TCSR address range */ 20 + #define USB2_PHY_SEL 0xfd4ab000 21 + 19 22 #define USB_AHBBURST (MSM_USB_BASE + 0x0090) 20 23 #define USB_AHBMODE (MSM_USB_BASE + 0x0098) 21 24 #define USB_CAPLENGTH (MSM_USB_BASE + 0x0100) /* 8 bit */