V4L/DVB (10237): pvrusb2: Generate a device-unique identifier
Implement a new internal function to create a string device identifier. This ID stays with the specific device, making it useful to user space to identify specific devices. We use the serial number if available; otherwise we give up and just spit out a unit/instance ID. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
d166b02ea6
commit
13a887971b
@@ -195,8 +195,20 @@ struct pvr2_hdw {
|
|||||||
struct mutex big_lock_mutex;
|
struct mutex big_lock_mutex;
|
||||||
int big_lock_held; /* For debugging */
|
int big_lock_held; /* For debugging */
|
||||||
|
|
||||||
|
/* This is a simple string which identifies the instance of this
|
||||||
|
driver. It is unique within the set of existing devices, but
|
||||||
|
there is no attempt to keep the name consistent with the same
|
||||||
|
physical device each time. */
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
||||||
|
/* This is a simple string which identifies the physical device
|
||||||
|
instance itself - if possible. (If not possible, then it is
|
||||||
|
based on the specific driver instance, similar to name above.)
|
||||||
|
The idea here is that userspace might hopefully be able to use
|
||||||
|
this recognize specific tuners. It will encode a serial number,
|
||||||
|
if available. */
|
||||||
|
char identifier[32];
|
||||||
|
|
||||||
/* I2C stuff */
|
/* I2C stuff */
|
||||||
struct i2c_adapter i2c_adap;
|
struct i2c_adapter i2c_adap;
|
||||||
struct i2c_algorithm i2c_algo;
|
struct i2c_algorithm i2c_algo;
|
||||||
|
@@ -1283,6 +1283,12 @@ const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *hdw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *pvr2_hdw_get_device_identifier(struct pvr2_hdw *hdw)
|
||||||
|
{
|
||||||
|
return hdw->identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
@@ -2024,6 +2030,19 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
|
|||||||
hdw->std_mask_eeprom = V4L2_STD_ALL;
|
hdw->std_mask_eeprom = V4L2_STD_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hdw->serial_number) {
|
||||||
|
idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
|
||||||
|
"sn-%lu", hdw->serial_number);
|
||||||
|
} else if (hdw->unit_number >= 0) {
|
||||||
|
idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
|
||||||
|
"unit-%c",
|
||||||
|
hdw->unit_number + 'a');
|
||||||
|
} else {
|
||||||
|
idx = scnprintf(hdw->identifier, sizeof(hdw->identifier) - 1,
|
||||||
|
"unit-??");
|
||||||
|
}
|
||||||
|
hdw->identifier[idx] = 0;
|
||||||
|
|
||||||
pvr2_hdw_setup_std(hdw);
|
pvr2_hdw_setup_std(hdw);
|
||||||
|
|
||||||
if (!get_default_tuner_type(hdw)) {
|
if (!get_default_tuner_type(hdw)) {
|
||||||
|
@@ -132,6 +132,9 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *);
|
|||||||
/* Retrieve bus location info of device */
|
/* Retrieve bus location info of device */
|
||||||
const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *);
|
const char *pvr2_hdw_get_bus_info(struct pvr2_hdw *);
|
||||||
|
|
||||||
|
/* Retrieve per-instance string identifier for this specific device */
|
||||||
|
const char *pvr2_hdw_get_device_identifier(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 *);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user