kernel: bump 4.14 to 4.14.44
[openwrt/openwrt.git] / target / linux / mediatek / patches-4.14 / 0136-mtd-mtk-nor-add-suspend-resume-support.patch
1 From 8947f8cd407a55db816cd03fc03b59096210978e Mon Sep 17 00:00:00 2001
2 From: Guochun Mao <guochun.mao@mediatek.com>
3 Date: Thu, 21 Sep 2017 20:45:06 +0800
4 Subject: [PATCH 136/224] mtd: mtk-nor: add suspend/resume support
5
6 Abstract functions of clock setting, to avoid duplicated code,
7 these functions been used in new feature.
8 Implement suspend/resume functions.
9
10 Signed-off-by: Guochun Mao <guochun.mao@mediatek.com>
11 Signed-off-by: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>
12 ---
13 drivers/mtd/spi-nor/mtk-quadspi.c | 70 ++++++++++++++++++++++++++++++++-------
14 1 file changed, 58 insertions(+), 12 deletions(-)
15
16 --- a/drivers/mtd/spi-nor/mtk-quadspi.c
17 +++ b/drivers/mtd/spi-nor/mtk-quadspi.c
18 @@ -404,6 +404,29 @@ static int mt8173_nor_write_reg(struct s
19 return ret;
20 }
21
22 +static void mt8173_nor_disable_clk(struct mt8173_nor *mt8173_nor)
23 +{
24 + clk_disable_unprepare(mt8173_nor->spi_clk);
25 + clk_disable_unprepare(mt8173_nor->nor_clk);
26 +}
27 +
28 +static int mt8173_nor_enable_clk(struct mt8173_nor *mt8173_nor)
29 +{
30 + int ret;
31 +
32 + ret = clk_prepare_enable(mt8173_nor->spi_clk);
33 + if (ret)
34 + return ret;
35 +
36 + ret = clk_prepare_enable(mt8173_nor->nor_clk);
37 + if (ret) {
38 + clk_disable_unprepare(mt8173_nor->spi_clk);
39 + return ret;
40 + }
41 +
42 + return 0;
43 +}
44 +
45 static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
46 struct device_node *flash_node)
47 {
48 @@ -468,15 +491,11 @@ static int mtk_nor_drv_probe(struct plat
49 return PTR_ERR(mt8173_nor->nor_clk);
50
51 mt8173_nor->dev = &pdev->dev;
52 - ret = clk_prepare_enable(mt8173_nor->spi_clk);
53 +
54 + ret = mt8173_nor_enable_clk(mt8173_nor);
55 if (ret)
56 return ret;
57
58 - ret = clk_prepare_enable(mt8173_nor->nor_clk);
59 - if (ret) {
60 - clk_disable_unprepare(mt8173_nor->spi_clk);
61 - return ret;
62 - }
63 /* only support one attached flash */
64 flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
65 if (!flash_np) {
66 @@ -487,10 +506,9 @@ static int mtk_nor_drv_probe(struct plat
67 ret = mtk_nor_init(mt8173_nor, flash_np);
68
69 nor_free:
70 - if (ret) {
71 - clk_disable_unprepare(mt8173_nor->spi_clk);
72 - clk_disable_unprepare(mt8173_nor->nor_clk);
73 - }
74 + if (ret)
75 + mt8173_nor_disable_clk(mt8173_nor);
76 +
77 return ret;
78 }
79
80 @@ -498,11 +516,38 @@ static int mtk_nor_drv_remove(struct pla
81 {
82 struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev);
83
84 - clk_disable_unprepare(mt8173_nor->spi_clk);
85 - clk_disable_unprepare(mt8173_nor->nor_clk);
86 + mt8173_nor_disable_clk(mt8173_nor);
87 +
88 + return 0;
89 +}
90 +
91 +#ifdef CONFIG_PM_SLEEP
92 +static int mtk_nor_suspend(struct device *dev)
93 +{
94 + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
95 +
96 + mt8173_nor_disable_clk(mt8173_nor);
97 +
98 return 0;
99 }
100
101 +static int mtk_nor_resume(struct device *dev)
102 +{
103 + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
104 +
105 + return mt8173_nor_enable_clk(mt8173_nor);
106 +}
107 +
108 +static const struct dev_pm_ops mtk_nor_dev_pm_ops = {
109 + .suspend = mtk_nor_suspend,
110 + .resume = mtk_nor_resume,
111 +};
112 +
113 +#define MTK_NOR_DEV_PM_OPS (&mtk_nor_dev_pm_ops)
114 +#else
115 +#define MTK_NOR_DEV_PM_OPS NULL
116 +#endif
117 +
118 static const struct of_device_id mtk_nor_of_ids[] = {
119 { .compatible = "mediatek,mt8173-nor"},
120 { /* sentinel */ }
121 @@ -514,6 +559,7 @@ static struct platform_driver mtk_nor_dr
122 .remove = mtk_nor_drv_remove,
123 .driver = {
124 .name = "mtk-nor",
125 + .pm = MTK_NOR_DEV_PM_OPS,
126 .of_match_table = mtk_nor_of_ids,
127 },
128 };