]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Feb 2023 11:10:28 +0000 (12:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Feb 2023 11:10:28 +0000 (12:10 +0100)
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

queue-5.15/phy-qcom-qmp-combo-disable-runtime-pm-on-unbind.patch [new file with mode: 0644]
queue-5.15/phy-qcom-qmp-combo-fix-broken-power-on.patch [new file with mode: 0644]
queue-5.15/phy-qcom-qmp-combo-fix-memleak-on-probe-deferral.patch [new file with mode: 0644]
queue-5.15/phy-qcom-qmp-combo-fix-runtime-suspend.patch [new file with mode: 0644]
queue-5.15/phy-qcom-qmp-usb-fix-memleak-on-probe-deferral.patch [new file with mode: 0644]
queue-5.15/series

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 (file)
index 0000000..d0de4b3
--- /dev/null
@@ -0,0 +1,52 @@
+From stable-owner@vger.kernel.org Fri Feb  3 23:27:27 2023
+From: Stephen Boyd <swboyd@chromium.org>
+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 <johan+linaro@kernel.org>, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov <dmitry.baryshkov@linaro.org>, Vinod Koul <vkoul@kernel.org>
+Message-ID: <20230203222616.2935268-2-swboyd@chromium.org>
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+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 <johan+linaro@kernel.org>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20220907110728.19092-2-johan+linaro@kernel.org
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..bc4062e
--- /dev/null
@@ -0,0 +1,98 @@
+From stable-owner@vger.kernel.org Fri Feb  3 23:27:28 2023
+From: Stephen Boyd <swboyd@chromium.org>
+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 <johan+linaro@kernel.org>, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov <dmitry.baryshkov@linaro.org>, Vinod Koul <vkoul@kernel.org>
+Message-ID: <20230203222616.2935268-5-swboyd@chromium.org>
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+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 <dmitry.baryshkov@linaro.org>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20221114081346.5116-5-johan+linaro@kernel.org
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+[swboyd@chromium.org: Backport to pre-split driver, also set usb_phy for
+pcie/ufs]
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..aecc0e3
--- /dev/null
@@ -0,0 +1,93 @@
+From stable-owner@vger.kernel.org Fri Feb  3 23:27:29 2023
+From: Stephen Boyd <swboyd@chromium.org>
+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 <johan+linaro@kernel.org>, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Vinod Koul <vkoul@kernel.org>
+Message-ID: <20230203222616.2935268-3-swboyd@chromium.org>
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+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 <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20220916102340.11520-5-johan+linaro@kernel.org
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..3c7c5ce
--- /dev/null
@@ -0,0 +1,53 @@
+From stable-owner@vger.kernel.org Fri Feb  3 23:27:28 2023
+From: Stephen Boyd <swboyd@chromium.org>
+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 <johan+linaro@kernel.org>, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Dmitry Baryshkov <dmitry.baryshkov@linaro.org>, Vinod Koul <vkoul@kernel.org>
+Message-ID: <20230203222616.2935268-6-swboyd@chromium.org>
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+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 <dmitry.baryshkov@linaro.org>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20221114081346.5116-6-johan+linaro@kernel.org
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+[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 <swboyd@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..2581f5e
--- /dev/null
@@ -0,0 +1,84 @@
+From stable-owner@vger.kernel.org Fri Feb  3 23:27:26 2023
+From: Stephen Boyd <swboyd@chromium.org>
+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 <johan+linaro@kernel.org>, linux-kernel@vger.kernel.org, patches@lists.linux.dev, Vinod Koul <vkoul@kernel.org>
+Message-ID: <20230203222616.2935268-4-swboyd@chromium.org>
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+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 <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20220916102340.11520-7-johan+linaro@kernel.org
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+[swboyd@chromium.org: Backport to pre-split driver]
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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);
index c3d8b6a99434683cdcf9e55f6f21a03688842cd6..83909ba030617b0b0cb8482016213e7b80a0d140 100644 (file)
@@ -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