From f210f91a8a109bd8c914eb735d42caf131465d5d Mon Sep 17 00:00:00 2001 From: Yonghua Yan Date: Fri, 12 May 2023 20:04:06 +0800 Subject: [PATCH] Add HS phy init sequence dtsi for Host Add HS phy init sequence for Host mode to support configure the HS phy parameters for Host and Device mode separately from device tree. Change-Id: Ia532d638c6e32377be9c4062f63f0cf227d55d2c Signed-off-by: Yonghua Yan Reviewed-on: https://gerrit.mot.com/2605855 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Guobin Zhang Submit-Approved: Jira Key Reviewed-on: https://gerrit.mot.com/2677516 Reviewed-by: Zonghua Liu Reviewed-by: Yeqing Wang Reviewed-by: Huosheng Liao --- drivers/usb/phy/phy-msm-snps-hs.c | 38 ++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/usb/phy/phy-msm-snps-hs.c b/drivers/usb/phy/phy-msm-snps-hs.c index a7c8d043b56a..8dfbdc702770 100644 --- a/drivers/usb/phy/phy-msm-snps-hs.c +++ b/drivers/usb/phy/phy-msm-snps-hs.c @@ -114,6 +114,9 @@ struct msm_hsphy { int *param_override_seq; int param_override_seq_cnt; + int *host_param_override_seq; + int host_param_override_seq_cnt; + void __iomem *phy_rcal_reg; u32 rcal_mask; @@ -397,9 +400,14 @@ static int msm_hsphy_init(struct usb_phy *uphy) VBUSVLDEXT0, VBUSVLDEXT0); /* set parameter ovrride if needed */ - if (phy->param_override_seq) + if ((phy->phy.flags & PHY_HOST_MODE) && + phy->host_param_override_seq) { + hsusb_phy_write_seq(phy->base, phy->host_param_override_seq, + phy->host_param_override_seq_cnt, 0); + } else if (phy->param_override_seq) { hsusb_phy_write_seq(phy->base, phy->param_override_seq, phy->param_override_seq_cnt, 0); + } if (phy->pre_emphasis) { u8 val = TXPREEMPAMPTUNE0(phy->pre_emphasis) & @@ -823,6 +831,34 @@ static int msm_hsphy_probe(struct platform_device *pdev) if (IS_ERR(phy->phy_reset)) return PTR_ERR(phy->phy_reset); + phy->host_param_override_seq_cnt = of_property_count_elems_of_size( + dev->of_node, + "qcom,host-param-override-seq", + sizeof(*phy->host_param_override_seq)); + if (phy->host_param_override_seq_cnt > 0) { + phy->host_param_override_seq = devm_kcalloc(dev, + phy->host_param_override_seq_cnt, + sizeof(*phy->host_param_override_seq), + GFP_KERNEL); + if (!phy->host_param_override_seq) + return -ENOMEM; + + if (phy->host_param_override_seq_cnt % 2) { + dev_err(dev, "invalid host_param_override_seq_len\n"); + return -EINVAL; + } + + ret = of_property_read_u32_array(dev->of_node, + "qcom,host-param-override-seq", + phy->host_param_override_seq, + phy->host_param_override_seq_cnt); + if (ret) { + dev_err(dev, "qcom,host_param-override-seq read failed %d\n", + ret); + return ret; + } + } + phy->param_override_seq_cnt = of_property_count_elems_of_size( dev->of_node, "qcom,param-override-seq",