]>
git.zerfleddert.de Git - ms2-fixes/blob - debounce.c
852118f020e8a3449fe52c6e1252f7898c1b99c9
1 #include <linux/module.h>
2 #include <linux/device.h>
3 #include <linux/platform_device.h>
4 #include <linux/gpio_event.h>
6 #define PREFIX "debounce: "
8 static int debounce_delay
= 15;
10 static int old_delay
= 0;
11 static unsigned old_flags
= 0;
12 static struct gpio_event_matrix_info
*gpio_evmi
= NULL
;
14 module_param(debounce_delay
, int, S_IRUSR
| S_IRGRP
| S_IROTH
);
15 MODULE_PARM_DESC(debounce_delay
, "debouncing delay (ms), default: 15");
17 static int find_ms2_dev(struct device
*dev
, void *data
)
19 if (!strncmp((char*)data
, dev_name(dev
), strlen((char*)data
))) {
20 printk(KERN_INFO PREFIX
"Found it\n");
26 static int __init
debounce_init(void)
28 struct device
*event_dev
= NULL
;
29 struct gpio_event_platform_data
*gpio_epd
;
30 struct gpio_event_info
*gpio_ei
;
32 printk(KERN_INFO PREFIX
"Searching for " GPIO_EVENT_DEV_NAME
"...\n");
35 event_dev
= device_find_child(&platform_bus
, GPIO_EVENT_DEV_NAME
, find_ms2_dev
);
36 if (event_dev
== NULL
)
39 gpio_epd
= (struct gpio_event_platform_data
*)event_dev
->platform_data
;
40 printk(KERN_INFO PREFIX
"And there is a %s connected...\n", gpio_epd
->name
);
41 if (strcmp(gpio_epd
->name
, "sholes-keypad"))
44 gpio_ei
= (struct gpio_event_info
*)gpio_epd
->info
[0];
45 gpio_evmi
= container_of(gpio_ei
, struct gpio_event_matrix_info
, info
);
47 printk(KERN_INFO PREFIX
"settle_time: %u\n", gpio_evmi
->settle_time
.tv
.nsec
);
48 printk(KERN_INFO PREFIX
"poll_time: %u\n", gpio_evmi
->poll_time
.tv
.nsec
);
49 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
50 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
52 old_delay
= gpio_evmi
->debounce_delay
.tv
.nsec
;
54 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= debounce_delay
* NSEC_PER_MSEC
) {
55 printk(KERN_INFO PREFIX
"Changing debounce_delay\n");
56 gpio_evmi
->debounce_delay
.tv
.nsec
= debounce_delay
* NSEC_PER_MSEC
;
57 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
60 old_flags
= gpio_evmi
->flags
;
62 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= 0) {
63 /* GPIOKPF_DEBOUNCE should already be set by GPIOKPF_REMOVE_PHANTOM_KEYS */
64 if (!(gpio_evmi
->flags
& GPIOKPF_DEBOUNCE
)) {
65 printk(KERN_INFO PREFIX
"Activating debounce\n");
66 gpio_evmi
->flags
|= GPIOKPF_DEBOUNCE
;
69 /* Deactivating GPIOKPF_DEBOUNCE */
70 printk(KERN_INFO PREFIX
"Deactivating debounce\n");
71 gpio_evmi
->flags
&= ~GPIOKPF_DEBOUNCE
;
73 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
78 static void __exit
debounce_exit(void)
81 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= old_delay
) {
82 printk(KERN_INFO PREFIX
"Restoring debounce_delay\n");
83 gpio_evmi
->debounce_delay
.tv
.nsec
= old_delay
;
84 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
86 if (gpio_evmi
->flags
!= old_flags
) {
87 printk(KERN_INFO PREFIX
"Restoring flags\n");
88 gpio_evmi
->flags
= old_flags
;
89 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
94 module_init(debounce_init
);
95 module_exit(debounce_exit
);
97 MODULE_LICENSE("GPL");
98 MODULE_AUTHOR("Michael Gernoth <michael@gernoth.net>");