1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Hantro VDEC driver |
4 | * |
5 | * Copyright (C) 2021 Collabora Ltd, Emil Velikov <emil.velikov@collabora.com> |
6 | */ |
7 | |
8 | #include "hantro.h" |
9 | |
10 | /* |
11 | * Supported formats. |
12 | */ |
13 | |
14 | static const struct hantro_fmt sama5d4_vdec_postproc_fmts[] = { |
15 | { |
16 | .fourcc = V4L2_PIX_FMT_YUYV, |
17 | .codec_mode = HANTRO_MODE_NONE, |
18 | .postprocessed = true, |
19 | .frmsize = { |
20 | .min_width = FMT_MIN_WIDTH, |
21 | .max_width = FMT_HD_WIDTH, |
22 | .step_width = MB_DIM, |
23 | .min_height = FMT_MIN_HEIGHT, |
24 | .max_height = FMT_HD_HEIGHT, |
25 | .step_height = MB_DIM, |
26 | }, |
27 | }, |
28 | }; |
29 | |
30 | static const struct hantro_fmt sama5d4_vdec_fmts[] = { |
31 | { |
32 | .fourcc = V4L2_PIX_FMT_NV12, |
33 | .codec_mode = HANTRO_MODE_NONE, |
34 | .frmsize = { |
35 | .min_width = FMT_MIN_WIDTH, |
36 | .max_width = FMT_HD_WIDTH, |
37 | .step_width = MB_DIM, |
38 | .min_height = FMT_MIN_HEIGHT, |
39 | .max_height = FMT_HD_HEIGHT, |
40 | .step_height = MB_DIM, |
41 | }, |
42 | }, |
43 | { |
44 | .fourcc = V4L2_PIX_FMT_MPEG2_SLICE, |
45 | .codec_mode = HANTRO_MODE_MPEG2_DEC, |
46 | .max_depth = 2, |
47 | .frmsize = { |
48 | .min_width = FMT_MIN_WIDTH, |
49 | .max_width = FMT_HD_WIDTH, |
50 | .step_width = MB_DIM, |
51 | .min_height = FMT_MIN_HEIGHT, |
52 | .max_height = FMT_HD_HEIGHT, |
53 | .step_height = MB_DIM, |
54 | }, |
55 | }, |
56 | { |
57 | .fourcc = V4L2_PIX_FMT_VP8_FRAME, |
58 | .codec_mode = HANTRO_MODE_VP8_DEC, |
59 | .max_depth = 2, |
60 | .frmsize = { |
61 | .min_width = FMT_MIN_WIDTH, |
62 | .max_width = FMT_HD_WIDTH, |
63 | .step_width = MB_DIM, |
64 | .min_height = FMT_MIN_HEIGHT, |
65 | .max_height = FMT_HD_HEIGHT, |
66 | .step_height = MB_DIM, |
67 | }, |
68 | }, |
69 | { |
70 | .fourcc = V4L2_PIX_FMT_H264_SLICE, |
71 | .codec_mode = HANTRO_MODE_H264_DEC, |
72 | .max_depth = 2, |
73 | .frmsize = { |
74 | .min_width = FMT_MIN_WIDTH, |
75 | .max_width = FMT_HD_WIDTH, |
76 | .step_width = MB_DIM, |
77 | .min_height = FMT_MIN_HEIGHT, |
78 | .max_height = FMT_HD_HEIGHT, |
79 | .step_height = MB_DIM, |
80 | }, |
81 | }, |
82 | }; |
83 | |
84 | /* |
85 | * Supported codec ops. |
86 | */ |
87 | |
88 | static const struct hantro_codec_ops sama5d4_vdec_codec_ops[] = { |
89 | [HANTRO_MODE_MPEG2_DEC] = { |
90 | .run = hantro_g1_mpeg2_dec_run, |
91 | .reset = hantro_g1_reset, |
92 | .init = hantro_mpeg2_dec_init, |
93 | .exit = hantro_mpeg2_dec_exit, |
94 | }, |
95 | [HANTRO_MODE_VP8_DEC] = { |
96 | .run = hantro_g1_vp8_dec_run, |
97 | .reset = hantro_g1_reset, |
98 | .init = hantro_vp8_dec_init, |
99 | .exit = hantro_vp8_dec_exit, |
100 | }, |
101 | [HANTRO_MODE_H264_DEC] = { |
102 | .run = hantro_g1_h264_dec_run, |
103 | .reset = hantro_g1_reset, |
104 | .init = hantro_h264_dec_init, |
105 | .exit = hantro_h264_dec_exit, |
106 | }, |
107 | }; |
108 | |
109 | static const struct hantro_irq sama5d4_irqs[] = { |
110 | { "vdec" , hantro_g1_irq }, |
111 | }; |
112 | |
113 | static const char * const sama5d4_clk_names[] = { "vdec_clk" }; |
114 | |
115 | const struct hantro_variant sama5d4_vdec_variant = { |
116 | .dec_fmts = sama5d4_vdec_fmts, |
117 | .num_dec_fmts = ARRAY_SIZE(sama5d4_vdec_fmts), |
118 | .postproc_fmts = sama5d4_vdec_postproc_fmts, |
119 | .num_postproc_fmts = ARRAY_SIZE(sama5d4_vdec_postproc_fmts), |
120 | .postproc_ops = &hantro_g1_postproc_ops, |
121 | .codec = HANTRO_MPEG2_DECODER | HANTRO_VP8_DECODER | |
122 | HANTRO_H264_DECODER, |
123 | .codec_ops = sama5d4_vdec_codec_ops, |
124 | .irqs = sama5d4_irqs, |
125 | .num_irqs = ARRAY_SIZE(sama5d4_irqs), |
126 | .clk_names = sama5d4_clk_names, |
127 | .num_clocks = ARRAY_SIZE(sama5d4_clk_names), |
128 | }; |
129 | |