From fa133f475e84216d901eedbe6350a22bcf7c0ea0 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 31 May 2023 15:35:15 +0800 Subject: [PATCH] media: rockchip: isp: fix build error for kernel 6.1 Change-Id: I5f1e2b9ef7f4fdca51752d1b1598db630faaf5e4 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/bridge.c | 7 -- .../media/platform/rockchip/isp/capture_v1x.c | 4 +- .../media/platform/rockchip/isp/capture_v20.c | 4 +- .../media/platform/rockchip/isp/capture_v21.c | 4 +- .../media/platform/rockchip/isp/capture_v30.c | 4 +- .../media/platform/rockchip/isp/capture_v32.c | 6 +- drivers/media/platform/rockchip/isp/common.c | 32 ++++-- drivers/media/platform/rockchip/isp/common.h | 2 + drivers/media/platform/rockchip/isp/csi.c | 21 +--- drivers/media/platform/rockchip/isp/dev.c | 2 - drivers/media/platform/rockchip/isp/dmarx.h | 3 +- drivers/media/platform/rockchip/isp/hw.c | 78 +++----------- .../media/platform/rockchip/isp/isp_rockit.c | 60 +++++------ drivers/media/platform/rockchip/isp/procfs.c | 9 +- drivers/media/platform/rockchip/isp/rkisp.c | 102 +++++++----------- 15 files changed, 124 insertions(+), 214 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/bridge.c b/drivers/media/platform/rockchip/isp/bridge.c index 66af5336144e..c3d975cd1bb7 100644 --- a/drivers/media/platform/rockchip/isp/bridge.c +++ b/drivers/media/platform/rockchip/isp/bridge.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.c b/drivers/media/platform/rockchip/isp/capture_v1x.c index a9026e2a2ee6..45d1881548af 100644 --- a/drivers/media/platform/rockchip/isp/capture_v1x.c +++ b/drivers/media/platform/rockchip/isp/capture_v1x.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index 209298197978..dbbf94bf9367 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index 79836510f56e..a5a4053eca83 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index c3ef571ff2e9..2393e0ca1eb8 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 5a7a0c5b60c6..463133ace88f 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -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]; diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index 875d6da59ed0..6d7ddf574249 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index 609d95074c04..19c5ff5f8d3c 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -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; diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index b6ae5a624db3..298bc0f5e052 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 588e017aec20..a2aa4db92989 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/dmarx.h b/drivers/media/platform/rockchip/isp/dmarx.h index a607ffee7a56..f8d8f230268b 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.h +++ b/drivers/media/platform/rockchip/isp/dmarx.h @@ -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; }; /* diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index e6e4d9a716fe..b2982c09a9ac 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/isp_rockit.c b/drivers/media/platform/rockchip/isp/isp_rockit.c index 0ba72aad0c73..8576926e4580 100644 --- a/drivers/media/platform/rockchip/isp/isp_rockit.c +++ b/drivers/media/platform/rockchip/isp/isp_rockit.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c index 96536d555e99..7b28d7dc7a8d 100644 --- a/drivers/media/platform/rockchip/isp/procfs.c +++ b/drivers/media/platform/rockchip/isp/procfs.c @@ -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; } diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 8d3150d1443f..1064c5ef0dc4 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -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);