File Index
Files and directories
Sign in
FILE

clk-mt8196-vdec.c

File preview with syntax highlighting.

linux-6.19.14/drivers/clk/mediatek/clk-mt8196-vdec.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright (c) 2025 MediaTek Inc.
  4 *                    Guangjie Song <guangjie.song@mediatek.com>
  5 * Copyright (c) 2025 Collabora Ltd.
  6 *                    Laura Nao <laura.nao@collabora.com>
  7 */
  8#include <dt-bindings/clock/mediatek,mt8196-clock.h>
  9
 10#include <linux/clk-provider.h>
 11#include <linux/module.h>
 12#include <linux/of_device.h>
 13#include <linux/platform_device.h>
 14
 15#include "clk-gate.h"
 16#include "clk-mtk.h"
 17
 18static const struct mtk_gate_regs vde20_cg_regs = {
 19	.set_ofs = 0x0,
 20	.clr_ofs = 0x4,
 21	.sta_ofs = 0x0,
 22};
 23
 24static const struct mtk_gate_regs vde20_hwv_regs = {
 25	.set_ofs = 0x0088,
 26	.clr_ofs = 0x008c,
 27	.sta_ofs = 0x2c44,
 28};
 29
 30static const struct mtk_gate_regs vde21_cg_regs = {
 31	.set_ofs = 0x200,
 32	.clr_ofs = 0x204,
 33	.sta_ofs = 0x200,
 34};
 35
 36static const struct mtk_gate_regs vde21_hwv_regs = {
 37	.set_ofs = 0x0080,
 38	.clr_ofs = 0x0084,
 39	.sta_ofs = 0x2c40,
 40};
 41
 42static const struct mtk_gate_regs vde22_cg_regs = {
 43	.set_ofs = 0x8,
 44	.clr_ofs = 0xc,
 45	.sta_ofs = 0x8,
 46};
 47
 48static const struct mtk_gate_regs vde22_hwv_regs = {
 49	.set_ofs = 0x0078,
 50	.clr_ofs = 0x007c,
 51	.sta_ofs = 0x2c3c,
 52};
 53
 54#define GATE_HWV_VDE20(_id, _name, _parent, _shift) {	\
 55		.id = _id,				\
 56		.name = _name,				\
 57		.parent_name = _parent,			\
 58		.regs = &vde20_cg_regs,			\
 59		.hwv_regs = &vde20_hwv_regs,		\
 60		.shift = _shift,			\
 61		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
 62		.flags = CLK_OPS_PARENT_ENABLE,		\
 63	}
 64
 65#define GATE_HWV_VDE21(_id, _name, _parent, _shift) {	\
 66		.id = _id,				\
 67		.name = _name,				\
 68		.parent_name = _parent,			\
 69		.regs = &vde21_cg_regs,			\
 70		.hwv_regs = &vde21_hwv_regs,		\
 71		.shift = _shift,			\
 72		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
 73		.flags = CLK_OPS_PARENT_ENABLE,		\
 74	}
 75
 76#define GATE_HWV_VDE22(_id, _name, _parent, _shift) {	\
 77		.id = _id,				\
 78		.name = _name,				\
 79		.parent_name = _parent,			\
 80		.regs = &vde22_cg_regs,			\
 81		.hwv_regs = &vde22_hwv_regs,		\
 82		.shift = _shift,			\
 83		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
 84		.flags = CLK_OPS_PARENT_ENABLE |	\
 85			 CLK_IGNORE_UNUSED,		\
 86	}
 87
 88static const struct mtk_gate vde2_clks[] = {
 89	/* VDE20 */
 90	GATE_HWV_VDE20(CLK_VDE2_VDEC_CKEN, "vde2_vdec_cken", "vdec", 0),
 91	GATE_HWV_VDE20(CLK_VDE2_VDEC_ACTIVE, "vde2_vdec_active", "vdec", 4),
 92	GATE_HWV_VDE20(CLK_VDE2_VDEC_CKEN_ENG, "vde2_vdec_cken_eng", "vdec", 8),
 93	/* VDE21 */
 94	GATE_HWV_VDE21(CLK_VDE2_LAT_CKEN, "vde2_lat_cken", "vdec", 0),
 95	GATE_HWV_VDE21(CLK_VDE2_LAT_ACTIVE, "vde2_lat_active", "vdec", 4),
 96	GATE_HWV_VDE21(CLK_VDE2_LAT_CKEN_ENG, "vde2_lat_cken_eng", "vdec", 8),
 97	/* VDE22 */
 98	GATE_HWV_VDE22(CLK_VDE2_LARB1_CKEN, "vde2_larb1_cken", "vdec", 0),
 99};
