Message ID | 20210524104408.599645-8-tomi.valkeinen@ideasonboard.com |
---|---|
State | Superseded |
Headers | show |
Series | v4l: subdev internal routing and streams | expand |
Hello Tomi, A few minors and a question below On Mon, May 24, 2021 at 01:43:48PM +0300, Tomi Valkeinen wrote: > From: Sakari Ailus <sakari.ailus@linux.intel.com> > > The pipeline has been moved from the entity to the pads; reflect this in > the media pipeline function API. > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > --- > Documentation/driver-api/media/mc-core.rst | 6 ++-- > drivers/media/mc/mc-entity.c | 24 ++++++------- > drivers/media/pci/intel/ipu3/ipu3-cio2-main.c | 6 ++-- > .../media/platform/exynos4-is/fimc-capture.c | 8 ++--- > .../platform/exynos4-is/fimc-isp-video.c | 8 ++--- > drivers/media/platform/exynos4-is/fimc-lite.c | 8 ++--- > drivers/media/platform/omap3isp/ispvideo.c | 6 ++-- > .../media/platform/qcom/camss/camss-video.c | 6 ++-- > drivers/media/platform/rcar-vin/rcar-dma.c | 6 ++-- > .../platform/rockchip/rkisp1/rkisp1-capture.c | 6 ++-- > .../media/platform/s3c-camif/camif-capture.c | 6 ++-- > drivers/media/platform/stm32/stm32-dcmi.c | 6 ++-- > .../platform/sunxi/sun4i-csi/sun4i_dma.c | 6 ++-- > .../platform/sunxi/sun6i-csi/sun6i_video.c | 6 ++-- > drivers/media/platform/ti-vpe/cal-video.c | 6 ++-- > drivers/media/platform/vsp1/vsp1_video.c | 6 ++-- > drivers/media/platform/xilinx/xilinx-dma.c | 6 ++-- > .../media/test-drivers/vimc/vimc-capture.c | 6 ++-- > drivers/media/usb/au0828/au0828-core.c | 8 ++--- > drivers/staging/media/imx/imx-media-utils.c | 6 ++-- > drivers/staging/media/ipu3/ipu3-v4l2.c | 6 ++-- > drivers/staging/media/omap4iss/iss_video.c | 6 ++-- > drivers/staging/media/tegra-video/tegra210.c | 6 ++-- > include/media/media-entity.h | 34 +++++++++---------- > 24 files changed, 98 insertions(+), 100 deletions(-) > > diff --git a/Documentation/driver-api/media/mc-core.rst b/Documentation/driver-api/media/mc-core.rst > index 8a13640bed56..69a64279a61f 100644 > --- a/Documentation/driver-api/media/mc-core.rst > +++ b/Documentation/driver-api/media/mc-core.rst > @@ -213,11 +213,11 @@ When starting streaming, drivers must notify all entities in the pipeline to > prevent link states from being modified during streaming by calling > :c:func:`media_pipeline_start()`. > > -The function will mark all entities connected to the given entity through > -enabled links, either directly or indirectly, as streaming. > +The function will mark all entities connected to the given pad through As the stream_count counter is now moved to the pads, should this be +The function will mark all the pads connected to the given pad through > +enabled routes and links, either directly or indirectly, as streaming. > > The struct media_pipeline instance pointed to by > -the pipe argument will be stored in every entity in the pipeline. > +the pipe argument will be stored in every pad in the pipeline. > Drivers should embed the struct media_pipeline Does this still apply ? > in higher-level pipeline structures and can then access the > pipeline through the struct media_entity This sentence should probably be changed to pipeline through the struct media_pad pipe field. > diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c > index ea1cf7f63ae8..e6451903359c 100644 > --- a/drivers/media/mc/mc-entity.c > +++ b/drivers/media/mc/mc-entity.c > @@ -404,12 +404,11 @@ EXPORT_SYMBOL_GPL(media_entity_get_fwnode_pad); > * Pipeline management > */ > > -__must_check int __media_pipeline_start(struct media_entity *entity, > +__must_check int __media_pipeline_start(struct media_pad *pad, > struct media_pipeline *pipe) > { > - struct media_device *mdev = entity->graph_obj.mdev; > + struct media_device *mdev = pad->graph_obj.mdev; > struct media_graph *graph = &pipe->graph; > - struct media_pad *pad = entity->pads; > struct media_pad *pad_err = pad; > struct media_link *link; > int ret; > @@ -542,24 +541,23 @@ __must_check int __media_pipeline_start(struct media_entity *entity, > } > EXPORT_SYMBOL_GPL(__media_pipeline_start); > > -__must_check int media_pipeline_start(struct media_entity *entity, > +__must_check int media_pipeline_start(struct media_pad *pad, > struct media_pipeline *pipe) As it seems that even with the full series applied media_pipeline_start() is always called with entity->pads as its first argument, I wonder if it wouldn't be more linear for a driver to keep using entity and have this function here pass the entity's pads to __media_pipeline_start(). Do we expect drivers to actually start the pipeline using a specific pad ? Thanks j > { > - struct media_device *mdev = entity->graph_obj.mdev; > + struct media_device *mdev = pad->graph_obj.mdev; > int ret; > > mutex_lock(&mdev->graph_mutex); > - ret = __media_pipeline_start(entity, pipe); > + ret = __media_pipeline_start(pad, pipe); > mutex_unlock(&mdev->graph_mutex); > return ret; > } > EXPORT_SYMBOL_GPL(media_pipeline_start); > > -void __media_pipeline_stop(struct media_entity *entity) > +void __media_pipeline_stop(struct media_pad *pad) > { > - struct media_pipeline *pipe = entity->pads->pipe; > + struct media_pipeline *pipe = pad->pipe; > struct media_graph *graph = &pipe->graph; > - struct media_pad *pad; > > /* > * If the following check fails, the driver has performed an > @@ -568,7 +566,7 @@ void __media_pipeline_stop(struct media_entity *entity) > if (WARN_ON(!pipe)) > return; > > - media_graph_walk_start(graph, entity->pads); > + media_graph_walk_start(graph, pad); > > while ((pad = media_graph_walk_next(graph))) { > struct media_entity *entity = pad->entity; > @@ -590,12 +588,12 @@ void __media_pipeline_stop(struct media_entity *entity) > } > EXPORT_SYMBOL_GPL(__media_pipeline_stop); > > -void media_pipeline_stop(struct media_entity *entity) > +void media_pipeline_stop(struct media_pad *pad) > { > - struct media_device *mdev = entity->graph_obj.mdev; > + struct media_device *mdev = pad->graph_obj.mdev; > > mutex_lock(&mdev->graph_mutex); > - __media_pipeline_stop(entity); > + __media_pipeline_stop(pad); > mutex_unlock(&mdev->graph_mutex); > } > EXPORT_SYMBOL_GPL(media_pipeline_stop); > diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c > index c2644efe4dbd..e0e1d8da70af 100644 > --- a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c > +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c > @@ -982,7 +982,7 @@ static int cio2_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) > return r; > } > > - r = media_pipeline_start(&q->vdev.entity, &q->pipe); > + r = media_pipeline_start(q->vdev.entity.pads, &q->pipe); > if (r) > goto fail_pipeline; > > @@ -1002,7 +1002,7 @@ static int cio2_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) > fail_csi2_subdev: > cio2_hw_exit(cio2, q); > fail_hw: > - media_pipeline_stop(&q->vdev.entity); > + media_pipeline_stop(q->vdev.entity.pads); > fail_pipeline: > dev_dbg(&cio2->pci_dev->dev, "failed to start streaming (%d)\n", r); > cio2_vb2_return_all_buffers(q, VB2_BUF_STATE_QUEUED); > @@ -1023,7 +1023,7 @@ static void cio2_vb2_stop_streaming(struct vb2_queue *vq) > cio2_hw_exit(cio2, q); > synchronize_irq(cio2->pci_dev->irq); > cio2_vb2_return_all_buffers(q, VB2_BUF_STATE_ERROR); > - media_pipeline_stop(&q->vdev.entity); > + media_pipeline_stop(q->vdev.entity.pads); > pm_runtime_put(&cio2->pci_dev->dev); > cio2->streaming = false; > } > diff --git a/drivers/media/platform/exynos4-is/fimc-capture.c b/drivers/media/platform/exynos4-is/fimc-capture.c > index 7ff4024003f4..eaac0ac4e406 100644 > --- a/drivers/media/platform/exynos4-is/fimc-capture.c > +++ b/drivers/media/platform/exynos4-is/fimc-capture.c > @@ -524,7 +524,7 @@ static int fimc_capture_release(struct file *file) > mutex_lock(&fimc->lock); > > if (close && vc->streaming) { > - media_pipeline_stop(&vc->ve.vdev.entity); > + media_pipeline_stop(vc->ve.vdev.entity.pads); > vc->streaming = false; > } > > @@ -1184,7 +1184,7 @@ static int fimc_cap_streamon(struct file *file, void *priv, > if (fimc_capture_active(fimc)) > return -EBUSY; > > - ret = media_pipeline_start(entity, &vc->ve.pipe->mp); > + ret = media_pipeline_start(entity->pads, &vc->ve.pipe->mp); > if (ret < 0) > return ret; > > @@ -1218,7 +1218,7 @@ static int fimc_cap_streamon(struct file *file, void *priv, > } > > err_p_stop: > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > return ret; > } > > @@ -1234,7 +1234,7 @@ static int fimc_cap_streamoff(struct file *file, void *priv, > return ret; > > if (vc->streaming) { > - media_pipeline_stop(&vc->ve.vdev.entity); > + media_pipeline_stop(vc->ve.vdev.entity.pads); > vc->streaming = false; > } > > diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c > index 8d9dc597deaa..ad8195e0b8f2 100644 > --- a/drivers/media/platform/exynos4-is/fimc-isp-video.c > +++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c > @@ -309,7 +309,7 @@ static int isp_video_release(struct file *file) > mutex_lock(&isp->video_lock); > > if (v4l2_fh_is_singular_file(file) && ivc->streaming) { > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > ivc->streaming = 0; > } > > @@ -490,7 +490,7 @@ static int isp_video_streamon(struct file *file, void *priv, > struct media_entity *me = &ve->vdev.entity; > int ret; > > - ret = media_pipeline_start(me, &ve->pipe->mp); > + ret = media_pipeline_start(me->pads, &ve->pipe->mp); > if (ret < 0) > return ret; > > @@ -505,7 +505,7 @@ static int isp_video_streamon(struct file *file, void *priv, > isp->video_capture.streaming = 1; > return 0; > p_stop: > - media_pipeline_stop(me); > + media_pipeline_stop(me->pads); > return ret; > } > > @@ -520,7 +520,7 @@ static int isp_video_streamoff(struct file *file, void *priv, > if (ret < 0) > return ret; > > - media_pipeline_stop(&video->ve.vdev.entity); > + media_pipeline_stop(video->ve.vdev.entity.pads); > video->streaming = 0; > return 0; > } > diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c > index 67bfb1ad2ba2..a979600ff6e6 100644 > --- a/drivers/media/platform/exynos4-is/fimc-lite.c > +++ b/drivers/media/platform/exynos4-is/fimc-lite.c > @@ -516,7 +516,7 @@ static int fimc_lite_release(struct file *file) > if (v4l2_fh_is_singular_file(file) && > atomic_read(&fimc->out_path) == FIMC_IO_DMA) { > if (fimc->streaming) { > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > fimc->streaming = false; > } > fimc_lite_stop_capture(fimc, false); > @@ -822,7 +822,7 @@ static int fimc_lite_streamon(struct file *file, void *priv, > if (fimc_lite_active(fimc)) > return -EBUSY; > > - ret = media_pipeline_start(entity, &fimc->ve.pipe->mp); > + ret = media_pipeline_start(entity->pads, &fimc->ve.pipe->mp); > if (ret < 0) > return ret; > > @@ -839,7 +839,7 @@ static int fimc_lite_streamon(struct file *file, void *priv, > } > > err_p_stop: > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > return 0; > } > > @@ -853,7 +853,7 @@ static int fimc_lite_streamoff(struct file *file, void *priv, > if (ret < 0) > return ret; > > - media_pipeline_stop(&fimc->ve.vdev.entity); > + media_pipeline_stop(fimc->ve.vdev.entity.pads); > fimc->streaming = false; > return 0; > } > diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c > index a8438040c4aa..87334477f223 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.c > +++ b/drivers/media/platform/omap3isp/ispvideo.c > @@ -1105,7 +1105,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); > pipe->max_rate = pipe->l3_ick; > > - ret = media_pipeline_start(&video->video.entity, &pipe->pipe); > + ret = media_pipeline_start(video->video.entity.pads, &pipe->pipe); > if (ret < 0) > goto err_pipeline_start; > > @@ -1162,7 +1162,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > return 0; > > err_check_format: > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > err_pipeline_start: > /* TODO: Implement PM QoS */ > /* The DMA queue must be emptied here, otherwise CCDC interrupts that > @@ -1229,7 +1229,7 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > video->error = false; > > /* TODO: Implement PM QoS */ > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > > media_entity_enum_cleanup(&pipe->ent_enum); > > diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c > index f282275af626..5cd494f17589 100644 > --- a/drivers/media/platform/qcom/camss/camss-video.c > +++ b/drivers/media/platform/qcom/camss/camss-video.c > @@ -491,7 +491,7 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) > struct v4l2_subdev *subdev; > int ret; > > - ret = media_pipeline_start(&vdev->entity, &video->pipe); > + ret = media_pipeline_start(vdev->entity.pads, &video->pipe); > if (ret < 0) > return ret; > > @@ -520,7 +520,7 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) > return 0; > > error: > - media_pipeline_stop(&vdev->entity); > + media_pipeline_stop(vdev->entity.pads); > > video->ops->flush_buffers(video, VB2_BUF_STATE_QUEUED); > > @@ -551,7 +551,7 @@ static void video_stop_streaming(struct vb2_queue *q) > v4l2_subdev_call(subdev, video, s_stream, 0); > } > > - media_pipeline_stop(&vdev->entity); > + media_pipeline_stop(vdev->entity.pads); > > video->ops->flush_buffers(video, VB2_BUF_STATE_ERROR); > } > diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c > index 7994262c9b63..2d930e53c1e2 100644 > --- a/drivers/media/platform/rcar-vin/rcar-dma.c > +++ b/drivers/media/platform/rcar-vin/rcar-dma.c > @@ -1215,7 +1215,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) > sd = media_entity_to_v4l2_subdev(pad->entity); > > if (!on) { > - media_pipeline_stop(&vin->vdev.entity); > + media_pipeline_stop(vin->vdev.entity.pads); > return v4l2_subdev_call(sd, video, s_stream, 0); > } > > @@ -1232,7 +1232,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) > mdev = vin->vdev.entity.graph_obj.mdev; > mutex_lock(&mdev->graph_mutex); > pipe = sd->entity.pads->pipe ? sd->entity.pads->pipe : &vin->vdev.pipe; > - ret = __media_pipeline_start(&vin->vdev.entity, pipe); > + ret = __media_pipeline_start(vin->vdev.entity.pads, pipe); > mutex_unlock(&mdev->graph_mutex); > if (ret) > return ret; > @@ -1241,7 +1241,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) > if (ret == -ENOIOCTLCMD) > ret = 0; > if (ret) > - media_pipeline_stop(&vin->vdev.entity); > + media_pipeline_stop(vin->vdev.entity.pads); > > return ret; > } > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > index 5f6c9d1623e4..c2a11fcc9709 100644 > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c > @@ -979,7 +979,7 @@ static void rkisp1_vb2_stop_streaming(struct vb2_queue *queue) > > rkisp1_dummy_buf_destroy(cap); > > - media_pipeline_stop(&node->vdev.entity); > + media_pipeline_stop(node->vdev.entity.pads); > > mutex_unlock(&cap->rkisp1->stream_lock); > } > @@ -993,7 +993,7 @@ rkisp1_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) > > mutex_lock(&cap->rkisp1->stream_lock); > > - ret = media_pipeline_start(entity, &cap->rkisp1->pipe); > + ret = media_pipeline_start(entity->pads, &cap->rkisp1->pipe); > if (ret) { > dev_err(cap->rkisp1->dev, "start pipeline failed %d\n", ret); > goto err_ret_buffers; > @@ -1030,7 +1030,7 @@ rkisp1_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) > err_destroy_dummy: > rkisp1_dummy_buf_destroy(cap); > err_pipeline_stop: > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > err_ret_buffers: > rkisp1_return_all_buffers(cap, VB2_BUF_STATE_QUEUED); > mutex_unlock(&cap->rkisp1->stream_lock); > diff --git a/drivers/media/platform/s3c-camif/camif-capture.c b/drivers/media/platform/s3c-camif/camif-capture.c > index 3a8d0b05c117..77ad4d3d0d48 100644 > --- a/drivers/media/platform/s3c-camif/camif-capture.c > +++ b/drivers/media/platform/s3c-camif/camif-capture.c > @@ -848,13 +848,13 @@ static int s3c_camif_streamon(struct file *file, void *priv, > if (s3c_vp_active(vp)) > return 0; > > - ret = media_pipeline_start(sensor, camif->m_pipeline); > + ret = media_pipeline_start(sensor->pads, camif->m_pipeline); > if (ret < 0) > return ret; > > ret = camif_pipeline_validate(camif); > if (ret < 0) { > - media_pipeline_stop(sensor); > + media_pipeline_stop(sensor->pads); > return ret; > } > > @@ -878,7 +878,7 @@ static int s3c_camif_streamoff(struct file *file, void *priv, > > ret = vb2_streamoff(&vp->vb_queue, type); > if (ret == 0) > - media_pipeline_stop(&camif->sensor.sd->entity); > + media_pipeline_stop(camif->sensor.sd->entity.pads); > return ret; > } > > diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c > index 6f163e301eb1..14a86f3826b8 100644 > --- a/drivers/media/platform/stm32/stm32-dcmi.c > +++ b/drivers/media/platform/stm32/stm32-dcmi.c > @@ -730,7 +730,7 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) > goto err_pm_put; > } > > - ret = media_pipeline_start(&dcmi->vdev->entity, &dcmi->pipeline); > + ret = media_pipeline_start(dcmi->vdev->entity.pads, &dcmi->pipeline); > if (ret < 0) { > dev_err(dcmi->dev, "%s: Failed to start streaming, media pipeline start error (%d)\n", > __func__, ret); > @@ -844,7 +844,7 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) > dcmi_pipeline_stop(dcmi); > > err_media_pipeline_stop: > - media_pipeline_stop(&dcmi->vdev->entity); > + media_pipeline_stop(dcmi->vdev->entity.pads); > > err_pm_put: > pm_runtime_put(dcmi->dev); > @@ -870,7 +870,7 @@ static void dcmi_stop_streaming(struct vb2_queue *vq) > > dcmi_pipeline_stop(dcmi); > > - media_pipeline_stop(&dcmi->vdev->entity); > + media_pipeline_stop(dcmi->vdev->entity.pads); > > spin_lock_irq(&dcmi->irqlock); > > diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c > index 2c39cd7f2862..be0defdf74f1 100644 > --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c > +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c > @@ -266,7 +266,7 @@ static int sun4i_csi_start_streaming(struct vb2_queue *vq, unsigned int count) > goto err_clear_dma_queue; > } > > - ret = media_pipeline_start(&csi->vdev.entity, &csi->vdev.pipe); > + ret = media_pipeline_start(csi->vdev.entity.pads, &csi->vdev.pipe); > if (ret < 0) > goto err_free_scratch_buffer; > > @@ -330,7 +330,7 @@ static int sun4i_csi_start_streaming(struct vb2_queue *vq, unsigned int count) > sun4i_csi_capture_stop(csi); > > err_disable_pipeline: > - media_pipeline_stop(&csi->vdev.entity); > + media_pipeline_stop(csi->vdev.entity.pads); > > err_free_scratch_buffer: > dma_free_coherent(csi->dev, csi->scratch.size, csi->scratch.vaddr, > @@ -359,7 +359,7 @@ static void sun4i_csi_stop_streaming(struct vb2_queue *vq) > return_all_buffers(csi, VB2_BUF_STATE_ERROR); > spin_unlock_irqrestore(&csi->qlock, flags); > > - media_pipeline_stop(&csi->vdev.entity); > + media_pipeline_stop(csi->vdev.entity.pads); > > dma_free_coherent(csi->dev, csi->scratch.size, csi->scratch.vaddr, > csi->scratch.paddr); > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > index 3181d0781b61..537057a75eaa 100644 > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > @@ -141,7 +141,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) > > video->sequence = 0; > > - ret = media_pipeline_start(&video->vdev.entity, &video->vdev.pipe); > + ret = media_pipeline_start(video->vdev.entity.pads, &video->vdev.pipe); > if (ret < 0) > goto clear_dma_queue; > > @@ -207,7 +207,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) > stop_csi_stream: > sun6i_csi_set_stream(video->csi, false); > stop_media_pipeline: > - media_pipeline_stop(&video->vdev.entity); > + media_pipeline_stop(video->vdev.entity.pads); > clear_dma_queue: > spin_lock_irqsave(&video->dma_queue_lock, flags); > list_for_each_entry(buf, &video->dma_queue, list) > @@ -231,7 +231,7 @@ static void sun6i_video_stop_streaming(struct vb2_queue *vq) > > sun6i_csi_set_stream(video->csi, false); > > - media_pipeline_stop(&video->vdev.entity); > + media_pipeline_stop(video->vdev.entity.pads); > > /* Release all active buffers */ > spin_lock_irqsave(&video->dma_queue_lock, flags); > diff --git a/drivers/media/platform/ti-vpe/cal-video.c b/drivers/media/platform/ti-vpe/cal-video.c > index 7b7436a355ee..ca75b54311a8 100644 > --- a/drivers/media/platform/ti-vpe/cal-video.c > +++ b/drivers/media/platform/ti-vpe/cal-video.c > @@ -675,7 +675,7 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count) > dma_addr_t addr; > int ret; > > - ret = media_pipeline_start(&ctx->vdev.entity, &ctx->phy->pipe); > + ret = media_pipeline_start(ctx->vdev.entity.pads, &ctx->phy->pipe); > if (ret < 0) { > ctx_err(ctx, "Failed to start media pipeline: %d\n", ret); > goto error_release_buffers; > @@ -719,7 +719,7 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count) > pm_runtime_put_sync(ctx->cal->dev); > > error_pipeline: > - media_pipeline_stop(&ctx->vdev.entity); > + media_pipeline_stop(ctx->vdev.entity.pads); > error_release_buffers: > cal_release_buffers(ctx, VB2_BUF_STATE_QUEUED); > > @@ -738,7 +738,7 @@ static void cal_stop_streaming(struct vb2_queue *vq) > > cal_release_buffers(ctx, VB2_BUF_STATE_ERROR); > > - media_pipeline_stop(&ctx->vdev.entity); > + media_pipeline_stop(ctx->vdev.entity.pads); > } > > static const struct vb2_ops cal_video_qops = { > diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c > index f2c36f2fdf53..978f820b0f34 100644 > --- a/drivers/media/platform/vsp1/vsp1_video.c > +++ b/drivers/media/platform/vsp1/vsp1_video.c > @@ -927,7 +927,7 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq) > } > mutex_unlock(&pipe->lock); > > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > vsp1_video_release_buffers(video); > vsp1_video_pipeline_put(pipe); > } > @@ -1048,7 +1048,7 @@ vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > return PTR_ERR(pipe); > } > > - ret = __media_pipeline_start(&video->video.entity, &pipe->pipe); > + ret = __media_pipeline_start(video->video.entity.pads, &pipe->pipe); > if (ret < 0) { > mutex_unlock(&mdev->graph_mutex); > goto err_pipe; > @@ -1072,7 +1072,7 @@ vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > return 0; > > err_stop: > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > err_pipe: > vsp1_video_pipeline_put(pipe); > return ret; > diff --git a/drivers/media/platform/xilinx/xilinx-dma.c b/drivers/media/platform/xilinx/xilinx-dma.c > index 7fa0467dddde..07074eda5f70 100644 > --- a/drivers/media/platform/xilinx/xilinx-dma.c > +++ b/drivers/media/platform/xilinx/xilinx-dma.c > @@ -406,7 +406,7 @@ static int xvip_dma_start_streaming(struct vb2_queue *vq, unsigned int count) > pipe = dma->video.entity.pads->pipe > ? to_xvip_pipeline(&dma->video.entity) : &dma->pipe; > > - ret = media_pipeline_start(&dma->video.entity, &pipe->pipe); > + ret = media_pipeline_start(dma->video.entity.pads, &pipe->pipe); > if (ret < 0) > goto error; > > @@ -432,7 +432,7 @@ static int xvip_dma_start_streaming(struct vb2_queue *vq, unsigned int count) > return 0; > > error_stop: > - media_pipeline_stop(&dma->video.entity); > + media_pipeline_stop(dma->video.entity.pads); > > error: > /* Give back all queued buffers to videobuf2. */ > @@ -460,7 +460,7 @@ static void xvip_dma_stop_streaming(struct vb2_queue *vq) > > /* Cleanup the pipeline and mark it as being stopped. */ > xvip_pipeline_cleanup(pipe); > - media_pipeline_stop(&dma->video.entity); > + media_pipeline_stop(dma->video.entity.pads); > > /* Give back all queued buffers to videobuf2. */ > spin_lock_irq(&dma->queued_lock); > diff --git a/drivers/media/test-drivers/vimc/vimc-capture.c b/drivers/media/test-drivers/vimc/vimc-capture.c > index 5e9fd902cd37..10724b0a868c 100644 > --- a/drivers/media/test-drivers/vimc/vimc-capture.c > +++ b/drivers/media/test-drivers/vimc/vimc-capture.c > @@ -246,7 +246,7 @@ static int vimc_cap_start_streaming(struct vb2_queue *vq, unsigned int count) > vcap->sequence = 0; > > /* Start the media pipeline */ > - ret = media_pipeline_start(entity, &vcap->stream.pipe); > + ret = media_pipeline_start(entity->pads, &vcap->stream.pipe); > if (ret) { > vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); > return ret; > @@ -254,7 +254,7 @@ static int vimc_cap_start_streaming(struct vb2_queue *vq, unsigned int count) > > ret = vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 1); > if (ret) { > - media_pipeline_stop(entity); > + media_pipeline_stop(entity->pads); > vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); > return ret; > } > @@ -273,7 +273,7 @@ static void vimc_cap_stop_streaming(struct vb2_queue *vq) > vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 0); > > /* Stop the media pipeline */ > - media_pipeline_stop(&vcap->vdev.entity); > + media_pipeline_stop(vcap->vdev.entity.pads); > > /* Release all active buffers */ > vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_ERROR); > diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c > index a8a72d5fbd12..93dd7bb0ece0 100644 > --- a/drivers/media/usb/au0828/au0828-core.c > +++ b/drivers/media/usb/au0828/au0828-core.c > @@ -410,7 +410,7 @@ static int au0828_enable_source(struct media_entity *entity, > goto end; > } > > - ret = __media_pipeline_start(entity, pipe); > + ret = __media_pipeline_start(entity->pads, pipe); > if (ret) { > pr_err("Start Pipeline: %s->%s Error %d\n", > source->name, entity->name, ret); > @@ -501,12 +501,12 @@ static void au0828_disable_source(struct media_entity *entity) > return; > > /* stop pipeline */ > - __media_pipeline_stop(dev->active_link_owner); > + __media_pipeline_stop(dev->active_link_owner->pads); > pr_debug("Pipeline stop for %s\n", > dev->active_link_owner->name); > > ret = __media_pipeline_start( > - dev->active_link_user, > + dev->active_link_user->pads, > dev->active_link_user_pipe); > if (ret) { > pr_err("Start Pipeline: %s->%s %d\n", > @@ -532,7 +532,7 @@ static void au0828_disable_source(struct media_entity *entity) > return; > > /* stop pipeline */ > - __media_pipeline_stop(dev->active_link_owner); > + __media_pipeline_stop(dev->active_link_owner->pads); > pr_debug("Pipeline stop for %s\n", > dev->active_link_owner->name); > > diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c > index 535da4dda3c6..74218af45551 100644 > --- a/drivers/staging/media/imx/imx-media-utils.c > +++ b/drivers/staging/media/imx/imx-media-utils.c > @@ -905,16 +905,16 @@ int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd, > mutex_lock(&imxmd->md.graph_mutex); > > if (on) { > - ret = __media_pipeline_start(entity, &imxmd->pipe); > + ret = __media_pipeline_start(entity->pads, &imxmd->pipe); > if (ret) > goto out; > ret = v4l2_subdev_call(sd, video, s_stream, 1); > if (ret) > - __media_pipeline_stop(entity); > + __media_pipeline_stop(entity->pads); > } else { > v4l2_subdev_call(sd, video, s_stream, 0); > if (entity->pads->pipe) > - __media_pipeline_stop(entity); > + __media_pipeline_stop(entity->pads); > } > > out: > diff --git a/drivers/staging/media/ipu3/ipu3-v4l2.c b/drivers/staging/media/ipu3/ipu3-v4l2.c > index 38a240764509..db5867da3f11 100644 > --- a/drivers/staging/media/ipu3/ipu3-v4l2.c > +++ b/drivers/staging/media/ipu3/ipu3-v4l2.c > @@ -485,7 +485,7 @@ static int imgu_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) > > pipe = node->pipe; > imgu_pipe = &imgu->imgu_pipe[pipe]; > - r = media_pipeline_start(&node->vdev.entity, &imgu_pipe->pipeline); > + r = media_pipeline_start(node->vdev.entity.pads, &imgu_pipe->pipeline); > if (r < 0) > goto fail_return_bufs; > > @@ -510,7 +510,7 @@ static int imgu_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) > return 0; > > fail_stop_pipeline: > - media_pipeline_stop(&node->vdev.entity); > + media_pipeline_stop(node->vdev.entity.pads); > fail_return_bufs: > imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_QUEUED); > > @@ -550,7 +550,7 @@ static void imgu_vb2_stop_streaming(struct vb2_queue *vq) > imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_ERROR); > mutex_unlock(&imgu->streaming_lock); > > - media_pipeline_stop(&node->vdev.entity); > + media_pipeline_stop(node->vdev.entity.pads); > } > > /******************** v4l2_ioctl_ops ********************/ > diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c > index b74f7891711d..20fac40581c6 100644 > --- a/drivers/staging/media/omap4iss/iss_video.c > +++ b/drivers/staging/media/omap4iss/iss_video.c > @@ -889,7 +889,7 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > if (video->iss->pdata->set_constraints) > video->iss->pdata->set_constraints(video->iss, true); > > - ret = media_pipeline_start(pad->entity, &pipe->pipe); > + ret = media_pipeline_start(pad, &pipe->pipe); > if (ret < 0) > goto err_media_pipeline_start; > > @@ -980,7 +980,7 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > err_omap4iss_set_stream: > vb2_streamoff(&vfh->queue, type); > err_iss_video_check_format: > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > err_media_pipeline_start: > if (video->iss->pdata->set_constraints) > video->iss->pdata->set_constraints(video->iss, false); > @@ -1034,7 +1034,7 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > > if (video->iss->pdata->set_constraints) > video->iss->pdata->set_constraints(video->iss, false); > - media_pipeline_stop(&video->video.entity); > + media_pipeline_stop(video->video.entity.pads); > > done: > mutex_unlock(&video->stream_lock); > diff --git a/drivers/staging/media/tegra-video/tegra210.c b/drivers/staging/media/tegra-video/tegra210.c > index f10a041e3e6c..d2d7dd0e8624 100644 > --- a/drivers/staging/media/tegra-video/tegra210.c > +++ b/drivers/staging/media/tegra-video/tegra210.c > @@ -547,7 +547,7 @@ static int tegra210_vi_start_streaming(struct vb2_queue *vq, u32 count) > VI_INCR_SYNCPT_NO_STALL); > > /* start the pipeline */ > - ret = media_pipeline_start(&chan->video.entity, pipe); > + ret = media_pipeline_start(chan->video.entity.pads, pipe); > if (ret < 0) > goto error_pipeline_start; > > @@ -595,7 +595,7 @@ static int tegra210_vi_start_streaming(struct vb2_queue *vq, u32 count) > error_kthread_start: > tegra_channel_set_stream(chan, false); > error_set_stream: > - media_pipeline_stop(&chan->video.entity); > + media_pipeline_stop(chan->video.entity.pads); > error_pipeline_start: > tegra_channel_release_buffers(chan, VB2_BUF_STATE_QUEUED); > return ret; > @@ -617,7 +617,7 @@ static void tegra210_vi_stop_streaming(struct vb2_queue *vq) > > tegra_channel_release_buffers(chan, VB2_BUF_STATE_ERROR); > tegra_channel_set_stream(chan, false); > - media_pipeline_stop(&chan->video.entity); > + media_pipeline_stop(chan->video.entity.pads); > } > > /* > diff --git a/include/media/media-entity.h b/include/media/media-entity.h > index c9d97c902d05..516d73a2941e 100644 > --- a/include/media/media-entity.h > +++ b/include/media/media-entity.h > @@ -937,53 +937,53 @@ struct media_pad *media_graph_walk_next(struct media_graph *graph); > > /** > * media_pipeline_start - Mark a pipeline as streaming > - * @entity: Starting entity > - * @pipe: Media pipeline to be assigned to all entities in the pipeline. > + * @pad: Starting pad > + * @pipe: Media pipeline to be assigned to all pads in the pipeline. > * > - * Mark all entities connected to a given entity through enabled links, either > - * directly or indirectly, as streaming. The given pipeline object is assigned > - * to every entity in the pipeline and stored in the media_entity pipe field. > + * Mark all pads connected to a given pad through enabled routes or links, > + * either directly or indirectly, as streaming. The given pipeline object is > + * assigned to every pad in the pipeline and stored in the media_pad pipe > + * field. > * > * Calls to this function can be nested, in which case the same number of > * media_pipeline_stop() calls will be required to stop streaming. The > * pipeline pointer must be identical for all nested calls to > * media_pipeline_start(). > */ > -__must_check int media_pipeline_start(struct media_entity *entity, > +__must_check int media_pipeline_start(struct media_pad *pad, > struct media_pipeline *pipe); > /** > * __media_pipeline_start - Mark a pipeline as streaming > * > - * @entity: Starting entity > - * @pipe: Media pipeline to be assigned to all entities in the pipeline. > + * @pad: Starting pad > + * @pipe: Media pipeline to be assigned to all pads in the pipeline. > * > * ..note:: This is the non-locking version of media_pipeline_start() > */ > -__must_check int __media_pipeline_start(struct media_entity *entity, > +__must_check int __media_pipeline_start(struct media_pad *pad, > struct media_pipeline *pipe); > > /** > * media_pipeline_stop - Mark a pipeline as not streaming > - * @entity: Starting entity > + * @pad: Starting pad > * > - * Mark all entities connected to a given entity through enabled links, either > - * directly or indirectly, as not streaming. The media_entity pipe field is > - * reset to %NULL. > + * Mark all pads connected to a given pad through enabled routes or links, > + * either directly or indirectly, as not streaming. > * > * If multiple calls to media_pipeline_start() have been made, the same > * number of calls to this function are required to mark the pipeline as not > - * streaming. > + * streaming and reset the media_pad pipe field to %NULL. > */ > -void media_pipeline_stop(struct media_entity *entity); > +void media_pipeline_stop(struct media_pad *pad); > > /** > * __media_pipeline_stop - Mark a pipeline as not streaming > * > - * @entity: Starting entity > + * @pad: Starting pad > * > * .. note:: This is the non-locking version of media_pipeline_stop() > */ > -void __media_pipeline_stop(struct media_entity *entity); > +void __media_pipeline_stop(struct media_pad *pad); > > /** > * media_devnode_create() - creates and initializes a device node interface > -- > 2.25.1 >
Hi Jacopo, On Thu, Jul 08, 2021 at 02:36:20PM +0200, Jacopo Mondi wrote: > Hello Tomi, > A few minors and a question below > > On Mon, May 24, 2021 at 01:43:48PM +0300, Tomi Valkeinen wrote: > > From: Sakari Ailus <sakari.ailus@linux.intel.com> > > > > The pipeline has been moved from the entity to the pads; reflect this in > > the media pipeline function API. > > > > Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org> > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> > > --- > > Documentation/driver-api/media/mc-core.rst | 6 ++-- > > drivers/media/mc/mc-entity.c | 24 ++++++------- > > drivers/media/pci/intel/ipu3/ipu3-cio2-main.c | 6 ++-- > > .../media/platform/exynos4-is/fimc-capture.c | 8 ++--- > > .../platform/exynos4-is/fimc-isp-video.c | 8 ++--- > > drivers/media/platform/exynos4-is/fimc-lite.c | 8 ++--- > > drivers/media/platform/omap3isp/ispvideo.c | 6 ++-- > > .../media/platform/qcom/camss/camss-video.c | 6 ++-- > > drivers/media/platform/rcar-vin/rcar-dma.c | 6 ++-- > > .../platform/rockchip/rkisp1/rkisp1-capture.c | 6 ++-- > > .../media/platform/s3c-camif/camif-capture.c | 6 ++-- > > drivers/media/platform/stm32/stm32-dcmi.c | 6 ++-- > > .../platform/sunxi/sun4i-csi/sun4i_dma.c | 6 ++-- > > .../platform/sunxi/sun6i-csi/sun6i_video.c | 6 ++-- > > drivers/media/platform/ti-vpe/cal-video.c | 6 ++-- > > drivers/media/platform/vsp1/vsp1_video.c | 6 ++-- > > drivers/media/platform/xilinx/xilinx-dma.c | 6 ++-- > > .../media/test-drivers/vimc/vimc-capture.c | 6 ++-- > > drivers/media/usb/au0828/au0828-core.c | 8 ++--- > > drivers/staging/media/imx/imx-media-utils.c | 6 ++-- > > drivers/staging/media/ipu3/ipu3-v4l2.c | 6 ++-- > > drivers/staging/media/omap4iss/iss_video.c | 6 ++-- > > drivers/staging/media/tegra-video/tegra210.c | 6 ++-- > > include/media/media-entity.h | 34 +++++++++---------- > > 24 files changed, 98 insertions(+), 100 deletions(-) > > > > diff --git a/Documentation/driver-api/media/mc-core.rst b/Documentation/driver-api/media/mc-core.rst > > index 8a13640bed56..69a64279a61f 100644 > > --- a/Documentation/driver-api/media/mc-core.rst > > +++ b/Documentation/driver-api/media/mc-core.rst > > @@ -213,11 +213,11 @@ When starting streaming, drivers must notify all entities in the pipeline to > > prevent link states from being modified during streaming by calling > > :c:func:`media_pipeline_start()`. > > > > -The function will mark all entities connected to the given entity through > > -enabled links, either directly or indirectly, as streaming. > > +The function will mark all entities connected to the given pad through > > As the stream_count counter is now moved to the pads, should this be > > +The function will mark all the pads connected to the given pad through Yes. > > > +enabled routes and links, either directly or indirectly, as streaming. > > > > The struct media_pipeline instance pointed to by > > -the pipe argument will be stored in every entity in the pipeline. > > +the pipe argument will be stored in every pad in the pipeline. > > Drivers should embed the struct media_pipeline > > Does this still apply ? Yes. > > > in higher-level pipeline structures and can then access the > > pipeline through the struct media_entity > > This sentence should probably be changed to > > pipeline through the struct media_pad pipe field. Yes. > > > diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c > > index ea1cf7f63ae8..e6451903359c 100644 > > --- a/drivers/media/mc/mc-entity.c > > +++ b/drivers/media/mc/mc-entity.c > > @@ -404,12 +404,11 @@ EXPORT_SYMBOL_GPL(media_entity_get_fwnode_pad); > > * Pipeline management > > */ > > > > -__must_check int __media_pipeline_start(struct media_entity *entity, > > +__must_check int __media_pipeline_start(struct media_pad *pad, > > struct media_pipeline *pipe) > > { > > - struct media_device *mdev = entity->graph_obj.mdev; > > + struct media_device *mdev = pad->graph_obj.mdev; > > struct media_graph *graph = &pipe->graph; > > - struct media_pad *pad = entity->pads; > > struct media_pad *pad_err = pad; > > struct media_link *link; > > int ret; > > @@ -542,24 +541,23 @@ __must_check int __media_pipeline_start(struct media_entity *entity, > > } > > EXPORT_SYMBOL_GPL(__media_pipeline_start); > > > > -__must_check int media_pipeline_start(struct media_entity *entity, > > +__must_check int media_pipeline_start(struct media_pad *pad, > > struct media_pipeline *pipe) > > As it seems that even with the full series applied > media_pipeline_start() is always called with entity->pads as its first > argument, I wonder if it wouldn't be more linear for a driver to keep > using entity and have this function here pass the entity's pads to > __media_pipeline_start(). > > Do we expect drivers to actually start the pipeline using a specific > pad ? The pipeline is moved to pads with this patch, and therefore it's logical to do start from pads, too. Should there be more than one, figuring out which one to use would not be possible. -- Sakari Ailus
On 08/07/2021 15:36, Jacopo Mondi wrote: > Hello Tomi, > A few minors and a question below > > On Mon, May 24, 2021 at 01:43:48PM +0300, Tomi Valkeinen wrote: >> From: Sakari Ailus <sakari.ailus@linux.intel.com> >> >> The pipeline has been moved from the entity to the pads; reflect this in >> the media pipeline function API. >> >> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> >> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> >> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> >> Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org> >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> >> --- >> Documentation/driver-api/media/mc-core.rst | 6 ++-- >> drivers/media/mc/mc-entity.c | 24 ++++++------- >> drivers/media/pci/intel/ipu3/ipu3-cio2-main.c | 6 ++-- >> .../media/platform/exynos4-is/fimc-capture.c | 8 ++--- >> .../platform/exynos4-is/fimc-isp-video.c | 8 ++--- >> drivers/media/platform/exynos4-is/fimc-lite.c | 8 ++--- >> drivers/media/platform/omap3isp/ispvideo.c | 6 ++-- >> .../media/platform/qcom/camss/camss-video.c | 6 ++-- >> drivers/media/platform/rcar-vin/rcar-dma.c | 6 ++-- >> .../platform/rockchip/rkisp1/rkisp1-capture.c | 6 ++-- >> .../media/platform/s3c-camif/camif-capture.c | 6 ++-- >> drivers/media/platform/stm32/stm32-dcmi.c | 6 ++-- >> .../platform/sunxi/sun4i-csi/sun4i_dma.c | 6 ++-- >> .../platform/sunxi/sun6i-csi/sun6i_video.c | 6 ++-- >> drivers/media/platform/ti-vpe/cal-video.c | 6 ++-- >> drivers/media/platform/vsp1/vsp1_video.c | 6 ++-- >> drivers/media/platform/xilinx/xilinx-dma.c | 6 ++-- >> .../media/test-drivers/vimc/vimc-capture.c | 6 ++-- >> drivers/media/usb/au0828/au0828-core.c | 8 ++--- >> drivers/staging/media/imx/imx-media-utils.c | 6 ++-- >> drivers/staging/media/ipu3/ipu3-v4l2.c | 6 ++-- >> drivers/staging/media/omap4iss/iss_video.c | 6 ++-- >> drivers/staging/media/tegra-video/tegra210.c | 6 ++-- >> include/media/media-entity.h | 34 +++++++++---------- >> 24 files changed, 98 insertions(+), 100 deletions(-) >> >> diff --git a/Documentation/driver-api/media/mc-core.rst b/Documentation/driver-api/media/mc-core.rst >> index 8a13640bed56..69a64279a61f 100644 >> --- a/Documentation/driver-api/media/mc-core.rst >> +++ b/Documentation/driver-api/media/mc-core.rst >> @@ -213,11 +213,11 @@ When starting streaming, drivers must notify all entities in the pipeline to >> prevent link states from being modified during streaming by calling >> :c:func:`media_pipeline_start()`. >> >> -The function will mark all entities connected to the given entity through >> -enabled links, either directly or indirectly, as streaming. >> +The function will mark all entities connected to the given pad through > > As the stream_count counter is now moved to the pads, should this be > > +The function will mark all the pads connected to the given pad through > >> +enabled routes and links, either directly or indirectly, as streaming. >> >> The struct media_pipeline instance pointed to by >> -the pipe argument will be stored in every entity in the pipeline. >> +the pipe argument will be stored in every pad in the pipeline. >> Drivers should embed the struct media_pipeline > > Does this still apply ? > >> in higher-level pipeline structures and can then access the >> pipeline through the struct media_entity > > This sentence should probably be changed to > > pipeline through the struct media_pad pipe field. Thanks! I've made these two changes. Tomi
diff --git a/Documentation/driver-api/media/mc-core.rst b/Documentation/driver-api/media/mc-core.rst index 8a13640bed56..69a64279a61f 100644 --- a/Documentation/driver-api/media/mc-core.rst +++ b/Documentation/driver-api/media/mc-core.rst @@ -213,11 +213,11 @@ When starting streaming, drivers must notify all entities in the pipeline to prevent link states from being modified during streaming by calling :c:func:`media_pipeline_start()`. -The function will mark all entities connected to the given entity through -enabled links, either directly or indirectly, as streaming. +The function will mark all entities connected to the given pad through +enabled routes and links, either directly or indirectly, as streaming. The struct media_pipeline instance pointed to by -the pipe argument will be stored in every entity in the pipeline. +the pipe argument will be stored in every pad in the pipeline. Drivers should embed the struct media_pipeline in higher-level pipeline structures and can then access the pipeline through the struct media_entity diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c index ea1cf7f63ae8..e6451903359c 100644 --- a/drivers/media/mc/mc-entity.c +++ b/drivers/media/mc/mc-entity.c @@ -404,12 +404,11 @@ EXPORT_SYMBOL_GPL(media_entity_get_fwnode_pad); * Pipeline management */ -__must_check int __media_pipeline_start(struct media_entity *entity, +__must_check int __media_pipeline_start(struct media_pad *pad, struct media_pipeline *pipe) { - struct media_device *mdev = entity->graph_obj.mdev; + struct media_device *mdev = pad->graph_obj.mdev; struct media_graph *graph = &pipe->graph; - struct media_pad *pad = entity->pads; struct media_pad *pad_err = pad; struct media_link *link; int ret; @@ -542,24 +541,23 @@ __must_check int __media_pipeline_start(struct media_entity *entity, } EXPORT_SYMBOL_GPL(__media_pipeline_start); -__must_check int media_pipeline_start(struct media_entity *entity, +__must_check int media_pipeline_start(struct media_pad *pad, struct media_pipeline *pipe) { - struct media_device *mdev = entity->graph_obj.mdev; + struct media_device *mdev = pad->graph_obj.mdev; int ret; mutex_lock(&mdev->graph_mutex); - ret = __media_pipeline_start(entity, pipe); + ret = __media_pipeline_start(pad, pipe); mutex_unlock(&mdev->graph_mutex); return ret; } EXPORT_SYMBOL_GPL(media_pipeline_start); -void __media_pipeline_stop(struct media_entity *entity) +void __media_pipeline_stop(struct media_pad *pad) { - struct media_pipeline *pipe = entity->pads->pipe; + struct media_pipeline *pipe = pad->pipe; struct media_graph *graph = &pipe->graph; - struct media_pad *pad; /* * If the following check fails, the driver has performed an @@ -568,7 +566,7 @@ void __media_pipeline_stop(struct media_entity *entity) if (WARN_ON(!pipe)) return; - media_graph_walk_start(graph, entity->pads); + media_graph_walk_start(graph, pad); while ((pad = media_graph_walk_next(graph))) { struct media_entity *entity = pad->entity; @@ -590,12 +588,12 @@ void __media_pipeline_stop(struct media_entity *entity) } EXPORT_SYMBOL_GPL(__media_pipeline_stop); -void media_pipeline_stop(struct media_entity *entity) +void media_pipeline_stop(struct media_pad *pad) { - struct media_device *mdev = entity->graph_obj.mdev; + struct media_device *mdev = pad->graph_obj.mdev; mutex_lock(&mdev->graph_mutex); - __media_pipeline_stop(entity); + __media_pipeline_stop(pad); mutex_unlock(&mdev->graph_mutex); } EXPORT_SYMBOL_GPL(media_pipeline_stop); diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c index c2644efe4dbd..e0e1d8da70af 100644 --- a/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2-main.c @@ -982,7 +982,7 @@ static int cio2_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) return r; } - r = media_pipeline_start(&q->vdev.entity, &q->pipe); + r = media_pipeline_start(q->vdev.entity.pads, &q->pipe); if (r) goto fail_pipeline; @@ -1002,7 +1002,7 @@ static int cio2_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) fail_csi2_subdev: cio2_hw_exit(cio2, q); fail_hw: - media_pipeline_stop(&q->vdev.entity); + media_pipeline_stop(q->vdev.entity.pads); fail_pipeline: dev_dbg(&cio2->pci_dev->dev, "failed to start streaming (%d)\n", r); cio2_vb2_return_all_buffers(q, VB2_BUF_STATE_QUEUED); @@ -1023,7 +1023,7 @@ static void cio2_vb2_stop_streaming(struct vb2_queue *vq) cio2_hw_exit(cio2, q); synchronize_irq(cio2->pci_dev->irq); cio2_vb2_return_all_buffers(q, VB2_BUF_STATE_ERROR); - media_pipeline_stop(&q->vdev.entity); + media_pipeline_stop(q->vdev.entity.pads); pm_runtime_put(&cio2->pci_dev->dev); cio2->streaming = false; } diff --git a/drivers/media/platform/exynos4-is/fimc-capture.c b/drivers/media/platform/exynos4-is/fimc-capture.c index 7ff4024003f4..eaac0ac4e406 100644 --- a/drivers/media/platform/exynos4-is/fimc-capture.c +++ b/drivers/media/platform/exynos4-is/fimc-capture.c @@ -524,7 +524,7 @@ static int fimc_capture_release(struct file *file) mutex_lock(&fimc->lock); if (close && vc->streaming) { - media_pipeline_stop(&vc->ve.vdev.entity); + media_pipeline_stop(vc->ve.vdev.entity.pads); vc->streaming = false; } @@ -1184,7 +1184,7 @@ static int fimc_cap_streamon(struct file *file, void *priv, if (fimc_capture_active(fimc)) return -EBUSY; - ret = media_pipeline_start(entity, &vc->ve.pipe->mp); + ret = media_pipeline_start(entity->pads, &vc->ve.pipe->mp); if (ret < 0) return ret; @@ -1218,7 +1218,7 @@ static int fimc_cap_streamon(struct file *file, void *priv, } err_p_stop: - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); return ret; } @@ -1234,7 +1234,7 @@ static int fimc_cap_streamoff(struct file *file, void *priv, return ret; if (vc->streaming) { - media_pipeline_stop(&vc->ve.vdev.entity); + media_pipeline_stop(vc->ve.vdev.entity.pads); vc->streaming = false; } diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c index 8d9dc597deaa..ad8195e0b8f2 100644 --- a/drivers/media/platform/exynos4-is/fimc-isp-video.c +++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c @@ -309,7 +309,7 @@ static int isp_video_release(struct file *file) mutex_lock(&isp->video_lock); if (v4l2_fh_is_singular_file(file) && ivc->streaming) { - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); ivc->streaming = 0; } @@ -490,7 +490,7 @@ static int isp_video_streamon(struct file *file, void *priv, struct media_entity *me = &ve->vdev.entity; int ret; - ret = media_pipeline_start(me, &ve->pipe->mp); + ret = media_pipeline_start(me->pads, &ve->pipe->mp); if (ret < 0) return ret; @@ -505,7 +505,7 @@ static int isp_video_streamon(struct file *file, void *priv, isp->video_capture.streaming = 1; return 0; p_stop: - media_pipeline_stop(me); + media_pipeline_stop(me->pads); return ret; } @@ -520,7 +520,7 @@ static int isp_video_streamoff(struct file *file, void *priv, if (ret < 0) return ret; - media_pipeline_stop(&video->ve.vdev.entity); + media_pipeline_stop(video->ve.vdev.entity.pads); video->streaming = 0; return 0; } diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c index 67bfb1ad2ba2..a979600ff6e6 100644 --- a/drivers/media/platform/exynos4-is/fimc-lite.c +++ b/drivers/media/platform/exynos4-is/fimc-lite.c @@ -516,7 +516,7 @@ static int fimc_lite_release(struct file *file) if (v4l2_fh_is_singular_file(file) && atomic_read(&fimc->out_path) == FIMC_IO_DMA) { if (fimc->streaming) { - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); fimc->streaming = false; } fimc_lite_stop_capture(fimc, false); @@ -822,7 +822,7 @@ static int fimc_lite_streamon(struct file *file, void *priv, if (fimc_lite_active(fimc)) return -EBUSY; - ret = media_pipeline_start(entity, &fimc->ve.pipe->mp); + ret = media_pipeline_start(entity->pads, &fimc->ve.pipe->mp); if (ret < 0) return ret; @@ -839,7 +839,7 @@ static int fimc_lite_streamon(struct file *file, void *priv, } err_p_stop: - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); return 0; } @@ -853,7 +853,7 @@ static int fimc_lite_streamoff(struct file *file, void *priv, if (ret < 0) return ret; - media_pipeline_stop(&fimc->ve.vdev.entity); + media_pipeline_stop(fimc->ve.vdev.entity.pads); fimc->streaming = false; return 0; } diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index a8438040c4aa..87334477f223 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -1105,7 +1105,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); pipe->max_rate = pipe->l3_ick; - ret = media_pipeline_start(&video->video.entity, &pipe->pipe); + ret = media_pipeline_start(video->video.entity.pads, &pipe->pipe); if (ret < 0) goto err_pipeline_start; @@ -1162,7 +1162,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) return 0; err_check_format: - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); err_pipeline_start: /* TODO: Implement PM QoS */ /* The DMA queue must be emptied here, otherwise CCDC interrupts that @@ -1229,7 +1229,7 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) video->error = false; /* TODO: Implement PM QoS */ - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); media_entity_enum_cleanup(&pipe->ent_enum); diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c index f282275af626..5cd494f17589 100644 --- a/drivers/media/platform/qcom/camss/camss-video.c +++ b/drivers/media/platform/qcom/camss/camss-video.c @@ -491,7 +491,7 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) struct v4l2_subdev *subdev; int ret; - ret = media_pipeline_start(&vdev->entity, &video->pipe); + ret = media_pipeline_start(vdev->entity.pads, &video->pipe); if (ret < 0) return ret; @@ -520,7 +520,7 @@ static int video_start_streaming(struct vb2_queue *q, unsigned int count) return 0; error: - media_pipeline_stop(&vdev->entity); + media_pipeline_stop(vdev->entity.pads); video->ops->flush_buffers(video, VB2_BUF_STATE_QUEUED); @@ -551,7 +551,7 @@ static void video_stop_streaming(struct vb2_queue *q) v4l2_subdev_call(subdev, video, s_stream, 0); } - media_pipeline_stop(&vdev->entity); + media_pipeline_stop(vdev->entity.pads); video->ops->flush_buffers(video, VB2_BUF_STATE_ERROR); } diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c index 7994262c9b63..2d930e53c1e2 100644 --- a/drivers/media/platform/rcar-vin/rcar-dma.c +++ b/drivers/media/platform/rcar-vin/rcar-dma.c @@ -1215,7 +1215,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) sd = media_entity_to_v4l2_subdev(pad->entity); if (!on) { - media_pipeline_stop(&vin->vdev.entity); + media_pipeline_stop(vin->vdev.entity.pads); return v4l2_subdev_call(sd, video, s_stream, 0); } @@ -1232,7 +1232,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) mdev = vin->vdev.entity.graph_obj.mdev; mutex_lock(&mdev->graph_mutex); pipe = sd->entity.pads->pipe ? sd->entity.pads->pipe : &vin->vdev.pipe; - ret = __media_pipeline_start(&vin->vdev.entity, pipe); + ret = __media_pipeline_start(vin->vdev.entity.pads, pipe); mutex_unlock(&mdev->graph_mutex); if (ret) return ret; @@ -1241,7 +1241,7 @@ static int rvin_set_stream(struct rvin_dev *vin, int on) if (ret == -ENOIOCTLCMD) ret = 0; if (ret) - media_pipeline_stop(&vin->vdev.entity); + media_pipeline_stop(vin->vdev.entity.pads); return ret; } diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c index 5f6c9d1623e4..c2a11fcc9709 100644 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c @@ -979,7 +979,7 @@ static void rkisp1_vb2_stop_streaming(struct vb2_queue *queue) rkisp1_dummy_buf_destroy(cap); - media_pipeline_stop(&node->vdev.entity); + media_pipeline_stop(node->vdev.entity.pads); mutex_unlock(&cap->rkisp1->stream_lock); } @@ -993,7 +993,7 @@ rkisp1_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) mutex_lock(&cap->rkisp1->stream_lock); - ret = media_pipeline_start(entity, &cap->rkisp1->pipe); + ret = media_pipeline_start(entity->pads, &cap->rkisp1->pipe); if (ret) { dev_err(cap->rkisp1->dev, "start pipeline failed %d\n", ret); goto err_ret_buffers; @@ -1030,7 +1030,7 @@ rkisp1_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) err_destroy_dummy: rkisp1_dummy_buf_destroy(cap); err_pipeline_stop: - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); err_ret_buffers: rkisp1_return_all_buffers(cap, VB2_BUF_STATE_QUEUED); mutex_unlock(&cap->rkisp1->stream_lock); diff --git a/drivers/media/platform/s3c-camif/camif-capture.c b/drivers/media/platform/s3c-camif/camif-capture.c index 3a8d0b05c117..77ad4d3d0d48 100644 --- a/drivers/media/platform/s3c-camif/camif-capture.c +++ b/drivers/media/platform/s3c-camif/camif-capture.c @@ -848,13 +848,13 @@ static int s3c_camif_streamon(struct file *file, void *priv, if (s3c_vp_active(vp)) return 0; - ret = media_pipeline_start(sensor, camif->m_pipeline); + ret = media_pipeline_start(sensor->pads, camif->m_pipeline); if (ret < 0) return ret; ret = camif_pipeline_validate(camif); if (ret < 0) { - media_pipeline_stop(sensor); + media_pipeline_stop(sensor->pads); return ret; } @@ -878,7 +878,7 @@ static int s3c_camif_streamoff(struct file *file, void *priv, ret = vb2_streamoff(&vp->vb_queue, type); if (ret == 0) - media_pipeline_stop(&camif->sensor.sd->entity); + media_pipeline_stop(camif->sensor.sd->entity.pads); return ret; } diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c index 6f163e301eb1..14a86f3826b8 100644 --- a/drivers/media/platform/stm32/stm32-dcmi.c +++ b/drivers/media/platform/stm32/stm32-dcmi.c @@ -730,7 +730,7 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) goto err_pm_put; } - ret = media_pipeline_start(&dcmi->vdev->entity, &dcmi->pipeline); + ret = media_pipeline_start(dcmi->vdev->entity.pads, &dcmi->pipeline); if (ret < 0) { dev_err(dcmi->dev, "%s: Failed to start streaming, media pipeline start error (%d)\n", __func__, ret); @@ -844,7 +844,7 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) dcmi_pipeline_stop(dcmi); err_media_pipeline_stop: - media_pipeline_stop(&dcmi->vdev->entity); + media_pipeline_stop(dcmi->vdev->entity.pads); err_pm_put: pm_runtime_put(dcmi->dev); @@ -870,7 +870,7 @@ static void dcmi_stop_streaming(struct vb2_queue *vq) dcmi_pipeline_stop(dcmi); - media_pipeline_stop(&dcmi->vdev->entity); + media_pipeline_stop(dcmi->vdev->entity.pads); spin_lock_irq(&dcmi->irqlock); diff --git a/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c b/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c index 2c39cd7f2862..be0defdf74f1 100644 --- a/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c +++ b/drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c @@ -266,7 +266,7 @@ static int sun4i_csi_start_streaming(struct vb2_queue *vq, unsigned int count) goto err_clear_dma_queue; } - ret = media_pipeline_start(&csi->vdev.entity, &csi->vdev.pipe); + ret = media_pipeline_start(csi->vdev.entity.pads, &csi->vdev.pipe); if (ret < 0) goto err_free_scratch_buffer; @@ -330,7 +330,7 @@ static int sun4i_csi_start_streaming(struct vb2_queue *vq, unsigned int count) sun4i_csi_capture_stop(csi); err_disable_pipeline: - media_pipeline_stop(&csi->vdev.entity); + media_pipeline_stop(csi->vdev.entity.pads); err_free_scratch_buffer: dma_free_coherent(csi->dev, csi->scratch.size, csi->scratch.vaddr, @@ -359,7 +359,7 @@ static void sun4i_csi_stop_streaming(struct vb2_queue *vq) return_all_buffers(csi, VB2_BUF_STATE_ERROR); spin_unlock_irqrestore(&csi->qlock, flags); - media_pipeline_stop(&csi->vdev.entity); + media_pipeline_stop(csi->vdev.entity.pads); dma_free_coherent(csi->dev, csi->scratch.size, csi->scratch.vaddr, csi->scratch.paddr); diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c index 3181d0781b61..537057a75eaa 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c @@ -141,7 +141,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) video->sequence = 0; - ret = media_pipeline_start(&video->vdev.entity, &video->vdev.pipe); + ret = media_pipeline_start(video->vdev.entity.pads, &video->vdev.pipe); if (ret < 0) goto clear_dma_queue; @@ -207,7 +207,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) stop_csi_stream: sun6i_csi_set_stream(video->csi, false); stop_media_pipeline: - media_pipeline_stop(&video->vdev.entity); + media_pipeline_stop(video->vdev.entity.pads); clear_dma_queue: spin_lock_irqsave(&video->dma_queue_lock, flags); list_for_each_entry(buf, &video->dma_queue, list) @@ -231,7 +231,7 @@ static void sun6i_video_stop_streaming(struct vb2_queue *vq) sun6i_csi_set_stream(video->csi, false); - media_pipeline_stop(&video->vdev.entity); + media_pipeline_stop(video->vdev.entity.pads); /* Release all active buffers */ spin_lock_irqsave(&video->dma_queue_lock, flags); diff --git a/drivers/media/platform/ti-vpe/cal-video.c b/drivers/media/platform/ti-vpe/cal-video.c index 7b7436a355ee..ca75b54311a8 100644 --- a/drivers/media/platform/ti-vpe/cal-video.c +++ b/drivers/media/platform/ti-vpe/cal-video.c @@ -675,7 +675,7 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count) dma_addr_t addr; int ret; - ret = media_pipeline_start(&ctx->vdev.entity, &ctx->phy->pipe); + ret = media_pipeline_start(ctx->vdev.entity.pads, &ctx->phy->pipe); if (ret < 0) { ctx_err(ctx, "Failed to start media pipeline: %d\n", ret); goto error_release_buffers; @@ -719,7 +719,7 @@ static int cal_start_streaming(struct vb2_queue *vq, unsigned int count) pm_runtime_put_sync(ctx->cal->dev); error_pipeline: - media_pipeline_stop(&ctx->vdev.entity); + media_pipeline_stop(ctx->vdev.entity.pads); error_release_buffers: cal_release_buffers(ctx, VB2_BUF_STATE_QUEUED); @@ -738,7 +738,7 @@ static void cal_stop_streaming(struct vb2_queue *vq) cal_release_buffers(ctx, VB2_BUF_STATE_ERROR); - media_pipeline_stop(&ctx->vdev.entity); + media_pipeline_stop(ctx->vdev.entity.pads); } static const struct vb2_ops cal_video_qops = { diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c index f2c36f2fdf53..978f820b0f34 100644 --- a/drivers/media/platform/vsp1/vsp1_video.c +++ b/drivers/media/platform/vsp1/vsp1_video.c @@ -927,7 +927,7 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq) } mutex_unlock(&pipe->lock); - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); vsp1_video_release_buffers(video); vsp1_video_pipeline_put(pipe); } @@ -1048,7 +1048,7 @@ vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) return PTR_ERR(pipe); } - ret = __media_pipeline_start(&video->video.entity, &pipe->pipe); + ret = __media_pipeline_start(video->video.entity.pads, &pipe->pipe); if (ret < 0) { mutex_unlock(&mdev->graph_mutex); goto err_pipe; @@ -1072,7 +1072,7 @@ vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) return 0; err_stop: - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); err_pipe: vsp1_video_pipeline_put(pipe); return ret; diff --git a/drivers/media/platform/xilinx/xilinx-dma.c b/drivers/media/platform/xilinx/xilinx-dma.c index 7fa0467dddde..07074eda5f70 100644 --- a/drivers/media/platform/xilinx/xilinx-dma.c +++ b/drivers/media/platform/xilinx/xilinx-dma.c @@ -406,7 +406,7 @@ static int xvip_dma_start_streaming(struct vb2_queue *vq, unsigned int count) pipe = dma->video.entity.pads->pipe ? to_xvip_pipeline(&dma->video.entity) : &dma->pipe; - ret = media_pipeline_start(&dma->video.entity, &pipe->pipe); + ret = media_pipeline_start(dma->video.entity.pads, &pipe->pipe); if (ret < 0) goto error; @@ -432,7 +432,7 @@ static int xvip_dma_start_streaming(struct vb2_queue *vq, unsigned int count) return 0; error_stop: - media_pipeline_stop(&dma->video.entity); + media_pipeline_stop(dma->video.entity.pads); error: /* Give back all queued buffers to videobuf2. */ @@ -460,7 +460,7 @@ static void xvip_dma_stop_streaming(struct vb2_queue *vq) /* Cleanup the pipeline and mark it as being stopped. */ xvip_pipeline_cleanup(pipe); - media_pipeline_stop(&dma->video.entity); + media_pipeline_stop(dma->video.entity.pads); /* Give back all queued buffers to videobuf2. */ spin_lock_irq(&dma->queued_lock); diff --git a/drivers/media/test-drivers/vimc/vimc-capture.c b/drivers/media/test-drivers/vimc/vimc-capture.c index 5e9fd902cd37..10724b0a868c 100644 --- a/drivers/media/test-drivers/vimc/vimc-capture.c +++ b/drivers/media/test-drivers/vimc/vimc-capture.c @@ -246,7 +246,7 @@ static int vimc_cap_start_streaming(struct vb2_queue *vq, unsigned int count) vcap->sequence = 0; /* Start the media pipeline */ - ret = media_pipeline_start(entity, &vcap->stream.pipe); + ret = media_pipeline_start(entity->pads, &vcap->stream.pipe); if (ret) { vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); return ret; @@ -254,7 +254,7 @@ static int vimc_cap_start_streaming(struct vb2_queue *vq, unsigned int count) ret = vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 1); if (ret) { - media_pipeline_stop(entity); + media_pipeline_stop(entity->pads); vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_QUEUED); return ret; } @@ -273,7 +273,7 @@ static void vimc_cap_stop_streaming(struct vb2_queue *vq) vimc_streamer_s_stream(&vcap->stream, &vcap->ved, 0); /* Stop the media pipeline */ - media_pipeline_stop(&vcap->vdev.entity); + media_pipeline_stop(vcap->vdev.entity.pads); /* Release all active buffers */ vimc_cap_return_all_buffers(vcap, VB2_BUF_STATE_ERROR); diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c index a8a72d5fbd12..93dd7bb0ece0 100644 --- a/drivers/media/usb/au0828/au0828-core.c +++ b/drivers/media/usb/au0828/au0828-core.c @@ -410,7 +410,7 @@ static int au0828_enable_source(struct media_entity *entity, goto end; } - ret = __media_pipeline_start(entity, pipe); + ret = __media_pipeline_start(entity->pads, pipe); if (ret) { pr_err("Start Pipeline: %s->%s Error %d\n", source->name, entity->name, ret); @@ -501,12 +501,12 @@ static void au0828_disable_source(struct media_entity *entity) return; /* stop pipeline */ - __media_pipeline_stop(dev->active_link_owner); + __media_pipeline_stop(dev->active_link_owner->pads); pr_debug("Pipeline stop for %s\n", dev->active_link_owner->name); ret = __media_pipeline_start( - dev->active_link_user, + dev->active_link_user->pads, dev->active_link_user_pipe); if (ret) { pr_err("Start Pipeline: %s->%s %d\n", @@ -532,7 +532,7 @@ static void au0828_disable_source(struct media_entity *entity) return; /* stop pipeline */ - __media_pipeline_stop(dev->active_link_owner); + __media_pipeline_stop(dev->active_link_owner->pads); pr_debug("Pipeline stop for %s\n", dev->active_link_owner->name); diff --git a/drivers/staging/media/imx/imx-media-utils.c b/drivers/staging/media/imx/imx-media-utils.c index 535da4dda3c6..74218af45551 100644 --- a/drivers/staging/media/imx/imx-media-utils.c +++ b/drivers/staging/media/imx/imx-media-utils.c @@ -905,16 +905,16 @@ int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd, mutex_lock(&imxmd->md.graph_mutex); if (on) { - ret = __media_pipeline_start(entity, &imxmd->pipe); + ret = __media_pipeline_start(entity->pads, &imxmd->pipe); if (ret) goto out; ret = v4l2_subdev_call(sd, video, s_stream, 1); if (ret) - __media_pipeline_stop(entity); + __media_pipeline_stop(entity->pads); } else { v4l2_subdev_call(sd, video, s_stream, 0); if (entity->pads->pipe) - __media_pipeline_stop(entity); + __media_pipeline_stop(entity->pads); } out: diff --git a/drivers/staging/media/ipu3/ipu3-v4l2.c b/drivers/staging/media/ipu3/ipu3-v4l2.c index 38a240764509..db5867da3f11 100644 --- a/drivers/staging/media/ipu3/ipu3-v4l2.c +++ b/drivers/staging/media/ipu3/ipu3-v4l2.c @@ -485,7 +485,7 @@ static int imgu_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) pipe = node->pipe; imgu_pipe = &imgu->imgu_pipe[pipe]; - r = media_pipeline_start(&node->vdev.entity, &imgu_pipe->pipeline); + r = media_pipeline_start(node->vdev.entity.pads, &imgu_pipe->pipeline); if (r < 0) goto fail_return_bufs; @@ -510,7 +510,7 @@ static int imgu_vb2_start_streaming(struct vb2_queue *vq, unsigned int count) return 0; fail_stop_pipeline: - media_pipeline_stop(&node->vdev.entity); + media_pipeline_stop(node->vdev.entity.pads); fail_return_bufs: imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_QUEUED); @@ -550,7 +550,7 @@ static void imgu_vb2_stop_streaming(struct vb2_queue *vq) imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_ERROR); mutex_unlock(&imgu->streaming_lock); - media_pipeline_stop(&node->vdev.entity); + media_pipeline_stop(node->vdev.entity.pads); } /******************** v4l2_ioctl_ops ********************/ diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c index b74f7891711d..20fac40581c6 100644 --- a/drivers/staging/media/omap4iss/iss_video.c +++ b/drivers/staging/media/omap4iss/iss_video.c @@ -889,7 +889,7 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) if (video->iss->pdata->set_constraints) video->iss->pdata->set_constraints(video->iss, true); - ret = media_pipeline_start(pad->entity, &pipe->pipe); + ret = media_pipeline_start(pad, &pipe->pipe); if (ret < 0) goto err_media_pipeline_start; @@ -980,7 +980,7 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) err_omap4iss_set_stream: vb2_streamoff(&vfh->queue, type); err_iss_video_check_format: - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); err_media_pipeline_start: if (video->iss->pdata->set_constraints) video->iss->pdata->set_constraints(video->iss, false); @@ -1034,7 +1034,7 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) if (video->iss->pdata->set_constraints) video->iss->pdata->set_constraints(video->iss, false); - media_pipeline_stop(&video->video.entity); + media_pipeline_stop(video->video.entity.pads); done: mutex_unlock(&video->stream_lock); diff --git a/drivers/staging/media/tegra-video/tegra210.c b/drivers/staging/media/tegra-video/tegra210.c index f10a041e3e6c..d2d7dd0e8624 100644 --- a/drivers/staging/media/tegra-video/tegra210.c +++ b/drivers/staging/media/tegra-video/tegra210.c @@ -547,7 +547,7 @@ static int tegra210_vi_start_streaming(struct vb2_queue *vq, u32 count) VI_INCR_SYNCPT_NO_STALL); /* start the pipeline */ - ret = media_pipeline_start(&chan->video.entity, pipe); + ret = media_pipeline_start(chan->video.entity.pads, pipe); if (ret < 0) goto error_pipeline_start; @@ -595,7 +595,7 @@ static int tegra210_vi_start_streaming(struct vb2_queue *vq, u32 count) error_kthread_start: tegra_channel_set_stream(chan, false); error_set_stream: - media_pipeline_stop(&chan->video.entity); + media_pipeline_stop(chan->video.entity.pads); error_pipeline_start: tegra_channel_release_buffers(chan, VB2_BUF_STATE_QUEUED); return ret; @@ -617,7 +617,7 @@ static void tegra210_vi_stop_streaming(struct vb2_queue *vq) tegra_channel_release_buffers(chan, VB2_BUF_STATE_ERROR); tegra_channel_set_stream(chan, false); - media_pipeline_stop(&chan->video.entity); + media_pipeline_stop(chan->video.entity.pads); } /* diff --git a/include/media/media-entity.h b/include/media/media-entity.h index c9d97c902d05..516d73a2941e 100644 --- a/include/media/media-entity.h +++ b/include/media/media-entity.h @@ -937,53 +937,53 @@ struct media_pad *media_graph_walk_next(struct media_graph *graph); /** * media_pipeline_start - Mark a pipeline as streaming - * @entity: Starting entity - * @pipe: Media pipeline to be assigned to all entities in the pipeline. + * @pad: Starting pad + * @pipe: Media pipeline to be assigned to all pads in the pipeline. * - * Mark all entities connected to a given entity through enabled links, either - * directly or indirectly, as streaming. The given pipeline object is assigned - * to every entity in the pipeline and stored in the media_entity pipe field. + * Mark all pads connected to a given pad through enabled routes or links, + * either directly or indirectly, as streaming. The given pipeline object is + * assigned to every pad in the pipeline and stored in the media_pad pipe + * field. * * Calls to this function can be nested, in which case the same number of * media_pipeline_stop() calls will be required to stop streaming. The * pipeline pointer must be identical for all nested calls to * media_pipeline_start(). */ -__must_check int media_pipeline_start(struct media_entity *entity, +__must_check int media_pipeline_start(struct media_pad *pad, struct media_pipeline *pipe); /** * __media_pipeline_start - Mark a pipeline as streaming * - * @entity: Starting entity - * @pipe: Media pipeline to be assigned to all entities in the pipeline. + * @pad: Starting pad + * @pipe: Media pipeline to be assigned to all pads in the pipeline. * * ..note:: This is the non-locking version of media_pipeline_start() */ -__must_check int __media_pipeline_start(struct media_entity *entity, +__must_check int __media_pipeline_start(struct media_pad *pad, struct media_pipeline *pipe); /** * media_pipeline_stop - Mark a pipeline as not streaming - * @entity: Starting entity + * @pad: Starting pad * - * Mark all entities connected to a given entity through enabled links, either - * directly or indirectly, as not streaming. The media_entity pipe field is - * reset to %NULL. + * Mark all pads connected to a given pad through enabled routes or links, + * either directly or indirectly, as not streaming. * * If multiple calls to media_pipeline_start() have been made, the same * number of calls to this function are required to mark the pipeline as not - * streaming. + * streaming and reset the media_pad pipe field to %NULL. */ -void media_pipeline_stop(struct media_entity *entity); +void media_pipeline_stop(struct media_pad *pad); /** * __media_pipeline_stop - Mark a pipeline as not streaming * - * @entity: Starting entity + * @pad: Starting pad * * .. note:: This is the non-locking version of media_pipeline_stop() */ -void __media_pipeline_stop(struct media_entity *entity); +void __media_pipeline_stop(struct media_pad *pad); /** * media_devnode_create() - creates and initializes a device node interface