Linux Audio

Check our new training course

Yocto / OpenEmbedded training

Feb 10-13, 2025
Register
Loading...
  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
 14static 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
 30static 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
 88static 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
109static const struct hantro_irq sama5d4_irqs[] = {
110	{ "vdec", hantro_g1_irq },
111};
112
113static const char * const sama5d4_clk_names[] = { "vdec_clk" };
114
115const 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};
1