mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user