Merge commit '095e362a8eb1948abd4ac62bd9b569e512a994f8'

* commit '095e362a8eb1948abd4ac62bd9b569e512a994f8':
  arm64: dts: rockchip: rk3576-vehicle-evb: close usb otg 5v default
  ARM: configs: rockchip_amp.config: Add rpmsg config
  ARM: dts: rockchip: rk3506-amp: Use mailbox2 as rpmsg-tx
  rpmsg: rockchip: Don't send notification until last_tx_done() is ok
  rpmsg: rockchip: use kmalloc to save tx_msg
  rpmsg: rockchip: mailbox tx/rx use different callback
  video: rockchip: mpp: rk3562 use cru reset
  media: rockchip: isp: add fpn function
  media: rockchip: isp: fix lsc switch for isp30

Change-Id: Icdf482cb6bddd293b3d6da99c26013ba4c036559
This commit is contained in:
Tao Huang
2024-09-29 18:42:23 +08:00
13 changed files with 299 additions and 33 deletions

View File

@@ -32,7 +32,7 @@
/* UART4 */
GIC_AMP_IRQ_CFG_ROUTE(70, 0xd0, CPU_GET_AFFINITY(0, 2))
/* MAILBOX */
GIC_AMP_IRQ_CFG_ROUTE(174, 0xd0, CPU_GET_AFFINITY(0, 2))>;
GIC_AMP_IRQ_CFG_ROUTE(176, 0xd0, CPU_GET_AFFINITY(0, 2))>;
status = "okay";
};
@@ -40,10 +40,11 @@
rpmsg: rpmsg@3c00000 {
compatible = "rockchip,rpmsg";
mbox-names = "rpmsg-rx", "rpmsg-tx";
mboxes = <&mailbox0 0 &mailbox0 3>;
mboxes = <&mailbox0 0 &mailbox2 0>;
rockchip,vdev-nums = <1>;
rockchip,link-id = <0x03>;
reg = <0x3c00000 0x100000>;
/* CPU2: link-id 0x02; */
rockchip,link-id = <0x02>;
reg = <0x3c00000 0x20000>;
memory-region = <&rpmsg_dma_reserved>;
status = "okay";
@@ -59,6 +60,11 @@
status = "okay";
};
&mailbox2 {
rockchip,txpoll-period-ms = <1>;
status = "okay";
};
&reserved_memory {
/* remote amp core address */
amp_shmem_reserved: amp-shmem@3b00000 {

View File

@@ -1 +1,31 @@
CONFIG_MAILBOX=y
CONFIG_ROCKCHIP_AMP=y
CONFIG_RPMSG_VIRTIO=y
# CONFIG_ALTERA_MBOX is not set
# CONFIG_ARM_MHU is not set
# CONFIG_ARM_MHU_V2 is not set
# CONFIG_ARM_SCPI_PROTOCOL is not set
CONFIG_BLK_MQ_VIRTIO=y
# CONFIG_BT_VIRTIO is not set
# CONFIG_CRYPTO_DEV_VIRTIO is not set
# CONFIG_GPIO_VIRTIO is not set
# CONFIG_HW_RANDOM_VIRTIO is not set
CONFIG_MAILBOX_POLL_PERIOD_US=y
# CONFIG_MAILBOX_TEST is not set
# CONFIG_PL320_MBOX is not set
# CONFIG_PLATFORM_MHU is not set
CONFIG_ROCKCHIP_MBOX=y
# CONFIG_ROCKCHIP_MBOX_DEMO is not set
CONFIG_RPMSG=y
# CONFIG_RPMSG_CHAR is not set
# CONFIG_RPMSG_CTRL is not set
CONFIG_RPMSG_NS=y
# CONFIG_RPMSG_QCOM_GLINK_RPM is not set
CONFIG_RPMSG_ROCKCHIP_MBOX=y
# CONFIG_RPMSG_ROCKCHIP_TEST is not set
# CONFIG_RPMSG_TTY is not set
# CONFIG_SND_SOC_FSL_RPMSG is not set
# CONFIG_SND_VIRTIO is not set
CONFIG_VIRTIO=y
CONFIG_VIRTIO_ANCHOR=y
# CONFIG_VIRTIO_BLK is not set

View File

@@ -62,14 +62,14 @@
};
};
usb_otg0_vcc5v_buck: usb_otg0_vcc5v-buck {
usb_otg_vcc5v_buck: usb_otg_vcc5v-buck {
compatible = "regulator-fixed";
regulator-name = "usb_otg0_vcc5v_buck";
regulator-name = "usb_otg_vcc5v_buck";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
//enable-active-high;
gpio = <&i2c0_nca9539_gpio 0 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_buck>;
regulator-state-mem {
@@ -524,3 +524,30 @@
&ufs {
status = "disabled";
};
&u2phy0 {
rockchip,sel-pipe-phystatus;
status = "okay";
};
&u2phy0_otg {
/delete-property/rockchip,sel-pipe-phystatus;
//vbus-supply = <&usb_otg_vcc5v_buck>;
status = "okay";
};
&u2phy1_otg {
phy-supply = <&usb_host_vcc5v_buck>;
status = "okay";
};
&usbdp_phy {
maximum-speed = "high-speed";
status = "okay";
};
&usb_drd1_dwc3 {
maximum-speed = "high-speed";
snps,dis_u2_susphy_quirk;
status = "okay";
};

View File

@@ -290,6 +290,7 @@ struct rkisp_device {
spinlock_t aiisp_lock;
struct rkisp_cmsk_cfg cmsk_cfg;
struct rkisp_aiisp_cfg aiisp_cfg;
struct rkisp_fpn_cfg fpn_cfg;
bool is_cmsk_upd;
bool is_hw_link;

View File

@@ -1067,7 +1067,7 @@ static void isp_config_clk(struct rkisp_hw_dev *dev, int on)
val = 0;
if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) && on)
val |= CLK_CTRL_ISP_3A;
val |= CLK_CTRL_ISP_3A | CLK_CTRL_ISP_RAW;
if (dev->isp_ver == ISP_V32)
rv1106_sdmmc_get_lock();
writel(val, dev->base_addr + CTRL_VI_ISP_CLK_CTRL);

View File

@@ -275,6 +275,12 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq)
params_vdev->rdbk_times = 0;
if (!(dev->isp_state & ISP_START))
rkisp_params_stream_stop(params_vdev);
dev->fpn_cfg.en = 0;
if (dev->fpn_cfg.buf) {
vfree(dev->fpn_cfg.buf);
dev->fpn_cfg.buf = NULL;
dev->fpn_cfg.buf_size = 0;
}
}
static int

