static int serio_bind_driver(struct serio *serio, struct serio_driver *drv)
{
    int error;

    if (serio_match_port(drv->id_table, serio)) {

        serio->dev.driver = &drv->driver;
        if (serio_connect_driver(serio, drv)) {
            serio->dev.driver = NULL;
            return -ENODEV;
        }

        error = device_bind_driver(&serio->dev);
        if (error) {
            dev_warn(&serio->dev,
                     "device_bind_driver() failed for %s (%s) and %s, error: %d\n",
                     serio->phys, serio->name,
                     drv->description, error);
            serio_disconnect_driver(serio);
            serio->dev.driver = NULL;
            return error;
        }
    }
    return 0;
}
Esempio n. 2
0
static void serio_bind_driver(struct serio *serio, struct serio_driver *drv)
{
	int error;

	down_write(&serio_bus.subsys.rwsem);

	if (serio_match_port(drv->id_table, serio)) {
		serio->dev.driver = &drv->driver;
		if (serio_connect_driver(serio, drv)) {
			serio->dev.driver = NULL;
			goto out;
		}
		error = device_bind_driver(&serio->dev);
		if (error) {
			printk(KERN_WARNING
				"serio: device_bind_driver() failed "
				"for %s (%s) and %s, error: %d\n",
				serio->phys, serio->name,
				drv->description, error);
			serio_disconnect_driver(serio);
			serio->dev.driver = NULL;
			goto out;
		}
	}
 out:
	up_write(&serio_bus.subsys.rwsem);
}