em28xx: reduce the polling interval for GPI connected buttons
Subsystems (2)
PATCH v2 1/1 em28xx: reduce the polling interval for GPI connected buttons
For GPI-connected buttons without (hardware) debouncing, the polling interval needs to be reduced to detect button presses properly.
Signed-off-by Frank Schäfer <[email protected]>
--- drivers/media/usb/em28xx/em28xx-input.c | 21 ++++++++++++++------- drivers/media/usb/em28xx/em28xx.h | 1 +
2 Dateien geändert, 15 Zeilen hinzugefügt(+), 7 Zeilen entfernt(-)
drivers/media/usb/em28xx/em28xx-input.c +14 -7
@@ -30,8 +30,9 @@#include "em28xx.h" -#define EM28XX_SNAPSHOT_KEY KEY_CAMERA -#define EM28XX_BUTTONS_QUERY_INTERVAL 500 +#define EM28XX_SNAPSHOT_KEY KEY_CAMERA +#define EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL 500/* [ms] */ +#define EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL 100/* [ms] */ static unsigned int ir_debug;module_param (ir_debug, int,0644 );
@@ -545,7 +546,7 @@ static void em28xx_query_buttons(struct work_struct *work) }/* Schedule next poll */ schedule_delayed_work (&dev->buttons_query_work, -msecs_to_jiffies (EM28XX_BUTTONS_QUERY_INTERVAL )); +msecs_to_jiffies (dev->button_polling_interval)); }static int em28xx_register_snapshot_button (struct em28xx *dev)
@@ -593,6 +594,7 @@ static void em28xx_init_buttons(struct em28xx *dev)u8 i =0 , j =0 ;bool addr_new =0 ; + dev->button_polling_interval =EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL ;while (dev->board.buttons[i].role >=0 && dev->board.buttons[i].role <EM28XX_NUM_BUTTON_ROLES ) {struct em28xx_button *button = &dev->board.buttons[i];
@@ -608,18 +610,18 @@ static void em28xx_init_buttons(struct em28xx *dev)if (addr_new && dev->num_button_polling_addresses >=EM28XX_NUM_BUTTON_ADDRESSES_MAX ) {WARN_ONCE (1 ,"BUG: maximum number of button polling addresses exceeded." ); - addr_new =0 ; + goto next_button; }/* Button role specific checks and actions */ if (button->role ==EM28XX_BUTTON_SNAPSHOT ) {/* Register input device */ if (em28xx_register_snapshot_button (dev) <0 ) - addr_new =0 ; + goto next_button; }else if (button->role ==EM28XX_BUTTON_ILLUMINATION ) {/* Check sanity */ if (!em28xx_find_led (dev,EM28XX_LED_ILLUMINATION )) {em28xx_errdev ("BUG: illumination button defined, but no illumination LED.\n" ); - addr_new =0 ; + goto next_button; } }/* Add read address to list of polling addresses */
@@ -628,6 +630,11 @@ static void em28xx_init_buttons(struct em28xx *dev) dev->button_polling_addresses[index] = button->reg_r; dev->num_button_polling_addresses++; } +/* Reduce polling interval if necessary */ +if (!button->reg_clearing) + dev->button_polling_interval = +EM28XX_BUTTONS_VOLATILE_QUERY_INTERVAL ; +next_button:/* Next button */ i++; }
@@ -639,7 +646,7 @@ static void em28xx_init_buttons(struct em28xx *dev)INIT_DELAYED_WORK (&dev->buttons_query_work, em28xx_query_buttons);schedule_delayed_work (&dev->buttons_query_work, -msecs_to_jiffies (EM28XX_BUTTONS_QUERY_INTERVAL )); +msecs_to_jiffies (dev->button_polling_interval)); } }
drivers/media/usb/em28xx/em28xx.h +1 -0
@@ -680,6 +680,7 @@ struct em28xx {u8 button_polling_addresses[EM28XX_NUM_BUTTON_ADDRESSES_MAX ];u8 button_polling_last_values[EM28XX_NUM_BUTTON_ADDRESSES_MAX ];u8 num_button_polling_addresses; +u16 button_polling_interval;/* [ms] */ /* Snapshot button input device */ char snapshot_button_path[30 ];/* path of the input dev */ struct input_dev *sbutton_input_dev;
Signature · 1 line
1.7.10.4