|
@@ -21,6 +21,8 @@
|
|
|
#include "s5p_mfc_pm.h"
|
|
|
|
|
|
#define MFC_GATE_CLK_NAME "mfc"
|
|
|
+#define MFC_SCLK_NAME "sclk-mfc"
|
|
|
+#define MFC_SCLK_RATE (200 * 1000000)
|
|
|
|
|
|
#define CLK_DEBUG
|
|
|
|
|
@@ -50,6 +52,20 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
|
|
|
goto err_p_ip_clk;
|
|
|
}
|
|
|
|
|
|
+ if (dev->variant->version != MFC_VERSION_V6) {
|
|
|
+ pm->clock = clk_get(&dev->plat_dev->dev, MFC_SCLK_NAME);
|
|
|
+ if (IS_ERR(pm->clock)) {
|
|
|
+ mfc_info("Failed to get MFC special clock control\n");
|
|
|
+ } else {
|
|
|
+ clk_set_rate(pm->clock, MFC_SCLK_RATE);
|
|
|
+ ret = clk_prepare_enable(pm->clock);
|
|
|
+ if (ret) {
|
|
|
+ mfc_err("Failed to enable MFC special clock\n");
|
|
|
+ goto err_s_clk;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
atomic_set(&pm->power, 0);
|
|
|
#ifdef CONFIG_PM_RUNTIME
|
|
|
pm->device = &dev->plat_dev->dev;
|
|
@@ -59,6 +75,9 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev)
|
|
|
atomic_set(&clk_ref, 0);
|
|
|
#endif
|
|
|
return 0;
|
|
|
+
|
|
|
+err_s_clk:
|
|
|
+ clk_put(pm->clock);
|
|
|
err_p_ip_clk:
|
|
|
clk_put(pm->clock_gate);
|
|
|
err_g_ip_clk:
|
|
@@ -67,6 +86,11 @@ err_g_ip_clk:
|
|
|
|
|
|
void s5p_mfc_final_pm(struct s5p_mfc_dev *dev)
|
|
|
{
|
|
|
+ if (dev->variant->version != MFC_VERSION_V6 &&
|
|
|
+ pm->clock) {
|
|
|
+ clk_disable_unprepare(pm->clock);
|
|
|
+ clk_put(pm->clock);
|
|
|
+ }
|
|
|
clk_unprepare(pm->clock_gate);
|
|
|
clk_put(pm->clock_gate);
|
|
|
#ifdef CONFIG_PM_RUNTIME
|