Add hibernation image area
[AGL/meta-agl.git] / meta-agl-bsp / meta-renesas / recipes-kernel / linux / linux / hibernation / 0001-Add-shdmac-hibernation-code.patch
1 From dfc07c05c50155420e47f85442d099d433db869b Mon Sep 17 00:00:00 2001
2 From: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
3 Date: Fri, 9 Jun 2017 20:11:49 +0900
4 Subject: [PATCH 1/3] Add shdmac hibernation code
5
6 Signed-off-by: Yuichi Kusakabe <yuichi.kusakabe@jp.fujitsu.com>
7 ---
8  drivers/dma/sh/shdmac.c | 36 ++++++++++++++++++++++++------------
9  1 file changed, 24 insertions(+), 12 deletions(-)
10
11 diff --git a/drivers/dma/sh/shdmac.c b/drivers/dma/sh/shdmac.c
12 index 1c97cc5..d084437 100644
13 --- a/drivers/dma/sh/shdmac.c
14 +++ b/drivers/dma/sh/shdmac.c
15 @@ -743,11 +743,20 @@ static int sh_dmae_resume(struct device *dev)
16  #define sh_dmae_resume NULL
17  #endif
18  
19 +static int sh_dmae_restore(struct device *dev)
20 +{
21 +#ifdef CONFIG_PM
22 +       return sh_dmae_resume(dev);
23 +#else
24 +       return 0;
25 +#endif
26 +}
27 +
28  const struct dev_pm_ops sh_dmae_pm = {
29 -       .suspend                = sh_dmae_suspend,
30 -       .resume                 = sh_dmae_resume,
31 -       .runtime_suspend        = sh_dmae_runtime_suspend,
32 -       .runtime_resume         = sh_dmae_runtime_resume,
33 +       SET_SYSTEM_SLEEP_PM_OPS(sh_dmae_suspend, sh_dmae_resume)
34 +       SET_RUNTIME_PM_OPS(sh_dmae_runtime_suspend, sh_dmae_runtime_resume,
35 +               NULL)
36 +       .restore_noirq = sh_dmae_restore,
37  };
38  
39  static dma_addr_t sh_dmae_slave_addr(struct shdma_chan *schan)
40 @@ -798,7 +807,6 @@ static int sh_dmae_probe(struct platform_device *pdev)
41         struct sh_dmae_device *shdev;
42         struct dma_device *dma_dev;
43         struct resource *chan, *dmars, *errirq_res, *chanirq_res;
44 -       unsigned long flags;
45  
46         if (pdev->dev.of_node)
47                 pdata = of_match_device(sh_dmae_of_match, &pdev->dev)->data;
48 @@ -885,9 +893,9 @@ static int sh_dmae_probe(struct platform_device *pdev)
49         if (err < 0)
50                 dev_err(&pdev->dev, "%s(): GET = %d\n", __func__, err);
51  
52 -       spin_lock_irqsave(&sh_dmae_lock, flags);
53 +       spin_lock_irq(&sh_dmae_lock);
54         list_add_tail_rcu(&shdev->node, &sh_dmae_devices);
55 -       spin_unlock_irqrestore(&sh_dmae_lock, flags);
56 +       spin_unlock_irq(&sh_dmae_lock);
57  
58         /* reset dma controller - only needed as a test */
59         err = sh_dmae_rst(shdev);
60 @@ -981,6 +989,7 @@ static int sh_dmae_probe(struct platform_device *pdev)
61         return err;
62  
63  edmadevreg:
64 +       pm_runtime_get(&pdev->dev);
65  chan_probe_err:
66         sh_dmae_chan_remove(shdev);
67  
68 @@ -988,9 +997,9 @@ chan_probe_err:
69  eirq_err:
70  #endif
71  rst_err:
72 -       spin_lock_irqsave(&sh_dmae_lock, flags);
73 +       spin_lock_irq(&sh_dmae_lock);
74         list_del_rcu(&shdev->node);
75 -       spin_unlock_irqrestore(&sh_dmae_lock, flags);
76 +       spin_unlock_irq(&sh_dmae_lock);
77  
78         pm_runtime_put(&pdev->dev);
79         pm_runtime_disable(&pdev->dev);
80 @@ -1007,13 +1016,12 @@ static int sh_dmae_remove(struct platform_device *pdev)
81  {
82         struct sh_dmae_device *shdev = platform_get_drvdata(pdev);
83         struct dma_device *dma_dev = &shdev->shdma_dev.dma_dev;
84 -       unsigned long flags;
85  
86         dma_async_device_unregister(dma_dev);
87  
88 -       spin_lock_irqsave(&sh_dmae_lock, flags);
89 +       spin_lock_irq(&sh_dmae_lock);
90         list_del_rcu(&shdev->node);
91 -       spin_unlock_irqrestore(&sh_dmae_lock, flags);
92 +       spin_unlock_irq(&sh_dmae_lock);
93  
94         pm_runtime_disable(&pdev->dev);
95  
96 @@ -1047,7 +1055,11 @@ static int __init sh_dmae_init(void)
97  
98         return platform_driver_probe(&sh_dmae_driver, sh_dmae_probe);
99  }
100 +#ifdef MODULE
101  module_init(sh_dmae_init);
102 +#else
103 +subsys_initcall(sh_dmae_init);
104 +#endif
105  
106  static void __exit sh_dmae_exit(void)
107  {
108 -- 
109 1.8.3.1
110