kernel: bump 4.14 to 4.14.125 (FS#2305 FS#2297)
[oweals/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  };