diff options
Diffstat (limited to 'drivers/media/video/pvrusb2')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h | 6 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.c | 14 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.h | 8 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-sysfs.c | 33 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-v4l2.c | 9 |
5 files changed, 54 insertions, 16 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h index 34b08fbcc6ea..4f69431a8f4e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h | |||
@@ -281,9 +281,9 @@ struct pvr2_hdw { | |||
281 | int unit_number; /* ID for driver instance */ | 281 | int unit_number; /* ID for driver instance */ |
282 | unsigned long serial_number; /* ID for hardware itself */ | 282 | unsigned long serial_number; /* ID for hardware itself */ |
283 | 283 | ||
284 | /* Minor number used by v4l logic (yes, this is a hack, as there should | 284 | /* Minor numbers used by v4l logic (yes, this is a hack, as there |
285 | be no v4l junk here). Probably a better way to do this. */ | 285 | should be no v4l junk here). Probably a better way to do this. */ |
286 | int v4l_minor_number; | 286 | int v4l_minor_number[3]; |
287 | 287 | ||
288 | /* Location of eeprom or a negative number if none */ | 288 | /* Location of eeprom or a negative number if none */ |
289 | int eeprom_addr; | 289 | int eeprom_addr; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index ca4ef95996be..4b45299e187d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1898,7 +1898,9 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, | |||
1898 | 1898 | ||
1899 | hdw->eeprom_addr = -1; | 1899 | hdw->eeprom_addr = -1; |
1900 | hdw->unit_number = -1; | 1900 | hdw->unit_number = -1; |
1901 | hdw->v4l_minor_number = -1; | 1901 | hdw->v4l_minor_number[0] = -1; |
1902 | hdw->v4l_minor_number[1] = -1; | ||
1903 | hdw->v4l_minor_number[2] = -1; | ||
1902 | hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL); | 1904 | hdw->ctl_write_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL); |
1903 | if (!hdw->ctl_write_buffer) goto fail; | 1905 | if (!hdw->ctl_write_buffer) goto fail; |
1904 | hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL); | 1906 | hdw->ctl_read_buffer = kmalloc(PVR2_CTL_BUFFSIZE,GFP_KERNEL); |
@@ -2546,16 +2548,16 @@ int pvr2_hdw_cpufw_get(struct pvr2_hdw *hdw,unsigned int offs, | |||
2546 | } | 2548 | } |
2547 | 2549 | ||
2548 | 2550 | ||
2549 | int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw) | 2551 | int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *hdw,int index) |
2550 | { | 2552 | { |
2551 | return hdw->v4l_minor_number; | 2553 | return hdw->v4l_minor_number[index]; |
2552 | } | 2554 | } |
2553 | 2555 | ||
2554 | 2556 | ||
2555 | /* Store the v4l minor device number */ | 2557 | /* Store a v4l minor device number */ |
2556 | void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int v) | 2558 | void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *hdw,int index,int v) |
2557 | { | 2559 | { |
2558 | hdw->v4l_minor_number = v; | 2560 | hdw->v4l_minor_number[index] = v; |
2559 | } | 2561 | } |
2560 | 2562 | ||
2561 | 2563 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h index 29979bb2a768..b1d80bd2678c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h | |||
@@ -205,11 +205,11 @@ int pvr2_hdw_cpufw_get_enabled(struct pvr2_hdw *); | |||
205 | int pvr2_hdw_cpufw_get(struct pvr2_hdw *,unsigned int offs, | 205 | int pvr2_hdw_cpufw_get(struct pvr2_hdw *,unsigned int offs, |
206 | char *buf,unsigned int cnt); | 206 | char *buf,unsigned int cnt); |
207 | 207 | ||
208 | /* Retrieve previously stored v4l minor device number */ | 208 | /* Retrieve a previously stored v4l minor device number */ |
209 | int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *); | 209 | int pvr2_hdw_v4l_get_minor_number(struct pvr2_hdw *,int); |
210 | 210 | ||
211 | /* Store the v4l minor device number */ | 211 | /* Store a v4l minor device number */ |
212 | void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,int); | 212 | void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *,int,int); |
213 | 213 | ||
214 | /* Direct read/write access to chip's registers: | 214 | /* Direct read/write access to chip's registers: |
215 | chip_id - unique id of chip (e.g. I2C_DRIVERD_xxxx) | 215 | chip_id - unique id of chip (e.g. I2C_DRIVERD_xxxx) |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c index c294f46db9b9..d583c9777b6d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c +++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c | |||
@@ -40,8 +40,10 @@ struct pvr2_sysfs { | |||
40 | struct pvr2_sysfs_ctl_item *item_first; | 40 | struct pvr2_sysfs_ctl_item *item_first; |
41 | struct pvr2_sysfs_ctl_item *item_last; | 41 | struct pvr2_sysfs_ctl_item *item_last; |
42 | struct class_device_attribute attr_v4l_minor_number; | 42 | struct class_device_attribute attr_v4l_minor_number; |
43 | struct class_device_attribute attr_v4l_radio_minor_number; | ||
43 | struct class_device_attribute attr_unit_number; | 44 | struct class_device_attribute attr_unit_number; |
44 | int v4l_minor_number_created_ok; | 45 | int v4l_minor_number_created_ok; |
46 | int v4l_radio_minor_number_created_ok; | ||
45 | int unit_number_created_ok; | 47 | int unit_number_created_ok; |
46 | }; | 48 | }; |
47 | 49 | ||
@@ -709,6 +711,10 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp) | |||
709 | class_device_remove_file(sfp->class_dev, | 711 | class_device_remove_file(sfp->class_dev, |
710 | &sfp->attr_v4l_minor_number); | 712 | &sfp->attr_v4l_minor_number); |
711 | } | 713 | } |
714 | if (sfp->v4l_radio_minor_number_created_ok) { | ||
715 | class_device_remove_file(sfp->class_dev, | ||
716 | &sfp->attr_v4l_radio_minor_number); | ||
717 | } | ||
712 | if (sfp->unit_number_created_ok) { | 718 | if (sfp->unit_number_created_ok) { |
713 | class_device_remove_file(sfp->class_dev, | 719 | class_device_remove_file(sfp->class_dev, |
714 | &sfp->attr_unit_number); | 720 | &sfp->attr_unit_number); |
@@ -726,7 +732,18 @@ static ssize_t v4l_minor_number_show(struct class_device *class_dev,char *buf) | |||
726 | sfp = (struct pvr2_sysfs *)class_dev->class_data; | 732 | sfp = (struct pvr2_sysfs *)class_dev->class_data; |
727 | if (!sfp) return -EINVAL; | 733 | if (!sfp) return -EINVAL; |
728 | return scnprintf(buf,PAGE_SIZE,"%d\n", | 734 | return scnprintf(buf,PAGE_SIZE,"%d\n", |
729 | pvr2_hdw_v4l_get_minor_number(sfp->channel.hdw)); | 735 | pvr2_hdw_v4l_get_minor_number(sfp->channel.hdw,0)); |
736 | } | ||
737 | |||
738 | |||
739 | static ssize_t v4l_radio_minor_number_show(struct class_device *class_dev, | ||
740 | char *buf) | ||
741 | { | ||
742 | struct pvr2_sysfs *sfp; | ||
743 | sfp = (struct pvr2_sysfs *)class_dev->class_data; | ||
744 | if (!sfp) return -EINVAL; | ||
745 | return scnprintf(buf,PAGE_SIZE,"%d\n", | ||
746 | pvr2_hdw_v4l_get_minor_number(sfp->channel.hdw,2)); | ||
730 | } | 747 | } |
731 | 748 | ||
732 | 749 | ||
@@ -793,6 +810,20 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
793 | sfp->v4l_minor_number_created_ok = !0; | 810 | sfp->v4l_minor_number_created_ok = !0; |
794 | } | 811 | } |
795 | 812 | ||
813 | sfp->attr_v4l_radio_minor_number.attr.owner = THIS_MODULE; | ||
814 | sfp->attr_v4l_radio_minor_number.attr.name = "v4l_radio_minor_number"; | ||
815 | sfp->attr_v4l_radio_minor_number.attr.mode = S_IRUGO; | ||
816 | sfp->attr_v4l_radio_minor_number.show = v4l_radio_minor_number_show; | ||
817 | sfp->attr_v4l_radio_minor_number.store = NULL; | ||
818 | ret = class_device_create_file(sfp->class_dev, | ||
819 | &sfp->attr_v4l_radio_minor_number); | ||
820 | if (ret < 0) { | ||
821 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
822 | __FUNCTION__, ret); | ||
823 | } else { | ||
824 | sfp->v4l_radio_minor_number_created_ok = !0; | ||
825 | } | ||
826 | |||
796 | sfp->attr_unit_number.attr.owner = THIS_MODULE; | 827 | sfp->attr_unit_number.attr.owner = THIS_MODULE; |
797 | sfp->attr_unit_number.attr.name = "unit_number"; | 828 | sfp->attr_unit_number.attr.name = "unit_number"; |
798 | sfp->attr_unit_number.attr.mode = S_IRUGO; | 829 | sfp->attr_unit_number.attr.mode = S_IRUGO; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 6cf17080eb49..02a541fbeff9 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -722,7 +722,12 @@ static void pvr2_v4l2_dev_destroy(struct pvr2_v4l2_dev *dip) | |||
722 | 722 | ||
723 | static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) | 723 | static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) |
724 | { | 724 | { |
725 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw,-1); | 725 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, |
726 | pvr2_config_mpeg-1,-1); | ||
727 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, | ||
728 | pvr2_config_vbi-1,-1); | ||
729 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, | ||
730 | pvr2_config_radio-1,-1); | ||
726 | pvr2_v4l2_dev_destroy(vp->vdev); | 731 | pvr2_v4l2_dev_destroy(vp->vdev); |
727 | 732 | ||
728 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); | 733 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); |
@@ -1062,7 +1067,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, | |||
1062 | } | 1067 | } |
1063 | 1068 | ||
1064 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, | 1069 | pvr2_hdw_v4l_store_minor_number(vp->channel.mc_head->hdw, |
1065 | dip->devbase.minor); | 1070 | cfg-1,dip->devbase.minor); |
1066 | } | 1071 | } |
1067 | 1072 | ||
1068 | 1073 | ||