0125-phy-phy-mtk-tphy-add-set_mode-callback.patch 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. From d42ebed1aa669c5a897ec0aa5e1ede8d9069894a Mon Sep 17 00:00:00 2001
  2. From: Chunfeng Yun <[email protected]>
  3. Date: Thu, 21 Sep 2017 18:31:49 +0800
  4. Subject: [PATCH 125/224] phy: phy-mtk-tphy: add set_mode callback
  5. This is used to force PHY with USB OTG function to enter a specific
  6. mode, and override OTG IDPIN(or IDDIG) signal.
  7. Signed-off-by: Chunfeng Yun <[email protected]>
  8. Signed-off-by: Kishon Vijay Abraham I <[email protected]>
  9. ---
  10. drivers/phy/mediatek/phy-mtk-tphy.c | 39 +++++++++++++++++++++++++++++++++++++
  11. 1 file changed, 39 insertions(+)
  12. --- a/drivers/phy/mediatek/phy-mtk-tphy.c
  13. +++ b/drivers/phy/mediatek/phy-mtk-tphy.c
  14. @@ -96,9 +96,11 @@
  15. #define U3P_U2PHYDTM1 0x06C
  16. #define P2C_RG_UART_EN BIT(16)
  17. +#define P2C_FORCE_IDDIG BIT(9)
  18. #define P2C_RG_VBUSVALID BIT(5)
  19. #define P2C_RG_SESSEND BIT(4)
  20. #define P2C_RG_AVALID BIT(2)
  21. +#define P2C_RG_IDDIG BIT(1)
  22. #define U3P_U3_CHIP_GPIO_CTLD 0x0c
  23. #define P3C_REG_IP_SW_RST BIT(31)
  24. @@ -585,6 +587,31 @@ static void u2_phy_instance_exit(struct
  25. }
  26. }
  27. +static void u2_phy_instance_set_mode(struct mtk_tphy *tphy,
  28. + struct mtk_phy_instance *instance,
  29. + enum phy_mode mode)
  30. +{
  31. + struct u2phy_banks *u2_banks = &instance->u2_banks;
  32. + u32 tmp;
  33. +
  34. + tmp = readl(u2_banks->com + U3P_U2PHYDTM1);
  35. + switch (mode) {
  36. + case PHY_MODE_USB_DEVICE:
  37. + tmp |= P2C_FORCE_IDDIG | P2C_RG_IDDIG;
  38. + break;
  39. + case PHY_MODE_USB_HOST:
  40. + tmp |= P2C_FORCE_IDDIG;
  41. + tmp &= ~P2C_RG_IDDIG;
  42. + break;
  43. + case PHY_MODE_USB_OTG:
  44. + tmp &= ~(P2C_FORCE_IDDIG | P2C_RG_IDDIG);
  45. + break;
  46. + default:
  47. + return;
  48. + }
  49. + writel(tmp, u2_banks->com + U3P_U2PHYDTM1);
  50. +}
  51. +
  52. static void pcie_phy_instance_init(struct mtk_tphy *tphy,
  53. struct mtk_phy_instance *instance)
  54. {
  55. @@ -881,6 +908,17 @@ static int mtk_phy_exit(struct phy *phy)
  56. return 0;
  57. }
  58. +static int mtk_phy_set_mode(struct phy *phy, enum phy_mode mode)
  59. +{
  60. + struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  61. + struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  62. +
  63. + if (instance->type == PHY_TYPE_USB2)
  64. + u2_phy_instance_set_mode(tphy, instance, mode);
  65. +
  66. + return 0;
  67. +}
  68. +
  69. static struct phy *mtk_phy_xlate(struct device *dev,
  70. struct of_phandle_args *args)
  71. {
  72. @@ -931,6 +969,7 @@ static const struct phy_ops mtk_tphy_ops
  73. .exit = mtk_phy_exit,
  74. .power_on = mtk_phy_power_on,
  75. .power_off = mtk_phy_power_off,
  76. + .set_mode = mtk_phy_set_mode,
  77. .owner = THIS_MODULE,
  78. };