Commit c1a37dd5 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: v4l2: taint pads with the signal types for consumer devices

Consumer devices are provided with a wide different range of types
supported by the same driver, allowing different configutations.

In order to make easier to setup media controller links, "taint"
pads with the signal type it carries.

While here, get rid of DEMOD_PAD_VBI_OUT, as the signal it carries
is actually the same as the normal video output.

The difference happens at the video/VBI interface:
	- for VBI, only the hidden lines are streamed;
	- for video, the stream is usually cropped to hide the
	  vbi lines.
Acked-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 092a3787
...@@ -719,8 +719,11 @@ static int au8522_probe(struct i2c_client *client, ...@@ -719,8 +719,11 @@ static int au8522_probe(struct i2c_client *client,
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
state->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; state->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
state->pads[DEMOD_PAD_IF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
state->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE; state->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
state->pads[DEMOD_PAD_VID_OUT].sig_type = PAD_SIGNAL_DV;
state->pads[DEMOD_PAD_AUDIO_OUT].flags = MEDIA_PAD_FL_SOURCE; state->pads[DEMOD_PAD_AUDIO_OUT].flags = MEDIA_PAD_FL_SOURCE;
state->pads[DEMOD_PAD_AUDIO_OUT].sig_type = PAD_SIGNAL_AUDIO;
sd->entity.function = MEDIA_ENT_F_ATV_DECODER; sd->entity.function = MEDIA_ENT_F_ATV_DECODER;
ret = media_entity_pads_init(&sd->entity, ARRAY_SIZE(state->pads), ret = media_entity_pads_init(&sd->entity, ARRAY_SIZE(state->pads),
......
...@@ -704,7 +704,9 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -704,7 +704,9 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
state->pads[IF_AUD_DEC_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; state->pads[IF_AUD_DEC_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
state->pads[IF_AUD_DEC_PAD_IF_INPUT].sig_type = PAD_SIGNAL_AUDIO;
state->pads[IF_AUD_DEC_PAD_OUT].flags = MEDIA_PAD_FL_SOURCE; state->pads[IF_AUD_DEC_PAD_OUT].flags = MEDIA_PAD_FL_SOURCE;
state->pads[IF_AUD_DEC_PAD_OUT].sig_type = PAD_SIGNAL_AUDIO;
sd->entity.function = MEDIA_ENT_F_IF_AUD_DECODER; sd->entity.function = MEDIA_ENT_F_IF_AUD_DECODER;
......
...@@ -1835,7 +1835,9 @@ static int saa711x_probe(struct i2c_client *client, ...@@ -1835,7 +1835,9 @@ static int saa711x_probe(struct i2c_client *client,
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
state->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; state->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
state->pads[DEMOD_PAD_IF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
state->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE; state->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
state->pads[DEMOD_PAD_VID_OUT].sig_type = PAD_SIGNAL_DV;
sd->entity.function = MEDIA_ENT_F_ATV_DECODER; sd->entity.function = MEDIA_ENT_F_ATV_DECODER;
......
...@@ -1500,7 +1500,9 @@ static int tvp5150_probe(struct i2c_client *c, ...@@ -1500,7 +1500,9 @@ static int tvp5150_probe(struct i2c_client *c,
#if defined(CONFIG_MEDIA_CONTROLLER) #if defined(CONFIG_MEDIA_CONTROLLER)
core->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; core->pads[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
core->pads[DEMOD_PAD_IF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
core->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE; core->pads[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
core->pads[DEMOD_PAD_VID_OUT].sig_type = PAD_SIGNAL_DV;
sd->entity.function = MEDIA_ENT_F_ATV_DECODER; sd->entity.function = MEDIA_ENT_F_ATV_DECODER;
......
...@@ -846,7 +846,9 @@ static void saa7134_create_entities(struct saa7134_dev *dev) ...@@ -846,7 +846,9 @@ static void saa7134_create_entities(struct saa7134_dev *dev)
if (!decoder) { if (!decoder) {
dev->demod.name = "saa713x"; dev->demod.name = "saa713x";
dev->demod_pad[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; dev->demod_pad[DEMOD_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
dev->demod_pad[DEMOD_PAD_IF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
dev->demod_pad[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE; dev->demod_pad[DEMOD_PAD_VID_OUT].flags = MEDIA_PAD_FL_SOURCE;
dev->demod_pad[DEMOD_PAD_VID_OUT].sig_type = PAD_SIGNAL_DV;
dev->demod.function = MEDIA_ENT_F_ATV_DECODER; dev->demod.function = MEDIA_ENT_F_ATV_DECODER;
ret = media_entity_pads_init(&dev->demod, DEMOD_NUM_PADS, ret = media_entity_pads_init(&dev->demod, DEMOD_NUM_PADS,
......
...@@ -467,10 +467,12 @@ static int si2157_probe(struct i2c_client *client, ...@@ -467,10 +467,12 @@ static int si2157_probe(struct i2c_client *client,
dev->ent.name = KBUILD_MODNAME; dev->ent.name = KBUILD_MODNAME;
dev->ent.function = MEDIA_ENT_F_TUNER; dev->ent.function = MEDIA_ENT_F_TUNER;
dev->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK; dev->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK;
dev->pad[TUNER_PAD_RF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
dev->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE; dev->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE;
dev->pad[TUNER_PAD_OUTPUT].sig_type = PAD_SIGNAL_ANALOG;
dev->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE; dev->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE;
dev->pad[TUNER_PAD_AUD_OUT].sig_type = PAD_SIGNAL_AUDIO;
ret = media_entity_pads_init(&dev->ent, TUNER_NUM_PADS, ret = media_entity_pads_init(&dev->ent, TUNER_NUM_PADS,
&dev->pad[0]); &dev->pad[0]);
......
...@@ -893,7 +893,9 @@ static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap) ...@@ -893,7 +893,9 @@ static int mxl111sf_attach_tuner(struct dvb_usb_adapter *adap)
state->tuner.function = MEDIA_ENT_F_TUNER; state->tuner.function = MEDIA_ENT_F_TUNER;
state->tuner.name = "mxl111sf tuner"; state->tuner.name = "mxl111sf tuner";
state->tuner_pads[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK; state->tuner_pads[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK;
state->tuner_pads[TUNER_PAD_RF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
state->tuner_pads[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE; state->tuner_pads[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE;
state->tuner_pads[TUNER_PAD_OUTPUT].sig_type = PAD_SIGNAL_ANALOG;
ret = media_entity_pads_init(&state->tuner, ret = media_entity_pads_init(&state->tuner,
TUNER_NUM_PADS, state->tuner_pads); TUNER_NUM_PADS, state->tuner_pads);
......
...@@ -685,15 +685,20 @@ static int tuner_probe(struct i2c_client *client, ...@@ -685,15 +685,20 @@ static int tuner_probe(struct i2c_client *client,
*/ */
if (t->type == TUNER_TDA9887) { if (t->type == TUNER_TDA9887) {
t->pad[IF_VID_DEC_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK; t->pad[IF_VID_DEC_PAD_IF_INPUT].flags = MEDIA_PAD_FL_SINK;
t->pad[IF_VID_DEC_PAD_IF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
t->pad[IF_VID_DEC_PAD_OUT].flags = MEDIA_PAD_FL_SOURCE; t->pad[IF_VID_DEC_PAD_OUT].flags = MEDIA_PAD_FL_SOURCE;
t->pad[IF_VID_DEC_PAD_OUT].sig_type = PAD_SIGNAL_ANALOG;
ret = media_entity_pads_init(&t->sd.entity, ret = media_entity_pads_init(&t->sd.entity,
IF_VID_DEC_PAD_NUM_PADS, IF_VID_DEC_PAD_NUM_PADS,
&t->pad[0]); &t->pad[0]);
t->sd.entity.function = MEDIA_ENT_F_IF_VID_DECODER; t->sd.entity.function = MEDIA_ENT_F_IF_VID_DECODER;
} else { } else {
t->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK; t->pad[TUNER_PAD_RF_INPUT].flags = MEDIA_PAD_FL_SINK;
t->pad[TUNER_PAD_RF_INPUT].sig_type = PAD_SIGNAL_ANALOG;
t->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE; t->pad[TUNER_PAD_OUTPUT].flags = MEDIA_PAD_FL_SOURCE;
t->pad[TUNER_PAD_OUTPUT].sig_type = PAD_SIGNAL_ANALOG;
t->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE; t->pad[TUNER_PAD_AUD_OUT].flags = MEDIA_PAD_FL_SOURCE;
t->pad[TUNER_PAD_AUD_OUT].sig_type = PAD_SIGNAL_AUDIO;
ret = media_entity_pads_init(&t->sd.entity, TUNER_NUM_PADS, ret = media_entity_pads_init(&t->sd.entity, TUNER_NUM_PADS,
&t->pad[0]); &t->pad[0]);
t->sd.entity.function = MEDIA_ENT_F_TUNER; t->sd.entity.function = MEDIA_ENT_F_TUNER;
......
...@@ -155,12 +155,41 @@ struct media_link { ...@@ -155,12 +155,41 @@ struct media_link {
bool is_backlink; bool is_backlink;
}; };
/**
* enum media_pad_signal_type - type of the signal inside a media pad
*
* @PAD_SIGNAL_DEFAULT:
* Default signal. Use this when all inputs or all outputs are
* uniquely identified by the pad number.
* @PAD_SIGNAL_ANALOG:
* The pad contains an analog signal. It can be Radio Frequency,
* Intermediate Frequency, a baseband signal or sub-cariers.
* Tuner inputs, IF-PLL demodulators, composite and s-video signals
* should use it.
* @PAD_SIGNAL_DV:
* Contains a digital video signal, with can be a bitstream of samples
* taken from an analog TV video source. On such case, it usually
* contains the VBI data on it.
* @PAD_SIGNAL_AUDIO:
* Contains an Intermediate Frequency analog signal from an audio
* sub-carrier or an audio bitstream. IF signals are provided by tuners
* and consumed by audio AM/FM decoders. Bitstream audio is provided by
* an audio decoder.
*/
enum media_pad_signal_type {
PAD_SIGNAL_DEFAULT = 0,
PAD_SIGNAL_ANALOG,
PAD_SIGNAL_DV,
PAD_SIGNAL_AUDIO,
};
/** /**
* struct media_pad - A media pad graph object. * struct media_pad - A media pad graph object.
* *
* @graph_obj: Embedded structure containing the media object common data * @graph_obj: Embedded structure containing the media object common data
* @entity: Entity this pad belongs to * @entity: Entity this pad belongs to
* @index: Pad index in the entity pads array, numbered from 0 to n * @index: Pad index in the entity pads array, numbered from 0 to n
* @sig_type: Type of the signal inside a media pad
* @flags: Pad flags, as defined in * @flags: Pad flags, as defined in
* :ref:`include/uapi/linux/media.h <media_header>` * :ref:`include/uapi/linux/media.h <media_header>`
* (seek for ``MEDIA_PAD_FL_*``) * (seek for ``MEDIA_PAD_FL_*``)
...@@ -169,6 +198,7 @@ struct media_pad { ...@@ -169,6 +198,7 @@ struct media_pad {
struct media_gobj graph_obj; /* must be first field in struct */ struct media_gobj graph_obj; /* must be first field in struct */
struct media_entity *entity; struct media_entity *entity;
u16 index; u16 index;
enum media_pad_signal_type sig_type;
unsigned long flags; unsigned long flags;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment