@@ -15,6 +15,7 @@
#include <linux/of_platform.h>
#include <soc/mediatek/smi.h>
#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
#include "mtk_mdp_comp.h"
#include "mtk_mdp_core.h"
@@ -52,7 +53,7 @@ static const struct of_device_id mtk_mdp_comp_driver_dt_match[] = {
};
MODULE_DEVICE_TABLE(of, mtk_mdp_comp_driver_dt_match);
-void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp)
+void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp)
{
int i, err;
@@ -61,25 +62,31 @@ void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp)
if (err) {
enum mtk_mdp_comp_type comp_type =
(enum mtk_mdp_comp_type)
- of_device_get_match_data(dev);
- dev_err(dev,
+ of_device_get_match_data(comp->dev);
+ dev_err(comp->dev,
"failed to get larb, err %d. type:%d\n",
err, comp_type);
}
}
+ err = pm_runtime_get_sync(comp->dev);
+ if (err < 0)
+ dev_err(comp->dev,
+ "failed to runtime get, err %d.\n",
+ err);
+
for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
if (IS_ERR(comp->clk[i]))
continue;
err = clk_prepare_enable(comp->clk[i]);
if (err)
- dev_err(dev,
+ dev_err(comp->dev,
"failed to enable clock, err %d. i:%d\n",
err, i);
}
}
-void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp)
+void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
{
int i;
@@ -91,6 +98,8 @@ void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp)
if (comp->larb_dev)
mtk_smi_larb_put(comp->larb_dev);
+
+ pm_runtime_put_sync(comp->dev);
}
static int mtk_mdp_comp_bind(struct device *dev, struct device *master,
@@ -100,6 +109,7 @@ static int mtk_mdp_comp_bind(struct device *dev, struct device *master,
struct mtk_mdp_dev *mdp = data;
mtk_mdp_register_component(mdp, comp);
+ pm_runtime_enable(dev);
return 0;
}
@@ -110,6 +120,7 @@ static void mtk_mdp_comp_unbind(struct device *dev, struct device *master,
struct mtk_mdp_dev *mdp = data;
struct mtk_mdp_comp *comp = dev_get_drvdata(dev);
+ pm_runtime_disable(dev);
mtk_mdp_unregister_component(mdp, comp);
}
@@ -128,6 +139,7 @@ int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev)
(enum mtk_mdp_comp_type)of_device_get_match_data(dev);
INIT_LIST_HEAD(&comp->node);
+ comp->dev = dev;
for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
comp->clk[i] = of_clk_get(node, i);
@@ -12,18 +12,20 @@
* @node: list node to track sibing MDP components
* @clk: clocks required for component
* @larb_dev: SMI device required for component
+ * @dev: component's device
*/
struct mtk_mdp_comp {
struct list_head node;
struct clk *clk[2];
struct device *larb_dev;
+ struct device *dev;
};
int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev);
void mtk_mdp_comp_deinit(struct mtk_mdp_comp *comp);
-void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp);
-void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp);
+void mtk_mdp_comp_clock_on(struct mtk_mdp_comp *comp);
+void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp);
extern struct platform_driver mtk_mdp_component_driver;
@@ -52,20 +52,18 @@ MODULE_DEVICE_TABLE(of, mtk_mdp_of_ids);
static void mtk_mdp_clock_on(struct mtk_mdp_dev *mdp)
{
- struct device *dev = &mdp->pdev->dev;
struct mtk_mdp_comp *comp_node;
list_for_each_entry(comp_node, &mdp->comp_list, node)
- mtk_mdp_comp_clock_on(dev, comp_node);
+ mtk_mdp_comp_clock_on(comp_node);
}
static void mtk_mdp_clock_off(struct mtk_mdp_dev *mdp)
{
- struct device *dev = &mdp->pdev->dev;
struct mtk_mdp_comp *comp_node;
list_for_each_entry(comp_node, &mdp->comp_list, node)
- mtk_mdp_comp_clock_off(dev, comp_node);
+ mtk_mdp_comp_clock_off(comp_node);
}
static void mtk_mdp_wdt_worker(struct work_struct *work)