mirror of https://gitee.com/openkylin/linux.git
V4L/DVB (5507): Pvrusb2: Gather USB bus address info and report it
The V4L2 API requires a unique bus_info string returned as part of the v4l2_capability structure. These changes gather up the USB address information, from the underlying device, into a string and report that out through v4l2 and via sysfs (for completeness). Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
4f210e0722
commit
31a1854706
|
@ -283,6 +283,8 @@ struct pvr2_hdw {
|
||||||
int unit_number; /* ID for driver instance */
|
int unit_number; /* ID for driver instance */
|
||||||
unsigned long serial_number; /* ID for hardware itself */
|
unsigned long serial_number; /* ID for hardware itself */
|
||||||
|
|
||||||
|
char bus_info[32]; /* Bus location info */
|
||||||
|
|
||||||
/* Minor numbers used by v4l logic (yes, this is a hack, as there
|
/* Minor numbers used by v4l logic (yes, this is a hack, as there
|
||||||
should be no v4l junk here). Probably a better way to do this. */
|
should be no v4l junk here). Probably a better way to do this. */
|
||||||
int v4l_minor_number_video;
|
int v4l_minor_number_video;
|
||||||
|
|
|
@ -1008,6 +1008,13 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw)
|
||||||
return hdw->serial_number;
|
return hdw->serial_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
|
||||||
|
{
|
||||||
|
return hdw->bus_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
|
unsigned long pvr2_hdw_get_cur_freq(struct pvr2_hdw *hdw)
|
||||||
{
|
{
|
||||||
return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
|
return hdw->freqSelector ? hdw->freqValTelevision : hdw->freqValRadio;
|
||||||
|
@ -2105,6 +2112,11 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
|
||||||
hdw->usb_intf = intf;
|
hdw->usb_intf = intf;
|
||||||
hdw->usb_dev = interface_to_usbdev(intf);
|
hdw->usb_dev = interface_to_usbdev(intf);
|
||||||
|
|
||||||
|
scnprintf(hdw->bus_info,sizeof(hdw->bus_info),
|
||||||
|
"usb %s address %d",
|
||||||
|
hdw->usb_dev->dev.bus_id,
|
||||||
|
hdw->usb_dev->devnum);
|
||||||
|
|
||||||
ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
|
ifnum = hdw->usb_intf->cur_altsetting->desc.bInterfaceNumber;
|
||||||
usb_set_interface(hdw->usb_dev,ifnum,0);
|
usb_set_interface(hdw->usb_dev,ifnum,0);
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,9 @@ struct usb_device *pvr2_hdw_get_dev(struct pvr2_hdw *);
|
||||||
/* Retrieve serial number of device */
|
/* Retrieve serial number of device */
|
||||||
unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *);
|
unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *);
|
||||||
|
|
||||||
|
/* Retrieve bus location info of device */
|
||||||
|
const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *);
|
||||||
|
|
||||||
/* Called when hardware has been unplugged */
|
/* Called when hardware has been unplugged */
|
||||||
void pvr2_hdw_disconnect(struct pvr2_hdw *);
|
void pvr2_hdw_disconnect(struct pvr2_hdw *);
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,11 @@ struct pvr2_sysfs {
|
||||||
struct class_device_attribute attr_v4l_minor_number;
|
struct class_device_attribute attr_v4l_minor_number;
|
||||||
struct class_device_attribute attr_v4l_radio_minor_number;
|
struct class_device_attribute attr_v4l_radio_minor_number;
|
||||||
struct class_device_attribute attr_unit_number;
|
struct class_device_attribute attr_unit_number;
|
||||||
|
struct class_device_attribute attr_bus_info;
|
||||||
int v4l_minor_number_created_ok;
|
int v4l_minor_number_created_ok;
|
||||||
int v4l_radio_minor_number_created_ok;
|
int v4l_radio_minor_number_created_ok;
|
||||||
int unit_number_created_ok;
|
int unit_number_created_ok;
|
||||||
|
int bus_info_created_ok;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
|
@ -705,6 +707,10 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp)
|
||||||
pvr2_sysfs_tear_down_debugifc(sfp);
|
pvr2_sysfs_tear_down_debugifc(sfp);
|
||||||
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
#endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */
|
||||||
pvr2_sysfs_tear_down_controls(sfp);
|
pvr2_sysfs_tear_down_controls(sfp);
|
||||||
|
if (sfp->bus_info_created_ok) {
|
||||||
|
class_device_remove_file(sfp->class_dev,
|
||||||
|
&sfp->attr_bus_info);
|
||||||
|
}
|
||||||
if (sfp->v4l_minor_number_created_ok) {
|
if (sfp->v4l_minor_number_created_ok) {
|
||||||
class_device_remove_file(sfp->class_dev,
|
class_device_remove_file(sfp->class_dev,
|
||||||
&sfp->attr_v4l_minor_number);
|
&sfp->attr_v4l_minor_number);
|
||||||
|
@ -735,6 +741,16 @@ static ssize_t v4l_minor_number_show(struct class_device *class_dev,char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ssize_t bus_info_show(struct class_device *class_dev,char *buf)
|
||||||
|
{
|
||||||
|
struct pvr2_sysfs *sfp;
|
||||||
|
sfp = (struct pvr2_sysfs *)class_dev->class_data;
|
||||||
|
if (!sfp) return -EINVAL;
|
||||||
|
return scnprintf(buf,PAGE_SIZE,"%s\n",
|
||||||
|
pvr2_hdw_get_bus_info(sfp->channel.hdw));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ssize_t v4l_radio_minor_number_show(struct class_device *class_dev,
|
static ssize_t v4l_radio_minor_number_show(struct class_device *class_dev,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
|
@ -836,6 +852,20 @@ static void class_dev_create(struct pvr2_sysfs *sfp,
|
||||||
sfp->unit_number_created_ok = !0;
|
sfp->unit_number_created_ok = !0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sfp->attr_bus_info.attr.owner = THIS_MODULE;
|
||||||
|
sfp->attr_bus_info.attr.name = "bus_info_str";
|
||||||
|
sfp->attr_bus_info.attr.mode = S_IRUGO;
|
||||||
|
sfp->attr_bus_info.show = bus_info_show;
|
||||||
|
sfp->attr_bus_info.store = NULL;
|
||||||
|
ret = class_device_create_file(sfp->class_dev,
|
||||||
|
&sfp->attr_bus_info);
|
||||||
|
if (ret < 0) {
|
||||||
|
printk(KERN_WARNING "%s: class_device_create_file error: %d\n",
|
||||||
|
__FUNCTION__, ret);
|
||||||
|
} else {
|
||||||
|
sfp->bus_info_created_ok = !0;
|
||||||
|
}
|
||||||
|
|
||||||
pvr2_sysfs_add_controls(sfp);
|
pvr2_sysfs_add_controls(sfp);
|
||||||
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
#ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC
|
||||||
pvr2_sysfs_add_debugifc(sfp);
|
pvr2_sysfs_add_debugifc(sfp);
|
||||||
|
|
|
@ -203,6 +203,8 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
|
||||||
struct v4l2_capability *cap = arg;
|
struct v4l2_capability *cap = arg;
|
||||||
|
|
||||||
memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability));
|
memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability));
|
||||||
|
strlcpy(cap->bus_info,pvr2_hdw_get_bus_info(hdw),
|
||||||
|
sizeof(cap->bus_info));
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue