GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / platform / mediatek / mdp / mtk_mdp_comp.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2016 MediaTek Inc.
4  * Author: Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
5  */
6
7 #include <linux/clk.h>
8 #include <linux/device.h>
9 #include <linux/of.h>
10
11 #include "mtk_mdp_comp.h"
12
13
14 void mtk_mdp_comp_clock_on(struct device *dev, struct mtk_mdp_comp *comp)
15 {
16         int i, err;
17
18         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
19                 if (IS_ERR(comp->clk[i]))
20                         continue;
21                 err = clk_prepare_enable(comp->clk[i]);
22                 if (err)
23                         dev_err(dev,
24                         "failed to enable clock, err %d. type:%d i:%d\n",
25                                 err, comp->type, i);
26         }
27 }
28
29 void mtk_mdp_comp_clock_off(struct device *dev, struct mtk_mdp_comp *comp)
30 {
31         int i;
32
33         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
34                 if (IS_ERR(comp->clk[i]))
35                         continue;
36                 clk_disable_unprepare(comp->clk[i]);
37         }
38 }
39
40 int mtk_mdp_comp_init(struct device *dev, struct device_node *node,
41                       struct mtk_mdp_comp *comp,
42                       enum mtk_mdp_comp_type comp_type)
43 {
44         int ret;
45         int i;
46
47         comp->dev_node = of_node_get(node);
48         comp->type = comp_type;
49
50         for (i = 0; i < ARRAY_SIZE(comp->clk); i++) {
51                 comp->clk[i] = of_clk_get(node, i);
52                 if (IS_ERR(comp->clk[i])) {
53                         ret = dev_err_probe(dev, PTR_ERR(comp->clk[i]),
54                                             "Failed to get clock\n");
55                         goto put_dev;
56                 }
57
58                 /* Only RDMA needs two clocks */
59                 if (comp->type != MTK_MDP_RDMA)
60                         break;
61         }
62
63         return 0;
64
65 put_dev:
66         of_node_put(comp->dev_node);
67
68         return ret;
69 }
70
71 void mtk_mdp_comp_deinit(struct device *dev, struct mtk_mdp_comp *comp)
72 {
73         of_node_put(comp->dev_node);
74 }