media: mc: entity: Add media_entity_pipeline() to access the media pipeline
Replace direct access to the pipe field in drivers with a new helper function. This will allow easier refactoring of media pipeline handling in the MC core behind the scenes without affecting drivers. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
Родитель
612589a35e
Коммит
72b603357a
|
@ -994,6 +994,12 @@ int media_entity_get_fwnode_pad(struct media_entity *entity,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_get_fwnode_pad);
|
||||
|
||||
struct media_pipeline *media_entity_pipeline(struct media_entity *entity)
|
||||
{
|
||||
return entity->pipe;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_entity_pipeline);
|
||||
|
||||
static void media_interface_init(struct media_device *mdev,
|
||||
struct media_interface *intf,
|
||||
u32 gobj_type,
|
||||
|
|
|
@ -786,9 +786,8 @@ static int rvin_csi2_link_notify(struct media_link *link, u32 flags,
|
|||
return 0;
|
||||
|
||||
/*
|
||||
* Don't allow link changes if any entity in the graph is
|
||||
* streaming, modifying the CHSEL register fields can disrupt
|
||||
* running streams.
|
||||
* Don't allow link changes if any stream in the graph is active as
|
||||
* modifying the CHSEL register fields can disrupt running streams.
|
||||
*/
|
||||
media_device_for_each_entity(entity, &group->mdev)
|
||||
if (media_entity_is_streaming(entity))
|
||||
|
|
|
@ -1281,7 +1281,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.pipe ? sd->entity.pipe : &vin->vdev.pipe;
|
||||
pipe = media_entity_pipeline(&sd->entity) ? : &vin->vdev.pipe;
|
||||
ret = __media_pipeline_start(&vin->vdev.entity, pipe);
|
||||
mutex_unlock(&mdev->graph_mutex);
|
||||
if (ret)
|
||||
|
|
|
@ -937,10 +937,8 @@ static int isp_pipeline_is_last(struct media_entity *me)
|
|||
struct isp_pipeline *pipe;
|
||||
struct media_pad *pad;
|
||||
|
||||
if (!me->pipe)
|
||||
return 0;
|
||||
pipe = to_isp_pipeline(me);
|
||||
if (pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED)
|
||||
if (!pipe || pipe->stream_state == ISP_PIPELINE_STREAM_STOPPED)
|
||||
return 0;
|
||||
pad = media_pad_remote_pad_first(&pipe->output->pad);
|
||||
return pad->entity == me;
|
||||
|
|
|
@ -1093,8 +1093,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
|
|||
/* Start streaming on the pipeline. No link touching an entity in the
|
||||
* pipeline can be activated or deactivated once streaming is started.
|
||||
*/
|
||||
pipe = video->video.entity.pipe
|
||||
? to_isp_pipeline(&video->video.entity) : &video->pipe;
|
||||
pipe = to_isp_pipeline(&video->video.entity) ? : &video->pipe;
|
||||
|
||||
ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev);
|
||||
if (ret)
|
||||
|
|
|
@ -99,8 +99,15 @@ struct isp_pipeline {
|
|||
unsigned int external_width;
|
||||
};
|
||||
|
||||
#define to_isp_pipeline(__e) \
|
||||
container_of((__e)->pipe, struct isp_pipeline, pipe)
|
||||
static inline struct isp_pipeline *to_isp_pipeline(struct media_entity *entity)
|
||||
{
|
||||
struct media_pipeline *pipe = media_entity_pipeline(entity);
|
||||
|
||||
if (!pipe)
|
||||
return NULL;
|
||||
|
||||
return container_of(pipe, struct isp_pipeline, pipe);
|
||||
}
|
||||
|
||||
static inline int isp_pipeline_ready(struct isp_pipeline *pipe)
|
||||
{
|
||||
|
|
|
@ -402,8 +402,7 @@ static int xvip_dma_start_streaming(struct vb2_queue *vq, unsigned int count)
|
|||
* Use the pipeline object embedded in the first DMA object that starts
|
||||
* streaming.
|
||||
*/
|
||||
pipe = dma->video.entity.pipe
|
||||
? to_xvip_pipeline(&dma->video.entity) : &dma->pipe;
|
||||
pipe = to_xvip_pipeline(&dma->video.entity) ? : &dma->pipe;
|
||||
|
||||
ret = media_pipeline_start(&dma->video.entity, &pipe->pipe);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -47,7 +47,12 @@ struct xvip_pipeline {
|
|||
|
||||
static inline struct xvip_pipeline *to_xvip_pipeline(struct media_entity *e)
|
||||
{
|
||||
return container_of(e->pipe, struct xvip_pipeline, pipe);
|
||||
struct media_pipeline *pipe = media_entity_pipeline(e);
|
||||
|
||||
if (!pipe)
|
||||
return NULL;
|
||||
|
||||
return container_of(pipe, struct xvip_pipeline, pipe);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -871,7 +871,7 @@ int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
|
|||
__media_pipeline_stop(entity);
|
||||
} else {
|
||||
v4l2_subdev_call(sd, video, s_stream, 0);
|
||||
if (entity->pipe)
|
||||
if (media_entity_pipeline(entity))
|
||||
__media_pipeline_stop(entity);
|
||||
}
|
||||
|
||||
|
|
|
@ -548,10 +548,8 @@ static int iss_pipeline_is_last(struct media_entity *me)
|
|||
struct iss_pipeline *pipe;
|
||||
struct media_pad *pad;
|
||||
|
||||
if (!me->pipe)
|
||||
return 0;
|
||||
pipe = to_iss_pipeline(me);
|
||||
if (pipe->stream_state == ISS_PIPELINE_STREAM_STOPPED)
|
||||
if (!pipe || pipe->stream_state == ISS_PIPELINE_STREAM_STOPPED)
|
||||
return 0;
|
||||
pad = media_pad_remote_pad_first(&pipe->output->pad);
|
||||
return pad->entity == me;
|
||||
|
|
|
@ -870,8 +870,7 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
|
|||
* Start streaming on the pipeline. No link touching an entity in the
|
||||
* pipeline can be activated or deactivated once streaming is started.
|
||||
*/
|
||||
pipe = entity->pipe
|
||||
? to_iss_pipeline(entity) : &video->pipe;
|
||||
pipe = to_iss_pipeline(&video->video.entity) ? : &video->pipe;
|
||||
pipe->external = NULL;
|
||||
pipe->external_rate = 0;
|
||||
pipe->external_bpp = 0;
|
||||
|
|
|
@ -90,8 +90,15 @@ struct iss_pipeline {
|
|||
int external_bpp;
|
||||
};
|
||||
|
||||
#define to_iss_pipeline(__e) \
|
||||
container_of((__e)->pipe, struct iss_pipeline, pipe)
|
||||
static inline struct iss_pipeline *to_iss_pipeline(struct media_entity *entity)
|
||||
{
|
||||
struct media_pipeline *pipe = media_entity_pipeline(entity);
|
||||
|
||||
if (!pipe)
|
||||
return NULL;
|
||||
|
||||
return container_of(pipe, struct iss_pipeline, pipe);
|
||||
}
|
||||
|
||||
static inline int iss_pipeline_ready(struct iss_pipeline *pipe)
|
||||
{
|
||||
|
|
|
@ -948,6 +948,24 @@ static inline bool media_entity_is_streaming(const struct media_entity *entity)
|
|||
return entity->pipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* media_entity_pipeline - Get the media pipeline an entity is part of
|
||||
* @entity: The entity
|
||||
*
|
||||
* This function returns the media pipeline that an entity has been associated
|
||||
* with when constructing the pipeline with media_pipeline_start(). The pointer
|
||||
* remains valid until media_pipeline_stop() is called.
|
||||
*
|
||||
* In general, entities can be part of multiple pipelines, when carrying
|
||||
* multiple streams (either on different pads, or on the same pad using
|
||||
* multiplexed streams). This function is to be used only for entities that
|
||||
* do not support multiple pipelines.
|
||||
*
|
||||
* Return: The media_pipeline the entity is part of, or NULL if the entity is
|
||||
* not part of any pipeline.
|
||||
*/
|
||||
struct media_pipeline *media_entity_pipeline(struct media_entity *entity);
|
||||
|
||||
/**
|
||||
* media_entity_get_fwnode_pad - Get pad number from fwnode
|
||||
*
|
||||
|
|
Загрузка…
Ссылка в новой задаче