blob: 10162049bec338ebea75bc78d49cfdd5db0d5811 [file] [log] [blame]
developer5d148cb2023-06-02 13:08:11 +08001From 0078d23c468b3b3fd73d65f1652de0b355b95081 Mon Sep 17 00:00:00 2001
2From: Sam Shih <sam.shih@mediatek.com>
3Date: Fri, 2 Jun 2023 13:06:18 +0800
4Subject: [PATCH]
5 [spi-and-storage][999-2360-v5.16-spi-add-power-control-when-set_cs.patch]
developer8e45c532021-12-13 10:38:52 +08006
developer5d148cb2023-06-02 13:08:11 +08007---
8 drivers/spi/spi.c | 24 +++++++++++++++++++++++-
9 1 file changed, 23 insertions(+), 1 deletion(-)
developer8e45c532021-12-13 10:38:52 +080010
developer5d148cb2023-06-02 13:08:11 +080011diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
12index 197a47eab..e562735a3 100644
developer8e45c532021-12-13 10:38:52 +080013--- a/drivers/spi/spi.c
14+++ b/drivers/spi/spi.c
15@@ -3170,7 +3170,29 @@ int spi_setup(struct spi_device *spi)
16 if (spi->controller->setup)
17 status = spi->controller->setup(spi);
18
19- spi_set_cs(spi, false);
20+ if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
21+ status = pm_runtime_get_sync(spi->controller->dev.parent);
22+ if (status < 0) {
23+ pm_runtime_put_noidle(spi->controller->dev.parent);
24+ dev_err(&spi->controller->dev, "Failed to power device: %d\n",
25+ status);
26+ return status;
27+ }
28+
29+ /*
30+ * We do not want to return positive value from pm_runtime_get,
31+ * there are many instances of devices calling spi_setup() and
32+ * checking for a non-zero return value instead of a negative
33+ * return value.
34+ */
35+ status = 0;
36+
37+ spi_set_cs(spi, false);
38+ pm_runtime_mark_last_busy(spi->controller->dev.parent);
39+ pm_runtime_put_autosuspend(spi->controller->dev.parent);
40+ } else {
41+ spi_set_cs(spi, false);
42+ }
43
44 if (spi->rt && !spi->controller->rt) {
45 spi->controller->rt = true;
46--
developer5d148cb2023-06-02 13:08:11 +0800472.34.1
developer8e45c532021-12-13 10:38:52 +080048