Commit | Line | Data |
---|---|---|
e9862118 SW |
1 | /* |
2 | * Copyright (c) 2014 MediaTek Inc. | |
3 | * Author: Shunli Wang <shunli.wang@mediatek.com> | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License version 2 as | |
7 | * published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | */ | |
14 | ||
15 | #include <linux/clk-provider.h> | |
16 | #include <linux/platform_device.h> | |
17 | ||
18 | #include "clk-mtk.h" | |
19 | #include "clk-gate.h" | |
20 | ||
21 | #include <dt-bindings/clock/mt2701-clk.h> | |
22 | ||
23 | static const struct mtk_gate_regs img_cg_regs = { | |
24 | .set_ofs = 0x0004, | |
25 | .clr_ofs = 0x0008, | |
26 | .sta_ofs = 0x0000, | |
27 | }; | |
28 | ||
29 | #define GATE_IMG(_id, _name, _parent, _shift) { \ | |
30 | .id = _id, \ | |
31 | .name = _name, \ | |
32 | .parent_name = _parent, \ | |
33 | .regs = &img_cg_regs, \ | |
34 | .shift = _shift, \ | |
35 | .ops = &mtk_clk_gate_ops_setclr, \ | |
36 | } | |
37 | ||
38 | static const struct mtk_gate img_clks[] = { | |
39 | GATE_IMG(CLK_IMG_SMI_COMM, "img_smi_comm", "mm_sel", 0), | |
40 | GATE_IMG(CLK_IMG_RESZ, "img_resz", "mm_sel", 1), | |
41 | GATE_IMG(CLK_IMG_JPGDEC_SMI, "img_jpgdec_smi", "mm_sel", 5), | |
42 | GATE_IMG(CLK_IMG_JPGDEC, "img_jpgdec", "mm_sel", 6), | |
43 | GATE_IMG(CLK_IMG_VENC_LT, "img_venc_lt", "mm_sel", 8), | |
44 | GATE_IMG(CLK_IMG_VENC, "img_venc", "mm_sel", 9), | |
45 | }; | |
46 | ||
47 | static const struct of_device_id of_match_clk_mt2701_img[] = { | |
48 | { .compatible = "mediatek,mt2701-imgsys", }, | |
49 | {} | |
50 | }; | |
51 | ||
52 | static int clk_mt2701_img_probe(struct platform_device *pdev) | |
53 | { | |
54 | struct clk_onecell_data *clk_data; | |
55 | int r; | |
56 | struct device_node *node = pdev->dev.of_node; | |
57 | ||
58 | clk_data = mtk_alloc_clk_data(CLK_IMG_NR); | |
59 | ||
60 | mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), | |
61 | clk_data); | |
62 | ||
63 | r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); | |
64 | if (r) | |
65 | dev_err(&pdev->dev, | |
66 | "could not register clock provider: %s: %d\n", | |
67 | pdev->name, r); | |
68 | ||
69 | return r; | |
70 | } | |
71 | ||
72 | static struct platform_driver clk_mt2701_img_drv = { | |
73 | .probe = clk_mt2701_img_probe, | |
74 | .driver = { | |
75 | .name = "clk-mt2701-img", | |
76 | .of_match_table = of_match_clk_mt2701_img, | |
77 | }, | |
78 | }; | |
79 | ||
80 | builtin_platform_driver(clk_mt2701_img_drv); |