From: Greg Kroah-Hartman Date: Tue, 7 Feb 2023 11:10:28 +0000 (+0100) Subject: 5.15-stable patches X-Git-Tag: v5.15.93~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=358091061af3c739da169c04fe0507d7557b1230;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch phy-qcom-qmp-combo-fix-broken-power-on.patch phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch phy-qcom-qmp-combo-fix-runtime-suspend.patch phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch --- diff --git a/queue-5.15/phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch b/queue-5.15/phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch new file mode 100644 index 00000000000..d0de4b356a2 --- /dev/null +++ b/queue-5.15/phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch @@ -0,0 +1,52 @@ +From stable-owner@vger.kernel.org Fri Feb 3 23:27:27 2023 +From: Stephen Boyd +Date: Fri, 3 Feb 2023 14:26:12 -0800 +Subject: phy: qcom-qmp-combo: disable runtime PM on unbind +To: stable@vger.kernel.org +Cc: Johan Hovold , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov , Vinod Koul +Message-ID: <20230203222616.2935268-2-swboyd@chromium.org> + +From: Johan Hovold + +commit 4382d518d1887e62234560ea08a0203d11d28cc1 upstream. + +Make sure to disable runtime PM also on driver unbind. + +Fixes: ac0d239936bd ("phy: qcom-qmp: Add support for runtime PM"). +Signed-off-by: Johan Hovold +Reviewed-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20220907110728.19092-2-johan+linaro@kernel.org +Signed-off-by: Vinod Koul +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -5740,7 +5740,9 @@ static int qcom_qmp_phy_probe(struct pla + return -ENOMEM; + + pm_runtime_set_active(dev); +- pm_runtime_enable(dev); ++ ret = devm_pm_runtime_enable(dev); ++ if (ret) ++ return ret; + /* + * Prevent runtime pm from being ON by default. Users can enable + * it using power/control in sysfs. +@@ -5790,13 +5792,10 @@ static int qcom_qmp_phy_probe(struct pla + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (!IS_ERR(phy_provider)) + dev_info(dev, "Registered Qcom-QMP phy\n"); +- else +- pm_runtime_disable(dev); + + return PTR_ERR_OR_ZERO(phy_provider); + + err_node_put: +- pm_runtime_disable(dev); + of_node_put(child); + return ret; + } diff --git a/queue-5.15/phy-qcom-qmp-combo-fix-broken-power-on.patch b/queue-5.15/phy-qcom-qmp-combo-fix-broken-power-on.patch new file mode 100644 index 00000000000..bc4062e41f3 --- /dev/null +++ b/queue-5.15/phy-qcom-qmp-combo-fix-broken-power-on.patch @@ -0,0 +1,98 @@ +From stable-owner@vger.kernel.org Fri Feb 3 23:27:28 2023 +From: Stephen Boyd +Date: Fri, 3 Feb 2023 14:26:15 -0800 +Subject: phy: qcom-qmp-combo: fix broken power on +To: stable@vger.kernel.org +Cc: Johan Hovold , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov , Vinod Koul +Message-ID: <20230203222616.2935268-5-swboyd@chromium.org> + +From: Johan Hovold + +commit 7a7d86d14d073dfa3429c550667a8e78b99edbd4 upstream. + +The PHY is powered on during phy-init by setting the SW_PWRDN bit in the +COM_POWER_DOWN_CTRL register and then setting the same bit in the in the +PCS_POWER_DOWN_CONTROL register that belongs to the USB part of the +PHY. + +Currently, whether power on succeeds depends on probe order and having +the USB part of the PHY be initialised first. In case the DP part of the +PHY is instead initialised first, the intended power on of the USB block +results in a corrupted DP_PHY register (e.g. DP_PHY_AUX_CFG8). + +Add a pointer to the USB part of the PHY to the driver data and use that +to power on the PHY also if the DP part of the PHY is initialised first. + +Fixes: 52e013d0bffa ("phy: qcom-qmp: Add support for DP in USB3+DP combo phy") +Cc: stable@vger.kernel.org # 5.10 +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20221114081346.5116-5-johan+linaro@kernel.org +Signed-off-by: Vinod Koul +[swboyd@chromium.org: Backport to pre-split driver, also set usb_phy for +pcie/ufs] +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -2919,6 +2919,7 @@ struct qcom_qmp { + struct regulator_bulk_data *vregs; + + struct qmp_phy **phys; ++ struct qmp_phy *usb_phy; + + struct mutex phy_mutex; + int init_count; +@@ -4554,7 +4555,7 @@ static int qcom_qmp_phy_com_init(struct + struct qcom_qmp *qmp = qphy->qmp; + const struct qmp_phy_cfg *cfg = qphy->cfg; + void __iomem *serdes = qphy->serdes; +- void __iomem *pcs = qphy->pcs; ++ struct qmp_phy *usb_phy = qmp->usb_phy; + void __iomem *dp_com = qmp->dp_com; + int ret, i; + +@@ -4620,13 +4621,13 @@ static int qcom_qmp_phy_com_init(struct + qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL], + SW_PWRDN); + } else { +- if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) +- qphy_setbits(pcs, +- cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], +- cfg->pwrdn_ctrl); ++ if (usb_phy->cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) ++ qphy_setbits(usb_phy->pcs, ++ usb_phy->cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], ++ usb_phy->cfg->pwrdn_ctrl); + else +- qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL, +- cfg->pwrdn_ctrl); ++ qphy_setbits(usb_phy->pcs, QPHY_POWER_DOWN_CONTROL, ++ usb_phy->cfg->pwrdn_ctrl); + } + + mutex_unlock(&qmp->phy_mutex); +@@ -5794,6 +5795,9 @@ static int qcom_qmp_phy_probe(struct pla + goto err_node_put; + } + ++ if (cfg->type != PHY_TYPE_DP) ++ qmp->usb_phy = qmp->phys[id]; ++ + /* + * Register the pipe clock provided by phy. + * See function description to see details of this pipe clock. +@@ -5816,6 +5820,9 @@ static int qcom_qmp_phy_probe(struct pla + id++; + } + ++ if (!qmp->usb_phy) ++ return -EINVAL; ++ + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (!IS_ERR(phy_provider)) + dev_info(dev, "Registered Qcom-QMP phy\n"); diff --git a/queue-5.15/phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch b/queue-5.15/phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch new file mode 100644 index 00000000000..aecc0e3ad3e --- /dev/null +++ b/queue-5.15/phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch @@ -0,0 +1,93 @@ +From stable-owner@vger.kernel.org Fri Feb 3 23:27:29 2023 +From: Stephen Boyd +Date: Fri, 3 Feb 2023 14:26:13 -0800 +Subject: phy: qcom-qmp-combo: fix memleak on probe deferral +To: stable@vger.kernel.org +Cc: Johan Hovold , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Vinod Koul +Message-ID: <20230203222616.2935268-3-swboyd@chromium.org> + +From: Johan Hovold + +commit 2de8a325b1084330ae500380cc27edc39f488c30 upstream. + +Switch to using the device-managed of_iomap helper to avoid leaking +memory on probe deferral and driver unbind. + +Note that this helper checks for already reserved regions and may fail +if there are multiple devices claiming the same memory. + +Fixes: e78f3d15e115 ("phy: qcom-qmp: new qmp phy driver for qcom-chipsets") +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20220916102340.11520-5-johan+linaro@kernel.org +Signed-off-by: Vinod Koul +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp.c | 36 +++++++++++++++++++----------------- + 1 file changed, 19 insertions(+), 17 deletions(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -5410,17 +5410,17 @@ int qcom_qmp_phy_create(struct device *d + * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5 + * For single lane PHYs: pcs_misc (optional) -> 3. + */ +- qphy->tx = of_iomap(np, 0); +- if (!qphy->tx) +- return -ENOMEM; +- +- qphy->rx = of_iomap(np, 1); +- if (!qphy->rx) +- return -ENOMEM; +- +- qphy->pcs = of_iomap(np, 2); +- if (!qphy->pcs) +- return -ENOMEM; ++ qphy->tx = devm_of_iomap(dev, np, 0, NULL); ++ if (IS_ERR(qphy->tx)) ++ return PTR_ERR(qphy->tx); ++ ++ qphy->rx = devm_of_iomap(dev, np, 1, NULL); ++ if (IS_ERR(qphy->rx)) ++ return PTR_ERR(qphy->rx); ++ ++ qphy->pcs = devm_of_iomap(dev, np, 2, NULL); ++ if (IS_ERR(qphy->pcs)) ++ return PTR_ERR(qphy->pcs); + + /* + * If this is a dual-lane PHY, then there should be registers for the +@@ -5429,9 +5429,9 @@ int qcom_qmp_phy_create(struct device *d + * offset from the first lane. + */ + if (cfg->is_dual_lane_phy) { +- qphy->tx2 = of_iomap(np, 3); +- qphy->rx2 = of_iomap(np, 4); +- if (!qphy->tx2 || !qphy->rx2) { ++ qphy->tx2 = devm_of_iomap(dev, np, 3, NULL); ++ qphy->rx2 = devm_of_iomap(dev, np, 4, NULL); ++ if (IS_ERR(qphy->tx2) || IS_ERR(qphy->rx2)) { + dev_warn(dev, + "Underspecified device tree, falling back to legacy register regions\n"); + +@@ -5441,15 +5441,17 @@ int qcom_qmp_phy_create(struct device *d + qphy->rx2 = qphy->rx + QMP_PHY_LEGACY_LANE_STRIDE; + + } else { +- qphy->pcs_misc = of_iomap(np, 5); ++ qphy->pcs_misc = devm_of_iomap(dev, np, 5, NULL); + } + + } else { +- qphy->pcs_misc = of_iomap(np, 3); ++ qphy->pcs_misc = devm_of_iomap(dev, np, 3, NULL); + } + +- if (!qphy->pcs_misc) ++ if (IS_ERR(qphy->pcs_misc)) { + dev_vdbg(dev, "PHY pcs_misc-reg not used\n"); ++ qphy->pcs_misc = NULL; ++ } + + /* + * Get PHY's Pipe clock, if any. USB3 and PCIe are PIPE3 diff --git a/queue-5.15/phy-qcom-qmp-combo-fix-runtime-suspend.patch b/queue-5.15/phy-qcom-qmp-combo-fix-runtime-suspend.patch new file mode 100644 index 00000000000..3c7c5ce5391 --- /dev/null +++ b/queue-5.15/phy-qcom-qmp-combo-fix-runtime-suspend.patch @@ -0,0 +1,53 @@ +From stable-owner@vger.kernel.org Fri Feb 3 23:27:28 2023 +From: Stephen Boyd +Date: Fri, 3 Feb 2023 14:26:16 -0800 +Subject: phy: qcom-qmp-combo: fix runtime suspend +To: stable@vger.kernel.org +Cc: Johan Hovold , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov , Vinod Koul +Message-ID: <20230203222616.2935268-6-swboyd@chromium.org> + +From: Johan Hovold + +commit c7b98de745cffdceefc077ad5cf9cda032ef8959 upstream. + +Drop the confused runtime-suspend type check which effectively broke +runtime PM if the DP child node happens to be parsed before the USB +child node during probe (e.g. due to order of child nodes in the +devicetree). + +Instead use the new driver data USB PHY pointer to access the USB +configuration and resources. + +Fixes: 52e013d0bffa ("phy: qcom-qmp: Add support for DP in USB3+DP combo phy") +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20221114081346.5116-6-johan+linaro@kernel.org +Signed-off-by: Vinod Koul +[swboyd@chromium.org: Backport to pre-split driver. Note that the +condition is kept so that ufs and pcie don't do anything as before] +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -4985,7 +4985,7 @@ static void qcom_qmp_phy_disable_autonom + static int __maybe_unused qcom_qmp_phy_runtime_suspend(struct device *dev) + { + struct qcom_qmp *qmp = dev_get_drvdata(dev); +- struct qmp_phy *qphy = qmp->phys[0]; ++ struct qmp_phy *qphy = qmp->usb_phy; + const struct qmp_phy_cfg *cfg = qphy->cfg; + + dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qphy->mode); +@@ -5010,7 +5010,7 @@ static int __maybe_unused qcom_qmp_phy_r + static int __maybe_unused qcom_qmp_phy_runtime_resume(struct device *dev) + { + struct qcom_qmp *qmp = dev_get_drvdata(dev); +- struct qmp_phy *qphy = qmp->phys[0]; ++ struct qmp_phy *qphy = qmp->usb_phy; + const struct qmp_phy_cfg *cfg = qphy->cfg; + int ret = 0; + diff --git a/queue-5.15/phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch b/queue-5.15/phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch new file mode 100644 index 00000000000..2581f5e4f7e --- /dev/null +++ b/queue-5.15/phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch @@ -0,0 +1,84 @@ +From stable-owner@vger.kernel.org Fri Feb 3 23:27:26 2023 +From: Stephen Boyd +Date: Fri, 3 Feb 2023 14:26:14 -0800 +Subject: phy: qcom-qmp-usb: fix memleak on probe deferral +To: stable@vger.kernel.org +Cc: Johan Hovold , linux-kernel@vger.kernel.org, patches@lists.linux.dev, Vinod Koul +Message-ID: <20230203222616.2935268-4-swboyd@chromium.org> + +From: Johan Hovold + +commit a5d6b1ac56cbd6b5850a3a54e35f1cb71e8e8cdd upstream. + +Switch to using the device-managed of_iomap helper to avoid leaking +memory on probe deferral and driver unbind. + +Note that this helper checks for already reserved regions and may fail +if there are multiple devices claiming the same memory. + +Two bindings currently rely on overlapping mappings for the PCS region +so fallback to non-exclusive mappings for those for now. + +Fixes: e78f3d15e115 ("phy: qcom-qmp: new qmp phy driver for qcom-chipsets") +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20220916102340.11520-7-johan+linaro@kernel.org +Signed-off-by: Vinod Koul +[swboyd@chromium.org: Backport to pre-split driver] +Signed-off-by: Stephen Boyd +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -5387,6 +5387,21 @@ static void qcom_qmp_reset_control_put(v + reset_control_put(data); + } + ++static void __iomem *qmp_usb_iomap(struct device *dev, struct device_node *np, ++ int index, bool exclusive) ++{ ++ struct resource res; ++ ++ if (!exclusive) { ++ if (of_address_to_resource(np, index, &res)) ++ return IOMEM_ERR_PTR(-EINVAL); ++ ++ return devm_ioremap(dev, res.start, resource_size(&res)); ++ } ++ ++ return devm_of_iomap(dev, np, index, NULL); ++} ++ + static + int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id, + void __iomem *serdes, const struct qmp_phy_cfg *cfg) +@@ -5396,8 +5411,18 @@ int qcom_qmp_phy_create(struct device *d + struct qmp_phy *qphy; + const struct phy_ops *ops; + char prop_name[MAX_PROP_NAME]; ++ bool exclusive = true; + int ret; + ++ /* ++ * FIXME: These bindings should be fixed to not rely on overlapping ++ * mappings for PCS. ++ */ ++ if (of_device_is_compatible(dev->of_node, "qcom,sdx65-qmp-usb3-uni-phy")) ++ exclusive = false; ++ if (of_device_is_compatible(dev->of_node, "qcom,sm8350-qmp-usb3-uni-phy")) ++ exclusive = false; ++ + qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL); + if (!qphy) + return -ENOMEM; +@@ -5418,7 +5443,7 @@ int qcom_qmp_phy_create(struct device *d + if (IS_ERR(qphy->rx)) + return PTR_ERR(qphy->rx); + +- qphy->pcs = devm_of_iomap(dev, np, 2, NULL); ++ qphy->pcs = qmp_usb_iomap(dev, np, 2, exclusive); + if (IS_ERR(qphy->pcs)) + return PTR_ERR(qphy->pcs); + diff --git a/queue-5.15/series b/queue-5.15/series index c3d8b6a9943..83909ba0306 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -101,3 +101,8 @@ nvmem-core-remove-nvmem_config-wp_gpio.patch nvmem-core-fix-cell-removal-on-error.patch serial-8250_dma-fix-dma-rx-completion-race.patch serial-8250_dma-fix-dma-rx-rearm-race.patch +phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch +phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch +phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch +phy-qcom-qmp-combo-fix-broken-power-on.patch +phy-qcom-qmp-combo-fix-runtime-suspend.patch