media: rockchip: isp: fix build error for kernel 6.1

Change-Id: I5f1e2b9ef7f4fdca51752d1b1598db630faaf5e4
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2023-05-31 15:35:15 +08:00
parent 814cb480e7
commit fa133f475e
15 changed files with 124 additions and 214 deletions

View File

@@ -278,13 +278,7 @@ static int bridge_start_stream(struct v4l2_subdev *sd)
if (ret < 0)
goto stop_bridge;
ret = media_pipeline_start(&sd->entity, &dev->ispdev->pipe.pipe);
if (ret < 0)
goto pipe_stream_off;
return 0;
pipe_stream_off:
dev->ispdev->pipe.set_stream(&dev->ispdev->pipe, false);
stop_bridge:
dev->ops->stop(dev);
close_pipe:
@@ -307,7 +301,6 @@ static int bridge_stop_stream(struct v4l2_subdev *sd)
struct rkisp_bridge_device *dev = v4l2_get_subdevdata(sd);
dev->ops->stop(dev);
media_pipeline_stop(&sd->entity);
dev->ispdev->pipe.set_stream(&dev->ispdev->pipe, false);
dev->ispdev->pipe.close(&dev->ispdev->pipe);
bridge_destroy_buf(dev);

View File

@@ -976,7 +976,7 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
return;
rkisp_stream_stop(stream);
media_pipeline_stop(&node->vdev.entity);
video_device_pipeline_stop(&node->vdev);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev,
@@ -1089,7 +1089,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
ret = video_device_pipeline_start(&node->vdev, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev,
"start pipeline failed %d\n", ret);

View File

