| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- From 8947f8cd407a55db816cd03fc03b59096210978e Mon Sep 17 00:00:00 2001
- From: Guochun Mao <[email protected]>
- Date: Thu, 21 Sep 2017 20:45:06 +0800
- Subject: [PATCH 136/224] mtd: mtk-nor: add suspend/resume support
- Abstract functions of clock setting, to avoid duplicated code,
- these functions been used in new feature.
- Implement suspend/resume functions.
- Signed-off-by: Guochun Mao <[email protected]>
- Signed-off-by: Cyrille Pitchen <[email protected]>
- ---
- drivers/mtd/spi-nor/mtk-quadspi.c | 70 ++++++++++++++++++++++++++++++++-------
- 1 file changed, 58 insertions(+), 12 deletions(-)
- diff --git a/drivers/mtd/spi-nor/mtk-quadspi.c b/drivers/mtd/spi-nor/mtk-quadspi.c
- index c258c7adf1c5..abe455ccd68b 100644
- --- a/drivers/mtd/spi-nor/mtk-quadspi.c
- +++ b/drivers/mtd/spi-nor/mtk-quadspi.c
- @@ -404,6 +404,29 @@ static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf,
- return ret;
- }
-
- +static void mt8173_nor_disable_clk(struct mt8173_nor *mt8173_nor)
- +{
- + clk_disable_unprepare(mt8173_nor->spi_clk);
- + clk_disable_unprepare(mt8173_nor->nor_clk);
- +}
- +
- +static int mt8173_nor_enable_clk(struct mt8173_nor *mt8173_nor)
- +{
- + int ret;
- +
- + ret = clk_prepare_enable(mt8173_nor->spi_clk);
- + if (ret)
- + return ret;
- +
- + ret = clk_prepare_enable(mt8173_nor->nor_clk);
- + if (ret) {
- + clk_disable_unprepare(mt8173_nor->spi_clk);
- + return ret;
- + }
- +
- + return 0;
- +}
- +
- static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
- struct device_node *flash_node)
- {
- @@ -468,15 +491,11 @@ static int mtk_nor_drv_probe(struct platform_device *pdev)
- return PTR_ERR(mt8173_nor->nor_clk);
-
- mt8173_nor->dev = &pdev->dev;
- - ret = clk_prepare_enable(mt8173_nor->spi_clk);
- +
- + ret = mt8173_nor_enable_clk(mt8173_nor);
- if (ret)
- return ret;
-
- - ret = clk_prepare_enable(mt8173_nor->nor_clk);
- - if (ret) {
- - clk_disable_unprepare(mt8173_nor->spi_clk);
- - return ret;
- - }
- /* only support one attached flash */
- flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
- if (!flash_np) {
- @@ -487,10 +506,9 @@ static int mtk_nor_drv_probe(struct platform_device *pdev)
- ret = mtk_nor_init(mt8173_nor, flash_np);
-
- nor_free:
- - if (ret) {
- - clk_disable_unprepare(mt8173_nor->spi_clk);
- - clk_disable_unprepare(mt8173_nor->nor_clk);
- - }
- + if (ret)
- + mt8173_nor_disable_clk(mt8173_nor);
- +
- return ret;
- }
-
- @@ -498,11 +516,38 @@ static int mtk_nor_drv_remove(struct platform_device *pdev)
- {
- struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev);
-
- - clk_disable_unprepare(mt8173_nor->spi_clk);
- - clk_disable_unprepare(mt8173_nor->nor_clk);
- + mt8173_nor_disable_clk(mt8173_nor);
- +
- + return 0;
- +}
- +
- +#ifdef CONFIG_PM_SLEEP
- +static int mtk_nor_suspend(struct device *dev)
- +{
- + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
- +
- + mt8173_nor_disable_clk(mt8173_nor);
- +
- return 0;
- }
-
- +static int mtk_nor_resume(struct device *dev)
- +{
- + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
- +
- + return mt8173_nor_enable_clk(mt8173_nor);
- +}
- +
- +static const struct dev_pm_ops mtk_nor_dev_pm_ops = {
- + .suspend = mtk_nor_suspend,
- + .resume = mtk_nor_resume,
- +};
- +
- +#define MTK_NOR_DEV_PM_OPS (&mtk_nor_dev_pm_ops)
- +#else
- +#define MTK_NOR_DEV_PM_OPS NULL
- +#endif
- +
- static const struct of_device_id mtk_nor_of_ids[] = {
- { .compatible = "mediatek,mt8173-nor"},
- { /* sentinel */ }
- @@ -514,6 +559,7 @@ static struct platform_driver mtk_nor_driver = {
- .remove = mtk_nor_drv_remove,
- .driver = {
- .name = "mtk-nor",
- + .pm = MTK_NOR_DEV_PM_OPS,
- .of_match_table = mtk_nor_of_ids,
- },
- };
- --
- 2.11.0
|