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->         dev-> 
      (disposition & }

 

相关内容