@@ -1770,7 +1770,7 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
if (stream->id == RKISP_STREAM_MP ||
(stream->id == RKISP_STREAM_SP && stream->out_isp_fmt.fmt_type != FMT_FBCGAIN)) {
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
video_device_pipeline_stop(&node->vdev);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev,
@@ -1913,7 +1913,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
ret = video_device_pipeline_start(&node->vdev, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev,
"start pipeline failed %d\n", ret);

View File

@@ -1575,7 +1575,7 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
if (stream->id == RKISP_STREAM_MP ||
stream->id == RKISP_STREAM_SP) {
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
video_device_pipeline_stop(&node->vdev);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev,
@@ -1709,7 +1709,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
ret = video_device_pipeline_start(&node->vdev, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev,
"start pipeline failed %d\n", ret);

View File

@@ -1276,7 +1276,7 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
rkisp_stream_stop(stream);
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
video_device_pipeline_stop(&node->vdev);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev, "pipeline stream-off failed:%d\n", ret);
@@ -1499,7 +1499,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
ret = video_device_pipeline_start(&node->vdev, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(v4l2_dev, "start pipeline failed %d\n", ret);
goto pipe_stream_off;

View File

@@ -1753,7 +1753,7 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
rkisp_stream_stop(stream);
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
video_device_pipeline_stop(&node->vdev);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev, "pipeline stream-off failed:%d\n", ret);
@@ -2012,7 +2012,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
ret = video_device_pipeline_start(&node->vdev, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(v4l2_dev, "start pipeline failed %d\n", ret);
goto pipe_stream_off;
@@ -2217,8 +2217,8 @@ void rkisp_unregister_stream_v32(struct rkisp_device *dev)
stream = &cap_dev->stream[RKISP_STREAM_MP];
rkisp_unregister_stream_vdev(stream);
stream = &cap_dev->stream[RKISP_STREAM_SP];
rkisp_unregister_stream_vdev(stream);
if (dev->isp_ver == ISP_V32) {
rkisp_unregister_stream_vdev(stream);
stream = &cap_dev->stream[RKISP_STREAM_BP];
rkisp_unregister_stream_vdev(stream);
stream = &cap_dev->stream[RKISP_STREAM_MPDS];

View File

@@ -184,10 +184,24 @@ void rkisp_update_regs(struct rkisp_device *dev, u32 start, u32 end)
}
}
static void rkisp_init_dummy_vb2(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
unsigned long attrs = buf->is_need_vaddr ? 0 : DMA_ATTR_NO_KERNEL_MAPPING;
memset(&buf->vb2_queue, 0, sizeof(buf->vb2_queue));
memset(&buf->vb, 0, sizeof(buf->vb));
buf->vb2_queue.gfp_flags = GFP_KERNEL | GFP_DMA32;
buf->vb2_queue.dma_dir = DMA_BIDIRECTIONAL;
if (dev->hw_dev->is_dma_contig)
attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
buf->vb2_queue.dma_attrs = attrs;
buf->vb.vb2_queue = &buf->vb2_queue;
}
int rkisp_alloc_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
{
unsigned long attrs = buf->is_need_vaddr ? 0 : DMA_ATTR_NO_KERNEL_MAPPING;
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
struct sg_table *sg_tbl;
void *mem_priv;
@@ -200,11 +214,9 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
goto err;
}
if (dev->hw_dev->is_dma_contig)
attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
rkisp_init_dummy_vb2(dev, buf);
buf->size = PAGE_ALIGN(buf->size);
mem_priv = g_ops->alloc(dev->hw_dev->dev, attrs, buf->size,
DMA_BIDIRECTIONAL, GFP_KERNEL | GFP_DMA32);
mem_priv = g_ops->alloc(&buf->vb, dev->hw_dev->dev, buf->size);
if (IS_ERR_OR_NULL(mem_priv)) {
ret = -ENOMEM;
goto err;
@@ -212,16 +224,16 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
buf->mem_priv = mem_priv;
if (dev->hw_dev->is_dma_sg_ops) {
sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv);
sg_tbl = (struct sg_table *)g_ops->cookie(&buf->vb, mem_priv);
buf->dma_addr = sg_dma_address(sg_tbl->sgl);
g_ops->prepare(mem_priv);
} else {
buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv));
buf->dma_addr = *((dma_addr_t *)g_ops->cookie(&buf->vb, mem_priv));
}
if (buf->is_need_vaddr)
buf->vaddr = g_ops->vaddr(mem_priv);
buf->vaddr = g_ops->vaddr(&buf->vb, mem_priv);
if (buf->is_need_dbuf) {
buf->dbuf = g_ops->get_dmabuf(mem_priv, O_RDWR);
buf->dbuf = g_ops->get_dmabuf(&buf->vb, mem_priv, O_RDWR);
if (buf->is_need_dmafd) {
buf->dma_fd = dma_buf_fd(buf->dbuf, O_CLOEXEC);
if (buf->dma_fd < 0) {
@@ -244,7 +256,7 @@ err:
}
void rkisp_free_buffer(struct rkisp_device *dev,
struct rkisp_dummy_buffer *buf)
struct rkisp_dummy_buffer *buf)
{
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;

View File

@@ -121,6 +121,8 @@ struct rkisp_buffer {
};
struct rkisp_dummy_buffer {
struct vb2_buffer vb;
struct vb2_queue vb2_queue;
struct list_head queue;
struct dma_buf *dbuf;
dma_addr_t dma_addr;

View File

@@ -187,26 +187,7 @@ static int csi_config(struct rkisp_csi_device *csi)
u32 emd_vc, emd_dt, mipi_ctrl;
int lanes, ret, i;
/*
* sensor->mbus is set in isp or d-phy notifier_bound function
*/
switch (sensor->mbus.flags & V4L2_MBUS_CSI2_LANES) {
case V4L2_MBUS_CSI2_4_LANE:
lanes = 4;
break;
case V4L2_MBUS_CSI2_3_LANE:
lanes = 3;
break;
case V4L2_MBUS_CSI2_2_LANE:
lanes = 2;
break;
case V4L2_MBUS_CSI2_1_LANE:
lanes = 1;
break;
default:
return -EINVAL;
}
lanes = sensor->mbus.bus.mipi_csi2.num_data_lanes;
emd_vc = 0xFF;
emd_dt = 0;
dev->hdr.sensor = NULL;

View File

@@ -615,7 +615,6 @@ static int rkisp_fwnode_parse(struct device *dev,
{
struct rkisp_async_subdev *rk_asd =
container_of(asd, struct rkisp_async_subdev, asd);
struct v4l2_mbus_config_parallel *bus = &vep->bus.parallel;
/*
* MIPI sensor is linked with a mipi dphy and its media bus config can
@@ -625,7 +624,6 @@ static int rkisp_fwnode_parse(struct device *dev,
vep->bus_type != V4L2_MBUS_PARALLEL)
return 0;
rk_asd->mbus.flags = bus->flags;
rk_asd->mbus.type = vep->bus_type;
return 0;

View File

@@ -43,7 +43,8 @@ struct rkisp_dmarx_frame {
struct rkisp_rx_buf_pool {
struct rkisp_buffer buf;
struct rkisp_rx_buf *dbufs;
void *mem_priv;
struct dma_buf_attachment *dba;
struct sg_table *sgt;
};
/*

View File

@@ -263,86 +263,40 @@ static irqreturn_t isp_irq_hdl(int irq, void *ctx)
return IRQ_HANDLED;
}
static irqreturn_t irq_handler(int irq, void *ctx)
{
struct device *dev = ctx;
struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev);
struct rkisp_device *isp = hw_dev->isp[hw_dev->cur_dev_id];
unsigned int mis_val, mis_3a = 0;
mis_val = readl(hw_dev->base_addr + CIF_ISP_MIS);
if (hw_dev->isp_ver >= ISP_V20)
mis_3a = readl(hw_dev->base_addr + ISP_ISP3A_MIS);
if (mis_val || mis_3a)
rkisp_isp_isr(mis_val, mis_3a, isp);
mis_val = readl(hw_dev->base_addr + CIF_MIPI_MIS);
if (mis_val)
rkisp_mipi_isr(mis_val, isp);
mis_val = readl(hw_dev->base_addr + CIF_MI_MIS);
if (mis_val)
rkisp_mi_isr(mis_val, isp);
return IRQ_HANDLED;
}
int rkisp_register_irq(struct rkisp_hw_dev *hw_dev)
{
const struct isp_match_data *match_data = hw_dev->match_data;
struct platform_device *pdev = hw_dev->pdev;
struct device *dev = &pdev->dev;
struct resource *res;
int i, ret, irq;
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
match_data->irqs[0].name);
if (res) {
/* there are irq names in dts */
for (i = 0; i < match_data->num_irqs; i++) {
irq = platform_get_irq_byname(pdev, match_data->irqs[i].name);
if (irq < 0) {
dev_err(dev, "no irq %s in dts\n",
match_data->irqs[i].name);
return irq;
}
if (!strcmp(match_data->irqs[i].name, "mipi_irq"))
hw_dev->mipi_irq = irq;
ret = devm_request_irq(dev, irq,
match_data->irqs[i].irq_hdl,
IRQF_SHARED,
dev_driver_string(dev),
dev);
if (ret < 0) {
dev_err(dev, "request %s failed: %d\n",
match_data->irqs[i].name, ret);
return ret;
}
if (hw_dev->mipi_irq == irq &&
(hw_dev->isp_ver == ISP_V12 ||
hw_dev->isp_ver == ISP_V13))
disable_irq(hw_dev->mipi_irq);
}
} else {
/* no irq names in dts */
irq = platform_get_irq(pdev, 0);
/* there are irq names in dts */
for (i = 0; i < match_data->num_irqs; i++) {
irq = platform_get_irq_byname(pdev, match_data->irqs[i].name);
if (irq < 0) {
dev_err(dev, "no isp irq in dts\n");
dev_err(dev, "no irq %s in dts\n",
match_data->irqs[i].name);
return irq;
}
if (!strcmp(match_data->irqs[i].name, "mipi_irq"))
hw_dev->mipi_irq = irq;
ret = devm_request_irq(dev, irq,
irq_handler,
match_data->irqs[i].irq_hdl,
IRQF_SHARED,
dev_driver_string(dev),
dev);
if (ret < 0) {
dev_err(dev, "request irq failed: %d\n", ret);
dev_err(dev, "request %s failed: %d\n",
match_data->irqs[i].name, ret);
return ret;
}
if (hw_dev->mipi_irq == irq &&
(hw_dev->isp_ver == ISP_V12 ||
hw_dev->isp_ver == ISP_V13))
disable_irq(hw_dev->mipi_irq);
}
return 0;

View File

@@ -16,14 +16,12 @@ static struct rockit_cfg *rockit_cfg;
struct rkisp_rockit_buffer {
struct rkisp_buffer isp_buf;
struct dma_buf *dmabuf;
void *mpi_mem;
struct dma_buf_attachment *dba;
struct sg_table *sgt;
void *mpi_buf;
struct list_head queue;
int buf_id;
union {
u32 buff_addr;
void *vaddr;
};
u32 buff_addr;
};
static struct rkisp_stream *rkisp_rockit_get_stream(struct rockit_cfg *input_rockit_cfg)
@@ -86,11 +84,8 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg)
struct rkisp_stream *stream = NULL;
struct rkisp_rockit_buffer *isprk_buf = NULL;
struct rkisp_device *ispdev = NULL;
const struct vb2_mem_ops *g_ops = NULL;
int i, ret, height, offset, dev_id;
int i, height, offset, dev_id;
struct rkisp_stream_cfg *stream_cfg = NULL;
void *mem = NULL;
struct sg_table *sg_tbl;
unsigned long lock_flags = 0;
if (!input_rockit_cfg)
@@ -104,7 +99,6 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg)
dev_id = stream->ispdev->dev_id;
ispdev = stream->ispdev;
g_ops = ispdev->hw_dev->mem_ops;
stream_cfg = &rockit_cfg->rkisp_dev_cfg[dev_id].rkisp_stream_cfg[stream->id];
stream_cfg->node = input_rockit_cfg->node;
@@ -120,6 +114,9 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg)
}
if (input_rockit_cfg->is_alloc) {
struct dma_buf_attachment *dba;
struct sg_table *sgt;
for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
if (!stream_cfg->buff_id[i] && !stream_cfg->rkisp_buff[i]) {
stream_cfg->buff_id[i] = input_rockit_cfg->mpi_id;
@@ -135,34 +132,26 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg)
if (i == ROCKIT_BUF_NUM_MAX)
return -EINVAL;
mem = g_ops->attach_dmabuf(stream->ispdev->hw_dev->dev,
input_rockit_cfg->buf,
input_rockit_cfg->buf->size,
DMA_BIDIRECTIONAL);
if (IS_ERR(mem)) {
dba = dma_buf_attach(input_rockit_cfg->buf, ispdev->hw_dev->dev);
if (IS_ERR(dba)) {
kfree(isprk_buf);
stream_cfg->buff_id[i] = 0;
return PTR_ERR(mem);
return PTR_ERR(dba);
}
ret = g_ops->map_dmabuf(mem);
if (ret) {
g_ops->detach_dmabuf(mem);
sgt = dma_buf_map_attachment(dba, DMA_BIDIRECTIONAL);
if (IS_ERR(sgt)) {
dma_buf_detach(input_rockit_cfg->buf, dba);
kfree(isprk_buf);
stream_cfg->buff_id[i] = 0;
return ret;
}
if (ispdev->hw_dev->is_dma_sg_ops) {
sg_tbl = (struct sg_table *)g_ops->cookie(mem);
isprk_buf->buff_addr = sg_dma_address(sg_tbl->sgl);
} else {
isprk_buf->buff_addr = *((u32 *)g_ops->cookie(mem));
return PTR_ERR(sgt);
}
isprk_buf->buff_addr = sg_dma_address(sgt->sgl);
get_dma_buf(input_rockit_cfg->buf);
isprk_buf->mpi_mem = mem;
isprk_buf->dmabuf = input_rockit_cfg->buf;
isprk_buf->mpi_buf = input_rockit_cfg->mpibuf;
isprk_buf->dmabuf = input_rockit_cfg->buf;
isprk_buf->dba = dba;
isprk_buf->sgt = sgt;
stream_cfg->rkisp_buff[i] = isprk_buf;
for (i = 0; i < stream->out_isp_fmt.mplanes; i++)
@@ -437,7 +426,6 @@ void rkisp_rockit_buf_state_clear(struct rkisp_stream *stream)
int rkisp_rockit_buf_free(struct rkisp_stream *stream)
{
const struct vb2_mem_ops *g_ops = stream->ispdev->hw_dev->mem_ops;
struct rkisp_rockit_buffer *isprk_buf;
struct rkisp_stream_cfg *stream_cfg;
u32 i = 0, dev_id = stream->ispdev->dev_id;
@@ -449,10 +437,16 @@ int rkisp_rockit_buf_free(struct rkisp_stream *stream)
for (i = 0; i < ROCKIT_BUF_NUM_MAX; i++) {
if (stream_cfg->rkisp_buff[i]) {
isprk_buf = (struct rkisp_rockit_buffer *)stream_cfg->rkisp_buff[i];
if (isprk_buf->mpi_mem) {
g_ops->unmap_dmabuf(isprk_buf->mpi_mem);
g_ops->detach_dmabuf(isprk_buf->mpi_mem);
if (isprk_buf->dba) {
if (isprk_buf->sgt) {
dma_buf_unmap_attachment(isprk_buf->dba,
isprk_buf->sgt,
DMA_BIDIRECTIONAL);
isprk_buf->sgt = NULL;
}
dma_buf_detach(isprk_buf->dmabuf, isprk_buf->dba);
dma_buf_put(isprk_buf->dmabuf);
isprk_buf->dba = NULL;
}
kfree(stream_cfg->rkisp_buff[i]);
stream_cfg->rkisp_buff[i] = NULL;

View File

@@ -1006,19 +1006,22 @@ static void rkisp_proc_dump_mem(struct rkisp_device *dev)
if (p->buf_3dnr_iir[0].mem_priv) {
if (!p->buf_3dnr_iir[0].is_need_vaddr)
p->buf_3dnr_iir[0].vaddr = g_ops->vaddr(p->buf_3dnr_iir[0].mem_priv);
p->buf_3dnr_iir[0].vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_iir[0].mem_priv);
iir_addr = p->buf_3dnr_iir[0].vaddr;
iir_size = p->buf_3dnr_iir[0].size;
}
if (p->buf_3dnr_cur[0].mem_priv) {
if (!p->buf_3dnr_cur[0].is_need_vaddr)
p->buf_3dnr_cur[0].vaddr = g_ops->vaddr(p->buf_3dnr_cur[0].mem_priv);
p->buf_3dnr_cur[0].vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_cur[0].mem_priv);
cur_addr = p->buf_3dnr_cur[0].vaddr;
cur_size = p->buf_3dnr_cur[0].size;
}
if (p->buf_3dnr_ds[0].mem_priv) {
if (!p->buf_3dnr_ds[0].is_need_vaddr)
p->buf_3dnr_ds[0].vaddr = g_ops->vaddr(p->buf_3dnr_ds[0].mem_priv);
p->buf_3dnr_ds[0].vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_ds[0].mem_priv);
ds_addr = p->buf_3dnr_ds[0].vaddr;
ds_size = p->buf_3dnr_ds[0].size;
}

View File

@@ -401,20 +401,7 @@ int rkisp_update_sensor_info(struct rkisp_device *dev)
return ret;
}
switch (ch.vc) {
case V4L2_MBUS_CSI2_CHANNEL_3:
vc = 3;
break;
case V4L2_MBUS_CSI2_CHANNEL_2:
vc = 2;
break;
case V4L2_MBUS_CSI2_CHANNEL_1:
vc = 1;
break;
case V4L2_MBUS_CSI2_CHANNEL_0:
default:
vc = 0;
}
vc = ch.vc;
dev->csi_dev.mipi_di[i] = CIF_MIPI_DATA_SEL_DT(ret) |
CIF_MIPI_DATA_SEL_VC(vc);
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
@@ -1698,16 +1685,15 @@ static int rkisp_config_isp(struct rkisp_device *dev)
/* Set up input acquisition properties */
if (sensor && (sensor->mbus.type == V4L2_MBUS_BT656 ||
sensor->mbus.type == V4L2_MBUS_PARALLEL)) {
if (sensor->mbus.flags &
V4L2_MBUS_PCLK_SAMPLE_RISING)
if (sensor->mbus.bus.parallel.flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
signal = CIF_ISP_ACQ_PROP_POS_EDGE;
}
if (sensor && sensor->mbus.type == V4L2_MBUS_PARALLEL) {
if (sensor->mbus.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
if (sensor->mbus.bus.parallel.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
signal |= CIF_ISP_ACQ_PROP_VSYNC_LOW;
if (sensor->mbus.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
if (sensor->mbus.bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
signal |= CIF_ISP_ACQ_PROP_HSYNC_LOW;
}
@@ -1826,21 +1812,7 @@ static int rkisp_config_lvds(struct rkisp_device *dev)
if (ret)
goto err;
switch (sensor->mbus.flags & V4L2_MBUS_CSI2_LANES) {
case V4L2_MBUS_CSI2_1_LANE:
lane = 1;
break;
case V4L2_MBUS_CSI2_2_LANE:
lane = 2;
break;
case V4L2_MBUS_CSI2_3_LANE:
lane = 3;
break;
case V4L2_MBUS_CSI2_4_LANE:
default:
lane = 4;
}
lane = BIT(lane) - 1;
lane = BIT(sensor->mbus.bus.mipi_csi2.num_data_lanes) - 1;
switch (in_fmt->bus_width) {
case 8:
@@ -2907,7 +2879,6 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
static void rkisp_rx_buf_free(struct rkisp_device *dev, struct rkisp_rx_buf *dbufs)
{
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
struct rkisp_rx_buf_pool *pool;
int i = 0;
@@ -2916,16 +2887,20 @@ static void rkisp_rx_buf_free(struct rkisp_device *dev, struct rkisp_rx_buf *dbu
for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
pool = &dev->pv_pool[i];
if (dbufs == pool->dbufs) {
if (pool->mem_priv) {
g_ops->unmap_dmabuf(pool->mem_priv);
g_ops->detach_dmabuf(pool->mem_priv);
dma_buf_put(pool->dbufs->dbuf);
pool->mem_priv = NULL;
if (dbufs != pool->dbufs)
continue;
if (pool->dba) {
if (pool->sgt) {
dma_buf_unmap_attachment(pool->dba, pool->sgt,
DMA_BIDIRECTIONAL);
pool->sgt = NULL;
}
pool->dbufs = NULL;
break;
dma_buf_detach(pool->dbufs->dbuf, pool->dba);
dma_buf_put(pool->dbufs->dbuf);
pool->dba = NULL;
}
pool->dbufs = NULL;
break;
}
}
@@ -3017,7 +2992,6 @@ static int rkisp_rx_qbuf(struct rkisp_device *dev,
void rkisp_rx_buf_pool_free(struct rkisp_device *dev)
{
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
struct rkisp_rx_buf_pool *pool;
int i;
@@ -3025,11 +2999,15 @@ void rkisp_rx_buf_pool_free(struct rkisp_device *dev)
pool = &dev->pv_pool[i];
if (!pool->dbufs)
break;
if (pool->mem_priv) {
g_ops->unmap_dmabuf(pool->mem_priv);
g_ops->detach_dmabuf(pool->mem_priv);
if (pool->dba) {
if (pool->sgt) {
dma_buf_unmap_attachment(pool->dba, pool->sgt,
DMA_BIDIRECTIONAL);
pool->sgt = NULL;
}
dma_buf_detach(pool->dbufs->dbuf, pool->dba);
dma_buf_put(pool->dbufs->dbuf);
pool->mem_priv = NULL;
pool->dba = NULL;
}
pool->dbufs = NULL;
}
@@ -3038,13 +3016,12 @@ void rkisp_rx_buf_pool_free(struct rkisp_device *dev)
static int rkisp_rx_buf_pool_init(struct rkisp_device *dev,
struct rkisp_rx_buf *dbufs)
{
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
struct rkisp_stream *stream;
struct rkisp_rx_buf_pool *pool;
struct sg_table *sg_tbl;
struct dma_buf_attachment *dba;
struct sg_table *sgt;
dma_addr_t dma;
int i, ret;
void *mem, *vaddr = NULL;
for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
pool = &dev->pv_pool[i];
@@ -3060,29 +3037,24 @@ static int rkisp_rx_buf_pool_init(struct rkisp_device *dev,
dma = dbufs->dma;
goto end;
}
mem = g_ops->attach_dmabuf(dev->hw_dev->dev, dbufs->dbuf,
dbufs->dbuf->size, DMA_BIDIRECTIONAL);
if (IS_ERR(mem)) {
ret = PTR_ERR(mem);
dba = dma_buf_attach(dbufs->dbuf, dev->hw_dev->dev);
if (IS_ERR(dba)) {
ret = PTR_ERR(dba);
goto err;
}
pool->mem_priv = mem;
ret = g_ops->map_dmabuf(mem);
if (ret)
pool->dba = dba;
sgt = dma_buf_map_attachment(dba, DMA_BIDIRECTIONAL);
if (IS_ERR(sgt)) {
ret = PTR_ERR(sgt);
goto err;
if (dev->hw_dev->is_dma_sg_ops) {
sg_tbl = (struct sg_table *)g_ops->cookie(mem);
dma = sg_dma_address(sg_tbl->sgl);
} else {
dma = *((dma_addr_t *)g_ops->cookie(mem));
}
pool->sgt = sgt;
dma = sg_dma_address(sgt->sgl);
get_dma_buf(dbufs->dbuf);
vaddr = g_ops->vaddr(mem);
end:
dbufs->is_init = true;
pool->buf.other = dbufs;
pool->buf.buff_addr[RKISP_PLANE_Y] = dma;
pool->buf.vaddr[RKISP_PLANE_Y] = vaddr;
switch (dbufs->type) {
case BUF_SHORT:
@@ -3104,7 +3076,7 @@ end:
dbufs->is_first = false;
}
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
"%s dma:0x%x vaddr:%p", __func__, (u32)dma, vaddr);
"%s dma:0x%x\n", __func__, (u32)dma);
return 0;
err:
rkisp_rx_buf_pool_free(dev);