From 8166e88dfa8e0bf336f32a89b729ba4356f41762 Mon Sep 17 00:00:00 2001 From: Wesley Cheng Date: Thu, 23 Jun 2022 15:10:49 -0700 Subject: [PATCH] usb: dwc3: dwc3-msm-core: Reshuffle DWC3 DTSI node parameter parsing Move OF node parsing for the DWC3 MSM and DWC3 core into its own APIs in an effort to reduce code complexity for the DWC3 MSM probe API. Change-Id: Ibd44dd4252286ee997a3508edff8582a7ecb8b78 Signed-off-by: Wesley Cheng --- drivers/usb/dwc3/dwc3-msm-core.c | 171 +++++++++++++++++-------------- 1 file changed, 93 insertions(+), 78 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-msm-core.c b/drivers/usb/dwc3/dwc3-msm-core.c index 0b6213b68a1b..64b2063920ce 100644 --- a/drivers/usb/dwc3/dwc3-msm-core.c +++ b/drivers/usb/dwc3/dwc3-msm-core.c @@ -5273,6 +5273,7 @@ static int dwc3_msm_core_init(struct dwc3_msm *mdwc) static int dwc3_msm_parse_core_params(struct dwc3_msm *mdwc, struct device_node *dwc3_node) { + struct device_node *phy_node; int ret; const char *prop_string; @@ -5299,16 +5300,101 @@ static int dwc3_msm_parse_core_params(struct dwc3_msm *mdwc, struct device_node disable_irq(mdwc->core_irq); } + phy_node = of_parse_phandle(dwc3_node, "usb-phy", 0); + mdwc->hs_phy = devm_usb_get_phy_by_node(mdwc->dev, phy_node, NULL); + if (IS_ERR(mdwc->hs_phy)) { + dev_err(mdwc->dev, "unable to get hsphy device\n"); + ret = PTR_ERR(mdwc->hs_phy); + return ret; + } + + phy_node = of_parse_phandle(dwc3_node, "usb-phy", 1); + mdwc->ss_phy = devm_usb_get_phy_by_node(mdwc->dev, phy_node, NULL); + if (IS_ERR(mdwc->ss_phy)) { + dev_err(mdwc->dev, "unable to get ssphy device\n"); + ret = PTR_ERR(mdwc->ss_phy); + return ret; + } + return ret; } +static int dwc3_msm_parse_params(struct dwc3_msm *mdwc, struct device_node *node) +{ + struct device *dev = mdwc->dev; + int ret, size = 0, i; + + of_property_read_u32(node, "qcom,num-gsi-evt-buffs", + &mdwc->num_gsi_event_buffers); + + if (mdwc->num_gsi_event_buffers) { + of_get_property(node, "qcom,gsi-reg-offset", &size); + if (size) { + mdwc->gsi_reg = devm_kzalloc(dev, size, GFP_KERNEL); + if (!mdwc->gsi_reg) + return -ENOMEM; + + mdwc->gsi_reg_offset_cnt = + (size / sizeof(*mdwc->gsi_reg)); + if (mdwc->gsi_reg_offset_cnt != GSI_REG_MAX) { + dev_err(dev, "invalid reg offset count\n"); + return -EINVAL; + } + + of_property_read_u32_array(dev->of_node, + "qcom,gsi-reg-offset", mdwc->gsi_reg, + mdwc->gsi_reg_offset_cnt); + } else { + dev_err(dev, "err provide qcom,gsi-reg-offset\n"); + return -EINVAL; + } + } + + mdwc->use_pdc_interrupts = of_property_read_bool(node, + "qcom,use-pdc-interrupts"); + + mdwc->use_eusb2_phy = of_property_read_bool(node, "qcom,use-eusb2-phy"); + mdwc->disable_host_ssphy_powerdown = of_property_read_bool(node, + "qcom,disable-host-ssphy-powerdown"); + + mdwc->dis_sending_cm_l1_quirk = of_property_read_bool(node, + "qcom,dis-sending-cm-l1-quirk"); + + /* use default as nominal bus voting */ + mdwc->default_bus_vote = BUS_VOTE_NOMINAL; + of_property_read_u32(node, "qcom,default-bus-vote", + &mdwc->default_bus_vote); + + if (mdwc->default_bus_vote >= BUS_VOTE_MAX) + mdwc->default_bus_vote = BUS_VOTE_MAX - 1; + else if (mdwc->default_bus_vote < BUS_VOTE_NONE) + mdwc->default_bus_vote = BUS_VOTE_NONE; + + for (i = 0; i < ARRAY_SIZE(mdwc->icc_paths); i++) { + mdwc->icc_paths[i] = of_icc_get(dev, icc_path_names[i]); + if (IS_ERR(mdwc->icc_paths[i])) + mdwc->icc_paths[i] = NULL; + } + + ret = of_property_read_u32(node, "qcom,pm-qos-latency", + &mdwc->pm_qos_latency); + if (ret) { + dev_dbg(dev, "setting pm-qos-latency to zero.\n"); + mdwc->pm_qos_latency = 0; + } + + mdwc->force_gen1 = of_property_read_bool(node, "qcom,force-gen1"); + + return 0; +} + static int dwc3_msm_probe(struct platform_device *pdev) { - struct device_node *node = pdev->dev.of_node, *dwc3_node, *phy_node; + struct device_node *node = pdev->dev.of_node, *dwc3_node; struct device *dev = &pdev->dev; struct dwc3_msm *mdwc; struct resource *res; - int ret = 0, size = 0, i; + int ret = 0, i; u32 val; mdwc = devm_kzalloc(&pdev->dev, sizeof(*mdwc), GFP_KERNEL); @@ -5462,38 +5548,9 @@ static int dwc3_msm_probe(struct platform_device *pdev) } } - ret = of_property_read_u32(node, "qcom,num-gsi-evt-buffs", - &mdwc->num_gsi_event_buffers); - - if (mdwc->num_gsi_event_buffers) { - of_get_property(node, "qcom,gsi-reg-offset", &size); - if (size) { - mdwc->gsi_reg = devm_kzalloc(dev, size, GFP_KERNEL); - if (!mdwc->gsi_reg) - return -ENOMEM; - - mdwc->gsi_reg_offset_cnt = - (size / sizeof(*mdwc->gsi_reg)); - if (mdwc->gsi_reg_offset_cnt != GSI_REG_MAX) { - dev_err(dev, "invalid reg offset count\n"); - return -EINVAL; - } - - of_property_read_u32_array(dev->of_node, - "qcom,gsi-reg-offset", mdwc->gsi_reg, - mdwc->gsi_reg_offset_cnt); - } else { - dev_err(dev, "err provide qcom,gsi-reg-offset\n"); - return -EINVAL; - } - } - - mdwc->use_pdc_interrupts = of_property_read_bool(node, - "qcom,use-pdc-interrupts"); - - mdwc->use_eusb2_phy = of_property_read_bool(node, "qcom,use-eusb2-phy"); - mdwc->disable_host_ssphy_powerdown = of_property_read_bool(node, - "qcom,disable-host-ssphy-powerdown"); + ret = dwc3_msm_parse_params(mdwc, node); + if (ret < 0) + goto err; if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) { dev_err(&pdev->dev, "setting DMA mask to 64 failed.\n"); @@ -5504,9 +5561,6 @@ static int dwc3_msm_probe(struct platform_device *pdev) } } - mdwc->dis_sending_cm_l1_quirk = of_property_read_bool(node, - "qcom,dis-sending-cm-l1-quirk"); - /* Assumes dwc3 is the first DT child of dwc3-msm */ dwc3_node = of_get_next_available_child(node, NULL); if (!dwc3_node) { @@ -5515,39 +5569,9 @@ static int dwc3_msm_probe(struct platform_device *pdev) goto err; } - dwc3_msm_parse_core_params(mdwc, dwc3_node); - - phy_node = of_parse_phandle(dwc3_node, "usb-phy", 0); - mdwc->hs_phy = devm_usb_get_phy_by_node(mdwc->dev, phy_node, NULL); - if (IS_ERR(mdwc->hs_phy)) { - dev_err(mdwc->dev, "unable to get hsphy device\n"); - ret = PTR_ERR(mdwc->hs_phy); + ret = dwc3_msm_parse_core_params(mdwc, dwc3_node); + if (ret < 0) goto err; - } - - phy_node = of_parse_phandle(dwc3_node, "usb-phy", 1); - mdwc->ss_phy = devm_usb_get_phy_by_node(mdwc->dev, phy_node, NULL); - if (IS_ERR(mdwc->ss_phy)) { - dev_err(mdwc->dev, "unable to get ssphy device\n"); - ret = PTR_ERR(mdwc->ss_phy); - goto err; - } - - /* use default as nominal bus voting */ - mdwc->default_bus_vote = BUS_VOTE_NOMINAL; - ret = of_property_read_u32(node, "qcom,default-bus-vote", - &mdwc->default_bus_vote); - - if (mdwc->default_bus_vote >= BUS_VOTE_MAX) - mdwc->default_bus_vote = BUS_VOTE_MAX - 1; - else if (mdwc->default_bus_vote < BUS_VOTE_NONE) - mdwc->default_bus_vote = BUS_VOTE_NONE; - - for (i = 0; i < ARRAY_SIZE(mdwc->icc_paths); i++) { - mdwc->icc_paths[i] = of_icc_get(&pdev->dev, icc_path_names[i]); - if (IS_ERR(mdwc->icc_paths[i])) - mdwc->icc_paths[i] = NULL; - } /* * Clocks and regulators will not be turned on until the first time @@ -5563,18 +5587,9 @@ static int dwc3_msm_probe(struct platform_device *pdev) if (of_property_read_bool(node, "qcom,disable-dev-mode-pm")) pm_runtime_get_noresume(mdwc->dev); - ret = of_property_read_u32(node, "qcom,pm-qos-latency", - &mdwc->pm_qos_latency); - if (ret) { - dev_dbg(&pdev->dev, "setting pm-qos-latency to zero.\n"); - mdwc->pm_qos_latency = 0; - } - mutex_init(&mdwc->suspend_resume_mutex); mutex_init(&mdwc->role_switch_mutex); - mdwc->force_gen1 = of_property_read_bool(node, "qcom,force-gen1"); - if (of_property_read_bool(node, "usb-role-switch")) { struct usb_role_switch_desc role_desc = { .set = dwc3_msm_usb_set_role,