Re: [PATCH 1/2] [media] au0828: disable tuner links and cache tuner/decoder

Shuah Khan
2016-03-11T16:27:42Z

On 03/11/2016 08:55 AM, Mauro Carvalho Chehab wrote:
> For au0828_enable_source() to work, the tuner links should be
> disabled and the tuner/decoder should be cached at au0828 struct.

hmm. are you sure about needing to cache decoder in au0828 struct.
It gets cached in au0828_card_analog_fe_setup() which is called
from au0828_card_setup() - this step happens before
au0828_media_device_register()

#ifdef CONFIG_MEDIA_CONTROLLER
if (sd)
dev->decoder = &sd->entity;
#endif

thanks,
-- Shuah

>
> Fixes: 9822f4173f84 ('[media] au0828: use v4l2_mc_create_media_graph()')
> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
> ---
> drivers/media/usb/au0828/au0828-core.c | 42 ++++++++++++++++++++++------------
> 1 file changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c
> index 5dc82e8c8670..ecfa18939663 100644
> --- a/drivers/media/usb/au0828/au0828-core.c
> +++ b/drivers/media/usb/au0828/au0828-core.c
> @@ -456,7 +456,8 @@ static int au0828_media_device_register(struct au0828_dev *dev,
> {
> #ifdef CONFIG_MEDIA_CONTROLLER
> int ret;
> - struct media_entity *entity, *demod = NULL, *tuner = NULL;
> + struct media_entity *entity, *demod = NULL;
> + struct media_link *link;
>
> if (!dev->media_dev)
> return 0;
> @@ -482,26 +483,37 @@ static int au0828_media_device_register(struct au0828_dev *dev,
> }
>
> /*
> - * Find tuner and demod to disable the link between
> - * the two to avoid disable step when tuner is requested
> - * by video or audio. Note that this step can't be done
> - * until dvb graph is created during dvb register.
> + * Find tuner, decoder and demod.
> + *
> + * The tuner and decoder should be cached, as they'll be used by
> + * au0828_enable_source.
> + *
> + * It also needs to disable the link between tuner and
> + * decoder/demod, to avoid disable step when tuner is requested
> + * by video or audio. Note that this step can't be done until dvb
> + * graph is created during dvb register.
> */
> media_device_for_each_entity(entity, dev->media_dev) {
> - if (entity->function == MEDIA_ENT_F_DTV_DEMOD)
> + switch (entity->function) {
> + case MEDIA_ENT_F_TUNER:
> + dev->tuner = entity;
> + break;
> + case MEDIA_ENT_F_ATV_DECODER:
> + dev->decoder = entity;
> + break;
> + case MEDIA_ENT_F_DTV_DEMOD:
> demod = entity;
> - else if (entity->function == MEDIA_ENT_F_TUNER)
> - tuner = entity;
> + break;
> + }
> }
> - /* Disable link between tuner and demod */
> - if (tuner && demod) {
> - struct media_link *link;
>
> - list_for_each_entry(link, &demod->links, list) {
> - if (link->sink->entity == demod &&
> - link->source->entity == tuner) {
> + /* Disable link between tuner->demod and/or tuner->decoder */
> + if (dev->tuner) {
> + list_for_each_entry(link, &dev->tuner->links, list) {
> + if (demod && link->sink->entity == demod)
> + media_entity_setup_link(link, 0);
> + if (dev->decoder && link->sink->entity == dev->decoder)
> media_entity_setup_link(link, 0);
> - }
> }
> }