Linux设备驱动剖析之Input(三)
(i = ; i < pdata->nbuttons; i++ gpio_keys_report_event(&ddata->
device_init_wakeup(&pdev->
sysfs_remove_group(&pdev->dev.kobj, & (--i >= free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata-> (ddata-> del_timer_sync(&ddata-> cancel_work_sync(&ddata-> gpio_free(pdata->
}
__init evdev_init( input_register_handler(& }
input_handler evdev_handler = . = .connect = .disconnect = .fops = & .minor = .name = .id_table = };
input_register_handler( input_handler * input_dev *
retval = mutex_lock_interruptible(&
INIT_LIST_HEAD(&handler->
(handler->fops != (input_table[handler->minor >> retval = - input_table[handler->minor >> ] =
list_add_tail(&handler->node, &
list_for_each_entry(dev, &
mutex_unlock(& }
input_attach_handler( input_dev *dev, input_handler * input_device_id *
id = (! -
error = handler-> (error && error != -
handler->name, kobject_name(&dev->
}
evdev_connect( input_handler *handler, input_dev * input_device_id * evdev *
(minor = ; minor < EVDEV_MINORS; minor++ (!
(minor == printk(KERN_ERR -
evdev = kzalloc(( (! -
INIT_LIST_HEAD(&evdev-> spin_lock_init(&evdev-> mutex_init(&evdev-> init_waitqueue_head(&evdev->
dev_set_name(&evdev->dev, evdev->exist = evdev->minor =
evdev->handle.dev = evdev->handle.name = dev_name(&evdev-> evdev->handle.handler = evdev->handle. =
evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->dev. = & evdev->dev.parent = &dev-> evdev->dev.release = device_initialize(&evdev->
error = input_register_handle(&evdev->
error =
error = device_add(&evdev->
input_unregister_handle(&evdev-> put_device(&evdev-> evdev_client * spinlock_t client_lock;
};
spinlock_t buffer_lock;
fasync_struct * evdev * };
};
evdev *evdev_table[EVDEV_MINORS];
input_register_handle( input_handle * input_handler *handler = handle-> input_dev *dev = handle->
error = mutex_lock_interruptible(&dev->
(handler-> list_add_rcu(&handle->d_node, &dev->
list_add_tail_rcu(&handle->d_node, &dev->
mutex_unlock(&dev->
list_add_tail_rcu(&handle->h_node, &handler->
(handler-> handler->
}
evdev_install_chrdev( evdev *
evdev_table[evdev->minor] = }
irqreturn_t gpio_keys_isr( irq, * gpio_button_data *bdata = gpio_keys_button *button = bdata->
BUG_ON(irq != gpio_to_irq(button->
(bdata-> mod_timer(&bdata-> jiffies + msecs_to_jiffies(bdata->
schedule_work(&bdata->
}
gpio_keys_timer(unsigned gpio_button_data *data = ( gpio_button_data *
schedule_work(&data-> }
gpio_keys_work_func( work_struct * gpio_button_data *bdata =
container_of(work,
}
gpio_keys_report_event( gpio_button_data * gpio_keys_button *button = bdata-> input_dev *input = bdata-> unsigned type = button->type ? state = (gpio_get_value(button->gpio) ? : ) ^ button->
input_event(input, type, button->code, !! }
input_event( input_dev * unsigned type, unsigned code, unsigned
(is_event_supported(type, dev->
spin_lock_irqsave(&dev-> spin_unlock_irqrestore(&dev-> }
inline is_event_supported(unsigned unsigned *bm, unsigned code <= max && }
input_handle_event( input_dev * unsigned type, unsigned code, disposition =
disposition =
(!dev-> dev->sync = disposition = dev->sync = disposition =
(is_event_supported(code, dev->keybit, KEY_MAX) &&
!!test_bit(code, dev->key) !=
(value != __change_bit(code, dev->
disposition =
(is_event_supported(code, dev->swbit, SW_MAX) &&
!!test_bit(code, dev->sw) !=
__change_bit(code, dev-> disposition =
(is_event_supported(code, dev-> disposition = input_handle_abs_event(dev, code, &
(is_event_supported(code, dev->relbit, REL_MAX) && disposition =
(is_event_supported(code, dev-> disposition =
(is_event_supported(code, dev->ledbit, LED_MAX) &&
!!test_bit(code, dev->led) !=
__change_bit(code, dev-> disposition =
(is_event_supported(code, dev->
(!!test_bit(code, dev->snd) != !! __change_bit(code, dev-> disposition =
(code <= REP_MAX && value >= && dev->rep[code] != dev->rep[code] = disposition =
(value >= disposition =
disposition =
(disposition != INPUT_IGNORE_EVENT && type != dev->sync =
((disposition & INPUT_PASS_TO_DEVICE) && dev->