Mercurial > vloopback
comparison vloopback.c @ 14:647e63ddab46
Apply patch with some fix from Peter Holik to allow compile and work with kernel 2.6.29
| author | AngelCarpintero |
|---|---|
| date | Wed, 08 Jul 2009 10:07:31 +0000 |
| parents | b904131a3807 |
| children | 1011e450be45 |
comparison
equal
deleted
inserted
replaced
| 13:5971a90f2459 | 14:647e63ddab46 |
|---|---|
| 149 * 13.10.08 (Stephan Berberig & Angel Carpintero) | 149 * 13.10.08 (Stephan Berberig & Angel Carpintero) |
| 150 * Release to work on 2.6.27 , allow v4l_compat_ioctl32 work in 2.6.27 and a little cleanup | 150 * Release to work on 2.6.27 , allow v4l_compat_ioctl32 work in 2.6.27 and a little cleanup |
| 151 * in Makefile. | 151 * in Makefile. |
| 152 * | 152 * |
| 153 * 22.12.08 (Angel Carpintero) | 153 * 22.12.08 (Angel Carpintero) |
| 154 * Allow build with kernel 2.6.28 and 2.6.27.git ( struct video_dev has not priv member anymore). | 154 * Allow build with kernel 2.6.28 and 2.6.27.git ( struct video_dev has not priv member anymore). |
| 155 * | |
| 156 * 17.05.09 (Peter Holik) | |
| 157 * Patch to allow work with kernel 2.6.29 | |
| 158 * | |
| 155 */ | 159 */ |
| 156 | 160 |
| 157 | 161 |
| 158 #define VLOOPBACK_VERSION "1.2-trunk" | 162 #define VLOOPBACK_VERSION "1.3-trunk" |
| 159 | 163 |
| 160 /* Include files common to 2.4 and 2.6 versions */ | 164 /* Include files common to 2.4 and 2.6 versions */ |
| 161 #include <linux/version.h> /* >= 2.6.14 LINUX_VERSION_CODE */ | 165 #include <linux/version.h> /* >= 2.6.14 LINUX_VERSION_CODE */ |
| 162 #include <linux/errno.h> | 166 #include <linux/errno.h> |
| 163 #include <linux/kernel.h> | 167 #include <linux/kernel.h> |
| 164 #include <linux/module.h> | 168 #include <linux/module.h> |
| 165 #include <linux/pagemap.h> | 169 #include <linux/pagemap.h> |
| 170 | |
| 171 #ifndef CONFIG_VIDEO_V4L1_COMPAT | |
| 172 #error "need CONFIG_VIDEO_V4L1_COMPAT" | |
| 173 #endif | |
| 166 | 174 |
| 167 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) | 175 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) |
| 168 #include <media/v4l2-common.h> | 176 #include <media/v4l2-common.h> |
| 169 #endif | 177 #endif |
| 170 | 178 |
| 374 memcpy (arg, loops[nr]->ioctlretdata, _IOC_SIZE(cmd)); | 382 memcpy (arg, loops[nr]->ioctlretdata, _IOC_SIZE(cmd)); |
| 375 } | 383 } |
| 376 return 0; | 384 return 0; |
| 377 } | 385 } |
| 378 | 386 |
| 387 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
| 379 static int vloopback_open(struct inode *inod, struct file *f) | 388 static int vloopback_open(struct inode *inod, struct file *f) |
| 389 #else | |
| 390 static int vloopback_open(struct file *f) | |
| 391 #endif | |
| 380 { | 392 { |
| 381 struct video_device *loopdev = video_devdata(f); | 393 struct video_device *loopdev = video_devdata(f); |
| 382 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; | 394 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; |
| 383 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); | 395 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); |
| 384 int nr = ptr->pipenr; | 396 int nr = ptr->pipenr; |
| 428 info("Current pid %d", current->pid); | 440 info("Current pid %d", current->pid); |
| 429 } | 441 } |
| 430 return 0; | 442 return 0; |
| 431 } | 443 } |
| 432 | 444 |
| 445 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
| 433 static int vloopback_release(struct inode * inod, struct file *f) | 446 static int vloopback_release(struct inode * inod, struct file *f) |
| 447 #else | |
| 448 static int vloopback_release(struct file *f) | |
| 449 #endif | |
| 434 { | 450 { |
| 435 struct video_device *loopdev = video_devdata(f); | 451 struct video_device *loopdev = video_devdata(f); |
| 436 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; | 452 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; |
| 437 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); | 453 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); |
| 438 int nr = ptr->pipenr; | 454 int nr = ptr->pipenr; |
| 689 up(&loops[nr]->lock); | 705 up(&loops[nr]->lock); |
| 690 | 706 |
| 691 return 0; | 707 return 0; |
| 692 } | 708 } |
| 693 | 709 |
| 710 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) | |
| 694 static int vloopback_ioctl(struct inode *inod, struct file *f, unsigned int cmd, | 711 static int vloopback_ioctl(struct inode *inod, struct file *f, unsigned int cmd, |
| 695 unsigned long arg) | 712 unsigned long arg) |
| 713 #else | |
| 714 static long vloopback_ioctl(struct file *f, unsigned int cmd, unsigned long arg) | |
| 715 #endif | |
| 696 { | 716 { |
| 697 struct video_device *loopdev = video_devdata(f); | 717 struct video_device *loopdev = video_devdata(f); |
| 698 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; | 718 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data; |
| 699 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); | 719 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev); |
| 700 int nr = ptr->pipenr; | 720 int nr = ptr->pipenr; |
| 1113 } | 1133 } |
| 1114 } | 1134 } |
| 1115 return 0; | 1135 return 0; |
| 1116 } | 1136 } |
| 1117 | 1137 |
| 1118 static struct file_operations fileops_template = | 1138 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) |
| 1139 static const struct file_operations fileops_template = | |
| 1140 #else | |
| 1141 static const struct v4l2_file_operations fileops_template = | |
| 1142 #endif | |
| 1119 { | 1143 { |
| 1120 owner: THIS_MODULE, | 1144 owner: THIS_MODULE, |
| 1121 open: vloopback_open, | 1145 open: vloopback_open, |
| 1122 release: vloopback_release, | 1146 release: vloopback_release, |
| 1123 read: vloopback_read, | 1147 read: vloopback_read, |
| 1124 write: vloopback_write, | 1148 write: vloopback_write, |
| 1125 poll: vloopback_poll, | 1149 poll: vloopback_poll, |
| 1126 ioctl: vloopback_ioctl, | 1150 ioctl: vloopback_ioctl, |
| 1127 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) | 1151 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) |
| 1128 compat_ioctl: v4l_compat_ioctl32, | 1152 compat_ioctl: v4l_compat_ioctl32, |
| 1129 #endif | 1153 #endif |
| 1130 mmap: vloopback_mmap, | 1154 mmap: vloopback_mmap, |
| 1131 }; | 1155 }; |
| 1132 | 1156 |
| 1155 minor_in = minor_out = -1; /* autoassign */ | 1179 minor_in = minor_out = -1; /* autoassign */ |
| 1156 } else { | 1180 } else { |
| 1157 minor_in = 2 * nr + dev_offset; | 1181 minor_in = 2 * nr + dev_offset; |
| 1158 minor_out = 2 * nr + 1 + dev_offset; | 1182 minor_out = 2 * nr + 1 + dev_offset; |
| 1159 } | 1183 } |
| 1160 | |
| 1161 /* allocate space for this pipe */ | 1184 /* allocate space for this pipe */ |
| 1162 loops[nr]= kmalloc(sizeof(struct vloopback_pipe), GFP_KERNEL); | 1185 loops[nr]= kmalloc(sizeof(struct vloopback_pipe), GFP_KERNEL); |
| 1163 | 1186 |
| 1164 if (!loops[nr]) | 1187 if (!loops[nr]) |
| 1165 return -ENOMEM; | 1188 return -ENOMEM; |