View File

@@ -634,6 +634,7 @@ static void
isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id)
{
struct isp3x_isp_params_cfg *params_rec = params_vdev->isp3x_params + id;
struct rkisp_isp_params_val_v3x *priv_val = params_vdev->priv_val;
u32 val = isp3_param_read(params_vdev, ISP3X_LSC_CTRL, id);
if (en == !!(val & ISP_LSC_EN))
@@ -641,9 +642,12 @@ isp_lsc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id)
if (en) {
isp3_param_set_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN, id);
if (params_vdev->dev->hw_dev->is_single)
isp_lsc_matrix_cfg_sram(params_vdev,
&params_rec->others.lsc_cfg, false, id);
if (params_vdev->dev->hw_dev->is_single) {
if (!in_interrupt())
isp_lsc_matrix_cfg_sram(params_vdev, &params_rec->others.lsc_cfg, false, id);
else if (id == ISP3_LEFT)
tasklet_schedule(&priv_val->lsc_tasklet);
}
} else {
isp3_param_clear_bits(params_vdev, ISP3X_LSC_CTRL, ISP_LSC_EN, id);
isp3_param_clear_bits(params_vdev, ISP3X_GAIN_CTRL, BIT(8), id);

View File

@@ -241,6 +241,8 @@ static void isp30_show(struct rkisp_device *dev, struct seq_file *p)
};
u32 val, tmp;
val = rkisp_read(dev, CSI2RX_FPN_CTRL, false);
seq_printf(p, "%-10s %s(0x%x)\n", "FPN", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP3X_CMSK_CTRL0, false);
seq_printf(p, "%-10s %s(0x%x)\n", "CMSK", (val & 1) ? "ON" : "OFF", val);
val = rkisp_read(dev, ISP3X_DPCC0_MODE, false);

View File

