diff options
Diffstat (limited to 'drivers/media/video/vivi.c')
| -rw-r--r-- | drivers/media/video/vivi.c | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index 3518af071a2e..8ba8daafd7ea 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
| @@ -1021,13 +1021,13 @@ static int vivi_release(void) | |||
| 1021 | dev = list_entry(list, struct vivi_dev, vivi_devlist); | 1021 | dev = list_entry(list, struct vivi_dev, vivi_devlist); |
| 1022 | 1022 | ||
| 1023 | if (-1 != dev->vfd->minor) { | 1023 | if (-1 != dev->vfd->minor) { |
| 1024 | video_unregister_device(dev->vfd); | 1024 | printk(KERN_INFO "%s: unregistering /dev/video%d\n", |
| 1025 | printk(KERN_INFO "%s: /dev/video%d unregistered.\n", | ||
| 1026 | VIVI_MODULE_NAME, dev->vfd->minor); | 1025 | VIVI_MODULE_NAME, dev->vfd->minor); |
| 1026 | video_unregister_device(dev->vfd); | ||
| 1027 | } else { | 1027 | } else { |
| 1028 | video_device_release(dev->vfd); | 1028 | printk(KERN_INFO "%s: releasing /dev/video%d\n", |
| 1029 | printk(KERN_INFO "%s: /dev/video%d released.\n", | ||
| 1030 | VIVI_MODULE_NAME, dev->vfd->minor); | 1029 | VIVI_MODULE_NAME, dev->vfd->minor); |
| 1030 | video_device_release(dev->vfd); | ||
| 1031 | } | 1031 | } |
| 1032 | 1032 | ||
| 1033 | kfree(dev); | 1033 | kfree(dev); |
| @@ -1104,19 +1104,29 @@ static struct video_device vivi_template = { | |||
| 1104 | Initialization and module stuff | 1104 | Initialization and module stuff |
| 1105 | ------------------------------------------------------------------*/ | 1105 | ------------------------------------------------------------------*/ |
| 1106 | 1106 | ||
| 1107 | /* This routine allocates from 1 to n_devs virtual drivers. | ||
| 1108 | |||
| 1109 | The real maximum number of virtual drivers will depend on how many drivers | ||
| 1110 | will succeed. This is limited to the maximum number of devices that | ||
| 1111 | videodev supports. Since there are 64 minors for video grabbers, this is | ||
| 1112 | currently the theoretical maximum limit. However, a further limit does | ||
| 1113 | exist at videodev that forbids any driver to register more than 32 video | ||
| 1114 | grabbers. | ||
| 1115 | */ | ||
| 1107 | static int __init vivi_init(void) | 1116 | static int __init vivi_init(void) |
| 1108 | { | 1117 | { |
| 1109 | int ret = -ENOMEM, i; | 1118 | int ret = -ENOMEM, i; |
| 1110 | struct vivi_dev *dev; | 1119 | struct vivi_dev *dev; |
| 1111 | struct video_device *vfd; | 1120 | struct video_device *vfd; |
| 1112 | 1121 | ||
| 1122 | if (n_devs <= 0) | ||
| 1123 | n_devs = 1; | ||
| 1124 | |||
| 1113 | for (i = 0; i < n_devs; i++) { | 1125 | for (i = 0; i < n_devs; i++) { |
| 1114 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 1126 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
| 1115 | if (NULL == dev) | 1127 | if (!dev) |
| 1116 | break; | 1128 | break; |
| 1117 | 1129 | ||
| 1118 | list_add_tail(&dev->vivi_devlist, &vivi_devlist); | ||
| 1119 | |||
| 1120 | /* init video dma queues */ | 1130 | /* init video dma queues */ |
| 1121 | INIT_LIST_HEAD(&dev->vidq.active); | 1131 | INIT_LIST_HEAD(&dev->vidq.active); |
| 1122 | init_waitqueue_head(&dev->vidq.wq); | 1132 | init_waitqueue_head(&dev->vidq.wq); |
| @@ -1126,14 +1136,27 @@ static int __init vivi_init(void) | |||
| 1126 | mutex_init(&dev->mutex); | 1136 | mutex_init(&dev->mutex); |
| 1127 | 1137 | ||
| 1128 | vfd = video_device_alloc(); | 1138 | vfd = video_device_alloc(); |
| 1129 | if (NULL == vfd) | 1139 | if (!vfd) { |
| 1140 | kfree(dev); | ||
| 1130 | break; | 1141 | break; |
| 1142 | } | ||
| 1131 | 1143 | ||
| 1132 | *vfd = vivi_template; | 1144 | *vfd = vivi_template; |
| 1133 | 1145 | ||
| 1134 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr); | 1146 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, video_nr); |
| 1135 | if (ret < 0) | 1147 | if (ret < 0) { |
| 1148 | video_device_release(vfd); | ||
| 1149 | kfree(dev); | ||
| 1150 | |||
| 1151 | /* If some registers succeeded, keep driver */ | ||
| 1152 | if (i) | ||
| 1153 | ret = 0; | ||
| 1154 | |||
| 1136 | break; | 1155 | break; |
| 1156 | } | ||
| 1157 | |||
| 1158 | /* Now that everything is fine, let's add it to device list */ | ||
| 1159 | list_add_tail(&dev->vivi_devlist, &vivi_devlist); | ||
| 1137 | 1160 | ||
| 1138 | snprintf(vfd->name, sizeof(vfd->name), "%s (%i)", | 1161 | snprintf(vfd->name, sizeof(vfd->name), "%s (%i)", |
| 1139 | vivi_template.name, vfd->minor); | 1162 | vivi_template.name, vfd->minor); |
| @@ -1149,11 +1172,16 @@ static int __init vivi_init(void) | |||
| 1149 | if (ret < 0) { | 1172 | if (ret < 0) { |
| 1150 | vivi_release(); | 1173 | vivi_release(); |
| 1151 | printk(KERN_INFO "Error %d while loading vivi driver\n", ret); | 1174 | printk(KERN_INFO "Error %d while loading vivi driver\n", ret); |
| 1152 | } else | 1175 | } else { |
| 1153 | printk(KERN_INFO "Video Technology Magazine Virtual Video " | 1176 | printk(KERN_INFO "Video Technology Magazine Virtual Video " |
| 1154 | "Capture Board ver %u.%u.%u successfully loaded.\n", | 1177 | "Capture Board ver %u.%u.%u successfully loaded.\n", |
| 1155 | (VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF, | 1178 | (VIVI_VERSION >> 16) & 0xFF, (VIVI_VERSION >> 8) & 0xFF, |
| 1156 | VIVI_VERSION & 0xFF); | 1179 | VIVI_VERSION & 0xFF); |
| 1180 | |||
| 1181 | /* n_devs will reflect the actual number of allocated devices */ | ||
| 1182 | n_devs = i; | ||
| 1183 | } | ||
| 1184 | |||
| 1157 | return ret; | 1185 | return ret; |
| 1158 | } | 1186 | } |
| 1159 | 1187 | ||
| @@ -1169,10 +1197,10 @@ MODULE_DESCRIPTION("Video Technology Magazine Virtual Video Capture Board"); | |||
| 1169 | MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol"); | 1197 | MODULE_AUTHOR("Mauro Carvalho Chehab, Ted Walther and John Sokol"); |
| 1170 | MODULE_LICENSE("Dual BSD/GPL"); | 1198 | MODULE_LICENSE("Dual BSD/GPL"); |
| 1171 | 1199 | ||
| 1172 | module_param(video_nr, int, 0); | 1200 | module_param(video_nr, uint, 0444); |
| 1173 | MODULE_PARM_DESC(video_nr, "video iminor start number"); | 1201 | MODULE_PARM_DESC(video_nr, "video iminor start number"); |
| 1174 | 1202 | ||
| 1175 | module_param(n_devs, int, 0); | 1203 | module_param(n_devs, uint, 0444); |
| 1176 | MODULE_PARM_DESC(n_devs, "number of video devices to create"); | 1204 | MODULE_PARM_DESC(n_devs, "number of video devices to create"); |
| 1177 | 1205 | ||
| 1178 | module_param_named(debug, vivi_template.debug, int, 0444); | 1206 | module_param_named(debug, vivi_template.debug, int, 0444); |
