diff options
author | John Crispin <john@phrozen.org> | 2018-05-07 12:07:32 +0200 |
---|---|---|
committer | John Crispin <john@phrozen.org> | 2018-05-24 22:11:55 +0200 |
commit | 050da2107a7eb2a571a8a3d0cee21cc6a44b72b8 (patch) | |
tree | 147c3b85ccae12e4b1659acd86ac93b13ecfa15d /target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch | |
parent | 4f67c1522d92bc4512c3ecf58c38ff9886530b48 (diff) | |
download | mtk-20170518-050da2107a7eb2a571a8a3d0cee21cc6a44b72b8.zip mtk-20170518-050da2107a7eb2a571a8a3d0cee21cc6a44b72b8.tar.gz mtk-20170518-050da2107a7eb2a571a8a3d0cee21cc6a44b72b8.tar.bz2 |
mediatek: backport upstream mediatek patches
Signed-off-by: John Crispin <john@phrozen.org>
Diffstat (limited to 'target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch')
-rw-r--r-- | target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch b/target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch new file mode 100644 index 0000000..248e195 --- /dev/null +++ b/target/linux/mediatek/patches-4.14/0136-mtd-mtk-nor-add-suspend-resume-support.patch @@ -0,0 +1,133 @@ +From 8947f8cd407a55db816cd03fc03b59096210978e Mon Sep 17 00:00:00 2001 +From: Guochun Mao <guochun.mao@mediatek.com> +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 <guochun.mao@mediatek.com> +Signed-off-by: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr> +--- + 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 + |