On 01/28/2016 08:37 AM, Mauro Carvalho Chehab wrote:
Em Wed, 6 Jan 2016 13:27:02 -0700 Shuah Khan shuahkh@osg.samsung.com escreveu:
au0828_create_media_graph() doesn't do any checks to determine, if vbi_dev, vdev, and input entities have been registered prior to creating pad links. Checking graph_obj.mdev field works as the graph_obj.mdev field gets initialized in the entity register interface. Fix it to check graph_obj.mdev field before creating pad links.
Signed-off-by: Shuah Khan shuahkh@osg.samsung.com
drivers/media/usb/au0828/au0828-core.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c index f46fb43..8ef7c71 100644 --- a/drivers/media/usb/au0828/au0828-core.c +++ b/drivers/media/usb/au0828/au0828-core.c @@ -291,20 +291,27 @@ static int au0828_create_media_graph(struct au0828_dev *dev) if (ret) return ret; }
- ret = media_create_pad_link(decoder, AU8522_PAD_VID_OUT,
&dev->vdev.entity, 0,
MEDIA_LNK_FL_ENABLED);
- if (ret)
return ret;
- ret = media_create_pad_link(decoder, AU8522_PAD_VBI_OUT,
&dev->vbi_dev.entity, 0,
MEDIA_LNK_FL_ENABLED);
- if (ret)
return ret;
- if (dev->vdev.entity.graph_obj.mdev) {
ret = media_create_pad_link(decoder, AU8522_PAD_VID_OUT,
&dev->vdev.entity, 0,
MEDIA_LNK_FL_ENABLED);
if (ret)
return ret;
- }
Those new if() doesn't look right. We can't continue if the entities weren't registered, as the graph would have troubles. The logic should ensure that the entities will always be created before running au0828_create_media_graph(). If this is not the case, some async logic is needed to ensure that.
There have been some changes in au0828 media init and register sequence in 4.5-rc1. wau0828 does its graph creation before it registers media_device.
I needed these checks before this above. It looks like I might have simply rebased my patch over without taking this change into account. I will try without these checks.
Async method is already in place for snd-usb-audio part of the graph. Please see patch 20 in the series.
thanks, -- Shuah
if (dev->vbi_dev.entity.graph_obj.mdev) {
ret = media_create_pad_link(decoder, AU8522_PAD_VBI_OUT,
&dev->vbi_dev.entity, 0,
MEDIA_LNK_FL_ENABLED);
if (ret)
return ret;
}
for (i = 0; i < AU0828_MAX_INPUT; i++) { struct media_entity *ent = &dev->input_ent[i];
if (!ent->graph_obj.mdev)
continue;
if (AUVI_INPUT(i).type == AU0828_VMUX_UNDEFINED) break;