2 * linux/drivers/media/video/s5p-mfc/s5p_mfc_pm.c
4 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
13 #include <linux/clk.h>
14 #include <linux/err.h>
15 #include <linux/platform_device.h>
16 #ifdef CONFIG_PM_RUNTIME
17 #include <linux/pm_runtime.h>
19 #include "s5p_mfc_common.h"
20 #include "s5p_mfc_debug.h"
21 #include "s5p_mfc_pm.h"
23 #define MFC_CLKNAME "sclk_mfc"
24 #define MFC_GATE_CLK_NAME "mfc"
28 static struct s5p_mfc_pm
*pm
;
29 static struct s5p_mfc_dev
*p_dev
;
35 int s5p_mfc_init_pm(struct s5p_mfc_dev
*dev
)
41 pm
->clock_gate
= clk_get(&dev
->plat_dev
->dev
, MFC_GATE_CLK_NAME
);
42 if (IS_ERR(pm
->clock_gate
)) {
43 mfc_err("Failed to get clock-gating control\n");
47 pm
->clock
= clk_get(&dev
->plat_dev
->dev
, MFC_CLKNAME
);
48 if (IS_ERR(pm
->clock
)) {
49 mfc_err("Failed to get MFC clock\n");
53 atomic_set(&pm
->power
, 0);
54 #ifdef CONFIG_PM_RUNTIME
55 pm
->device
= &dev
->plat_dev
->dev
;
56 pm_runtime_enable(pm
->device
);
59 atomic_set(&clk_ref
, 0);
63 clk_put(pm
->clock_gate
);
68 void s5p_mfc_final_pm(struct s5p_mfc_dev
*dev
)
70 clk_put(pm
->clock_gate
);
72 #ifdef CONFIG_PM_RUNTIME
73 pm_runtime_disable(pm
->device
);
77 int s5p_mfc_clock_on(void)
82 mfc_debug(3, "+ %d", atomic_read(&clk_ref
));
84 ret
= clk_enable(pm
->clock_gate
);
88 void s5p_mfc_clock_off(void)
92 mfc_debug(3, "- %d", atomic_read(&clk_ref
));
94 clk_disable(pm
->clock_gate
);
97 int s5p_mfc_power_on(void)
99 #ifdef CONFIG_PM_RUNTIME
100 return pm_runtime_get_sync(pm
->device
);
102 atomic_set(&pm
->power
, 1);
107 int s5p_mfc_power_off(void)
109 #ifdef CONFIG_PM_RUNTIME
110 return pm_runtime_put_sync(pm
->device
);
112 atomic_set(&pm
->power
, 0);