LCOV - code coverage report
Current view: top level - drivers/media/v4l2-core - v4l2-dev.c (source / functions) Hit Total Coverage
Test: gcov_data_raspi2_real_modules_combined.info Lines: 232 441 52.6 %
Date: 2020-09-30 20:25:40 Functions: 14 29 48.3 %
Branches: 191 504 37.9 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-or-later
       2                 :            : /*
       3                 :            :  * Video capture interface for Linux version 2
       4                 :            :  *
       5                 :            :  *      A generic video device interface for the LINUX operating system
       6                 :            :  *      using a set of device structures/vectors for low level operations.
       7                 :            :  *
       8                 :            :  * Authors:     Alan Cox, <alan@lxorguk.ukuu.org.uk> (version 1)
       9                 :            :  *              Mauro Carvalho Chehab <mchehab@kernel.org> (version 2)
      10                 :            :  *
      11                 :            :  * Fixes:       20000516  Claudio Matsuoka <claudio@conectiva.com>
      12                 :            :  *              - Added procfs support
      13                 :            :  */
      14                 :            : 
      15                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      16                 :            : 
      17                 :            : #include <linux/module.h>
      18                 :            : #include <linux/types.h>
      19                 :            : #include <linux/kernel.h>
      20                 :            : #include <linux/mm.h>
      21                 :            : #include <linux/string.h>
      22                 :            : #include <linux/errno.h>
      23                 :            : #include <linux/init.h>
      24                 :            : #include <linux/kmod.h>
      25                 :            : #include <linux/slab.h>
      26                 :            : #include <linux/uaccess.h>
      27                 :            : 
      28                 :            : #include <media/v4l2-common.h>
      29                 :            : #include <media/v4l2-device.h>
      30                 :            : #include <media/v4l2-ioctl.h>
      31                 :            : 
      32                 :            : #define VIDEO_NUM_DEVICES       256
      33                 :            : #define VIDEO_NAME              "video4linux"
      34                 :            : 
      35                 :            : #define dprintk(fmt, arg...) do {                                       \
      36                 :            :                 printk(KERN_DEBUG pr_fmt("%s: " fmt),                 \
      37                 :            :                        __func__, ##arg);                                \
      38                 :            : } while (0)
      39                 :            : 
      40                 :            : 
      41                 :            : /*
      42                 :            :  *      sysfs stuff
      43                 :            :  */
      44                 :            : 
      45                 :       1444 : static ssize_t index_show(struct device *cd,
      46                 :            :                           struct device_attribute *attr, char *buf)
      47                 :            : {
      48                 :            :         struct video_device *vdev = to_video_device(cd);
      49                 :            : 
      50                 :       1444 :         return sprintf(buf, "%i\n", vdev->index);
      51                 :            : }
      52                 :            : static DEVICE_ATTR_RO(index);
      53                 :            : 
      54                 :          0 : static ssize_t dev_debug_show(struct device *cd,
      55                 :            :                           struct device_attribute *attr, char *buf)
      56                 :            : {
      57                 :            :         struct video_device *vdev = to_video_device(cd);
      58                 :            : 
      59                 :          0 :         return sprintf(buf, "%i\n", vdev->dev_debug);
      60                 :            : }
      61                 :            : 
      62                 :          0 : static ssize_t dev_debug_store(struct device *cd, struct device_attribute *attr,
      63                 :            :                           const char *buf, size_t len)
      64                 :            : {
      65                 :            :         struct video_device *vdev = to_video_device(cd);
      66                 :            :         int res = 0;
      67                 :            :         u16 value;
      68                 :            : 
      69                 :          0 :         res = kstrtou16(buf, 0, &value);
      70         [ #  # ]:          0 :         if (res)
      71                 :            :                 return res;
      72                 :            : 
      73                 :          0 :         vdev->dev_debug = value;
      74                 :          0 :         return len;
      75                 :            : }
      76                 :            : static DEVICE_ATTR_RW(dev_debug);
      77                 :            : 
      78                 :          0 : static ssize_t name_show(struct device *cd,
      79                 :            :                          struct device_attribute *attr, char *buf)
      80                 :            : {
      81                 :            :         struct video_device *vdev = to_video_device(cd);
      82                 :            : 
      83                 :          0 :         return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name);
      84                 :            : }
      85                 :            : static DEVICE_ATTR_RO(name);
      86                 :            : 
      87                 :            : static struct attribute *video_device_attrs[] = {
      88                 :            :         &dev_attr_name.attr,
      89                 :            :         &dev_attr_dev_debug.attr,
      90                 :            :         &dev_attr_index.attr,
      91                 :            :         NULL,
      92                 :            : };
      93                 :            : ATTRIBUTE_GROUPS(video_device);
      94                 :            : 
      95                 :            : /*
      96                 :            :  *      Active devices
      97                 :            :  */
      98                 :            : static struct video_device *video_devices[VIDEO_NUM_DEVICES];
      99                 :            : static DEFINE_MUTEX(videodev_lock);
     100                 :            : static DECLARE_BITMAP(devnode_nums[VFL_TYPE_MAX], VIDEO_NUM_DEVICES);
     101                 :            : 
     102                 :            : /* Device node utility functions */
     103                 :            : 
     104                 :            : /* Note: these utility functions all assume that vfl_type is in the range
     105                 :            :    [0, VFL_TYPE_MAX-1]. */
     106                 :            : 
     107                 :            : #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
     108                 :            : /* Return the bitmap corresponding to vfl_type. */
     109                 :            : static inline unsigned long *devnode_bits(enum vfl_devnode_type vfl_type)
     110                 :            : {
     111                 :            :         /* Any types not assigned to fixed minor ranges must be mapped to
     112                 :            :            one single bitmap for the purposes of finding a free node number
     113                 :            :            since all those unassigned types use the same minor range. */
     114                 :            :         int idx = (vfl_type > VFL_TYPE_RADIO) ? VFL_TYPE_MAX - 1 : vfl_type;
     115                 :            : 
     116                 :            :         return devnode_nums[idx];
     117                 :            : }
     118                 :            : #else
     119                 :            : /* Return the bitmap corresponding to vfl_type. */
     120                 :            : static inline unsigned long *devnode_bits(enum vfl_devnode_type vfl_type)
     121                 :            : {
     122                 :       2898 :         return devnode_nums[vfl_type];
     123                 :            : }
     124                 :            : #endif
     125                 :            : 
     126                 :            : /* Mark device node number vdev->num as used */
     127                 :            : static inline void devnode_set(struct video_device *vdev)
     128                 :            : {
     129                 :       2898 :         set_bit(vdev->num, devnode_bits(vdev->vfl_type));
     130                 :            : }
     131                 :            : 
     132                 :            : /* Mark device node number vdev->num as unused */
     133                 :            : static inline void devnode_clear(struct video_device *vdev)
     134                 :            : {
     135                 :          0 :         clear_bit(vdev->num, devnode_bits(vdev->vfl_type));
     136                 :            : }
     137                 :            : 
     138                 :            : /* Try to find a free device node number in the range [from, to> */
     139                 :            : static inline int devnode_find(struct video_device *vdev, int from, int to)
     140                 :            : {
     141                 :       2898 :         return find_next_zero_bit(devnode_bits(vdev->vfl_type), to, from);
     142                 :            : }
     143                 :            : 
     144                 :          0 : struct video_device *video_device_alloc(void)
     145                 :            : {
     146                 :          0 :         return kzalloc(sizeof(struct video_device), GFP_KERNEL);
     147                 :            : }
     148                 :            : EXPORT_SYMBOL(video_device_alloc);
     149                 :            : 
     150                 :          0 : void video_device_release(struct video_device *vdev)
     151                 :            : {
     152                 :          0 :         kfree(vdev);
     153                 :          0 : }
     154                 :            : EXPORT_SYMBOL(video_device_release);
     155                 :            : 
     156                 :          0 : void video_device_release_empty(struct video_device *vdev)
     157                 :            : {
     158                 :            :         /* Do nothing */
     159                 :            :         /* Only valid when the video_device struct is a static. */
     160                 :          0 : }
     161                 :            : EXPORT_SYMBOL(video_device_release_empty);
     162                 :            : 
     163                 :            : static inline void video_get(struct video_device *vdev)
     164                 :            : {
     165                 :       1449 :         get_device(&vdev->dev);
     166                 :            : }
     167                 :            : 
     168                 :            : static inline void video_put(struct video_device *vdev)
     169                 :            : {
     170                 :       1449 :         put_device(&vdev->dev);
     171                 :            : }
     172                 :            : 
     173                 :            : /* Called when the last user of the video device exits. */
     174                 :          0 : static void v4l2_device_release(struct device *cd)
     175                 :            : {
     176                 :          0 :         struct video_device *vdev = to_video_device(cd);
     177                 :          0 :         struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
     178                 :            : 
     179                 :          0 :         mutex_lock(&videodev_lock);
     180   [ #  #  #  # ]:          0 :         if (WARN_ON(video_devices[vdev->minor] != vdev)) {
     181                 :            :                 /* should not happen */
     182                 :          0 :                 mutex_unlock(&videodev_lock);
     183                 :          0 :                 return;
     184                 :            :         }
     185                 :            : 
     186                 :            :         /* Free up this device for reuse */
     187                 :          0 :         video_devices[vdev->minor] = NULL;
     188                 :            : 
     189                 :            :         /* Delete the cdev on this minor as well */
     190                 :          0 :         cdev_del(vdev->cdev);
     191                 :            :         /* Just in case some driver tries to access this from
     192                 :            :            the release() callback. */
     193                 :          0 :         vdev->cdev = NULL;
     194                 :            : 
     195                 :            :         /* Mark device node number as free */
     196                 :            :         devnode_clear(vdev);
     197                 :            : 
     198                 :          0 :         mutex_unlock(&videodev_lock);
     199                 :            : 
     200                 :            : #if defined(CONFIG_MEDIA_CONTROLLER)
     201   [ #  #  #  # ]:          0 :         if (v4l2_dev->mdev && vdev->vfl_dir != VFL_DIR_M2M) {
     202                 :            :                 /* Remove interfaces and interface links */
     203                 :          0 :                 media_devnode_remove(vdev->intf_devnode);
     204         [ #  # ]:          0 :                 if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN)
     205                 :          0 :                         media_device_unregister_entity(&vdev->entity);
     206                 :            :         }
     207                 :            : #endif
     208                 :            : 
     209                 :            :         /* Do not call v4l2_device_put if there is no release callback set.
     210                 :            :          * Drivers that have no v4l2_device release callback might free the
     211                 :            :          * v4l2_dev instance in the video_device release callback below, so we
     212                 :            :          * must perform this check here.
     213                 :            :          *
     214                 :            :          * TODO: In the long run all drivers that use v4l2_device should use the
     215                 :            :          * v4l2_device release callback. This check will then be unnecessary.
     216                 :            :          */
     217         [ #  # ]:          0 :         if (v4l2_dev->release == NULL)
     218                 :            :                 v4l2_dev = NULL;
     219                 :            : 
     220                 :            :         /* Release video_device and perform other
     221                 :            :            cleanups as needed. */
     222                 :          0 :         vdev->release(vdev);
     223                 :            : 
     224                 :            :         /* Decrease v4l2_device refcount */
     225         [ #  # ]:          0 :         if (v4l2_dev)
     226                 :          0 :                 v4l2_device_put(v4l2_dev);
     227                 :            : }
     228                 :            : 
     229                 :            : static struct class video_class = {
     230                 :            :         .name = VIDEO_NAME,
     231                 :            :         .dev_groups = video_device_groups,
     232                 :            : };
     233                 :            : 
     234                 :       7861 : struct video_device *video_devdata(struct file *file)
     235                 :            : {
     236                 :      12208 :         return video_devices[iminor(file_inode(file))];
     237                 :            : }
     238                 :            : EXPORT_SYMBOL(video_devdata);
     239                 :            : 
     240                 :            : 
     241                 :            : /* Priority handling */
     242                 :            : 
     243                 :            : static inline bool prio_is_valid(enum v4l2_priority prio)
     244                 :            : {
     245                 :            :         return prio == V4L2_PRIORITY_BACKGROUND ||
     246                 :       4347 :                prio == V4L2_PRIORITY_INTERACTIVE ||
     247                 :            :                prio == V4L2_PRIORITY_RECORD;
     248                 :            : }
     249                 :            : 
     250                 :        828 : void v4l2_prio_init(struct v4l2_prio_state *global)
     251                 :            : {
     252                 :        828 :         memset(global, 0, sizeof(*global));
     253                 :        828 : }
     254                 :            : EXPORT_SYMBOL(v4l2_prio_init);
     255                 :            : 
     256                 :       1449 : int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
     257                 :            :                      enum v4l2_priority new)
     258                 :            : {
     259         [ +  - ]:       1449 :         if (!prio_is_valid(new))
     260                 :            :                 return -EINVAL;
     261         [ +  + ]:       1449 :         if (*local == new)
     262                 :            :                 return 0;
     263                 :            : 
     264                 :       1448 :         atomic_inc(&global->prios[new]);
     265         [ -  + ]:       2898 :         if (prio_is_valid(*local))
     266                 :          0 :                 atomic_dec(&global->prios[*local]);
     267                 :       1447 :         *local = new;
     268                 :       1447 :         return 0;
     269                 :            : }
     270                 :            : EXPORT_SYMBOL(v4l2_prio_change);
     271                 :            : 
     272                 :       1449 : void v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local)
     273                 :            : {
     274                 :       1449 :         v4l2_prio_change(global, local, V4L2_PRIORITY_DEFAULT);
     275                 :       1449 : }
     276                 :            : EXPORT_SYMBOL(v4l2_prio_open);
     277                 :            : 
     278                 :       1449 : void v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority local)
     279                 :            : {
     280         [ +  - ]:       1449 :         if (prio_is_valid(local))
     281                 :       1449 :                 atomic_dec(&global->prios[local]);
     282                 :       1449 : }
     283                 :            : EXPORT_SYMBOL(v4l2_prio_close);
     284                 :            : 
     285                 :          0 : enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global)
     286                 :            : {
     287   [ #  #  #  # ]:          0 :         if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)
     288                 :            :                 return V4L2_PRIORITY_RECORD;
     289   [ #  #  #  # ]:          0 :         if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)
     290                 :            :                 return V4L2_PRIORITY_INTERACTIVE;
     291   [ #  #  #  # ]:          0 :         if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)
     292                 :            :                 return V4L2_PRIORITY_BACKGROUND;
     293                 :          0 :         return V4L2_PRIORITY_UNSET;
     294                 :            : }
     295                 :            : EXPORT_SYMBOL(v4l2_prio_max);
     296                 :            : 
     297                 :          0 : int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority local)
     298                 :            : {
     299         [ #  # ]:          0 :         return (local < v4l2_prio_max(global)) ? -EBUSY : 0;
     300                 :            : }
     301                 :            : EXPORT_SYMBOL(v4l2_prio_check);
     302                 :            : 
     303                 :            : 
     304                 :          0 : static ssize_t v4l2_read(struct file *filp, char __user *buf,
     305                 :            :                 size_t sz, loff_t *off)
     306                 :            : {
     307                 :            :         struct video_device *vdev = video_devdata(filp);
     308                 :            :         int ret = -ENODEV;
     309                 :            : 
     310         [ #  # ]:          0 :         if (!vdev->fops->read)
     311                 :            :                 return -EINVAL;
     312         [ #  # ]:          0 :         if (video_is_registered(vdev))
     313                 :          0 :                 ret = vdev->fops->read(filp, buf, sz, off);
     314         [ #  # ]:          0 :         if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
     315                 :            :             (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
     316                 :          0 :                 dprintk("%s: read: %zd (%d)\n",
     317                 :            :                         video_device_node_name(vdev), sz, ret);
     318                 :          0 :         return ret;
     319                 :            : }
     320                 :            : 
     321                 :          0 : static ssize_t v4l2_write(struct file *filp, const char __user *buf,
     322                 :            :                 size_t sz, loff_t *off)
     323                 :            : {
     324                 :            :         struct video_device *vdev = video_devdata(filp);
     325                 :            :         int ret = -ENODEV;
     326                 :            : 
     327         [ #  # ]:          0 :         if (!vdev->fops->write)
     328                 :            :                 return -EINVAL;
     329         [ #  # ]:          0 :         if (video_is_registered(vdev))
     330                 :          0 :                 ret = vdev->fops->write(filp, buf, sz, off);
     331         [ #  # ]:          0 :         if ((vdev->dev_debug & V4L2_DEV_DEBUG_FOP) &&
     332                 :            :             (vdev->dev_debug & V4L2_DEV_DEBUG_STREAMING))
     333                 :          0 :                 dprintk("%s: write: %zd (%d)\n",
     334                 :            :                         video_device_node_name(vdev), sz, ret);
     335                 :          0 :         return ret;
     336                 :            : }
     337                 :            : 
     338                 :          0 : static __poll_t v4l2_poll(struct file *filp, struct poll_table_struct *poll)
     339                 :            : {
     340                 :            :         struct video_device *vdev = video_devdata(filp);
     341                 :            :         __poll_t res = EPOLLERR | EPOLLHUP;
     342                 :            : 
     343         [ #  # ]:          0 :         if (!vdev->fops->poll)
     344                 :            :                 return DEFAULT_POLLMASK;
     345         [ #  # ]:          0 :         if (video_is_registered(vdev))
     346                 :          0 :                 res = vdev->fops->poll(filp, poll);
     347         [ #  # ]:          0 :         if (vdev->dev_debug & V4L2_DEV_DEBUG_POLL)
     348                 :          0 :                 dprintk("%s: poll: %08x\n",
     349                 :            :                         video_device_node_name(vdev), res);
     350                 :          0 :         return res;
     351                 :            : }
     352                 :            : 
     353                 :       1449 : static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
     354                 :            : {
     355                 :            :         struct video_device *vdev = video_devdata(filp);
     356                 :            :         int ret = -ENODEV;
     357                 :            : 
     358         [ +  - ]:       1449 :         if (vdev->fops->unlocked_ioctl) {
     359         [ +  - ]:       1449 :                 if (video_is_registered(vdev))
     360                 :       1449 :                         ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
     361                 :            :         } else
     362                 :            :                 ret = -ENOTTY;
     363                 :            : 
     364                 :       1449 :         return ret;
     365                 :            : }
     366                 :            : 
     367                 :            : #ifdef CONFIG_MMU
     368                 :            : #define v4l2_get_unmapped_area NULL
     369                 :            : #else
     370                 :            : static unsigned long v4l2_get_unmapped_area(struct file *filp,
     371                 :            :                 unsigned long addr, unsigned long len, unsigned long pgoff,
     372                 :            :                 unsigned long flags)
     373                 :            : {
     374                 :            :         struct video_device *vdev = video_devdata(filp);
     375                 :            :         int ret;
     376                 :            : 
     377                 :            :         if (!vdev->fops->get_unmapped_area)
     378                 :            :                 return -ENOSYS;
     379                 :            :         if (!video_is_registered(vdev))
     380                 :            :                 return -ENODEV;
     381                 :            :         ret = vdev->fops->get_unmapped_area(filp, addr, len, pgoff, flags);
     382                 :            :         if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
     383                 :            :                 dprintk("%s: get_unmapped_area (%d)\n",
     384                 :            :                         video_device_node_name(vdev), ret);
     385                 :            :         return ret;
     386                 :            : }
     387                 :            : #endif
     388                 :            : 
     389                 :          0 : static int v4l2_mmap(struct file *filp, struct vm_area_struct *vm)
     390                 :            : {
     391                 :            :         struct video_device *vdev = video_devdata(filp);
     392                 :            :         int ret = -ENODEV;
     393                 :            : 
     394         [ #  # ]:          0 :         if (!vdev->fops->mmap)
     395                 :            :                 return -ENODEV;
     396         [ #  # ]:          0 :         if (video_is_registered(vdev))
     397                 :          0 :                 ret = vdev->fops->mmap(filp, vm);
     398         [ #  # ]:          0 :         if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
     399                 :          0 :                 dprintk("%s: mmap (%d)\n",
     400                 :            :                         video_device_node_name(vdev), ret);
     401                 :          0 :         return ret;
     402                 :            : }
     403                 :            : 
     404                 :            : /* Override for the open function */
     405                 :       1449 : static int v4l2_open(struct inode *inode, struct file *filp)
     406                 :            : {
     407                 :            :         struct video_device *vdev;
     408                 :            :         int ret = 0;
     409                 :            : 
     410                 :            :         /* Check if the video device is available */
     411                 :       1449 :         mutex_lock(&videodev_lock);
     412                 :            :         vdev = video_devdata(filp);
     413                 :            :         /* return ENODEV if the video device has already been removed. */
     414   [ +  -  -  + ]:       2898 :         if (vdev == NULL || !video_is_registered(vdev)) {
     415                 :          0 :                 mutex_unlock(&videodev_lock);
     416                 :          0 :                 return -ENODEV;
     417                 :            :         }
     418                 :            :         /* and increase the device refcount */
     419                 :            :         video_get(vdev);
     420                 :       1449 :         mutex_unlock(&videodev_lock);
     421         [ +  - ]:       1449 :         if (vdev->fops->open) {
     422         [ +  - ]:       1449 :                 if (video_is_registered(vdev))
     423                 :       1449 :                         ret = vdev->fops->open(filp);
     424                 :            :                 else
     425                 :            :                         ret = -ENODEV;
     426                 :            :         }
     427                 :            : 
     428         [ -  + ]:       1449 :         if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
     429                 :          0 :                 dprintk("%s: open (%d)\n",
     430                 :            :                         video_device_node_name(vdev), ret);
     431                 :            :         /* decrease the refcount in case of an error */
     432         [ -  + ]:       1449 :         if (ret)
     433                 :            :                 video_put(vdev);
     434                 :       1449 :         return ret;
     435                 :            : }
     436                 :            : 
     437                 :            : /* Override for the release function */
     438                 :       1449 : static int v4l2_release(struct inode *inode, struct file *filp)
     439                 :            : {
     440                 :            :         struct video_device *vdev = video_devdata(filp);
     441                 :            :         int ret = 0;
     442                 :            : 
     443                 :            :         /*
     444                 :            :          * We need to serialize the release() with queueing new requests.
     445                 :            :          * The release() may trigger the cancellation of a streaming
     446                 :            :          * operation, and that should not be mixed with queueing a new
     447                 :            :          * request at the same time.
     448                 :            :          */
     449         [ +  + ]:       1449 :         if (vdev->fops->release) {
     450         [ -  + ]:       2892 :                 if (v4l2_device_supports_requests(vdev->v4l2_dev)) {
     451                 :          0 :                         mutex_lock(&vdev->v4l2_dev->mdev->req_queue_mutex);
     452                 :          0 :                         ret = vdev->fops->release(filp);
     453                 :          0 :                         mutex_unlock(&vdev->v4l2_dev->mdev->req_queue_mutex);
     454                 :            :                 } else {
     455                 :       1446 :                         ret = vdev->fops->release(filp);
     456                 :            :                 }
     457                 :            :         }
     458                 :            : 
     459         [ -  + ]:       1449 :         if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
     460                 :          0 :                 dprintk("%s: release\n",
     461                 :            :                         video_device_node_name(vdev));
     462                 :            : 
     463                 :            :         /* decrease the refcount unconditionally since the release()
     464                 :            :            return value is ignored. */
     465                 :            :         video_put(vdev);
     466                 :       1449 :         return ret;
     467                 :            : }
     468                 :            : 
     469                 :            : static const struct file_operations v4l2_fops = {
     470                 :            :         .owner = THIS_MODULE,
     471                 :            :         .read = v4l2_read,
     472                 :            :         .write = v4l2_write,
     473                 :            :         .open = v4l2_open,
     474                 :            :         .get_unmapped_area = v4l2_get_unmapped_area,
     475                 :            :         .mmap = v4l2_mmap,
     476                 :            :         .unlocked_ioctl = v4l2_ioctl,
     477                 :            : #ifdef CONFIG_COMPAT
     478                 :            :         .compat_ioctl = v4l2_compat_ioctl32,
     479                 :            : #endif
     480                 :            :         .release = v4l2_release,
     481                 :            :         .poll = v4l2_poll,
     482                 :            :         .llseek = no_llseek,
     483                 :            : };
     484                 :            : 
     485                 :            : /**
     486                 :            :  * get_index - assign stream index number based on v4l2_dev
     487                 :            :  * @vdev: video_device to assign index number to, vdev->v4l2_dev should be assigned
     488                 :            :  *
     489                 :            :  * Note that when this is called the new device has not yet been registered
     490                 :            :  * in the video_device array, but it was able to obtain a minor number.
     491                 :            :  *
     492                 :            :  * This means that we can always obtain a free stream index number since
     493                 :            :  * the worst case scenario is that there are VIDEO_NUM_DEVICES - 1 slots in
     494                 :            :  * use of the video_device array.
     495                 :            :  *
     496                 :            :  * Returns a free index number.
     497                 :            :  */
     498                 :       1449 : static int get_index(struct video_device *vdev)
     499                 :            : {
     500                 :            :         /* This can be static since this function is called with the global
     501                 :            :            videodev_lock held. */
     502                 :            :         static DECLARE_BITMAP(used, VIDEO_NUM_DEVICES);
     503                 :            :         int i;
     504                 :            : 
     505                 :            :         bitmap_zero(used, VIDEO_NUM_DEVICES);
     506                 :            : 
     507         [ +  + ]:     372393 :         for (i = 0; i < VIDEO_NUM_DEVICES; i++) {
     508   [ +  +  +  + ]:     375291 :                 if (video_devices[i] != NULL &&
     509                 :       4347 :                     video_devices[i]->v4l2_dev == vdev->v4l2_dev) {
     510                 :       1242 :                         set_bit(video_devices[i]->index, used);
     511                 :            :                 }
     512                 :            :         }
     513                 :            : 
     514                 :       1449 :         return find_first_zero_bit(used, VIDEO_NUM_DEVICES);
     515                 :            : }
     516                 :            : 
     517                 :            : #define SET_VALID_IOCTL(ops, cmd, op)                   \
     518                 :            :         if (ops->op)                                 \
     519                 :            :                 set_bit(_IOC_NR(cmd), valid_ioctls)
     520                 :            : 
     521                 :            : /* This determines which ioctls are actually implemented in the driver.
     522                 :            :    It's a one-time thing which simplifies video_ioctl2 as it can just do
     523                 :            :    a bit test.
     524                 :            : 
     525                 :            :    Note that drivers can override this by setting bits to 1 in
     526                 :            :    vdev->valid_ioctls. If an ioctl is marked as 1 when this function is
     527                 :            :    called, then that ioctl will actually be marked as unimplemented.
     528                 :            : 
     529                 :            :    It does that by first setting up the local valid_ioctls bitmap, and
     530                 :            :    at the end do a:
     531                 :            : 
     532                 :            :    vdev->valid_ioctls = valid_ioctls & ~(vdev->valid_ioctls)
     533                 :            :  */
     534                 :       1449 : static void determine_valid_ioctls(struct video_device *vdev)
     535                 :            : {
     536                 :            :         DECLARE_BITMAP(valid_ioctls, BASE_VIDIOC_PRIVATE);
     537                 :       1449 :         const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
     538                 :       1449 :         bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER;
     539                 :       1449 :         bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI;
     540                 :       1449 :         bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO;
     541                 :       1449 :         bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR;
     542                 :       1449 :         bool is_tch = vdev->vfl_type == VFL_TYPE_TOUCH;
     543                 :       1449 :         bool is_rx = vdev->vfl_dir != VFL_DIR_TX;
     544                 :       1449 :         bool is_tx = vdev->vfl_dir != VFL_DIR_RX;
     545                 :            : 
     546                 :            :         bitmap_zero(valid_ioctls, BASE_VIDIOC_PRIVATE);
     547                 :            : 
     548                 :            :         /* vfl_type and vfl_dir independent ioctls */
     549                 :            : 
     550         [ +  - ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_QUERYCAP, vidioc_querycap);
     551                 :       1449 :         set_bit(_IOC_NR(VIDIOC_G_PRIORITY), valid_ioctls);
     552                 :       1449 :         set_bit(_IOC_NR(VIDIOC_S_PRIORITY), valid_ioctls);
     553                 :            : 
     554                 :            :         /* Note: the control handler can also be passed through the filehandle,
     555                 :            :            and that can't be tested here. If the bit for these control ioctls
     556                 :            :            is set, then the ioctl is valid. But if it is 0, then it can still
     557                 :            :            be valid if the filehandle passed the control handler. */
     558   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_queryctrl)
     559                 :        207 :                 set_bit(_IOC_NR(VIDIOC_QUERYCTRL), valid_ioctls);
     560   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_query_ext_ctrl)
     561                 :        207 :                 set_bit(_IOC_NR(VIDIOC_QUERY_EXT_CTRL), valid_ioctls);
     562   [ +  +  +  -  :       1449 :         if (vdev->ctrl_handler || ops->vidioc_g_ctrl || ops->vidioc_g_ext_ctrls)
                   -  + ]
     563                 :        207 :                 set_bit(_IOC_NR(VIDIOC_G_CTRL), valid_ioctls);
     564   [ +  +  +  -  :       1449 :         if (vdev->ctrl_handler || ops->vidioc_s_ctrl || ops->vidioc_s_ext_ctrls)
                   -  + ]
     565                 :        207 :                 set_bit(_IOC_NR(VIDIOC_S_CTRL), valid_ioctls);
     566   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_g_ext_ctrls)
     567                 :        207 :                 set_bit(_IOC_NR(VIDIOC_G_EXT_CTRLS), valid_ioctls);
     568   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_s_ext_ctrls)
     569                 :        207 :                 set_bit(_IOC_NR(VIDIOC_S_EXT_CTRLS), valid_ioctls);
     570   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_try_ext_ctrls)
     571                 :        207 :                 set_bit(_IOC_NR(VIDIOC_TRY_EXT_CTRLS), valid_ioctls);
     572   [ +  +  -  + ]:       1449 :         if (vdev->ctrl_handler || ops->vidioc_querymenu)
     573                 :        207 :                 set_bit(_IOC_NR(VIDIOC_QUERYMENU), valid_ioctls);
     574         [ -  + ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_G_FREQUENCY, vidioc_g_frequency);
     575         [ -  + ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_S_FREQUENCY, vidioc_s_frequency);
     576         [ -  + ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_LOG_STATUS, vidioc_log_status);
     577                 :            : #ifdef CONFIG_VIDEO_ADV_DEBUG
     578                 :            :         set_bit(_IOC_NR(VIDIOC_DBG_G_CHIP_INFO), valid_ioctls);
     579                 :            :         set_bit(_IOC_NR(VIDIOC_DBG_G_REGISTER), valid_ioctls);
     580                 :            :         set_bit(_IOC_NR(VIDIOC_DBG_S_REGISTER), valid_ioctls);
     581                 :            : #endif
     582                 :            :         /* yes, really vidioc_subscribe_event */
     583         [ +  - ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_DQEVENT, vidioc_subscribe_event);
     584         [ +  - ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_SUBSCRIBE_EVENT, vidioc_subscribe_event);
     585         [ +  - ]:       1449 :         SET_VALID_IOCTL(ops, VIDIOC_UNSUBSCRIBE_EVENT, vidioc_unsubscribe_event);
     586   [ +  -  +  -  :       1449 :         if (ops->vidioc_enum_freq_bands || ops->vidioc_g_tuner || ops->vidioc_g_modulator)
                   -  + ]
     587                 :          0 :                 set_bit(_IOC_NR(VIDIOC_ENUM_FREQ_BANDS), valid_ioctls);
     588                 :            : 
     589         [ +  - ]:       1449 :         if (is_vid || is_tch) {
     590                 :            :                 /* video and metadata specific ioctls */
     591   [ +  +  -  +  :       1449 :                 if ((is_rx && (ops->vidioc_enum_fmt_vid_cap ||
                   #  # ]
     592         [ #  # ]:          0 :                                ops->vidioc_enum_fmt_vid_overlay ||
     593         [ +  - ]:        206 :                                ops->vidioc_enum_fmt_meta_cap)) ||
     594   [ -  +  #  # ]:        207 :                     (is_tx && (ops->vidioc_enum_fmt_vid_out ||
     595                 :          0 :                                ops->vidioc_enum_fmt_meta_out)))
     596                 :       1450 :                         set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
     597   [ +  +  +  +  :       2069 :                 if ((is_rx && (ops->vidioc_g_fmt_vid_cap ||
                   -  + ]
     598         [ #  # ]:        621 :                                ops->vidioc_g_fmt_vid_cap_mplane ||
     599         [ #  # ]:          0 :                                ops->vidioc_g_fmt_vid_overlay ||
     600         [ +  - ]:        206 :                                ops->vidioc_g_fmt_meta_cap)) ||
     601   [ -  +  #  # ]:        207 :                     (is_tx && (ops->vidioc_g_fmt_vid_out ||
     602         [ #  # ]:          0 :                                ops->vidioc_g_fmt_vid_out_mplane ||
     603         [ #  # ]:          0 :                                ops->vidioc_g_fmt_vid_out_overlay ||
     604                 :          0 :                                ops->vidioc_g_fmt_meta_out)))
     605                 :       1449 :                          set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
     606   [ +  +  +  +  :       2069 :                 if ((is_rx && (ops->vidioc_s_fmt_vid_cap ||
                   -  + ]
     607         [ #  # ]:        621 :                                ops->vidioc_s_fmt_vid_cap_mplane ||
     608         [ #  # ]:          0 :                                ops->vidioc_s_fmt_vid_overlay ||
     609         [ +  - ]:        206 :                                ops->vidioc_s_fmt_meta_cap)) ||
     610   [ -  +  #  # ]:        207 :                     (is_tx && (ops->vidioc_s_fmt_vid_out ||
     611         [ #  # ]:          0 :                                ops->vidioc_s_fmt_vid_out_mplane ||
     612         [ #  # ]:          0 :                                ops->vidioc_s_fmt_vid_out_overlay ||
     613                 :          0 :                                ops->vidioc_s_fmt_meta_out)))
     614                 :       1449 :                          set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
     615   [ +  +  +  +  :       2069 :                 if ((is_rx && (ops->vidioc_try_fmt_vid_cap ||
                   -  + ]
     616         [ #  # ]:        621 :                                ops->vidioc_try_fmt_vid_cap_mplane ||
     617         [ #  # ]:          0 :                                ops->vidioc_try_fmt_vid_overlay ||
     618         [ +  - ]:        206 :                                ops->vidioc_try_fmt_meta_cap)) ||
     619   [ -  +  #  # ]:        207 :                     (is_tx && (ops->vidioc_try_fmt_vid_out ||
     620         [ #  # ]:          0 :                                ops->vidioc_try_fmt_vid_out_mplane ||
     621         [ #  # ]:          0 :                                ops->vidioc_try_fmt_vid_out_overlay ||
     622                 :          0 :                                ops->vidioc_try_fmt_meta_out)))
     623                 :       1449 :                          set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
     624         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_OVERLAY, vidioc_overlay);
     625         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_G_FBUF, vidioc_g_fbuf);
     626         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_S_FBUF, vidioc_s_fbuf);
     627         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_G_JPEGCOMP, vidioc_g_jpegcomp);
     628         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_S_JPEGCOMP, vidioc_s_jpegcomp);
     629         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_G_ENC_INDEX, vidioc_g_enc_index);
     630         [ +  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_ENCODER_CMD, vidioc_encoder_cmd);
     631         [ +  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_TRY_ENCODER_CMD, vidioc_try_encoder_cmd);
     632         [ +  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_DECODER_CMD, vidioc_decoder_cmd);
     633         [ +  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_TRY_DECODER_CMD, vidioc_try_decoder_cmd);
     634         [ +  - ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMESIZES, vidioc_enum_framesizes);
     635         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_ENUM_FRAMEINTERVALS, vidioc_enum_frameintervals);
     636         [ +  - ]:       1448 :                 if (ops->vidioc_g_selection) {
     637                 :       1449 :                         set_bit(_IOC_NR(VIDIOC_G_CROP), valid_ioctls);
     638                 :       1449 :                         set_bit(_IOC_NR(VIDIOC_CROPCAP), valid_ioctls);
     639                 :            :                 }
     640         [ +  - ]:       1448 :                 if (ops->vidioc_s_selection)
     641                 :       1449 :                         set_bit(_IOC_NR(VIDIOC_S_CROP), valid_ioctls);
     642         [ +  - ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_G_SELECTION, vidioc_g_selection);
     643         [ +  - ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_S_SELECTION, vidioc_s_selection);
     644         [ #  # ]:          0 :         } else if (is_vbi) {
     645                 :            :                 /* vbi specific ioctls */
     646   [ #  #  #  #  :          0 :                 if ((is_rx && (ops->vidioc_g_fmt_vbi_cap ||
                   #  # ]
     647         [ #  # ]:          0 :                                ops->vidioc_g_fmt_sliced_vbi_cap)) ||
     648   [ #  #  #  # ]:          0 :                     (is_tx && (ops->vidioc_g_fmt_vbi_out ||
     649                 :          0 :                                ops->vidioc_g_fmt_sliced_vbi_out)))
     650                 :          0 :                         set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
     651   [ #  #  #  #  :          0 :                 if ((is_rx && (ops->vidioc_s_fmt_vbi_cap ||
                   #  # ]
     652         [ #  # ]:          0 :                                ops->vidioc_s_fmt_sliced_vbi_cap)) ||
     653   [ #  #  #  # ]:          0 :                     (is_tx && (ops->vidioc_s_fmt_vbi_out ||
     654                 :          0 :                                ops->vidioc_s_fmt_sliced_vbi_out)))
     655                 :          0 :                         set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
     656   [ #  #  #  #  :          0 :                 if ((is_rx && (ops->vidioc_try_fmt_vbi_cap ||
                   #  # ]
     657         [ #  # ]:          0 :                                ops->vidioc_try_fmt_sliced_vbi_cap)) ||
     658   [ #  #  #  # ]:          0 :                     (is_tx && (ops->vidioc_try_fmt_vbi_out ||
     659                 :          0 :                                ops->vidioc_try_fmt_sliced_vbi_out)))
     660                 :          0 :                         set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
     661         [ #  # ]:          0 :                 SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap);
     662         [ #  # ]:          0 :         } else if (is_sdr && is_rx) {
     663                 :            :                 /* SDR receiver specific ioctls */
     664         [ #  # ]:          0 :                 if (ops->vidioc_enum_fmt_sdr_cap)
     665                 :          0 :                         set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
     666         [ #  # ]:          0 :                 if (ops->vidioc_g_fmt_sdr_cap)
     667                 :          0 :                         set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
     668         [ #  # ]:          0 :                 if (ops->vidioc_s_fmt_sdr_cap)
     669                 :          0 :                         set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
     670         [ #  # ]:          0 :                 if (ops->vidioc_try_fmt_sdr_cap)
     671                 :          0 :                         set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
     672         [ #  # ]:          0 :         } else if (is_sdr && is_tx) {
     673                 :            :                 /* SDR transmitter specific ioctls */
     674         [ #  # ]:          0 :                 if (ops->vidioc_enum_fmt_sdr_out)
     675                 :          0 :                         set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls);
     676         [ #  # ]:          0 :                 if (ops->vidioc_g_fmt_sdr_out)
     677                 :          0 :                         set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls);
     678         [ #  # ]:          0 :                 if (ops->vidioc_s_fmt_sdr_out)
     679                 :          0 :                         set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls);
     680         [ #  # ]:          0 :                 if (ops->vidioc_try_fmt_sdr_out)
     681                 :          0 :                         set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls);
     682                 :            :         }
     683                 :            : 
     684   [ -  +  #  # ]:       1448 :         if (is_vid || is_vbi || is_sdr || is_tch) {
     685                 :            :                 /* ioctls valid for video, metadata, vbi or sdr */
     686         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs);
     687         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf);
     688         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf);
     689         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_EXPBUF, vidioc_expbuf);
     690         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf);
     691         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs);
     692         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf);
     693         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_STREAMON, vidioc_streamon);
     694         [ +  - ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_STREAMOFF, vidioc_streamoff);
     695                 :            :         }
     696                 :            : 
     697   [ -  +  #  # ]:       1448 :         if (is_vid || is_vbi || is_tch) {
     698                 :            :                 /* ioctls valid for video or vbi */
     699         [ -  + ]:       1448 :                 if (ops->vidioc_s_std)
     700                 :          0 :                         set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls);
     701         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std);
     702         [ -  + ]:       1448 :                 SET_VALID_IOCTL(ops, VIDIOC_G_STD, vidioc_g_std);
     703         [ +  + ]:       1448 :                 if (is_rx) {
     704         [ -  + ]:       1241 :                         SET_VALID_IOCTL(ops, VIDIOC_QUERYSTD, vidioc_querystd);
     705         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_ENUMINPUT, vidioc_enum_input);
     706         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_G_INPUT, vidioc_g_input);
     707         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_S_INPUT, vidioc_s_input);
     708         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDIO, vidioc_enumaudio);
     709         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
     710         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
     711         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings);
     712         [ -  + ]:       1242 :                         SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid);
     713                 :            :                 }
     714         [ +  + ]:       1449 :                 if (is_tx) {
     715         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
     716         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_G_OUTPUT, vidioc_g_output);
     717         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_S_OUTPUT, vidioc_s_output);
     718         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_ENUMAUDOUT, vidioc_enumaudout);
     719         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_G_AUDOUT, vidioc_g_audout);
     720         [ -  + ]:        828 :                         SET_VALID_IOCTL(ops, VIDIOC_S_AUDOUT, vidioc_s_audout);
     721                 :            :                 }
     722   [ +  +  +  -  :       2277 :                 if (ops->vidioc_g_parm || (vdev->vfl_type == VFL_TYPE_GRABBER &&
                   -  + ]
     723                 :        828 :                                         ops->vidioc_g_std))
     724                 :        621 :                         set_bit(_IOC_NR(VIDIOC_G_PARM), valid_ioctls);
     725         [ +  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_S_PARM, vidioc_s_parm);
     726         [ -  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings);
     727         [ -  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
     728         [ -  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
     729         [ -  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
     730         [ -  + ]:       1449 :                 SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid);
     731                 :            :         }
     732   [ +  +  -  + ]:       1449 :         if (is_tx && (is_radio || is_sdr)) {
     733                 :            :                 /* radio transmitter only ioctls */
     734         [ #  # ]:          0 :                 SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator);
     735         [ #  # ]:          0 :                 SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator);
     736                 :            :         }
     737         [ +  + ]:       1449 :         if (is_rx) {
     738                 :            :                 /* receiver only ioctls */
     739         [ -  + ]:       1242 :                 SET_VALID_IOCTL(ops, VIDIOC_G_TUNER, vidioc_g_tuner);
     740         [ -  + ]:       1242 :                 SET_VALID_IOCTL(ops, VIDIOC_S_TUNER, vidioc_s_tuner);
     741         [ -  + ]:       1242 :                 SET_VALID_IOCTL(ops, VIDIOC_S_HW_FREQ_SEEK, vidioc_s_hw_freq_seek);
     742                 :            :         }
     743                 :            : 
     744                 :       1449 :         bitmap_andnot(vdev->valid_ioctls, valid_ioctls, vdev->valid_ioctls,
     745                 :            :                         BASE_VIDIOC_PRIVATE);
     746                 :       1449 : }
     747                 :            : 
     748                 :       1449 : static int video_register_media_controller(struct video_device *vdev)
     749                 :            : {
     750                 :            : #if defined(CONFIG_MEDIA_CONTROLLER)
     751                 :            :         u32 intf_type;
     752                 :            :         int ret;
     753                 :            : 
     754                 :            :         /* Memory-to-memory devices are more complex and use
     755                 :            :          * their own function to register its mc entities.
     756                 :            :          */
     757   [ +  +  -  + ]:       1449 :         if (!vdev->v4l2_dev->mdev || vdev->vfl_dir == VFL_DIR_M2M)
     758                 :            :                 return 0;
     759                 :            : 
     760                 :          0 :         vdev->entity.obj_type = MEDIA_ENTITY_TYPE_VIDEO_DEVICE;
     761                 :          0 :         vdev->entity.function = MEDIA_ENT_F_UNKNOWN;
     762                 :            : 
     763   [ #  #  #  #  :          0 :         switch (vdev->vfl_type) {
                #  #  # ]
     764                 :            :         case VFL_TYPE_GRABBER:
     765                 :            :                 intf_type = MEDIA_INTF_T_V4L_VIDEO;
     766                 :          0 :                 vdev->entity.function = MEDIA_ENT_F_IO_V4L;
     767                 :          0 :                 break;
     768                 :            :         case VFL_TYPE_VBI:
     769                 :            :                 intf_type = MEDIA_INTF_T_V4L_VBI;
     770                 :          0 :                 vdev->entity.function = MEDIA_ENT_F_IO_VBI;
     771                 :          0 :                 break;
     772                 :            :         case VFL_TYPE_SDR:
     773                 :            :                 intf_type = MEDIA_INTF_T_V4L_SWRADIO;
     774                 :          0 :                 vdev->entity.function = MEDIA_ENT_F_IO_SWRADIO;
     775                 :          0 :                 break;
     776                 :            :         case VFL_TYPE_TOUCH:
     777                 :            :                 intf_type = MEDIA_INTF_T_V4L_TOUCH;
     778                 :          0 :                 vdev->entity.function = MEDIA_ENT_F_IO_V4L;
     779                 :          0 :                 break;
     780                 :            :         case VFL_TYPE_RADIO:
     781                 :            :                 intf_type = MEDIA_INTF_T_V4L_RADIO;
     782                 :            :                 /*
     783                 :            :                  * Radio doesn't have an entity at the V4L2 side to represent
     784                 :            :                  * radio input or output. Instead, the audio input/output goes
     785                 :            :                  * via either physical wires or ALSA.
     786                 :            :                  */
     787                 :            :                 break;
     788                 :            :         case VFL_TYPE_SUBDEV:
     789                 :            :                 intf_type = MEDIA_INTF_T_V4L_SUBDEV;
     790                 :            :                 /* Entity will be created via v4l2_device_register_subdev() */
     791                 :          0 :                 break;
     792                 :            :         default:
     793                 :            :                 return 0;
     794                 :            :         }
     795                 :            : 
     796         [ #  # ]:          0 :         if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN) {
     797                 :          0 :                 vdev->entity.name = vdev->name;
     798                 :            : 
     799                 :            :                 /* Needed just for backward compatibility with legacy MC API */
     800                 :          0 :                 vdev->entity.info.dev.major = VIDEO_MAJOR;
     801                 :          0 :                 vdev->entity.info.dev.minor = vdev->minor;
     802                 :            : 
     803                 :          0 :                 ret = media_device_register_entity(vdev->v4l2_dev->mdev,
     804                 :            :                                                    &vdev->entity);
     805         [ #  # ]:          0 :                 if (ret < 0) {
     806                 :          0 :                         pr_warn("%s: media_device_register_entity failed\n",
     807                 :            :                                 __func__);
     808                 :          0 :                         return ret;
     809                 :            :                 }
     810                 :            :         }
     811                 :            : 
     812                 :          0 :         vdev->intf_devnode = media_devnode_create(vdev->v4l2_dev->mdev,
     813                 :            :                                                   intf_type,
     814                 :            :                                                   0, VIDEO_MAJOR,
     815                 :          0 :                                                   vdev->minor);
     816         [ #  # ]:          0 :         if (!vdev->intf_devnode) {
     817                 :          0 :                 media_device_unregister_entity(&vdev->entity);
     818                 :          0 :                 return -ENOMEM;
     819                 :            :         }
     820                 :            : 
     821         [ #  # ]:          0 :         if (vdev->entity.function != MEDIA_ENT_F_UNKNOWN) {
     822                 :            :                 struct media_link *link;
     823                 :            : 
     824                 :          0 :                 link = media_create_intf_link(&vdev->entity,
     825                 :            :                                               &vdev->intf_devnode->intf,
     826                 :            :                                               MEDIA_LNK_FL_ENABLED |
     827                 :            :                                               MEDIA_LNK_FL_IMMUTABLE);
     828         [ #  # ]:          0 :                 if (!link) {
     829                 :          0 :                         media_devnode_remove(vdev->intf_devnode);
     830                 :          0 :                         media_device_unregister_entity(&vdev->entity);
     831                 :          0 :                         return -ENOMEM;
     832                 :            :                 }
     833                 :            :         }
     834                 :            : 
     835                 :            :         /* FIXME: how to create the other interface links? */
     836                 :            : 
     837                 :            : #endif
     838                 :            :         return 0;
     839                 :            : }
     840                 :            : 
     841                 :       1449 : int __video_register_device(struct video_device *vdev,
     842                 :            :                             enum vfl_devnode_type type,
     843                 :            :                             int nr, int warn_if_nr_in_use,
     844                 :            :                             struct module *owner)
     845                 :            : {
     846                 :            :         int i = 0;
     847                 :            :         int ret;
     848                 :            :         int minor_offset = 0;
     849                 :            :         int minor_cnt = VIDEO_NUM_DEVICES;
     850                 :            :         const char *name_base;
     851                 :            : 
     852                 :            :         /* A minor value of -1 marks this video device as never
     853                 :            :            having been registered */
     854                 :       1449 :         vdev->minor = -1;
     855                 :            : 
     856                 :            :         /* the release callback MUST be present */
     857   [ -  +  +  - ]:       1449 :         if (WARN_ON(!vdev->release))
     858                 :            :                 return -EINVAL;
     859                 :            :         /* the v4l2_dev pointer MUST be present */
     860   [ -  +  +  - ]:       1449 :         if (WARN_ON(!vdev->v4l2_dev))
     861                 :            :                 return -EINVAL;
     862                 :            :         /* the device_caps field MUST be set for all but subdevs */
     863   [ +  -  +  -  :       1449 :         if (WARN_ON(type != VFL_TYPE_SUBDEV && !vdev->device_caps))
             -  +  +  - ]
     864                 :            :                 return -EINVAL;
     865                 :            : 
     866                 :            :         /* v4l2_fh support */
     867                 :       1449 :         spin_lock_init(&vdev->fh_lock);
     868                 :       1449 :         INIT_LIST_HEAD(&vdev->fh_list);
     869                 :            : 
     870                 :            :         /* Part 1: check device type */
     871   [ -  -  -  -  :       1449 :         switch (type) {
                -  -  + ]
     872                 :            :         case VFL_TYPE_GRABBER:
     873                 :            :                 name_base = "video";
     874                 :            :                 break;
     875                 :            :         case VFL_TYPE_VBI:
     876                 :            :                 name_base = "vbi";
     877                 :          0 :                 break;
     878                 :            :         case VFL_TYPE_RADIO:
     879                 :            :                 name_base = "radio";
     880                 :          0 :                 break;
     881                 :            :         case VFL_TYPE_SUBDEV:
     882                 :            :                 name_base = "v4l-subdev";
     883                 :          0 :                 break;
     884                 :            :         case VFL_TYPE_SDR:
     885                 :            :                 /* Use device name 'swradio' because 'sdr' was already taken. */
     886                 :            :                 name_base = "swradio";
     887                 :          0 :                 break;
     888                 :            :         case VFL_TYPE_TOUCH:
     889                 :            :                 name_base = "v4l-touch";
     890                 :          0 :                 break;
     891                 :            :         default:
     892                 :          0 :                 pr_err("%s called with unknown type: %d\n",
     893                 :            :                        __func__, type);
     894                 :          0 :                 return -EINVAL;
     895                 :            :         }
     896                 :            : 
     897                 :       1449 :         vdev->vfl_type = type;
     898                 :       1449 :         vdev->cdev = NULL;
     899         [ +  - ]:       1449 :         if (vdev->dev_parent == NULL)
     900                 :       1449 :                 vdev->dev_parent = vdev->v4l2_dev->dev;
     901         [ +  + ]:       1449 :         if (vdev->ctrl_handler == NULL)
     902                 :       1242 :                 vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;
     903                 :            :         /* If the prio state pointer is NULL, then use the v4l2_device
     904                 :            :            prio state. */
     905         [ +  - ]:       1449 :         if (vdev->prio == NULL)
     906                 :       1449 :                 vdev->prio = &vdev->v4l2_dev->prio;
     907                 :            : 
     908                 :            :         /* Part 2: find a free minor, device node number and device index. */
     909                 :            : #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
     910                 :            :         /* Keep the ranges for the first four types for historical
     911                 :            :          * reasons.
     912                 :            :          * Newer devices (not yet in place) should use the range
     913                 :            :          * of 128-191 and just pick the first free minor there
     914                 :            :          * (new style). */
     915                 :            :         switch (type) {
     916                 :            :         case VFL_TYPE_GRABBER:
     917                 :            :                 minor_offset = 0;
     918                 :            :                 minor_cnt = 64;
     919                 :            :                 break;
     920                 :            :         case VFL_TYPE_RADIO:
     921                 :            :                 minor_offset = 64;
     922                 :            :                 minor_cnt = 64;
     923                 :            :                 break;
     924                 :            :         case VFL_TYPE_VBI:
     925                 :            :                 minor_offset = 224;
     926                 :            :                 minor_cnt = 32;
     927                 :            :                 break;
     928                 :            :         default:
     929                 :            :                 minor_offset = 128;
     930                 :            :                 minor_cnt = 64;
     931                 :            :                 break;
     932                 :            :         }
     933                 :            : #endif
     934                 :            : 
     935                 :            :         /* Pick a device node number */
     936                 :       1449 :         mutex_lock(&videodev_lock);
     937         [ +  - ]:       1449 :         nr = devnode_find(vdev, nr == -1 ? 0 : nr, minor_cnt);
     938         [ -  + ]:       1449 :         if (nr == minor_cnt)
     939                 :            :                 nr = devnode_find(vdev, 0, minor_cnt);
     940         [ +  - ]:       1449 :         if (nr == minor_cnt) {
     941                 :          0 :                 pr_err("could not get a free device node number\n");
     942                 :          0 :                 mutex_unlock(&videodev_lock);
     943                 :          0 :                 return -ENFILE;
     944                 :            :         }
     945                 :            : #ifdef CONFIG_VIDEO_FIXED_MINOR_RANGES
     946                 :            :         /* 1-on-1 mapping of device node number to minor number */
     947                 :            :         i = nr;
     948                 :            : #else
     949                 :            :         /* The device node number and minor numbers are independent, so
     950                 :            :            we just find the first free minor number. */
     951         [ +  - ]:       4347 :         for (i = 0; i < VIDEO_NUM_DEVICES; i++)
     952         [ +  + ]:       5796 :                 if (video_devices[i] == NULL)
     953                 :            :                         break;
     954         [ -  + ]:       1449 :         if (i == VIDEO_NUM_DEVICES) {
     955                 :          0 :                 mutex_unlock(&videodev_lock);
     956                 :          0 :                 pr_err("could not get a free minor\n");
     957                 :          0 :                 return -ENFILE;
     958                 :            :         }
     959                 :            : #endif
     960                 :       1449 :         vdev->minor = i + minor_offset;
     961                 :       1449 :         vdev->num = nr;
     962                 :            : 
     963                 :            :         /* Should not happen since we thought this minor was free */
     964   [ -  +  -  + ]:       1449 :         if (WARN_ON(video_devices[vdev->minor])) {
     965                 :          0 :                 mutex_unlock(&videodev_lock);
     966                 :          0 :                 pr_err("video_device not empty!\n");
     967                 :          0 :                 return -ENFILE;
     968                 :            :         }
     969                 :            :         devnode_set(vdev);
     970                 :       1449 :         vdev->index = get_index(vdev);
     971                 :       1449 :         video_devices[vdev->minor] = vdev;
     972                 :       1449 :         mutex_unlock(&videodev_lock);
     973                 :            : 
     974         [ +  - ]:       1449 :         if (vdev->ioctl_ops)
     975                 :       1449 :                 determine_valid_ioctls(vdev);
     976                 :            : 
     977                 :            :         /* Part 3: Initialize the character device */
     978                 :       1449 :         vdev->cdev = cdev_alloc();
     979         [ +  - ]:       1449 :         if (vdev->cdev == NULL) {
     980                 :            :                 ret = -ENOMEM;
     981                 :            :                 goto cleanup;
     982                 :            :         }
     983                 :       1449 :         vdev->cdev->ops = &v4l2_fops;
     984                 :       1449 :         vdev->cdev->owner = owner;
     985                 :       1449 :         ret = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1);
     986         [ -  + ]:       1449 :         if (ret < 0) {
     987                 :          0 :                 pr_err("%s: cdev_add failed\n", __func__);
     988                 :          0 :                 kfree(vdev->cdev);
     989                 :          0 :                 vdev->cdev = NULL;
     990                 :          0 :                 goto cleanup;
     991                 :            :         }
     992                 :            : 
     993                 :            :         /* Part 4: register the device with sysfs */
     994                 :       1449 :         vdev->dev.class = &video_class;
     995                 :       1449 :         vdev->dev.devt = MKDEV(VIDEO_MAJOR, vdev->minor);
     996                 :       1449 :         vdev->dev.parent = vdev->dev_parent;
     997                 :       1449 :         dev_set_name(&vdev->dev, "%s%d", name_base, vdev->num);
     998                 :       1449 :         ret = device_register(&vdev->dev);
     999         [ -  + ]:       1449 :         if (ret < 0) {
    1000                 :          0 :                 pr_err("%s: device_register failed\n", __func__);
    1001                 :          0 :                 goto cleanup;
    1002                 :            :         }
    1003                 :            :         /* Register the release callback that will be called when the last
    1004                 :            :            reference to the device goes away. */
    1005                 :       1449 :         vdev->dev.release = v4l2_device_release;
    1006                 :            : 
    1007   [ +  -  -  +  :       1449 :         if (nr != -1 && nr != vdev->num && warn_if_nr_in_use)
                   #  # ]
    1008                 :          0 :                 pr_warn("%s: requested %s%d, got %s\n", __func__,
    1009                 :            :                         name_base, nr, video_device_node_name(vdev));
    1010                 :            : 
    1011                 :            :         /* Increase v4l2_device refcount */
    1012                 :       1449 :         v4l2_device_get(vdev->v4l2_dev);
    1013                 :            : 
    1014                 :            :         /* Part 5: Register the entity. */
    1015                 :       1449 :         ret = video_register_media_controller(vdev);
    1016                 :            : 
    1017                 :            :         /* Part 6: Activate this minor. The char device can now be used. */
    1018                 :       1449 :         set_bit(V4L2_FL_REGISTERED, &vdev->flags);
    1019                 :            : 
    1020                 :       1449 :         return 0;
    1021                 :            : 
    1022                 :            : cleanup:
    1023                 :          0 :         mutex_lock(&videodev_lock);
    1024         [ #  # ]:          0 :         if (vdev->cdev)
    1025                 :          0 :                 cdev_del(vdev->cdev);
    1026                 :          0 :         video_devices[vdev->minor] = NULL;
    1027                 :            :         devnode_clear(vdev);
    1028                 :          0 :         mutex_unlock(&videodev_lock);
    1029                 :            :         /* Mark this video device as never having been registered. */
    1030                 :          0 :         vdev->minor = -1;
    1031                 :          0 :         return ret;
    1032                 :            : }
    1033                 :            : EXPORT_SYMBOL(__video_register_device);
    1034                 :            : 
    1035                 :            : /**
    1036                 :            :  *      video_unregister_device - unregister a video4linux device
    1037                 :            :  *      @vdev: the device to unregister
    1038                 :            :  *
    1039                 :            :  *      This unregisters the passed device. Future open calls will
    1040                 :            :  *      be met with errors.
    1041                 :            :  */
    1042                 :          0 : void video_unregister_device(struct video_device *vdev)
    1043                 :            : {
    1044                 :            :         /* Check if vdev was ever registered at all */
    1045   [ #  #  #  # ]:          0 :         if (!vdev || !video_is_registered(vdev))
    1046                 :          0 :                 return;
    1047                 :            : 
    1048                 :          0 :         mutex_lock(&videodev_lock);
    1049                 :            :         /* This must be in a critical section to prevent a race with v4l2_open.
    1050                 :            :          * Once this bit has been cleared video_get may never be called again.
    1051                 :            :          */
    1052                 :          0 :         clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
    1053                 :          0 :         mutex_unlock(&videodev_lock);
    1054                 :          0 :         device_unregister(&vdev->dev);
    1055                 :            : }
    1056                 :            : EXPORT_SYMBOL(video_unregister_device);
    1057                 :            : 
    1058                 :            : /*
    1059                 :            :  *      Initialise video for linux
    1060                 :            :  */
    1061                 :        207 : static int __init videodev_init(void)
    1062                 :            : {
    1063                 :            :         dev_t dev = MKDEV(VIDEO_MAJOR, 0);
    1064                 :            :         int ret;
    1065                 :            : 
    1066                 :        207 :         pr_info("Linux video capture interface: v2.00\n");
    1067                 :        207 :         ret = register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
    1068         [ -  + ]:        207 :         if (ret < 0) {
    1069                 :          0 :                 pr_warn("videodev: unable to get major %d\n",
    1070                 :            :                                 VIDEO_MAJOR);
    1071                 :          0 :                 return ret;
    1072                 :            :         }
    1073                 :            : 
    1074                 :        207 :         ret = class_register(&video_class);
    1075         [ -  + ]:        207 :         if (ret < 0) {
    1076                 :          0 :                 unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
    1077                 :          0 :                 pr_warn("video_dev: class_register failed\n");
    1078                 :          0 :                 return -EIO;
    1079                 :            :         }
    1080                 :            : 
    1081                 :            :         return 0;
    1082                 :            : }
    1083                 :            : 
    1084                 :          0 : static void __exit videodev_exit(void)
    1085                 :            : {
    1086                 :            :         dev_t dev = MKDEV(VIDEO_MAJOR, 0);
    1087                 :            : 
    1088                 :          0 :         class_unregister(&video_class);
    1089                 :          0 :         unregister_chrdev_region(dev, VIDEO_NUM_DEVICES);
    1090                 :          0 : }
    1091                 :            : 
    1092                 :            : subsys_initcall(videodev_init);
    1093                 :            : module_exit(videodev_exit)
    1094                 :            : 
    1095                 :            : MODULE_AUTHOR("Alan Cox, Mauro Carvalho Chehab <mchehab@kernel.org>, Bill Dirks, Justin Schoeman, Gerd Knorr");
    1096                 :            : MODULE_DESCRIPTION("Video4Linux2 core driver");
    1097                 :            : MODULE_LICENSE("GPL");
    1098                 :            : MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR);

Generated by: LCOV version 1.14