media: mark entity-intf links as IMMUTABLE
authorHans Verkuil <hverkuil@xs4all.nl>
Mon, 2 Jul 2018 12:43:02 +0000 (08:43 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 4 Jul 2018 12:40:49 +0000 (08:40 -0400)
Currently links between entities and an interface are just marked as
ENABLED. But (at least today) these links cannot be disabled by userspace
or the driver, so they should also be marked as IMMUTABLE.

It might become possible that drivers can disable such links (if for some
reason the device node cannot be used), so we might need to add a new link
flag at some point to mark interface links that can be changed by the driver
but not by userspace.

Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/dvb-core/dvbdev.c
drivers/media/v4l2-core/v4l2-dev.c
drivers/media/v4l2-core/v4l2-device.c

index 64d6793674b9c9e715143c41efd5ea6a50bc0abc..3c87785703310fb97f342b1e42279b33f466b80f 100644 (file)
@@ -440,8 +440,10 @@ static int dvb_register_media_device(struct dvb_device *dvbdev,
        if (!dvbdev->entity)
                return 0;
 
-       link = media_create_intf_link(dvbdev->entity, &dvbdev->intf_devnode->intf,
-                                     MEDIA_LNK_FL_ENABLED);
+       link = media_create_intf_link(dvbdev->entity,
+                                     &dvbdev->intf_devnode->intf,
+                                     MEDIA_LNK_FL_ENABLED |
+                                     MEDIA_LNK_FL_IMMUTABLE);
        if (!link)
                return -ENOMEM;
 #endif
@@ -599,7 +601,8 @@ static int dvb_create_io_intf_links(struct dvb_adapter *adap,
                        if (strncmp(entity->name, name, strlen(name)))
                                continue;
                        link = media_create_intf_link(entity, intf,
-                                                     MEDIA_LNK_FL_ENABLED);
+                                                     MEDIA_LNK_FL_ENABLED |
+                                                     MEDIA_LNK_FL_IMMUTABLE);
                        if (!link)
                                return -ENOMEM;
                }
@@ -754,14 +757,16 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
        media_device_for_each_intf(intf, mdev) {
                if (intf->type == MEDIA_INTF_T_DVB_CA && ca) {
                        link = media_create_intf_link(ca, intf,
-                                                     MEDIA_LNK_FL_ENABLED);
+                                                     MEDIA_LNK_FL_ENABLED |
+                                                     MEDIA_LNK_FL_IMMUTABLE);
                        if (!link)
                                return -ENOMEM;
                }
 
                if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) {
                        link = media_create_intf_link(tuner, intf,
-                                                     MEDIA_LNK_FL_ENABLED);
+                                                     MEDIA_LNK_FL_ENABLED |
+                                                     MEDIA_LNK_FL_IMMUTABLE);
                        if (!link)
                                return -ENOMEM;
                }
@@ -773,7 +778,8 @@ int dvb_create_media_graph(struct dvb_adapter *adap,
                 */
                if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) {
                        link = media_create_intf_link(demux, intf,
-                                                     MEDIA_LNK_FL_ENABLED);
+                                                     MEDIA_LNK_FL_ENABLED |
+                                                     MEDIA_LNK_FL_IMMUTABLE);
                        if (!link)
                                return -ENOMEM;
                }
index 4ffd7d60a901149214b59b7e585077ec8c4dabed..5f43f63fa700231de525ab24411ed25f6ccc020e 100644 (file)
@@ -808,7 +808,8 @@ static int video_register_media_controller(struct video_device *vdev, int type)
 
                link = media_create_intf_link(&vdev->entity,
                                              &vdev->intf_devnode->intf,
-                                             MEDIA_LNK_FL_ENABLED);
+                                             MEDIA_LNK_FL_ENABLED |
+                                             MEDIA_LNK_FL_IMMUTABLE);
                if (!link) {
                        media_devnode_remove(vdev->intf_devnode);
                        media_device_unregister_entity(&vdev->entity);
index 937c6de85606d6855b0899a5e77470297bf8a568..3940e55c72f1f7754bc04a44b295f66432537d46 100644 (file)
@@ -267,7 +267,8 @@ int v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev)
 
                        link = media_create_intf_link(&sd->entity,
                                                      &vdev->intf_devnode->intf,
-                                                     MEDIA_LNK_FL_ENABLED);
+                                                     MEDIA_LNK_FL_ENABLED |
+                                                     MEDIA_LNK_FL_IMMUTABLE);
                        if (!link) {
                                err = -ENOMEM;
                                goto clean_up;