pmdomain: imx8mp-blk-ctrl: Error out if domains are missing in DT
authorMarek Vasut <marex@denx.de>
Fri, 19 Jan 2024 01:47:41 +0000 (02:47 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 14 Feb 2024 09:26:11 +0000 (10:26 +0100)
This driver assumes that domain->power_dev is non-NULL in its
suspend/resume path. The assumption is valid, since all the devices that
are being looked up here should be described in DT. In case they are not
described in DT, because the DT is faulty, suspend/resume attempt would
trigger NULL pointer dereference.

To avoid this failure, check whether the power_dev assignment is not NULL
right away in probe callback and fail early if it is.

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/20240119014807.268694-1-marex@denx.de
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/imx/imx8m-blk-ctrl.c
drivers/pmdomain/imx/imx8mp-blk-ctrl.c

index 1341a707f61bcb15b6e636c141a0ba38b57f219c..ca942d7929c2ba9a93ca82603262e5b89e47e7d3 100644 (file)
@@ -258,11 +258,14 @@ static int imx8m_blk_ctrl_probe(struct platform_device *pdev)
 
                domain->power_dev =
                        dev_pm_domain_attach_by_name(dev, data->gpc_name);
-               if (IS_ERR(domain->power_dev)) {
-                       dev_err_probe(dev, PTR_ERR(domain->power_dev),
+               if (IS_ERR_OR_NULL(domain->power_dev)) {
+                       if (!domain->power_dev)
+                               ret = -ENODEV;
+                       else
+                               ret = PTR_ERR(domain->power_dev);
+                       dev_err_probe(dev, ret,
                                      "failed to attach power domain \"%s\"\n",
                                      data->gpc_name);
-                       ret = PTR_ERR(domain->power_dev);
                        goto cleanup_pds;
                }
 
index e3203eb6a02293a63f2a19e8f027762916f232e2..e488cf79b800708480abc84626248eb3eeae3f1c 100644 (file)
@@ -687,11 +687,14 @@ static int imx8mp_blk_ctrl_probe(struct platform_device *pdev)
 
                domain->power_dev =
                        dev_pm_domain_attach_by_name(dev, data->gpc_name);
-               if (IS_ERR(domain->power_dev)) {
-                       dev_err_probe(dev, PTR_ERR(domain->power_dev),
+               if (IS_ERR_OR_NULL(domain->power_dev)) {
+                       if (!domain->power_dev)
+                               ret = -ENODEV;
+                       else
+                               ret = PTR_ERR(domain->power_dev);
+                       dev_err_probe(dev, ret,
                                      "failed to attach power domain %s\n",
                                      data->gpc_name);
-                       ret = PTR_ERR(domain->power_dev);
                        goto cleanup_pds;
                }