mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
|
||||
2823
drivers/media/platform/rockchip/vpss/stream_v1.c
Normal file
2823
drivers/media/platform/rockchip/vpss/stream_v1.c
Normal file
File diff suppressed because it is too large
Load Diff
42
drivers/media/platform/rockchip/vpss/stream_v1.h
Normal file
42
drivers/media/platform/rockchip/vpss/stream_v1.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
2271
drivers/media/platform/rockchip/vpss/vpss_offline_v1.c
Normal file
2271
drivers/media/platform/rockchip/vpss/vpss_offline_v1.c
Normal file
File diff suppressed because it is too large
Load Diff
22
drivers/media/platform/rockchip/vpss/vpss_offline_v1.h
Normal file
22
drivers/media/platform/rockchip/vpss/vpss_offline_v1.h
Normal 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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user