[media] v4l: omap3isp: Use the new media graph walk interface

The media graph walk requires initialisation and cleanup soon. Update the
users to perform the soon necessary API calls.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
Sakari Ailus
2015-12-16 11:32:24 -02:00
committed by Mauro Carvalho Chehab
parent 106b9907c3
commit 28461451c0
4 changed files with 61 additions and 27 deletions

View File

@@ -683,14 +683,14 @@ static irqreturn_t isp_isr(int irq, void *_isp)
*
* Return the total number of users of all video device nodes in the pipeline.
*/
static int isp_pipeline_pm_use_count(struct media_entity *entity)
static int isp_pipeline_pm_use_count(struct media_entity *entity,
struct media_entity_graph *graph)
{
struct media_entity_graph graph;
int use = 0;
media_entity_graph_walk_start(&graph, entity);
media_entity_graph_walk_start(graph, entity);
while ((entity = media_entity_graph_walk_next(&graph))) {
while ((entity = media_entity_graph_walk_next(graph))) {
if (is_media_entity_v4l2_io(entity))
use += entity->use_count;
}
@@ -742,27 +742,27 @@ static int isp_pipeline_pm_power_one(struct media_entity *entity, int change)
*
* Return 0 on success or a negative error code on failure.
*/
static int isp_pipeline_pm_power(struct media_entity *entity, int change)
static int isp_pipeline_pm_power(struct media_entity *entity, int change,
struct media_entity_graph *graph)
{
struct media_entity_graph graph;
struct media_entity *first = entity;
int ret = 0;
if (!change)
return 0;
media_entity_graph_walk_start(&graph, entity);
media_entity_graph_walk_start(graph, entity);
while (!ret && (entity = media_entity_graph_walk_next(&graph)))
while (!ret && (entity = media_entity_graph_walk_next(graph)))
if (is_media_entity_v4l2_subdev(entity))
ret = isp_pipeline_pm_power_one(entity, change);
if (!ret)
return 0;
return ret;
media_entity_graph_walk_start(&graph, first);
media_entity_graph_walk_start(graph, first);
while ((first = media_entity_graph_walk_next(&graph))
while ((first = media_entity_graph_walk_next(graph))
&& first != entity)
if (is_media_entity_v4l2_subdev(first))
isp_pipeline_pm_power_one(first, -change);
@@ -782,7 +782,8 @@ static int isp_pipeline_pm_power(struct media_entity *entity, int change)
* off is assumed to never fail. No failure can occur when the use parameter is
* set to 0.
*/
int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
int omap3isp_pipeline_pm_use(struct media_entity *entity, int use,
struct media_entity_graph *graph)
{
int change = use ? 1 : -1;
int ret;
@@ -794,7 +795,7 @@ int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
WARN_ON(entity->use_count < 0);
/* Apply power change to connected non-nodes. */
ret = isp_pipeline_pm_power(entity, change);
ret = isp_pipeline_pm_power(entity, change, graph);
if (ret < 0)
entity->use_count -= change;
@@ -820,35 +821,49 @@ int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
static int isp_pipeline_link_notify(struct media_link *link, u32 flags,
unsigned int notification)
{
struct media_entity_graph *graph =
&container_of(link->graph_obj.mdev, struct isp_device,
media_dev)->pm_count_graph;
struct media_entity *source = link->source->entity;
struct media_entity *sink = link->sink->entity;
int source_use = isp_pipeline_pm_use_count(source);
int sink_use = isp_pipeline_pm_use_count(sink);
int ret;
int source_use;
int sink_use;
int ret = 0;
if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH) {
ret = media_entity_graph_walk_init(graph,
link->graph_obj.mdev);
if (ret)
return ret;
}
source_use = isp_pipeline_pm_use_count(source, graph);
sink_use = isp_pipeline_pm_use_count(sink, graph);
if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH &&
!(flags & MEDIA_LNK_FL_ENABLED)) {
/* Powering off entities is assumed to never fail. */
isp_pipeline_pm_power(source, -sink_use);
isp_pipeline_pm_power(sink, -source_use);
isp_pipeline_pm_power(source, -sink_use, graph);
isp_pipeline_pm_power(sink, -source_use, graph);
return 0;
}
if (notification == MEDIA_DEV_NOTIFY_PRE_LINK_CH &&
(flags & MEDIA_LNK_FL_ENABLED)) {
ret = isp_pipeline_pm_power(source, sink_use);
ret = isp_pipeline_pm_power(source, sink_use, graph);
if (ret < 0)
return ret;
ret = isp_pipeline_pm_power(sink, source_use);
ret = isp_pipeline_pm_power(sink, source_use, graph);
if (ret < 0)
isp_pipeline_pm_power(source, -sink_use);
return ret;
isp_pipeline_pm_power(source, -sink_use, graph);
}
return 0;
if (notification == MEDIA_DEV_NOTIFY_POST_LINK_CH)
media_entity_graph_walk_cleanup(graph);
return ret;
}
/* -----------------------------------------------------------------------------