Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2022 Rockchip Electronics Co., Ltd */

#include <linux/of.h>
#include <linux/of_platform.h>
#include <soc/rockchip/rockchip_dvbm.h>

#include "dev.h"
#include "regs.h"

static struct dvbm_port *g_dvbm;

int rkisp_dvbm_get(struct rkisp_device *dev)
{
	struct device_node *np = dev->dev->of_node;
	struct device_node *np_dvbm = of_parse_phandle(np, "dvbm", 0);
	int ret = -EINVAL;

	g_dvbm = NULL;
	if (dev->isp_ver != ISP_V32)
		goto end;

	if (!np_dvbm || !of_device_is_available(np_dvbm)) {
		dev_warn(dev->dev, "failed to get dvbm node\n");
	} else {
		struct platform_device *p_dvbm = of_find_device_by_node(np_dvbm);

		g_dvbm = rk_dvbm_get_port(p_dvbm, DVBM_ISP_PORT);
		of_node_put(np_dvbm);
	}

end:
	return ret;
}

int rkisp_dvbm_init(struct rkisp_stream *stream)
{
	struct rkisp_device *dev = stream->ispdev;
	struct rkisp_dummy_buffer *buf = &stream->dummy_buf;
	struct dvbm_isp_cfg_t dvbm_cfg;
	u32 width, height, wrap_line;

	if (!g_dvbm)
		return -EINVAL;

	width = stream->out_fmt.plane_fmt[0].bytesperline;
	height = stream->out_fmt.height;
	wrap_line = dev->cap_dev.wrap_line;
	dvbm_cfg.dma_addr = buf->dma_addr;
	dvbm_cfg.ybuf_bot = 0;
	dvbm_cfg.ybuf_top = width * wrap_line;
	dvbm_cfg.ybuf_lstd = width;
	dvbm_cfg.ybuf_fstd = width * height;
	dvbm_cfg.cbuf_bot = dvbm_cfg.ybuf_top;
	dvbm_cfg.cbuf_top = dvbm_cfg.cbuf_bot + (width * wrap_line / 2);
	dvbm_cfg.cbuf_lstd = width;
	dvbm_cfg.cbuf_fstd = dvbm_cfg.ybuf_fstd / 2;

	rk_dvbm_ctrl(g_dvbm, DVBM_ISP_SET_CFG, &dvbm_cfg);
	rk_dvbm_link(g_dvbm);
	return 0;
}

void rkisp_dvbm_deinit(void)
{
	if (g_dvbm)
		rk_dvbm_unlink(g_dvbm);
}

int rkisp_dvbm_event(struct rkisp_device *dev, u32 event)
{
	enum dvbm_cmd cmd;
	u32 seq;

	if (!g_dvbm || dev->isp_ver != ISP_V32 ||
	    !dev->cap_dev.wrap_line)
		return -EINVAL;

	rkisp_dmarx_get_frame(dev, &seq, NULL, NULL, true);

	switch (event) {
	case CIF_ISP_V_START:
		cmd = DVBM_ISP_FRM_START;
		break;
	case CIF_MI_MP_FRAME:
		cmd = DVBM_ISP_FRM_END;
		break;
	default:
		return -EINVAL;
	}

	return rk_dvbm_ctrl(g_dvbm, cmd, &seq);
}