100
101static const struct mtk_clk_desc vde2_mcd = {
102	.clks = vde2_clks,
103	.num_clks = ARRAY_SIZE(vde2_clks),
104	.need_runtime_pm = true,
105};
106
107static const struct mtk_gate_regs vde10_hwv_regs = {
108	.set_ofs = 0x00a0,
109	.clr_ofs = 0x00a4,
110	.sta_ofs = 0x2c50,
111};
112
113static const struct mtk_gate_regs vde11_cg_regs = {
114	.set_ofs = 0x1e0,
115	.clr_ofs = 0x1e0,
116	.sta_ofs = 0x1e0,
117};
118
119static const struct mtk_gate_regs vde11_hwv_regs = {
120	.set_ofs = 0x00b0,
121	.clr_ofs = 0x00b4,
122	.sta_ofs = 0x2c58,
123};
124
125static const struct mtk_gate_regs vde12_cg_regs = {
126	.set_ofs = 0x1ec,
127	.clr_ofs = 0x1ec,
128	.sta_ofs = 0x1ec,
129};
130
131static const struct mtk_gate_regs vde12_hwv_regs = {
132	.set_ofs = 0x00a8,
133	.clr_ofs = 0x00ac,
134	.sta_ofs = 0x2c54,
135};
136
137static const struct mtk_gate_regs vde13_cg_regs = {
138	.set_ofs = 0x200,
139	.clr_ofs = 0x204,
140	.sta_ofs = 0x200,
141};
142
143static const struct mtk_gate_regs vde13_hwv_regs = {
144	.set_ofs = 0x0098,
145	.clr_ofs = 0x009c,
146	.sta_ofs = 0x2c4c,
147};
148
149static const struct mtk_gate_regs vde14_hwv_regs = {
150	.set_ofs = 0x0090,
151	.clr_ofs = 0x0094,
152	.sta_ofs = 0x2c48,
153};
154
155#define GATE_HWV_VDE10(_id, _name, _parent, _shift) {	\
156		.id = _id,				\
157		.name = _name,				\
158		.parent_name = _parent,			\
159		.regs = &vde20_cg_regs,			\
160		.hwv_regs = &vde10_hwv_regs,		\
161		.shift = _shift,			\
162		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
163		.flags = CLK_OPS_PARENT_ENABLE,		\
164	}
165
166#define GATE_HWV_VDE11(_id, _name, _parent, _shift) {		\
167		.id = _id,					\
168		.name = _name,					\
169		.parent_name = _parent,				\
170		.regs = &vde11_cg_regs,				\
171		.hwv_regs = &vde11_hwv_regs,			\
172		.shift = _shift,				\
173		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,	\
174		.flags = CLK_OPS_PARENT_ENABLE,			\
175	}
176
177#define GATE_HWV_VDE12(_id, _name, _parent, _shift) {		\
178		.id = _id,					\
179		.name = _name,					\
180		.parent_name = _parent,				\
181		.regs = &vde12_cg_regs,				\
182		.hwv_regs = &vde12_hwv_regs,			\
183		.shift = _shift,				\
184		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,	\
185		.flags = CLK_OPS_PARENT_ENABLE			\
186	}
187
188#define GATE_HWV_VDE13(_id, _name, _parent, _shift) {	\
189		.id = _id,				\
190		.name = _name,				\
191		.parent_name = _parent,			\
192		.regs = &vde13_cg_regs,			\
193		.hwv_regs = &vde13_hwv_regs,		\
194		.shift = _shift,			\
195		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
196		.flags = CLK_OPS_PARENT_ENABLE,		\
197	}
198
199#define GATE_HWV_VDE14(_id, _name, _parent, _shift) {	\
200		.id = _id,				\
201		.name = _name,				\
202		.parent_name = _parent,			\
203		.regs = &vde22_cg_regs,			\
204		.hwv_regs = &vde14_hwv_regs,		\
205		.shift = _shift,			\
206		.ops = &mtk_clk_gate_hwv_ops_setclr_inv,\
207		.flags = CLK_OPS_PARENT_ENABLE |	\
208			 CLK_IGNORE_UNUSED,		\
209	}
210
211static const struct mtk_gate vde1_clks[] = {
212	/* VDE10 */
213	GATE_HWV_VDE10(CLK_VDE1_VDEC_CKEN, "vde1_vdec_cken", "vdec", 0),
214	GATE_HWV_VDE10(CLK_VDE1_VDEC_ACTIVE, "vde1_vdec_active", "vdec", 4),
215	GATE_HWV_VDE10(CLK_VDE1_VDEC_CKEN_ENG, "vde1_vdec_cken_eng", "vdec", 8),
216	/* VDE11 */
217	GATE_HWV_VDE11(CLK_VDE1_VDEC_SOC_IPS_EN, "vde1_vdec_soc_ips_en", "vdec", 0),
218	/* VDE12 */
219	GATE_HWV_VDE12(CLK_VDE1_VDEC_SOC_APTV_EN, "vde1_aptv_en", "ck_tck_26m_mx9_ck", 0),
220	GATE_HWV_VDE12(CLK_VDE1_VDEC_SOC_APTV_TOP_EN, "vde1_aptv_topen", "ck_tck_26m_mx9_ck", 1),
221	/* VDE13 */
222	GATE_HWV_VDE13(CLK_VDE1_LAT_CKEN, "vde1_lat_cken", "vdec", 0),
223	GATE_HWV_VDE13(CLK_VDE1_LAT_ACTIVE, "vde1_lat_active", "vdec", 4),
224	GATE_HWV_VDE13(CLK_VDE1_LAT_CKEN_ENG, "vde1_lat_cken_eng", "vdec", 8),
225	/* VDE14 */
226	GATE_HWV_VDE14(CLK_VDE1_LARB1_CKEN, "vde1_larb1_cken", "vdec", 0),
227};
228
229static const struct mtk_clk_desc vde1_mcd = {
230	.clks = vde1_clks,
231	.num_clks = ARRAY_SIZE(vde1_clks),
232	.need_runtime_pm = true,
233};
234
235static const struct of_device_id of_match_clk_mt8196_vdec[] = {
236	{ .compatible = "mediatek,mt8196-vdecsys", .data = &vde2_mcd },
237	{ .compatible = "mediatek,mt8196-vdecsys-soc", .data = &vde1_mcd },
238	{ /* sentinel */ }
239};
240MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_vdec);
241
242static struct platform_driver clk_mt8196_vdec_drv = {
243	.probe = mtk_clk_simple_probe,
244	.remove = mtk_clk_simple_remove,
245	.driver = {
246		.name = "clk-mt8196-vdec",
247		.of_match_table = of_match_clk_mt8196_vdec,
248	},
249};
250module_platform_driver(clk_mt8196_vdec_drv);
251
252MODULE_DESCRIPTION("MediaTek MT8196 Video Decoders clocks driver");
253MODULE_LICENSE("GPL");
~/ Read-only file preview.