Add 'discover' hook for drivers
Drivers can now offer a discover function, and are expected to offer the device devtype during discovery, without accessing the USB device. Hmm. Maybe we'll have to change that later...
This commit is contained in:
parent
f0ef386f43
commit
cc3e976042
2 changed files with 30 additions and 8 deletions
|
@ -121,6 +121,32 @@ static struct fp_driver *find_supporting_driver(struct usb_device *udev,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct fp_dscv_dev *discover_dev(struct usb_device *udev)
|
||||||
|
{
|
||||||
|
struct usb_id *usb_id;
|
||||||
|
struct fp_driver *drv = find_supporting_driver(udev, &usb_id);
|
||||||
|
struct fp_dscv_dev *ddev;
|
||||||
|
uint32_t devtype = 0;
|
||||||
|
|
||||||
|
if (!drv)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (drv->discover) {
|
||||||
|
int r = drv->discover(usb_id, &devtype);
|
||||||
|
if (r < 0)
|
||||||
|
fp_err("%s discover failed, code %d", drv->name, r);
|
||||||
|
if (r <= 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ddev = g_malloc0(sizeof(*ddev));
|
||||||
|
ddev->drv = drv;
|
||||||
|
ddev->udev = udev;
|
||||||
|
ddev->driver_data = usb_id->driver_data;
|
||||||
|
ddev->devtype = devtype;
|
||||||
|
return ddev;
|
||||||
|
}
|
||||||
|
|
||||||
API_EXPORTED struct fp_dscv_dev **fp_discover_devs(void)
|
API_EXPORTED struct fp_dscv_dev **fp_discover_devs(void)
|
||||||
{
|
{
|
||||||
GList *tmplist = NULL;
|
GList *tmplist = NULL;
|
||||||
|
@ -142,15 +168,9 @@ API_EXPORTED struct fp_dscv_dev **fp_discover_devs(void)
|
||||||
* sets of drivers against small sets of USB devices */
|
* sets of drivers against small sets of USB devices */
|
||||||
for (bus = usb_get_busses(); bus; bus = bus->next)
|
for (bus = usb_get_busses(); bus; bus = bus->next)
|
||||||
for (udev = bus->devices; udev; udev = udev->next) {
|
for (udev = bus->devices; udev; udev = udev->next) {
|
||||||
unsigned long driver_data;
|
struct fp_dscv_dev *ddev = discover_dev(udev);
|
||||||
struct fp_driver *drv = find_supporting_driver(udev, &driver_data);
|
if (!ddev)
|
||||||
struct fp_dscv_dev *ddev;
|
|
||||||
if (!drv)
|
|
||||||
continue;
|
continue;
|
||||||
ddev = g_malloc0(sizeof(*ddev));
|
|
||||||
ddev->drv = drv;
|
|
||||||
ddev->udev = udev;
|
|
||||||
ddev->driver_data = driver_data;
|
|
||||||
tmplist = g_list_prepend(tmplist, (gpointer) ddev);
|
tmplist = g_list_prepend(tmplist, (gpointer) ddev);
|
||||||
dscv_count++;
|
dscv_count++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,7 @@ struct fp_driver {
|
||||||
void *priv;
|
void *priv;
|
||||||
|
|
||||||
/* Device operations */
|
/* Device operations */
|
||||||
|
int (*discover)(struct usb_id *usb_id, uint32_t *devtype);
|
||||||
int (*init)(struct fp_dev *dev, unsigned long driver_data);
|
int (*init)(struct fp_dev *dev, unsigned long driver_data);
|
||||||
void (*exit)(struct fp_dev *dev);
|
void (*exit)(struct fp_dev *dev);
|
||||||
int (*enroll)(struct fp_dev *dev, gboolean initial, int stage,
|
int (*enroll)(struct fp_dev *dev, gboolean initial, int stage,
|
||||||
|
@ -141,6 +142,7 @@ struct fp_dscv_dev {
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
struct fp_driver *drv;
|
struct fp_driver *drv;
|
||||||
unsigned long driver_data;
|
unsigned long driver_data;
|
||||||
|
uint32_t devtype;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum fp_print_data_type {
|
enum fp_print_data_type {
|
||||||
|
|
Loading…
Add table
Reference in a new issue