mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
media: rkvdec: Add variants support
Different versions of the Rockchip VDEC IP exists and one way they can differ is what decoding formats are supported. Add a variant implementation in order to support flagging different capabilities. Signed-off-by: Alex Bee <knaerzche@gmail.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Tested-by: Diederik de Haas <didi.debian@cknow.org> # Rock64, RockPro64, Quartz64-B, NanoPi R5S Tested-by: Detlev Casanova <detlev.casanova@collabora.com> # RK3399 Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
parent
3595375c23
commit
603bf462ad
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/iommu.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
|
@ -327,6 +328,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|||
.ops = &rkvdec_hevc_fmt_ops,
|
||||
.num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts),
|
||||
.decoded_fmts = rkvdec_hevc_decoded_fmts,
|
||||
.capability = RKVDEC_CAPABILITY_HEVC,
|
||||
},
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_H264_SLICE,
|
||||
|
|
@ -343,6 +345,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|||
.num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_decoded_fmts),
|
||||
.decoded_fmts = rkvdec_h264_decoded_fmts,
|
||||
.subsystem_flags = VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF,
|
||||
.capability = RKVDEC_CAPABILITY_H264,
|
||||
},
|
||||
{
|
||||
.fourcc = V4L2_PIX_FMT_VP9_FRAME,
|
||||
|
|
@ -358,6 +361,7 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = {
|
|||
.ops = &rkvdec_vp9_fmt_ops,
|
||||
.num_decoded_fmts = ARRAY_SIZE(rkvdec_vp9_decoded_fmts),
|
||||
.decoded_fmts = rkvdec_vp9_decoded_fmts,
|
||||
.capability = RKVDEC_CAPABILITY_VP9,
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -1185,8 +1189,18 @@ static void rkvdec_watchdog_func(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
|
||||
static const struct rkvdec_variant rk3399_rkvdec_variant = {
|
||||
.num_regs = 78,
|
||||
.capabilities = RKVDEC_CAPABILITY_HEVC |
|
||||
RKVDEC_CAPABILITY_H264 |
|
||||
RKVDEC_CAPABILITY_VP9,
|
||||
};
|
||||
|
||||
static const struct of_device_id of_rkvdec_match[] = {
|
||||
{ .compatible = "rockchip,rk3399-vdec" },
|
||||
{
|
||||
.compatible = "rockchip,rk3399-vdec",
|
||||
.data = &rk3399_rkvdec_variant,
|
||||
},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, of_rkvdec_match);
|
||||
|
|
@ -1197,16 +1211,22 @@ static const char * const rkvdec_clk_names[] = {
|
|||
|
||||
static int rkvdec_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct rkvdec_variant *variant;
|
||||
struct rkvdec_dev *rkvdec;
|
||||
unsigned int i;
|
||||
int ret, irq;
|
||||
|
||||
variant = of_device_get_match_data(&pdev->dev);
|
||||
if (!variant)
|
||||
return -EINVAL;
|
||||
|
||||
rkvdec = devm_kzalloc(&pdev->dev, sizeof(*rkvdec), GFP_KERNEL);
|
||||
if (!rkvdec)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, rkvdec);
|
||||
rkvdec->dev = &pdev->dev;
|
||||
rkvdec->variant = variant;
|
||||
mutex_init(&rkvdec->vdev_lock);
|
||||
INIT_DELAYED_WORK(&rkvdec->watchdog_work, rkvdec_watchdog_func);
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,10 @@
|
|||
#include <media/videobuf2-core.h>
|
||||
#include <media/videobuf2-dma-contig.h>
|
||||
|
||||
#define RKVDEC_CAPABILITY_HEVC BIT(0)
|
||||
#define RKVDEC_CAPABILITY_H264 BIT(1)
|
||||
#define RKVDEC_CAPABILITY_VP9 BIT(2)
|
||||
|
||||
struct rkvdec_ctx;
|
||||
|
||||
struct rkvdec_ctrl_desc {
|
||||
|
|
@ -63,6 +67,11 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf)
|
|||
base.vb.vb2_buf);
|
||||
}
|
||||
|
||||
struct rkvdec_variant {
|
||||
unsigned int num_regs;
|
||||
unsigned int capabilities;
|
||||
};
|
||||
|
||||
struct rkvdec_coded_fmt_ops {
|
||||
int (*adjust_fmt)(struct rkvdec_ctx *ctx,
|
||||
struct v4l2_format *f);
|
||||
|
|
@ -98,6 +107,7 @@ struct rkvdec_coded_fmt_desc {
|
|||
unsigned int num_decoded_fmts;
|
||||
const struct rkvdec_decoded_fmt_desc *decoded_fmts;
|
||||
u32 subsystem_flags;
|
||||
unsigned int capability;
|
||||
};
|
||||
|
||||
struct rkvdec_dev {
|
||||
|
|
@ -111,6 +121,7 @@ struct rkvdec_dev {
|
|||
struct mutex vdev_lock; /* serializes ioctls */
|
||||
struct delayed_work watchdog_work;
|
||||
struct iommu_domain *empty_domain;
|
||||
const struct rkvdec_variant *variant;
|
||||
};
|
||||
|
||||
struct rkvdec_ctx {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user