Skip to content

Commit dcbce32

Browse files
claudiubezneaUlf Hansson
authored andcommitted
mmc: renesas_sdhi: Add suspend/resume hooks
Add suspend/resume hooks which assert/deassert the reset signals, along with forcing runtime suspend/resume. This allows using the driver in scenarios where the resume is done with the help of bootloader and the bootloader disables the SDHI clocks, resets, IRQs before passing execution to Linux. Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent 50371ef commit dcbce32

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

drivers/mmc/host/renesas_sdhi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef RENESAS_SDHI_H
1010
#define RENESAS_SDHI_H
1111

12+
#include <linux/device.h>
1213
#include <linux/dmaengine.h>
1314
#include <linux/platform_device.h>
1415
#include <linux/workqueue.h>
@@ -107,4 +108,6 @@ int renesas_sdhi_probe(struct platform_device *pdev,
107108
const struct renesas_sdhi_of_data *of_data,
108109
const struct renesas_sdhi_quirks *quirks);
109110
void renesas_sdhi_remove(struct platform_device *pdev);
111+
int renesas_sdhi_suspend(struct device *dev);
112+
int renesas_sdhi_resume(struct device *dev);
110113
#endif

drivers/mmc/host/renesas_sdhi_core.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <linux/platform_data/tmio.h>
3232
#include <linux/platform_device.h>
3333
#include <linux/pm_domain.h>
34+
#include <linux/pm_runtime.h>
3435
#include <linux/regulator/consumer.h>
3536
#include <linux/regulator/driver.h>
3637
#include <linux/regulator/of_regulator.h>
@@ -1317,5 +1318,41 @@ void renesas_sdhi_remove(struct platform_device *pdev)
13171318
}
13181319
EXPORT_SYMBOL_GPL(renesas_sdhi_remove);
13191320

1321+
int renesas_sdhi_suspend(struct device *dev)
1322+
{
1323+
struct tmio_mmc_host *host = dev_get_drvdata(dev);
1324+
struct renesas_sdhi *priv = host_to_priv(host);
1325+
int ret;
1326+
1327+
ret = pm_runtime_force_suspend(dev);
1328+
if (ret)
1329+
return ret;
1330+
1331+
ret = reset_control_assert(priv->rstc);
1332+
if (ret)
1333+
pm_runtime_force_resume(dev);
1334+
1335+
return ret;
1336+
}
1337+
EXPORT_SYMBOL_GPL(renesas_sdhi_suspend);
1338+
1339+
int renesas_sdhi_resume(struct device *dev)
1340+
{
1341+
struct tmio_mmc_host *host = dev_get_drvdata(dev);
1342+
struct renesas_sdhi *priv = host_to_priv(host);
1343+
int ret;
1344+
1345+
ret = reset_control_deassert(priv->rstc);
1346+
if (ret)
1347+
return ret;
1348+
1349+
ret = pm_runtime_force_resume(dev);
1350+
if (ret)
1351+
reset_control_assert(priv->rstc);
1352+
1353+
return ret;
1354+
}
1355+
EXPORT_SYMBOL_GPL(renesas_sdhi_resume);
1356+
13201357
MODULE_DESCRIPTION("Renesas SDHI core driver");
13211358
MODULE_LICENSE("GPL v2");

drivers/mmc/host/renesas_sdhi_internal_dmac.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include <linux/pagemap.h>
1919
#include <linux/platform_data/tmio.h>
2020
#include <linux/platform_device.h>
21-
#include <linux/pm_runtime.h>
2221
#include <linux/scatterlist.h>
2322
#include <linux/sys_soc.h>
2423

@@ -600,7 +599,7 @@ static int renesas_sdhi_internal_dmac_probe(struct platform_device *pdev)
600599
}
601600

602601
static const struct dev_pm_ops renesas_sdhi_internal_dmac_dev_pm_ops = {
603-
SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
602+
SYSTEM_SLEEP_PM_OPS(renesas_sdhi_suspend, renesas_sdhi_resume)
604603
RUNTIME_PM_OPS(tmio_mmc_host_runtime_suspend,
605604
tmio_mmc_host_runtime_resume,
606605
NULL)

0 commit comments

Comments
 (0)