GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / media / platform / verisilicon / sama5d4_vdec_hw.c
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 };