media: rockchip: vpss: refactor v_1 for rk3576

Signed-off-by: Mingwei Yan <mingwei.yan@rock-chips.com>
Change-Id: Iff2b7f690b9143807cb5135aa518804dbaf29614
This commit is contained in:
Mingwei Yan
2025-02-25 15:19:32 +08:00
committed by Tao Huang
parent a956e55572
commit 3f26cdc2d2
23 changed files with 5455 additions and 5035 deletions

View File

@@ -10,3 +10,11 @@ config VIDEO_ROCKCHIP_VPSS
default n
help
Support for VPSS on the rockchip SoC.
config VIDEO_ROCKCHIP_VPSS_V1
bool "vpss1 for rk3576"
depends on CPU_RK3576
depends on VIDEO_ROCKCHIP_VPSS
default y
help
Support for rk3576

View File

@@ -8,3 +8,7 @@ video_rkvpss-objs += hw.o \
stream.o \
procfs.o \
vpss_offline.o
video_rkvpss-$(CONFIG_VIDEO_ROCKCHIP_VPSS_V1) += \
stream_v1.o \
vpss_offline_v1.o

View File

@@ -1,13 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2023 Rockchip Electronics Co., Ltd. */
#include <linux/delay.h>
#include <linux/of_platform.h>
#include <linux/slab.h>
#include "vpss.h"
#include "common.h"
#include "stream.h"
#include "dev.h"
#include "regs.h"
#include "vpss_offline.h"
#include "hw.h"
#include "procfs.h"
#include "regs_v1.h"
void rkvpss_idx_write(struct rkvpss_device *dev, u32 reg, u32 val, int idx)
@@ -105,7 +106,7 @@ void rkvpss_update_regs(struct rkvpss_device *dev, u32 start, u32 end)
if (i == RKVPSS_VPSS_ONLINE) {
u32 mask = 0;
for (j = 0; j < RKVPSS_OUTPUT_MAX; j++) {
for (j = 0; j < vpss_outchn_max(hw->vpss_ver); j++) {
if (!hw->is_ofl_ch[j])
continue;
mask |= (RKVPSS_ISP2VPSS_CHN0_SEL(3) << j * 2);

View File

@@ -12,6 +12,9 @@
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/videobuf2-v4l2.h>
#include <linux/delay.h>
#include <linux/of_platform.h>
#include <linux/slab.h>
#include "../isp/isp_vpss.h"
#include <linux/rk-camera-module.h>
@@ -88,6 +91,14 @@ static inline struct vb2_queue *to_vb2_queue(struct file *file)
return &vnode->buf_queue;
}
static inline int vpss_outchn_max(int version)
{
if (version == VPSS_V10)
return 4;
return 0;
}
extern int rkvpss_debug;
extern struct platform_driver rkvpss_plat_drv;
extern int rkvpss_cfginfo_num;

View File

@@ -1,23 +1,15 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2023 Rockchip Electronics Co., Ltd. */
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/regmap.h>
#include <media/v4l2-fwnode.h>
#include "vpss.h"
#include "common.h"
#include "stream.h"
#include "dev.h"
#include "regs.h"
#include "vpss_offline.h"
#include "hw.h"
#include "procfs.h"
#include "regs_v1.h"
#include "version.h"
#define RKVPSS_VERNO_LEN 10
@@ -34,6 +26,14 @@ static char rkvpss_version[RKVPSS_VERNO_LEN];
module_param_string(version, rkvpss_version, RKVPSS_VERNO_LEN, 0444);
MODULE_PARM_DESC(version, "version number");
static unsigned int rkvpss_wrap_line;
module_param_named(wrap_line, rkvpss_wrap_line, uint, 0644);
MODULE_PARM_DESC(wrap_line, "rkvpss wrap line");
char rkvpss_regfile[RKVPSS_REGFILE_LEN];
module_param_string(reg_file, rkvpss_regfile, RKVPSS_REGFILE_LEN, 0644);
MODULE_PARM_DESC(reg_file, "dump reg file");
int rkvpss_cfginfo_num = 5;
static int rkvpss_get_cfginfo_num(const char *val, const struct kernel_param *kp)
@@ -72,7 +72,7 @@ void rkvpss_pipeline_default_fmt(struct rkvpss_device *dev)
w = dev->vpss_sdev.out_fmt.width;
h = dev->vpss_sdev.out_fmt.height;
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++)
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++)
rkvpss_stream_default_fmt(dev, i, w, h, V4L2_PIX_FMT_NV12);
}
@@ -134,7 +134,7 @@ static int rkvpss_create_links(struct rkvpss_device *dev)
struct media_entity *source, *sink;
struct rkvpss_stream *stream;
unsigned int flags = 0;
int ret;
int ret, i;
if (!dev->remote_sd)
return -EINVAL;
@@ -152,33 +152,14 @@ static int rkvpss_create_links(struct rkvpss_device *dev)
flags = MEDIA_LNK_FL_ENABLED;
source = &dev->vpss_sdev.sd.entity;
stream = &stream_vdev->stream[RKVPSS_OUTPUT_CH0];
stream->linked = flags;
sink = &stream->vnode.vdev.entity;
ret = media_create_pad_link(source, RKVPSS_PAD_SOURCE, sink, 0, flags);
if (ret < 0)
goto end;
stream = &stream_vdev->stream[RKVPSS_OUTPUT_CH1];
stream->linked = flags;
sink = &stream->vnode.vdev.entity;
ret = media_create_pad_link(source, RKVPSS_PAD_SOURCE, sink, 0, flags);
if (ret < 0)
goto end;
stream = &stream_vdev->stream[RKVPSS_OUTPUT_CH2];
stream->linked = flags;
sink = &stream->vnode.vdev.entity;
ret = media_create_pad_link(source, RKVPSS_PAD_SOURCE, sink, 0, flags);
if (ret < 0)
goto end;
stream = &stream_vdev->stream[RKVPSS_OUTPUT_CH3];
stream->linked = flags;
sink = &stream->vnode.vdev.entity;
ret = media_create_pad_link(source, RKVPSS_PAD_SOURCE, sink, 0, flags);
if (ret < 0)
goto end;
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++) {
stream = &stream_vdev->stream[i];
stream->linked = flags;
sink = &stream->vnode.vdev.entity;
ret = media_create_pad_link(source, RKVPSS_PAD_SOURCE, sink, 0, flags);
if (ret < 0)
goto end;
}
end:
return ret;

