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 unsigned old_flags
= 0;
9 ktime_t old_debounce_delay
;
10 ktime_t old_settle_time
;
11 ktime_t old_poll_time
;
12 static struct gpio_event_matrix_info
*gpio_evmi
= NULL
;
14 static int find_ms2_dev(struct device
*dev
, void *data
)
16 if (!strncmp((char*)data
, dev_name(dev
), strlen((char*)data
))) {
17 printk(KERN_INFO PREFIX
"Found it\n");
23 static ssize_t
show_debounce_delay(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
28 return snprintf(buf
, PAGE_SIZE
, "%ld\n", (gpio_evmi
->debounce_delay
.tv
.nsec
/ NSEC_PER_MSEC
));
31 static void set_debounce_delay(long delay
)
33 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= delay
* NSEC_PER_MSEC
) {
34 printk(KERN_INFO PREFIX
"Changing debounce_delay\n");
35 gpio_evmi
->debounce_delay
.tv
.nsec
= delay
* NSEC_PER_MSEC
;
36 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
40 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= 0) {
41 if (!(gpio_evmi
->flags
& GPIOKPF_DEBOUNCE
)) {
42 printk(KERN_INFO PREFIX
"Activating debounce\n");
43 gpio_evmi
->flags
|= GPIOKPF_DEBOUNCE
;
46 if (gpio_evmi
->flags
& GPIOKPF_DEBOUNCE
) {
47 printk(KERN_INFO PREFIX
"Deactivating debounce\n");
48 gpio_evmi
->flags
&= ~GPIOKPF_DEBOUNCE
;
54 static ssize_t
store_debounce_delay(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
61 sscanf(buf
, "%ld", &delay
);
62 set_debounce_delay(delay
);
67 static ssize_t
show_settle_time(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
72 return snprintf(buf
, PAGE_SIZE
, "%ld\n", (gpio_evmi
->settle_time
.tv
.nsec
/ NSEC_PER_USEC
));
75 static ssize_t
store_settle_time(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
82 sscanf(buf
, "%ld", &delay
);
83 gpio_evmi
->settle_time
.tv
.nsec
= delay
* NSEC_PER_USEC
;
88 static ssize_t
show_poll_time(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
93 return snprintf(buf
, PAGE_SIZE
, "%ld\n", (gpio_evmi
->poll_time
.tv
.nsec
/ NSEC_PER_MSEC
));
96 static ssize_t
store_poll_time(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
103 sscanf(buf
, "%ld", &delay
);
104 gpio_evmi
->poll_time
.tv
.nsec
= delay
* NSEC_PER_MSEC
;
109 static ssize_t
show_flags(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
114 return snprintf(buf
, PAGE_SIZE
, "0x%x\n", gpio_evmi
->flags
);
117 static ssize_t
store_flags(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
124 sscanf(buf
, "0x%x", &flags
);
126 printk(KERN_INFO PREFIX
"flags: 0x%x\n", flags
);
128 if (flags
& GPIOKPF_DRIVE_INACTIVE
)
131 gpio_evmi
->flags
= flags
;
136 static ssize_t
show_debounce_flag(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
141 return snprintf(buf
, PAGE_SIZE
, "%u\n", (gpio_evmi
->flags
& GPIOKPF_DEBOUNCE
) ? 1 : 0);
144 static ssize_t
store_debounce_flag(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
151 sscanf(buf
, "%u", &flag
);
154 gpio_evmi
->flags
|= GPIOKPF_DEBOUNCE
;
156 gpio_evmi
->flags
&= ~GPIOKPF_DEBOUNCE
;
162 static ssize_t
show_remove_some_phantom_keys_flag(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
167 return snprintf(buf
, PAGE_SIZE
, "%u\n", (gpio_evmi
->flags
& GPIOKPF_REMOVE_SOME_PHANTOM_KEYS
) ? 1 : 0);
170 static ssize_t
store_remove_some_phantom_keys_flag(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
177 sscanf(buf
, "%u", &flag
);
180 gpio_evmi
->flags
|= GPIOKPF_REMOVE_SOME_PHANTOM_KEYS
;
182 gpio_evmi
->flags
&= ~GPIOKPF_REMOVE_SOME_PHANTOM_KEYS
;
188 static ssize_t
show_print_unmapped_keys_flag(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
193 return snprintf(buf
, PAGE_SIZE
, "%u\n", (gpio_evmi
->flags
& GPIOKPF_PRINT_UNMAPPED_KEYS
) ? 1 : 0);
196 static ssize_t
store_print_unmapped_keys_flag(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
203 sscanf(buf
, "%u", &flag
);
206 gpio_evmi
->flags
|= GPIOKPF_PRINT_UNMAPPED_KEYS
;
208 gpio_evmi
->flags
&= ~GPIOKPF_PRINT_UNMAPPED_KEYS
;
214 static ssize_t
show_print_mapped_keys_flag(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
219 return snprintf(buf
, PAGE_SIZE
, "%u\n", (gpio_evmi
->flags
& GPIOKPF_PRINT_MAPPED_KEYS
) ? 1 : 0);
222 static ssize_t
store_print_mapped_keys_flag(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
229 sscanf(buf
, "%u", &flag
);
232 gpio_evmi
->flags
|= GPIOKPF_PRINT_MAPPED_KEYS
;
234 gpio_evmi
->flags
&= ~GPIOKPF_PRINT_MAPPED_KEYS
;
240 static ssize_t
show_print_phantom_keys_flag(struct device
*dev
, struct device_attribute
*attr
, char *buf
)
245 return snprintf(buf
, PAGE_SIZE
, "%u\n", (gpio_evmi
->flags
& GPIOKPF_PRINT_PHANTOM_KEYS
) ? 1 : 0);
248 static ssize_t
store_print_phantom_keys_flag(struct device
*dev
, struct device_attribute
*attr
, const char *buf
, size_t count
)
255 sscanf(buf
, "%u", &flag
);
258 gpio_evmi
->flags
|= GPIOKPF_PRINT_PHANTOM_KEYS
;
260 gpio_evmi
->flags
&= ~GPIOKPF_PRINT_PHANTOM_KEYS
;
266 static DEVICE_ATTR(debounce_delay
, (S_IRUGO
| S_IWUGO
), show_debounce_delay
, store_debounce_delay
);
267 static DEVICE_ATTR(settle_time
, (S_IRUGO
| S_IWUGO
), show_settle_time
, store_settle_time
);
268 static DEVICE_ATTR(poll_time
, (S_IRUGO
| S_IWUGO
), show_poll_time
, store_poll_time
);
269 static DEVICE_ATTR(flags
, (S_IRUGO
), show_flags
, store_flags
);
270 static DEVICE_ATTR(debounce_flag
, (S_IRUGO
| S_IWUGO
), show_debounce_flag
, store_debounce_flag
);
271 static DEVICE_ATTR(remove_some_phantom_keys_flag
, (S_IRUGO
| S_IWUGO
), show_remove_some_phantom_keys_flag
, store_remove_some_phantom_keys_flag
);
272 static DEVICE_ATTR(print_unmapped_keys_flag
, (S_IRUGO
| S_IWUGO
), show_print_unmapped_keys_flag
, store_print_unmapped_keys_flag
);
273 static DEVICE_ATTR(print_mapped_keys_flag
, (S_IRUGO
| S_IWUGO
), show_print_mapped_keys_flag
, store_print_mapped_keys_flag
);
274 static DEVICE_ATTR(print_phantom_keys_flag
, (S_IRUGO
| S_IWUGO
), show_print_phantom_keys_flag
, store_print_phantom_keys_flag
);
276 static void debounce_release(struct device
*dev
)
280 static struct device debounce_device
= {
281 .init_name
= "debounce",
282 .release
= debounce_release
,
285 static int __init
debounce_init(void)
287 struct device
*event_dev
= NULL
;
288 struct gpio_event_platform_data
*gpio_epd
;
289 struct gpio_event_info
*gpio_ei
;
292 printk(KERN_INFO PREFIX
"Searching for " GPIO_EVENT_DEV_NAME
"...\n");
294 event_dev
= device_find_child(&platform_bus
, GPIO_EVENT_DEV_NAME
, find_ms2_dev
);
295 if (event_dev
== NULL
)
298 gpio_epd
= (struct gpio_event_platform_data
*)event_dev
->platform_data
;
299 printk(KERN_INFO PREFIX
"And there is a %s connected...\n", gpio_epd
->name
);
300 if (strcmp(gpio_epd
->name
, "sholes-keypad"))
303 gpio_ei
= (struct gpio_event_info
*)gpio_epd
->info
[0];
304 gpio_evmi
= container_of(gpio_ei
, struct gpio_event_matrix_info
, info
);
306 err
= device_register(&debounce_device
);
311 err
= device_create_file(&debounce_device
, &dev_attr_debounce_delay
);
312 err
= device_create_file(&debounce_device
, &dev_attr_settle_time
);
313 err
= device_create_file(&debounce_device
, &dev_attr_poll_time
);
314 err
= device_create_file(&debounce_device
, &dev_attr_flags
);
315 err
= device_create_file(&debounce_device
, &dev_attr_debounce_flag
);
316 err
= device_create_file(&debounce_device
, &dev_attr_remove_some_phantom_keys_flag
);
317 err
= device_create_file(&debounce_device
, &dev_attr_print_unmapped_keys_flag
);
318 err
= device_create_file(&debounce_device
, &dev_attr_print_mapped_keys_flag
);
319 err
= device_create_file(&debounce_device
, &dev_attr_print_phantom_keys_flag
);
321 printk(KERN_INFO PREFIX
"settle_time: %u\n", gpio_evmi
->settle_time
.tv
.nsec
);
322 printk(KERN_INFO PREFIX
"poll_time: %u\n", gpio_evmi
->poll_time
.tv
.nsec
);
323 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
324 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
326 old_debounce_delay
= gpio_evmi
->debounce_delay
;
327 old_settle_time
= gpio_evmi
->settle_time
;
328 old_poll_time
= gpio_evmi
->poll_time
;
329 old_flags
= gpio_evmi
->flags
;
331 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
336 static void __exit
debounce_exit(void)
339 if (gpio_evmi
->debounce_delay
.tv
.nsec
!= old_debounce_delay
.tv
.nsec
) {
340 printk(KERN_INFO PREFIX
"Restoring debounce_delay\n");
341 gpio_evmi
->debounce_delay
= old_debounce_delay
;
342 printk(KERN_INFO PREFIX
"debounce_delay: %u\n", gpio_evmi
->debounce_delay
.tv
.nsec
);
344 if (gpio_evmi
->flags
!= old_flags
) {
345 printk(KERN_INFO PREFIX
"Restoring flags\n");
346 gpio_evmi
->flags
= old_flags
;
347 printk(KERN_INFO PREFIX
"flags: 0x%x\n", gpio_evmi
->flags
);
349 gpio_evmi
->settle_time
= old_settle_time
;
350 gpio_evmi
->poll_time
= old_poll_time
;
352 device_remove_file(&debounce_device
, &dev_attr_debounce_delay
);
353 device_remove_file(&debounce_device
, &dev_attr_settle_time
);
354 device_remove_file(&debounce_device
, &dev_attr_poll_time
);
355 device_remove_file(&debounce_device
, &dev_attr_flags
);
356 device_remove_file(&debounce_device
, &dev_attr_debounce_flag
);
357 device_remove_file(&debounce_device
, &dev_attr_remove_some_phantom_keys_flag
);
358 device_remove_file(&debounce_device
, &dev_attr_print_unmapped_keys_flag
);
359 device_remove_file(&debounce_device
, &dev_attr_print_mapped_keys_flag
);
360 device_remove_file(&debounce_device
, &dev_attr_print_phantom_keys_flag
);
361 device_unregister(&debounce_device
);
364 module_init(debounce_init
);
365 module_exit(debounce_exit
);
367 MODULE_LICENSE("GPL");
368 MODULE_AUTHOR("Michael Gernoth <michael@gernoth.net>");