Changes made during the v4l2_subdev API review renamed the /dev/subdev*
device nodes to /dev/v4l-subdev*. Instead of hardcoding the names in the
media-ctl application, use sysfs to retrieve the kernel device name and
assume the device node name is identical.
This isn't a perfect solution, we should really use libudev, but it will
do for now.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
{
struct media_entity *entity;
struct stat devstat;
{
struct media_entity *entity;
struct stat devstat;
+ char devname[32];
+ char sysname[32];
+ char target[1024];
+ char *p;
(entity->info.type != MEDIA_ENTITY_TYPE_SUBDEV))
continue;
(entity->info.type != MEDIA_ENTITY_TYPE_SUBDEV))
continue;
- for (i = 0; i < 256; ++i) {
- if (entity->info.type == MEDIA_ENTITY_TYPE_NODE)
- sprintf(devname, "/dev/video%u", i);
- else
- sprintf(devname, "/dev/subdev%u", i);
+ sprintf(sysname, "/sys/dev/char/%u:%u", entity->info.v4l.major,
+ entity->info.v4l.minor);
+ ret = readlink(sysname, target, sizeof(target));
+ if (ret < 0)
+ continue;
- ret = stat(devname, &devstat);
- if (ret < 0)
- continue;
+ target[ret] = '\0';
+ p = strrchr(target, '/');
+ if (p == NULL)
+ continue;
- if (major(devstat.st_rdev) == entity->info.v4l.major &&
- minor(devstat.st_rdev) == entity->info.v4l.minor) {
- strcpy(entity->devname, devname);
- break;
- }
- }
+ sprintf(devname, "/dev/%s", p + 1);
+ ret = stat(devname, &devstat);
+ if (ret < 0)
+ continue;
+ /* Sanity check: udev might have reordered the device nodes.
+ * Make sure the major/minor match. We should really use
+ * libudev.
+ */
+ if (major(devstat.st_rdev) == entity->info.v4l.major &&
+ minor(devstat.st_rdev) == entity->info.v4l.minor)
+ strcpy(entity->devname, devname);