View File

@@ -4,12 +4,20 @@
#ifndef _RKVPSS_DEV_H
#define _RKVPSS_DEV_H
#include <linux/rk-vpss-config.h>
#include "hw.h"
#include "procfs.h"
#include "stream.h"
#include "vpss.h"
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/regmap.h>
#include <media/v4l2-fwnode.h>
#define DRIVER_NAME "rkvpss"
#define S0_VDEV_NAME DRIVER_NAME "_scale0"
@@ -17,6 +25,8 @@
#define S2_VDEV_NAME DRIVER_NAME "_scale2"
#define S3_VDEV_NAME DRIVER_NAME "_scale3"
#define RKVPSS_REGFILE_LEN 50
enum rkvpss_input {
INP_INVAL = 0,
INP_ISP,
@@ -59,6 +69,7 @@ struct rkvpss_device {
atomic_t pipe_stream_cnt;
spinlock_t cmsc_lock;
spinlock_t idle_lock;
struct rkvpss_cmsc_cfg cmsc_cfg;
enum rkvpss_ver vpss_ver;

View File

@@ -1,27 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2023 Rockchip Electronics Co., Ltd. */
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iommu.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <media/videobuf2-cma-sg.h>
#include <media/videobuf2-dma-sg.h>
#include <soc/rockchip/rockchip_iommu.h>
#include "vpss.h"
#include "common.h"
#include "stream.h"
#include "dev.h"
#include "vpss_offline.h"
#include "hw.h"
#include "regs.h"
#include "procfs.h"
#include "regs_v1.h"
struct irqs_data {
const char *name;
@@ -895,7 +882,7 @@ static int rkvpss_hw_probe(struct platform_device *pdev)
spin_lock_init(&hw_dev->reg_lock);
atomic_set(&hw_dev->refcnt, 0);
INIT_LIST_HEAD(&hw_dev->list);
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++)
for (i = 0; i < vpss_outchn_max(hw_dev->vpss_ver); i++)
hw_dev->is_ofl_ch[i] = false;
hw_dev->is_ofl_cmsc = false;
hw_dev->is_single = true;

View File

@@ -4,8 +4,22 @@
#ifndef _RKVPSS_HW_H
#define _RKVPSS_HW_H
#include "common.h"
#include "vpss_offline.h"
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iommu.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_graph.h>
#include <linux/of_platform.h>
#include <linux/of_reserved_mem.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <media/videobuf2-cma-sg.h>
#include <media/videobuf2-dma-sg.h>
#include <soc/rockchip/rockchip_iommu.h>
#define VPSS_MAX_BUS_CLK 4
#define VPSS_MAX_DEV 8

View File

@@ -1,14 +1,15 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) Rockchip Electronics Co., Ltd. */
#include <linux/clk.h>
#include <linux/proc_fs.h>
#include <linux/sem.h>
#include <linux/seq_file.h>
#include <media/v4l2-common.h>
#include "vpss.h"
#include "common.h"
#include "stream.h"
#include "dev.h"
#include "vpss_offline.h"
#include "hw.h"
#include "procfs.h"
#include "regs.h"
#include "regs_v1.h"
#include "version.h"
#ifdef CONFIG_PROC_FS
@@ -27,7 +28,7 @@ static void show_hw(struct seq_file *p, struct rkvpss_hw_dev *hw)
val = rkvpss_hw_read(hw, RKVPSS_VPSS_CTRL);
seq_printf(p, "\tmirror:%s(0x%x)\n", (val & 0x10) ? "ON" : "OFF", val);
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(hw->vpss_ver); i++) {
seq_printf(p, "\toutput[%d]", i);
val = rkvpss_hw_read(hw, RKVPSS_CMSC_CTRL);
mask = RKVPSS_CMSC_CHN_EN(i);
@@ -90,7 +91,7 @@ static int vpss_show(struct seq_file *p, void *v)
vpss_sdev->in_fmt.width, vpss_sdev->in_fmt.height);
seq_printf(p, "is_ofl_cmsc:%d\n", hw->is_ofl_cmsc);
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(hw->vpss_ver); i++) {
stream = &dev->stream_vdev.stream[i];
if (hw->is_ofl_ch[i] || !stream->streaming) {
seq_printf(p, "is_ofl_ch[%d]:%d OFF\n", i, hw->is_ofl_ch[i]);
@@ -109,7 +110,7 @@ static int vpss_show(struct seq_file *p, void *v)
stream->crop.height,
stream->out_fmt.width,
stream->out_fmt.height);
seq_printf(p, "\tframe_cnt:%d rate:%dms delay:%dms frameloss:%d buf_cnt:%d\n",
seq_printf(p, "\tsequence:%d rate:%dms delay:%dms frameloss:%d buf_cnt:%d\n",
stream->dbg.id,
stream->dbg.interval / 1000 / 1000,
stream->dbg.delay / 1000 / 1000,
@@ -194,7 +195,7 @@ static int offline_vpss_show(struct seq_file *p, void *v)
cfginfo->input.height);
seq_printf(p, "%-10s\n", "Output");
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(hw->vpss_ver); i++) {
if (!ofl->hw->is_ofl_ch[i] || !cfginfo->output[i].enable) {
seq_printf(p, "\tch[%d] OFF is_ofl_ch[%d]:%d output[%d].enable:%d\n",
i, i, ofl->hw->is_ofl_ch[i], i,

View File

@@ -4,6 +4,12 @@
#ifndef _RKVPSS_PROCFS_H
#define _RKVPSS_PROCFS_H
#include <linux/clk.h>
#include <linux/proc_fs.h>
#include <linux/sem.h>
#include <linux/seq_file.h>
#include <media/v4l2-common.h>
#ifdef CONFIG_PROC_FS
int rkvpss_proc_init(struct rkvpss_device *dev);
void rkvpss_proc_cleanup(struct rkvpss_device *dev);

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,23 @@
#ifndef _RKVPSS_STREAM_H
#define _RKVPSS_STREAM_H
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <media/v4l2-common.h>
#include <media/v4l2-event.h>
#include <media/v4l2-fh.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-mc.h>
#include <media/v4l2-subdev.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-dma-sg.h>
#include <uapi/linux/rk-video-format.h>
#include <linux/interrupt.h>
#include "common.h"
#define STREAM_OUT_REQ_BUFS_MIN 0
struct rkvpss_stream;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2025 Rockchip Electronics Co., Ltd. */
#ifndef _RKVPSS_STREAM_V1_H
#define _RKVPSS_STREAM_V1_H
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <media/v4l2-common.h>
#include <media/v4l2-event.h>
#include <media/v4l2-fh.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-mc.h>
#include <media/v4l2-subdev.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-dma-sg.h>
#include <uapi/linux/rk-video-format.h>
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_VPSS_V1)
int rkvpss_register_stream_vdevs_v1(struct rkvpss_device *dev);
void rkvpss_unregister_stream_vdevs_v1(struct rkvpss_device *dev);
void rkvpss_stream_default_fmt_v1(struct rkvpss_device *dev, u32 id,
u32 width, u32 height, u32 pixelformat);
void rkvpss_isr_v1(struct rkvpss_device *dev, u32 mis_val);
void rkvpss_mi_isr_v1(struct rkvpss_device *dev, u32 mis_val);
void rkvpss_cmsc_config_v1(struct rkvpss_device *dev, bool sync);
int rkvpss_stream_buf_cnt_v1(struct rkvpss_stream *stream);
#else
static inline int rkvpss_register_stream_vdevs_v1(struct rkvpss_device *dev) {return -EINVAL; }
static inline void rkvpss_unregister_stream_vdevs_v1(struct rkvpss_device *dev) {}
static inline void rkvpss_stream_default_fmt_v1(struct rkvpss_device *dev, u32 id, u32 width, u32 height, u32 pixelformat) {}
static inline void rkvpss_isr_v1(struct rkvpss_device *dev, u32 mis_val) {}
static inline void rkvpss_mi_isr_v1(struct rkvpss_device *dev, u32 mis_val) {}
static inline void rkvpss_cmsc_config_v1(struct rkvpss_device *dev, bool sync) {}
static inline int rkvpss_stream_buf_cnt_v1(struct rkvpss_stream *stream) {return -EINVAL; }
#endif
#endif

View File

@@ -4,7 +4,6 @@
#ifndef _RKVPSS_VERSION_H
#define _RKVPSS_VERSION_H
#include <linux/version.h>
#include <linux/rk-vpss-config.h>
/*
* RKVPSS DRIVER VERSION NOTE

View File

@@ -1,16 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2023 Rockchip Electronics Co., Ltd. */
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/iommu.h>
#include <linux/pm_runtime.h>
#include <linux/videodev2.h>
#include <media/media-entity.h>
#include <media/v4l2-event.h>
#include "vpss.h"
#include "common.h"
#include "stream.h"
#include "dev.h"
#include "regs.h"
#include "vpss_offline.h"
#include "hw.h"
#include "procfs.h"
#include "regs_v1.h"
static const struct vpsssd_fmt rkvpss_formats[] = {
{
@@ -19,6 +17,22 @@ static const struct vpsssd_fmt rkvpss_formats[] = {
},
};
static inline const char *s_dev_name(int i)
{
switch (i) {
case 0:
return S0_VDEV_NAME;
case 1:
return S1_VDEV_NAME;
case 2:
return S2_VDEV_NAME;
case 3:
return S3_VDEV_NAME;
default:
return S0_VDEV_NAME;
}
}
static int rkvpss_subdev_link_setup(struct media_entity *entity,
const struct media_pad *local,
const struct media_pad *remote,
@@ -29,6 +43,7 @@ static int rkvpss_subdev_link_setup(struct media_entity *entity,
struct rkvpss_device *dev;
struct rkvpss_stream_vdev *vdev;
struct rkvpss_stream *stream = NULL;
int i;
if (local->index != RKVPSS_PAD_SINK &&
local->index != RKVPSS_PAD_SOURCE)
@@ -46,22 +61,23 @@ static int rkvpss_subdev_link_setup(struct media_entity *entity,
if (vpss_sdev->state & VPSS_START)
return -EBUSY;
if (!strcmp(remote->entity->name, S0_VDEV_NAME)) {
stream = &vdev->stream[RKVPSS_OUTPUT_CH0];
} else if (!strcmp(remote->entity->name, S1_VDEV_NAME)) {
stream = &vdev->stream[RKVPSS_OUTPUT_CH1];
} else if (!strcmp(remote->entity->name, S2_VDEV_NAME)) {
stream = &vdev->stream[RKVPSS_OUTPUT_CH2];
} else if (!strcmp(remote->entity->name, S3_VDEV_NAME)) {
stream = &vdev->stream[RKVPSS_OUTPUT_CH3];
} else if (strstr(remote->entity->name, "rkisp")) {
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++) {
if (!strcmp(remote->entity->name, s_dev_name(i))) {
stream = &vdev->stream[i];
break;
}
}
if (stream)
stream->linked = flags & MEDIA_LNK_FL_ENABLED;
if (strstr(remote->entity->name, "rkisp")) {
if (flags & MEDIA_LNK_FL_ENABLED)
dev->inp = INP_ISP;
else
dev->inp = INP_INVAL;
}
if (stream)
stream->linked = flags & MEDIA_LNK_FL_ENABLED;
v4l2_dbg(1, rkvpss_debug, &dev->v4l2_dev, "input:%d\n", dev->inp);
return 0;
}
@@ -253,7 +269,7 @@ static int rkvpss_sof(struct rkvpss_subdev *sdev, struct rkisp_vpss_sof *info)
dev->unite_mode, dev->unite_index, info->seq);
rkvpss_cmsc_config(dev, !info->irq);
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++) {
stream = &dev->stream_vdev.stream[i];
if (!stream->streaming)
continue;
@@ -287,7 +303,7 @@ static int rkvpss_sof(struct rkvpss_subdev *sdev, struct rkisp_vpss_sof *info)
/* force update mi write */
vpss_online = rkvpss_hw_read(hw, RKVPSS_VPSS_ONLINE);
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++) {
if (((vpss_online >> (2 * i)) & 0x3) == 0x2)
val |= BIT(i);
}
@@ -296,7 +312,7 @@ static int rkvpss_sof(struct rkvpss_subdev *sdev, struct rkisp_vpss_sof *info)
}
dev->irq_ends_mask = VPSS_FRAME_END;
for (i = 0; i < RKVPSS_OUTPUT_MAX; i++) {
for (i = 0; i < vpss_outchn_max(dev->hw_dev->vpss_ver); i++) {
if (hw->is_ofl_ch[i])
continue;
if (rkvpss_hw_read(dev->hw_dev, RKVPSS_MI_CHN0_WR_CTRL_SHD + i * 0x100) & 0x1)
@@ -426,16 +442,29 @@ static void rkvpss_end_notify_isp(struct rkvpss_device *dev)
void rkvpss_check_idle(struct rkvpss_device *dev, u32 irq)
{
unsigned long lock_flags = 0;
spin_lock_irqsave(&dev->idle_lock, lock_flags);
dev->irq_ends |= (irq & dev->irq_ends_mask);
v4l2_dbg(3, rkvpss_debug, &dev->v4l2_dev,
"%s irq:0x%x ends:0x%x mask:0x%x\n",
__func__, irq, dev->irq_ends, dev->irq_ends_mask);
if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask)
if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask) {
spin_unlock_irqrestore(&dev->idle_lock, lock_flags);
return;
}
/* offline MI frame end */
if (!dev->irq_ends_mask) {
spin_unlock_irqrestore(&dev->idle_lock, lock_flags);
return;
}
dev->irq_ends = 0;
spin_unlock_irqrestore(&dev->idle_lock, lock_flags);
rkvpss_end_notify_isp(dev);
dev->is_idle = true;

View File

@@ -4,7 +4,31 @@
#ifndef _RKVPSS_VPSS_H
#define _RKVPSS_VPSS_H
#include "common.h"
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/iommu.h>
#include <linux/pm_runtime.h>
#include <linux/videodev2.h>
#include <media/media-entity.h>
#include <media/v4l2-event.h>
#include <linux/version.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <media/v4l2-common.h>
#include <media/v4l2-event.h>
#include <media/v4l2-fh.h>
#include <media/v4l2-ioctl.h>
#include <media/v4l2-mc.h>
#include <media/v4l2-subdev.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-dma-sg.h>
#include <uapi/linux/rk-video-format.h>
#include <linux/rk-vpss-config.h>
#define GRP_ID_VPSS BIT(0)

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
#define UNITE_ENLARGE 16
#define UNITE_LEFT_ENLARGE 16
#include "hw.h"
extern char rkvpss_regfile[RKVPSS_REGFILE_LEN];
struct rkvpss_ofl_incfginfo {
int width;
@@ -82,5 +82,6 @@ struct rkvpss_offline_dev {
int rkvpss_register_offline(struct rkvpss_hw_dev *hw);
void rkvpss_unregister_offline(struct rkvpss_hw_dev *hw);
void rkvpss_offline_irq(struct rkvpss_hw_dev *hw, u32 irq);
void rkvpss_dump_reg(struct rkvpss_offline_dev *ofl, int sequence, int size);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2024 Rockchip Electronics Co., Ltd. */
#ifndef _RKVPSS_OFFLINE_V1_H
#define _RKVPSS_OFFLINE_V1_H
#define DEV_NUM_MAX 256
#define UNITE_ENLARGE 16
#define UNITE_LEFT_ENLARGE 16
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_VPSS_V1)
int rkvpss_register_offline_v1(struct rkvpss_hw_dev *hw);
void rkvpss_unregister_offline_v1(struct rkvpss_hw_dev *hw);
void rkvpss_offline_irq_v1(struct rkvpss_hw_dev *hw, u32 irq);
#else
static inline int rkvpss_register_offline_v1(struct rkvpss_hw_dev *hw) {return -EINVAL; }
static inline void rkvpss_unregister_offline_v1(struct rkvpss_hw_dev *hw) {}
static inline void rkvpss_offline_irq_v1(struct rkvpss_hw_dev *hw, u32 irq) {}
#endif
#endif

View File

@@ -27,6 +27,8 @@
* ioctl RKVPSS_CMD_MODULE_SEL to select function using
*/
#define RKVPSS_OUT_V1_MAX 4
/******vpss(online mode) v4l2 ioctl***************************/
/* set before VIDIOC_S_FMT if dynamically changing output resolution */
#define RKVPSS_CMD_SET_STREAM_MAX_SIZE \