@@ -561,7 +561,8 @@
#define CSI2RX_RAWFBC_EN_SHD (CSI2RX_BASE + 0x000c8)
#define CSI2RX_FPN_CTRL (CSI2RX_BASE + 0x000d0)
#define CSI2RX_FPN_TABLE_CTRL (CSI2RX_BASE + 0x000d4)
#define CSI2RX_FPN_TABLE_DATA (CSI2RX_BASE + 0x000d8)
#define CSI2RX_FPN_TABLE_DATA0 (CSI2RX_BASE + 0x000d8)
#define CSI2RX_FPN_TABLE_DATA1 (CSI2RX_BASE + 0x000dc)
#define CSI2RX_Y_STAT_CTRL (CSI2RX_BASE + 0x000f0)
#define CSI2RX_Y_STAT_RO (CSI2RX_BASE + 0x000f4)
#define CSI2RX_VERSION (CSI2RX_BASE + 0x000fc)
@@ -2432,6 +2433,12 @@
#define SW_CSI_ESP_IDCD_OBPIX(a) ((a) & 0x7F)
#define SW_CSI_ESP_IDCD_EFPIX(a) (((a) & 0x7F) << 16)
#define SW_FPN_EN BIT(0)
#define SW_FPN_ROW_EN BIT(1)
#define SW_FPN_BITS(a) (((a) & 0x3) << 2)
#define SW_FPN_CFG BIT(0)
#define SW_Y_STAT_INT_MODE_MASK GENMASK(3, 2)
#define SW_Y_STAT_RD_FRM_ID_MASK GENMASK(5, 4)
#define SW_Y_STAT_RD_TILE_ID_MASK GENMASK(7, 6)

View File

@@ -87,6 +87,7 @@
static void rkisp_config_cmsk(struct rkisp_device *dev);
static void rkisp_config_aiisp(struct rkisp_device *dev);
static void rkisp_config_fpn(struct rkisp_device *dev);
static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd)
{
@@ -1825,6 +1826,8 @@ static int rkisp_config_isp(struct rkisp_device *dev)
dev->is_aiisp_upd = dev->is_aiisp_en;
rkisp_config_cmsk(dev);
rkisp_config_aiisp(dev);
if (dev->hw_dev->is_single)
rkisp_config_fpn(dev);
return 0;
}
@@ -3768,6 +3771,84 @@ static int rkisp_get_offline_raw_buf_cnt(struct rkisp_device *dev, int *cnt)
return 0;
}
static void rkisp_config_fpn(struct rkisp_device *dev)
{
struct rkisp_fpn_cfg *cfg = &dev->fpn_cfg;
u32 i, val, *data;
if (!cfg->en) {
rkisp_unite_write(dev, CSI2RX_FPN_CTRL, 0, true);
return;
}
val = SW_FPN_EN | SW_FPN_BITS(cfg->data_shift);
if (cfg->row_en)
val |= SW_FPN_ROW_EN;
rkisp_unite_write(dev, CSI2RX_FPN_CTRL, val, true);
rkisp_unite_write(dev, CSI2RX_FPN_TABLE_CTRL, SW_FPN_CFG, true);
data = cfg->buf;
/* 32bit: 8 fpn, first data line for DATA0, second line for DATA1 */
for (i = 0; i < cfg->buf_size / 8; i++) {
val = *(data + i);
rkisp_unite_write(dev, CSI2RX_FPN_TABLE_DATA0, val, true);
val = *(data + cfg->buf_size / 8 + i);
rkisp_unite_write(dev, CSI2RX_FPN_TABLE_DATA1, val, true);
}
rkisp_unite_write(dev, CSI2RX_FPN_TABLE_CTRL, 0, true);
}
static int rkisp_set_fpn(struct rkisp_device *dev, struct rkisp_fpn_cfg *cfg)
{
u32 w = dev->isp_sdev.out_crop.width;
u32 h = dev->isp_sdev.out_crop.height;
int ret = 0;
if (!cfg->en && dev->fpn_cfg.en) {
dev->fpn_cfg.en = 0;
if (dev->fpn_cfg.buf) {
vfree(dev->fpn_cfg.buf);
dev->fpn_cfg.buf = NULL;
dev->fpn_cfg.buf_size = 0;
}
return ret;
}
if ((cfg->row_en && cfg->buf_size < h) ||
(!cfg->row_en && cfg->buf_size < w)) {
dev_err(dev->dev, "fpn buf size %d row_en:%d error for %dx%d\n",
cfg->buf_size, cfg->row_en, w, h);
ret = -EINVAL;
goto err;
}
if (dev->fpn_cfg.buf && dev->fpn_cfg.buf_size < cfg->buf_size) {
vfree(dev->fpn_cfg.buf);
dev->fpn_cfg.buf = NULL;
dev->fpn_cfg.buf_size = 0;
}
if (!dev->fpn_cfg.buf) {
dev->fpn_cfg.buf = vmalloc(cfg->buf_size);
if (!dev->fpn_cfg.buf) {
ret = -ENOMEM;
goto err;
}
}
if (copy_from_user(dev->fpn_cfg.buf, cfg->buf, cfg->buf_size)) {
dev_err(dev->dev, "copy fpn data err\n");
vfree(dev->fpn_cfg.buf);
dev->fpn_cfg.buf = NULL;
dev->fpn_cfg.buf_size = 0;
ret = -EFAULT;
goto err;
}
dev->fpn_cfg.en = cfg->en;
dev->fpn_cfg.row_en = cfg->row_en;
dev->fpn_cfg.data_shift = cfg->data_shift;
dev->fpn_cfg.buf_size = cfg->buf_size;
err:
return ret;
}
static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
{
struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
@@ -3927,6 +4008,9 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
case RKISP_CMD_GET_OFFLINE_RAW_BUFCNT:
ret = rkisp_get_offline_raw_buf_cnt(isp_dev, arg);
break;
case RKISP_CMD_SET_FPN:
ret = rkisp_set_fpn(isp_dev, arg);
break;
default:
ret = -ENOIOCTLCMD;
}
@@ -4024,6 +4108,10 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
size = sizeof(int);
cp_t_us = true;
break;
case RKISP_CMD_SET_FPN:
size = sizeof(struct rkisp_fpn_cfg);
cp_f_us = true;
break;
default:
return -ENOIOCTLCMD;
}

