From f94a07310f18720faa0cc773a1aec5a7b1bf3928 Mon Sep 17 00:00:00 2001
From: "xingyu.wu" <xingyu.wu@starfivetech.com>
Date: Tue, 19 Jul 2022 14:49:20 +0800
Subject: [PATCH 102/116] spi:pl022-starfive:Avoid power device error when
 CONFIG_PM enable

It would be error when CONFIG_PM enable and use overlay by of-platform to register.

Add some power manager operation in platform probe function.

Signed-off-by: Xingyu Wu <xingyu.wu@starfivetech.com>
Signed-off-by: Ziv Xu <ziv.xu@starfivetech.com>
Signed-off-by: Hal Feng <hal.feng@starfivetech.com>
---
 drivers/spi/spi-pl022.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

--- a/drivers/spi/spi-pl022.c
+++ b/drivers/spi/spi-pl022.c
@@ -35,6 +35,8 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/reset.h>
 #include <linux/platform_device.h>
+#include <linux/clk/clk-conf.h>
+#include <linux/pm_domain.h>
 
 /*
  * This macro is used to define some register default values.
@@ -2266,7 +2268,8 @@ static int pl022_probe(struct amba_devic
 		goto err_spi_register;
 	}
 	dev_dbg(dev, "probe succeeded\n");
-
+	if (!platform_flag)
+		platform_info->autosuspend_delay = 100;
 	/* let runtime pm put suspend */
 	if (platform_info->autosuspend_delay > 0) {
 		dev_info(&adev->dev,
@@ -2276,7 +2279,10 @@ static int pl022_probe(struct amba_devic
 			platform_info->autosuspend_delay);
 		pm_runtime_use_autosuspend(dev);
 	}
-	pm_runtime_put(dev);
+	if (platform_flag)
+		clk_disable_unprepare(pl022->clk);
+	else
+		pm_runtime_put(dev);
 
 	return 0;
 
@@ -2534,8 +2540,33 @@ static int starfive_of_pl022_probe(struc
 		ret = -EINVAL;
 	}
 
+	ret = of_clk_set_defaults(dev->of_node, false);
+	if (ret < 0)
+		goto err_probe;
+
+	ret = dev_pm_domain_attach(dev, true);
+	if (ret)
+		goto err_probe;
+
 	ret = pl022_probe(pcdev, &id);
 
+	struct pl022 *pl022 = amba_get_drvdata(pcdev);
+
+	pl022->host->dev.parent = &pdev->dev;
+	platform_set_drvdata(pdev, pl022);
+
+	pm_runtime_enable(&pdev->dev);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, 100);
+	pm_runtime_use_autosuspend(&pdev->dev);
+
+	if (ret) {
+		pm_runtime_disable(dev);
+		pm_runtime_set_suspended(dev);
+		pm_runtime_put_noidle(dev);
+		dev_pm_domain_detach(dev, true);
+	}
+
+err_probe:
 	return ret;
 }
 
@@ -2566,6 +2597,7 @@ static int starfive_of_pl022_remove(stru
 	size = resource_size(pdev->resource);
 	release_mem_region(pdev->resource->start, size);
 	tasklet_disable(&pl022->pump_transfers);
+	pm_runtime_disable(&pdev->dev);
 	return 0;
 }
 
