Skip to content

Commit 0578a6d

Browse files
DhruvaG2000broonie
authored andcommitted
spi: spi-cadence-quadspi: add runtime pm support
Add runtime pm support to cadence-qspi driver, this allows the driver to suspend whenever it's is not actively being used thus reducing active power consumed by the system. Also, with the use of devm_pm_runtime_enable we no longer need the fallback probe_pm_failed that used to pm_runtime_disable Co-developed-by: Apurva Nandan <[email protected]> Signed-off-by: Apurva Nandan <[email protected]> Signed-off-by: Dhruva Gole <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent eb9913b commit 0578a6d

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

drivers/spi/spi-cadence-quadspi.c

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ struct cqspi_driver_platdata {
116116
#define CQSPI_TIMEOUT_MS 500
117117
#define CQSPI_READ_TIMEOUT_MS 10
118118

119+
/* Runtime_pm autosuspend delay */
120+
#define CQSPI_AUTOSUSPEND_TIMEOUT 2000
121+
119122
#define CQSPI_DUMMY_CLKS_PER_BYTE 8
120123
#define CQSPI_DUMMY_BYTES_MAX 4
121124
#define CQSPI_DUMMY_CLKS_MAX 31
@@ -1407,8 +1410,20 @@ static int cqspi_mem_process(struct spi_mem *mem, const struct spi_mem_op *op)
14071410
static int cqspi_exec_mem_op(struct spi_mem *mem, const struct spi_mem_op *op)
14081411
{
14091412
int ret;
1413+
struct cqspi_st *cqspi = spi_master_get_devdata(mem->spi->master);
1414+
struct device *dev = &cqspi->pdev->dev;
1415+
1416+
ret = pm_runtime_resume_and_get(dev);
1417+
if (ret) {
1418+
dev_err(&mem->spi->dev, "resume failed with %d\n", ret);
1419+
return ret;
1420+
}
14101421

14111422
ret = cqspi_mem_process(mem, op);
1423+
1424+
pm_runtime_mark_last_busy(dev);
1425+
pm_runtime_put_autosuspend(dev);
1426+
14121427
if (ret)
14131428
dev_err(&mem->spi->dev, "operation failed with %d\n", ret);
14141429

@@ -1753,10 +1768,10 @@ static int cqspi_probe(struct platform_device *pdev)
17531768
if (irq < 0)
17541769
return -ENXIO;
17551770

1756-
pm_runtime_enable(dev);
1757-
ret = pm_runtime_resume_and_get(dev);
1758-
if (ret < 0)
1759-
goto probe_pm_failed;
1771+
ret = pm_runtime_set_active(dev);
1772+
if (ret)
1773+
return ret;
1774+
17601775

17611776
ret = clk_prepare_enable(cqspi->clk);
17621777
if (ret) {
@@ -1862,21 +1877,29 @@ static int cqspi_probe(struct platform_device *pdev)
18621877
goto probe_setup_failed;
18631878
}
18641879

1880+
ret = devm_pm_runtime_enable(dev);
1881+
if (ret)
1882+
return ret;
1883+
1884+
pm_runtime_set_autosuspend_delay(dev, CQSPI_AUTOSUSPEND_TIMEOUT);
1885+
pm_runtime_use_autosuspend(dev);
1886+
pm_runtime_get_noresume(dev);
1887+
18651888
ret = spi_register_controller(host);
18661889
if (ret) {
18671890
dev_err(&pdev->dev, "failed to register SPI ctlr %d\n", ret);
18681891
goto probe_setup_failed;
18691892
}
18701893

1894+
pm_runtime_mark_last_busy(dev);
1895+
pm_runtime_put_autosuspend(dev);
1896+
18711897
return 0;
18721898
probe_setup_failed:
18731899
cqspi_controller_enable(cqspi, 0);
18741900
probe_reset_failed:
18751901
clk_disable_unprepare(cqspi->clk);
18761902
probe_clk_failed:
1877-
pm_runtime_put_sync(dev);
1878-
probe_pm_failed:
1879-
pm_runtime_disable(dev);
18801903
return ret;
18811904
}
18821905

@@ -1928,7 +1951,8 @@ static int cqspi_resume(struct device *dev)
19281951
return spi_controller_resume(host);
19291952
}
19301953

1931-
static DEFINE_SIMPLE_DEV_PM_OPS(cqspi_dev_pm_ops, cqspi_suspend, cqspi_resume);
1954+
static DEFINE_RUNTIME_DEV_PM_OPS(cqspi_dev_pm_ops, cqspi_suspend,
1955+
cqspi_resume, NULL);
19321956

19331957
static const struct cqspi_driver_platdata cdns_qspi = {
19341958
.quirks = CQSPI_DISABLE_DAC_MODE,
@@ -2012,7 +2036,7 @@ static struct platform_driver cqspi_platform_driver = {
20122036
.remove_new = cqspi_remove,
20132037
.driver = {
20142038
.name = CQSPI_NAME,
2015-
.pm = &cqspi_dev_pm_ops,
2039+
.pm = pm_ptr(&cqspi_dev_pm_ops),
20162040
.of_match_table = cqspi_dt_ids,
20172041
},
20182042
};

0 commit comments

Comments
 (0)