2009-12-09 14:40:00 +03:00
/*
* Media entity
*
* Copyright ( C ) 2010 Nokia Corporation
*
* Contacts : Laurent Pinchart < laurent . pinchart @ ideasonboard . com >
* Sakari Ailus < sakari . ailus @ iki . fi >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# ifndef _MEDIA_ENTITY_H
# define _MEDIA_ENTITY_H
# include <linux/list.h>
2009-12-09 14:40:01 +03:00
# include <linux/media.h>
2009-12-09 14:40:00 +03:00
2010-08-25 16:00:41 +04:00
struct media_pipeline {
} ;
2009-12-09 14:40:00 +03:00
struct media_link {
struct media_pad * source ; /* Source pad */
struct media_pad * sink ; /* Sink pad */
struct media_link * reverse ; /* Link in the reverse direction */
unsigned long flags ; /* Link flags (MEDIA_LNK_FL_*) */
} ;
struct media_pad {
struct media_entity * entity ; /* Entity this pad belongs to */
u16 index ; /* Pad index in the entity pads array */
unsigned long flags ; /* Pad flags (MEDIA_PAD_FL_*) */
} ;
2009-12-09 14:40:03 +03:00
struct media_entity_operations {
int ( * link_setup ) ( struct media_entity * entity ,
const struct media_pad * local ,
const struct media_pad * remote , u32 flags ) ;
2012-01-11 13:25:15 +04:00
int ( * link_validate ) ( struct media_link * link ) ;
2009-12-09 14:40:03 +03:00
} ;
2009-12-09 14:40:00 +03:00
struct media_entity {
struct list_head list ;
struct media_device * parent ; /* Media device this entity belongs to*/
u32 id ; /* Entity ID, unique in the parent media
* device context */
const char * name ; /* Entity name */
u32 type ; /* Entity type (MEDIA_ENT_T_*) */
u32 revision ; /* Entity revision, driver specific */
unsigned long flags ; /* Entity flags (MEDIA_ENT_FL_*) */
u32 group_id ; /* Entity group ID */
u16 num_pads ; /* Number of sink and source pads */
u16 num_links ; /* Number of existing links, both
* enabled and disabled */
u16 num_backlinks ; /* Number of backlinks */
u16 max_links ; /* Maximum number of links */
struct media_pad * pads ; /* Pads array (num_pads elements) */
struct media_link * links ; /* Links array (max_links elements)*/
2009-12-09 14:40:03 +03:00
const struct media_entity_operations * ops ; /* Entity operations */
2010-03-07 21:04:59 +03:00
/* Reference counts must never be negative, but are signed integers on
* purpose : a simple WARN_ON ( < 0 ) check can be used to detect reference
* count bugs that would make them negative .
*/
2010-08-25 16:00:41 +04:00
int stream_count ; /* Stream count for the entity. */
2010-03-07 21:04:59 +03:00
int use_count ; /* Use count for the entity. */
2010-08-25 16:00:41 +04:00
struct media_pipeline * pipe ; /* Pipeline this entity belongs to. */
2009-12-09 14:40:00 +03:00
union {
/* Node specifications */
struct {
u32 major ;
u32 minor ;
} v4l ;
struct {
u32 major ;
u32 minor ;
} fb ;
struct {
u32 card ;
u32 device ;
u32 subdevice ;
} alsa ;
int dvb ;
/* Sub-device specifications */
/* Nothing needed yet */
2011-11-06 01:42:01 +04:00
} info ;
2009-12-09 14:40:00 +03:00
} ;
static inline u32 media_entity_type ( struct media_entity * entity )
{
return entity - > type & MEDIA_ENT_TYPE_MASK ;
}
static inline u32 media_entity_subtype ( struct media_entity * entity )
{
return entity - > type & MEDIA_ENT_SUBTYPE_MASK ;
}
2010-03-07 22:14:14 +03:00
# define MEDIA_ENTITY_ENUM_MAX_DEPTH 16
struct media_entity_graph {
struct {
struct media_entity * entity ;
int link ;
} stack [ MEDIA_ENTITY_ENUM_MAX_DEPTH ] ;
int top ;
} ;
2009-12-09 14:40:00 +03:00
int media_entity_init ( struct media_entity * entity , u16 num_pads ,
struct media_pad * pads , u16 extra_links ) ;
void media_entity_cleanup ( struct media_entity * entity ) ;
2010-08-25 16:00:41 +04:00
2009-12-09 14:40:00 +03:00
int media_entity_create_link ( struct media_entity * source , u16 source_pad ,
struct media_entity * sink , u16 sink_pad , u32 flags ) ;
2013-05-09 15:29:32 +04:00
void __media_entity_remove_links ( struct media_entity * entity ) ;
void media_entity_remove_links ( struct media_entity * entity ) ;
2009-12-09 14:40:03 +03:00
int __media_entity_setup_link ( struct media_link * link , u32 flags ) ;
int media_entity_setup_link ( struct media_link * link , u32 flags ) ;
struct media_link * media_entity_find_link ( struct media_pad * source ,
struct media_pad * sink ) ;
2013-06-03 12:16:13 +04:00
struct media_pad * media_entity_remote_pad ( struct media_pad * pad ) ;
2009-12-09 14:40:00 +03:00
2010-03-07 21:04:59 +03:00
struct media_entity * media_entity_get ( struct media_entity * entity ) ;
void media_entity_put ( struct media_entity * entity ) ;
2010-03-07 22:14:14 +03:00
void media_entity_graph_walk_start ( struct media_entity_graph * graph ,
struct media_entity * entity ) ;
struct media_entity *
media_entity_graph_walk_next ( struct media_entity_graph * graph ) ;
2012-01-11 13:25:15 +04:00
__must_check int media_entity_pipeline_start ( struct media_entity * entity ,
struct media_pipeline * pipe ) ;
2010-08-25 16:00:41 +04:00
void media_entity_pipeline_stop ( struct media_entity * entity ) ;
2010-03-07 22:14:14 +03:00
2009-12-09 14:40:03 +03:00
# define media_entity_call(entity, operation, args...) \
( ( ( entity ) - > ops & & ( entity ) - > ops - > operation ) ? \
( entity ) - > ops - > operation ( ( entity ) , # # args ) : - ENOIOCTLCMD )
2009-12-09 14:40:00 +03:00
# endif