diff options
author | Marek Szyprowski <m.szyprowski@samsung.com> | 2016-11-16 04:04:56 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-11-30 06:20:39 -0500 |
commit | 741f4331d07fd670b9ebb5eeda18208b6eb2ba28 (patch) | |
tree | a189876a1fb8a1b0a28e82d62d7a07cb3530ae28 | |
parent | 387e08e2021022e764a235df6c1f0ed3d861f711 (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.c | 52 |
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 | ||
68 | err_s_clk: | ||
69 | clk_put(pm->clock); | ||
70 | pm->clock = NULL; | ||
71 | err_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; |
74 | err_g_ip_clk: | 58 | err_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 | ||
112 | int s5p_mfc_power_on(void) | 94 | int 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 | |||
116 | err_gate: | ||
117 | clk_disable_unprepare(pm->clock_gate); | ||
118 | err_pm: | ||
119 | pm_runtime_put_sync(pm->device); | ||
122 | return ret; | 120 | return ret; |
121 | |||
123 | } | 122 | } |
124 | 123 | ||
125 | int s5p_mfc_power_off(void) | 124 | int 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 | |||