30
30
31
31
#include "em28xx.h"
32
32
33
- #define EM28XX_SNAPSHOT_KEY KEY_CAMERA
34
- #define EM28XX_BUTTONS_QUERY_INTERVAL 500
33
+ #define EM28XX_SNAPSHOT_KEY KEY_CAMERA
34
+ #define EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL 500 /* [ms] */
35
+ #define EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL 100 /* [ms] */
35
36
36
37
static unsigned int ir_debug ;
37
38
module_param (ir_debug , int , 0644 );
@@ -546,7 +547,7 @@ static void em28xx_query_buttons(struct work_struct *work)
546
547
}
547
548
/* Schedule next poll */
548
549
schedule_delayed_work (& dev -> buttons_query_work ,
549
- msecs_to_jiffies (EM28XX_BUTTONS_QUERY_INTERVAL ));
550
+ msecs_to_jiffies (dev -> button_polling_interval ));
550
551
}
551
552
552
553
static int em28xx_register_snapshot_button (struct em28xx * dev )
@@ -594,6 +595,7 @@ static void em28xx_init_buttons(struct em28xx *dev)
594
595
u8 i = 0 , j = 0 ;
595
596
bool addr_new = 0 ;
596
597
598
+ dev -> button_polling_interval = EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL ;
597
599
while (dev -> board .buttons [i ].role >= 0 &&
598
600
dev -> board .buttons [i ].role < EM28XX_NUM_BUTTON_ROLES ) {
599
601
struct em28xx_button * button = & dev -> board .buttons [i ];
@@ -609,18 +611,18 @@ static void em28xx_init_buttons(struct em28xx *dev)
609
611
if (addr_new && dev -> num_button_polling_addresses
610
612
>= EM28XX_NUM_BUTTON_ADDRESSES_MAX ) {
611
613
WARN_ONCE (1 , "BUG: maximum number of button polling addresses exceeded." );
612
- addr_new = 0 ;
614
+ goto next_button ;
613
615
}
614
616
/* Button role specific checks and actions */
615
617
if (button -> role == EM28XX_BUTTON_SNAPSHOT ) {
616
618
/* Register input device */
617
619
if (em28xx_register_snapshot_button (dev ) < 0 )
618
- addr_new = 0 ;
620
+ goto next_button ;
619
621
} else if (button -> role == EM28XX_BUTTON_ILLUMINATION ) {
620
622
/* Check sanity */
621
623
if (!em28xx_find_led (dev , EM28XX_LED_ILLUMINATION )) {
622
624
em28xx_errdev ("BUG: illumination button defined, but no illumination LED.\n" );
623
- addr_new = 0 ;
625
+ goto next_button ;
624
626
}
625
627
}
626
628
/* Add read address to list of polling addresses */
@@ -629,6 +631,11 @@ static void em28xx_init_buttons(struct em28xx *dev)
629
631
dev -> button_polling_addresses [index ] = button -> reg_r ;
630
632
dev -> num_button_polling_addresses ++ ;
631
633
}
634
+ /* Reduce polling interval if necessary */
635
+ if (!button -> reg_clearing )
636
+ dev -> button_polling_interval =
637
+ EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL ;
638
+ next_button :
632
639
/* Next button */
633
640
i ++ ;
634
641
}
@@ -640,7 +647,7 @@ static void em28xx_init_buttons(struct em28xx *dev)
640
647
INIT_DELAYED_WORK (& dev -> buttons_query_work ,
641
648
em28xx_query_buttons );
642
649
schedule_delayed_work (& dev -> buttons_query_work ,
643
- msecs_to_jiffies (EM28XX_BUTTONS_QUERY_INTERVAL ));
650
+ msecs_to_jiffies (dev -> button_polling_interval ));
644
651
}
645
652
}
646
653
0 commit comments