aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Szyprowski <m.szyprowski@samsung.com>2016-11-16 04:04:56 -0500
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-11-30 06:20:39 -0500
commit741f4331d07fd670b9ebb5eeda18208b6eb2ba28 (patch)
treea189876a1fb8a1b0a28e82d62d7a07cb3530ae28
parent387e08e2021022e764a235df6c1f0ed3d861f711 (diff)
[media] s5p-mfc: Don't keep clock prepared all the time
This patch moves preparation of clocks from s5p_mfc_init_pm() (driver probe) to s5p_mfc_power_on() (start of device operation). This change will allow to use runtime power usage optimization on newer Samsung Exynos platforms (for example Exynos 5433). Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_pm.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c
index b514584cf00d..796dac85746a 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c
@@ -39,23 +39,11 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
39 goto err_g_ip_clk; 39 goto err_g_ip_clk;
40 } 40 }
41 41
42 ret = clk_prepare(pm->clock_gate);
43 if (ret) {
44 mfc_err("Failed to prepare clock-gating control\n");
45 goto err_p_ip_clk;
46 }
47
48 if (dev->variant->version != MFC_VERSION_V6) { 42 if (dev->variant->version != MFC_VERSION_V6) {
49 pm->clock = clk_get(&dev->plat_dev->dev, MFC_SCLK_NAME); 43 pm->clock = clk_get(&dev->plat_dev->dev, MFC_SCLK_NAME);
50 if (IS_ERR(pm->clock)) { 44 if (IS_ERR(pm->clock)) {
51 mfc_info("Failed to get MFC special clock control\n"); 45 mfc_info("Failed to get MFC special clock control\n");
52 pm->clock = NULL; 46 pm->clock = NULL;
53 } else {
54 ret = clk_prepare_enable(pm->clock);
55 if (ret) {
56 mfc_err("Failed to enable MFC special clock\n");
57 goto err_s_clk;
58 }
59 } 47 }
60 } 48 }
61 49
@@ -65,10 +53,6 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
65 53
66 return 0; 54 return 0;
67 55
68err_s_clk:
69 clk_put(pm->clock);
70 pm->clock = NULL;
71err_p_ip_clk:
72 clk_put(pm->clock_gate); 56 clk_put(pm->clock_gate);
73 pm->clock_gate = NULL; 57 pm->clock_gate = NULL;
74err_g_ip_clk: 58err_g_ip_clk:
@@ -79,11 +63,9 @@ void s5p_mfc_final_pm(struct s5p_mfc_dev *dev)
79{ 63{
80 if (dev->variant->version != MFC_VERSION_V6 && 64 if (dev->variant->version != MFC_VERSION_V6 &&
81 pm->clock) { 65 pm->clock) {
82 clk_disable_unprepare(pm->clock);
83 clk_put(pm->clock); 66 clk_put(pm->clock);
84 pm->clock = NULL; 67 pm->clock = NULL;
85 } 68 }
86 clk_unprepare(pm->clock_gate);
87 clk_put(pm->clock_gate); 69 clk_put(pm->clock_gate);
88 pm->clock_gate = NULL; 70 pm->clock_gate = NULL;
89 pm_runtime_disable(pm->device); 71 pm_runtime_disable(pm->device);
@@ -111,22 +93,44 @@ void s5p_mfc_clock_off(void)
111 93
112int s5p_mfc_power_on(void) 94int s5p_mfc_power_on(void)
113{ 95{
114 int ret = 0; 96 int ret;
115 97
116 ret = pm_runtime_get_sync(pm->device); 98 ret = pm_runtime_get_sync(pm->device);
117 if (ret) 99 if (ret)
118 return ret; 100 return ret;
119 101
120 if (!pm->use_clock_gating) 102 ret = clk_prepare_enable(pm->clock_gate);
121 ret = clk_enable(pm->clock_gate); 103 if (ret)
104 goto err_pm;
105
106 if (pm->clock) {
107 ret = clk_prepare_enable(pm->clock);
108 if (ret)
109 goto err_gate;
110 }
111
112 if (pm->use_clock_gating)
113 clk_disable(pm->clock_gate);
114 return 0;
115
116err_gate:
117 clk_disable_unprepare(pm->clock_gate);
118err_pm:
119 pm_runtime_put_sync(pm->device);
122 return ret; 120 return ret;
121
123} 122}
124 123
125int s5p_mfc_power_off(void) 124int s5p_mfc_power_off(void)
126{ 125{
127 if (!pm->use_clock_gating) 126 if (pm->clock)
128 clk_disable(pm->clock_gate); 127 clk_disable_unprepare(pm->clock);
128
129 if (pm->use_clock_gating)
130 clk_unprepare(pm->clock_gate);
131 else
132 clk_disable_unprepare(pm->clock_gate);
133
129 return pm_runtime_put_sync(pm->device); 134 return pm_runtime_put_sync(pm->device);
130} 135}
131 136
132