View File

@@ -41,9 +41,10 @@ struct rk_rpmsg_dev {
struct platform_device *pdev;
int vdev_nums;
unsigned int link_id;
int first_notify;
bool need_notify;
u32 flags;
struct mbox_client mbox_cl;
struct mbox_client mbox_rx_cl;
struct mbox_client mbox_tx_cl;
struct mbox_chan *mbox_rx_chan;
struct mbox_chan *mbox_tx_chan;
struct rk_virtio_dev *rpvdev[RPMSG_MAX_INSTANCE_NUM];
@@ -55,20 +56,46 @@ struct rk_rpmsg_vq_info {
struct rk_rpmsg_dev *rpdev;
};
static void rk_rpmsg_tx_callback(struct mbox_client *client, void *message)
{
struct rk_virtio_dev *rpvdev;
struct rk_rpmsg_dev *rpdev = container_of(client, struct rk_rpmsg_dev, mbox_tx_cl);
struct platform_device *pdev = rpdev->pdev;
struct device *dev = &pdev->dev;
struct rockchip_mbox_msg *rx_msg = message;
dev_dbg(dev, "rpmsg master tx cb: receive cmd=0x%x data=0x%x\n",
rx_msg->cmd, rx_msg->data);
if (rx_msg->data != RPMSG_MBOX_MAGIC)
dev_err(dev, "rpmsg master tx cb: mailbox data error 0x%8x!\n",
rx_msg->data);
/* TODO: only support one remote core now */
rpvdev = rpdev->rpvdev[0];
/*
* Recv TX CONSUME message
* Enabled RL_ALLOW_CONSUMED_BUFFERS_NOTIFICATION in rpmsg-lite
*/
vring_interrupt(0, rpvdev->vq[1]);
}
static void rk_rpmsg_rx_callback(struct mbox_client *client, void *message)
{
u32 link_id;
struct rk_virtio_dev *rpvdev;
struct rk_rpmsg_dev *rpdev = container_of(client, struct rk_rpmsg_dev, mbox_cl);
struct rk_rpmsg_dev *rpdev = container_of(client, struct rk_rpmsg_dev, mbox_rx_cl);
struct platform_device *pdev = rpdev->pdev;
struct device *dev = &pdev->dev;
struct rockchip_mbox_msg *rx_msg;
rx_msg = message;
dev_dbg(dev, "rpmsg master: receive cmd=0x%x data=0x%x\n",
dev_dbg(dev, "rpmsg master rx cb: receive cmd=0x%x data=0x%x\n",
rx_msg->cmd, rx_msg->data);
if (rx_msg->data != RPMSG_MBOX_MAGIC)
dev_err(dev, "rpmsg master: mailbox data error!\n");
dev_err(dev, "rpmsg master rx cb: mailbox data error 0x%8x!\n",
rx_msg->data);
link_id = rx_msg->cmd & 0xFFU;
/* TODO: only support one remote core now */
rpvdev = rpdev->rpvdev[0];
@@ -77,6 +104,12 @@ static void rk_rpmsg_rx_callback(struct mbox_client *client, void *message)
vring_interrupt(0, rpvdev->vq[0]);
}
static void rk_rpmsg_xfer_done(struct mbox_client *cl, void *mssg, int r)
{
if (!r)
kfree(mssg);
}
static bool rk_rpmsg_notify(struct virtqueue *vq)
{
struct rk_rpmsg_vq_info *rpvq = vq->priv;
@@ -85,25 +118,44 @@ static bool rk_rpmsg_notify(struct virtqueue *vq)
struct device *dev = &pdev->dev;
u32 link_id;
int ret;
struct rockchip_mbox_msg tx_msg;
struct rockchip_mbox_msg *tx_msg;
memset(&tx_msg, 0, sizeof(tx_msg));
dev_dbg(dev, "queue_id-0x%x virt_vring_addr 0x%p\n",
rpvq->queue_id, rpvq->vring_addr);
link_id = rpdev->link_id;
tx_msg.cmd = link_id & 0xFFU;
tx_msg.data = RPMSG_MBOX_MAGIC;
if ((rpdev->first_notify == 0) && (rpvq->queue_id % 2 == 0)) {
/* first_notify is used in the master init handshake phase. */
dev_dbg(dev, "rpmsg first_notify\n");
rpdev->first_notify++;
if ((!rpdev->need_notify) && (rpvq->queue_id % 2 == 0)) {
/* first notify is used in the master init handshake phase. */
dev_dbg(dev, "rpmsg handshake notify\n");
} else if (rpvq->queue_id % 2 == 0) {
/* tx done is not supported, so ignored */
return true;
}
ret = mbox_send_message(rpdev->mbox_tx_chan, &tx_msg);
if (!rpdev->mbox_tx_chan->mbox->ops->last_tx_done(rpdev->mbox_tx_chan)) {
/*
* Mailbox BUSY means remote side has not processed previous
* notification. The remote side will process all availd
* messages after meeting the last notification.
*/
return true;
}
if (rpdev->need_notify)
mbox_client_txdone(rpdev->mbox_tx_chan, 0);
else
rpdev->need_notify = true;
tx_msg = kzalloc(sizeof(*tx_msg), GFP_KERNEL);
if (!tx_msg) {
dev_err(dev, "Can not get memory for tx_msg\n");
return false;
}
tx_msg->cmd = link_id & 0xFFU;
tx_msg->data = RPMSG_MBOX_MAGIC;
ret = mbox_send_message(rpdev->mbox_tx_chan, tx_msg);
if (ret < 0) {
dev_err(dev, "mbox send failed!\n");
return false;
@@ -300,12 +352,13 @@ static int rockchip_rpmsg_probe(struct platform_device *pdev)
return -ENOMEM;
dev_info(dev, "rockchip rpmsg platform probe.\n");
rpdev->pdev = pdev;
rpdev->first_notify = 0;
cl = &rpdev->mbox_cl;
rpdev->pdev = pdev;
rpdev->need_notify = false;
cl = &rpdev->mbox_rx_cl;
cl->dev = dev;
cl->rx_callback = rk_rpmsg_rx_callback;
cl->tx_done = rk_rpmsg_xfer_done;
rpdev->mbox_rx_chan = mbox_request_channel_byname(cl, "rpmsg-rx");
if (IS_ERR(rpdev->mbox_rx_chan)) {
@@ -313,6 +366,13 @@ static int rockchip_rpmsg_probe(struct platform_device *pdev)
dev_err(dev, "failed to request mbox rx chan, ret %d\n", ret);
return ret;
}
cl = &rpdev->mbox_tx_cl;
cl->dev = dev;
cl->rx_callback = rk_rpmsg_tx_callback;
cl->tx_done = rk_rpmsg_xfer_done;
cl->knows_txdone = true;
rpdev->mbox_tx_chan = mbox_request_channel_byname(cl, "rpmsg-tx");
if (IS_ERR(rpdev->mbox_tx_chan)) {
ret = PTR_ERR(rpdev->mbox_tx_chan);

View File

@@ -1346,7 +1346,7 @@ static int rkvdec2_vdpu382_reset(struct mpp_dev *mpp)
int ret = 0;
/*
* only for rk3528 and rk3562
* only for rk3528
* use mmu reset as soft reset
* rkvdec will reset together when rkvdec_mmu force reset
*/
@@ -1550,7 +1550,7 @@ static const struct mpp_dev_var rkvdec_rk3568_data = {
.dev_ops = &rkvdec_rk3568_dev_ops,
};
static const struct mpp_dev_var rkvdec_vdpu382_data = {
static const struct mpp_dev_var rkvdec_rk3528_data = {
.device_type = MPP_DEVICE_RKVDEC,
.hw_info = &rkvdec_vdpu382_hw_info,
.trans_info = rkvdec_v2_trans,
@@ -1558,6 +1558,14 @@ static const struct mpp_dev_var rkvdec_vdpu382_data = {
.dev_ops = &rkvdec_v2_dev_ops,
};
static const struct mpp_dev_var rkvdec_rk3562_data = {
.device_type = MPP_DEVICE_RKVDEC,
.hw_info = &rkvdec_vdpu382_hw_info,
.trans_info = rkvdec_v2_trans,
.hw_ops = &rkvdec_v2_hw_ops,
.dev_ops = &rkvdec_v2_dev_ops,
};
static const struct mpp_dev_var rkvdec_rk3588_data = {
.device_type = MPP_DEVICE_RKVDEC,
.hw_info = &rkvdec_v2_hw_info,
@@ -1594,13 +1602,13 @@ static const struct of_device_id mpp_rkvdec2_dt_match[] = {
#ifdef CONFIG_CPU_RK3528
{
.compatible = "rockchip,rkv-decoder-rk3528",
.data = &rkvdec_vdpu382_data,
.data = &rkvdec_rk3528_data,
},
#endif
#ifdef CONFIG_CPU_RK3562
{
.compatible = "rockchip,rkv-decoder-rk3562",
.data = &rkvdec_vdpu382_data,
.data = &rkvdec_rk3562_data,
},
#endif
#ifdef CONFIG_CPU_RK3576

View File

@@ -80,6 +80,9 @@
#define RKISP_CMD_GET_OFFLINE_RAW_BUFCNT \
_IOR('V', BASE_VIDIOC_PRIVATE + 22, int)
#define RKISP_CMD_SET_FPN \
_IOW('V', BASE_VIDIOC_PRIVATE + 25, struct rkisp_fpn_cfg)
/****************ISP VIDEO IOCTL******************************/
#define RKISP_CMD_GET_CSI_MEMORY_MODE \
@@ -129,6 +132,7 @@
/* BASE_VIDIOC_PRIVATE + 115 for RKISP_CMD_GET_PARAMS_V39 */
/* BASE_VIDIOC_PRIVATE + 116 for RKISP_CMD_GET_PARAMS_V33 */
/* BASE_VIDIOC_PRIVATE + 117 for RKISP_CMD_SET_QUICK_STREAM */
/**********************EVENT_PRIVATE***************************/
#define RKISP_V4L2_EVENT_AIISP_LINECNT (V4L2_EVENT_PRIVATE_START + 1)
@@ -349,6 +353,29 @@ struct isp2x_mesh_head {
__u32 data_oft;
} __attribute__ ((packed));
enum {
RKISP_FPN_DATA_SHIFT_0 = 0,
RKISP_FPN_DATA_SHIFT_1,
RKISP_FPN_DATA_SHIFT_2,
RKISP_FPN_DATA_SHIFT_3,
};
/* struct rkisp_aiisp_cfg
* en: enable fpn function
* row_en: row fpn mode other column fpn
* data_shift: fpn data shift, 4bits of 7bits calculate fpn data
* buf_size: buf size: row_en ? height : width
* buf: fpn data, two row or two column fpn data, 4bit one fpn data
*/
struct rkisp_fpn_cfg {
char en;
char row_en;
char data_shift;
char reserved;
int buf_size;
void *buf;
} __attribute__ ((packed));
#define RKISP_AIISP_WR_LINECNT_ID 0
#define RKISP_AIISP_RD_LINECNT_ID 1
struct rkisp_aiisp_ev_info {