From 670949a431c6cb12fc8477932802ede0c7a52d26 Mon Sep 17 00:00:00 2001 From: Jack Pham Date: Mon, 11 Nov 2019 11:04:16 -0800 Subject: [PATCH 1/3] usb: dwc3: Suppress error message about optional clks Since the glue layer might already be handling the clocks for the entire block, it is not always required for the core driver to handle them. Use the _optional variant of devm_clk_bulk_get() in order to suppress the error about failing to get the clock. Change-Id: I254f476d2eb81db50c709d8c9f132dc95194ae46 Signed-off-by: Jack Pham --- drivers/usb/dwc3/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 50a2c406df10..6e2b0de602a8 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1557,7 +1557,7 @@ static int dwc3_probe(struct platform_device *pdev) if (dev->of_node) { dwc->num_clks = ARRAY_SIZE(dwc3_core_clks); - ret = devm_clk_bulk_get(dev, dwc->num_clks, dwc->clks); + ret = devm_clk_bulk_get_optional(dev, dwc->num_clks, dwc->clks); if (ret == -EPROBE_DEFER) goto err0; /* From 4fc3a6ae00b329e7d226d37b5ddd3233187b39eb Mon Sep 17 00:00:00 2001 From: Jack Pham Date: Mon, 18 Nov 2019 16:12:27 -0800 Subject: [PATCH 2/3] usb: dwc3-msm: Fix invalid usb_psy access during remove The "qcom,usb-charger" property is optional and hence may result in the usb_psy pointer being initialized to a negative ERR_PTR value. This leads to invalid pointer access in dwc3_msm_remove() when calling power_supply_put() on it. Fix this by switching to the managed variant of devm_power_supply_get_by_phandle() which allows us to simply remove the power_supply_put() call. Change-Id: I4fd1e46fd410fe143b1e499da1e9cf91dd53dd66 Signed-off-by: Jack Pham --- drivers/usb/dwc3/dwc3-msm.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 772482129149..550ad95cc71c 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -4115,9 +4115,6 @@ static int dwc3_msm_remove(struct platform_device *pdev) mdwc->dpdm_nb.notifier_call = NULL; } - if (mdwc->usb_psy) - power_supply_put(mdwc->usb_psy); - /* * In case of system suspend, pm_runtime_get_sync fails. * Hence turn ON the clocks manually. @@ -4527,7 +4524,7 @@ static int dwc3_msm_gadget_vbus_draw(struct dwc3_msm *mdwc, unsigned int mA) int ret; if (!mdwc->usb_psy) { - mdwc->usb_psy = power_supply_get_by_phandle(mdwc->dev->of_node, + mdwc->usb_psy = devm_power_supply_get_by_phandle(mdwc->dev, "qcom,usb-charger"); if (IS_ERR_OR_NULL(mdwc->usb_psy)) { dev_info(mdwc->dev, "Could not get usb psy\n"); From c6822904f906d3a43d229090a9d91c870d3f997e Mon Sep 17 00:00:00 2001 From: Jack Pham Date: Mon, 18 Nov 2019 18:30:36 -0800 Subject: [PATCH 3/3] usb: dwc3-msm: Fix usage of find_matching_dbm_ep() Since there is no longer an endless flag in struct usb_ep, we simply allow some DBM specific functions to be called unconditionally, expecting find_matching_dbm_ep() to succeed only if it was set up to be a DBM endpoint. Thus in non-DBM cases it is expected to return -ENODEV, which we can just return directly and fail silently without an error message. Change-Id: Idc3d2fc5c00f8149baec4c17872b99c3bd96665b Signed-off-by: Jack Pham --- drivers/usb/dwc3/dwc3-msm.c | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 550ad95cc71c..ae3acf280756 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -706,11 +706,8 @@ static int dwc3_msm_dbm_disable_updxfer(struct dwc3 *dwc, u8 usb_ep) dev_dbg(mdwc->dev, "%s\n", __func__); dbm_ep = find_matching_dbm_ep(mdwc, usb_ep); - - if (dbm_ep < 0) { - pr_err("usb ep index %d has no corresponding dbm ep\n", usb_ep); - return -ENODEV; - } + if (dbm_ep < 0) + return dbm_ep; data = msm_dbm_read_reg(mdwc, DBM_DISABLE_UPDXFER); data |= (0x1 << dbm_ep); @@ -871,11 +868,8 @@ int msm_dwc3_reset_dbm_ep(struct usb_ep *ep) int dbm_ep; dbm_ep = find_matching_dbm_ep(mdwc, dep->number); - - if (dbm_ep >= mdwc->dbm_num_eps) { - pr_err("Invalid DBM ep index %d\n", dbm_ep); - return -ENODEV; - } + if (dbm_ep < 0) + return dbm_ep; dev_dbg(mdwc->dev, "Resetting endpoint %d, DBM ep %d\n", dep->number, dbm_ep); @@ -1820,11 +1814,8 @@ static int dbm_ep_config(struct dwc3_msm *mdwc, u8 usb_ep, u8 bam_pipe, dev_dbg(mdwc->dev, "Configuring DBM ep\n"); dbm_ep = find_matching_dbm_ep(mdwc, usb_ep); - - if (dbm_ep < 0) { - pr_err("usb ep index %d has no corresponding dbm ep\n", usb_ep); - return -ENODEV; - } + if (dbm_ep < 0) + return dbm_ep; /* Due to HW issue, EP 7 can be set as IN EP only */ if (!mdwc->dbm_is_1p4 && dbm_ep == 7 && producer) { @@ -1987,12 +1978,8 @@ static int dbm_ep_unconfig(struct dwc3_msm *mdwc, u8 usb_ep) dev_dbg(mdwc->dev, "Unconfiguring DB ep\n"); dbm_ep = find_matching_dbm_ep(mdwc, usb_ep); - - if (dbm_ep < 0) { - dev_info(mdwc->dev, "usb ep index %d has no corespondng dbm ep\n", - usb_ep); - return -ENODEV; - } + if (dbm_ep < 0) + return dbm_ep; mdwc->dbm_ep_num_mapping[dbm_ep] = 0;