Lines Matching refs:kp
36 static void clear_phantom_key(struct gpio_kp *kp, int out, int in) in clear_phantom_key() argument
38 struct gpio_event_matrix_info *mi = kp->keypad_info; in clear_phantom_key()
44 if (!test_bit(keycode, kp->input_devs->dev[dev]->key)) { in clear_phantom_key()
49 __clear_bit(key_index, kp->keys_pressed); in clear_phantom_key()
58 static int restore_keys_for_input(struct gpio_kp *kp, int out, int in) in restore_keys_for_input() argument
63 key_index = out * kp->keypad_info->ninputs + in; in restore_keys_for_input()
64 while (out < kp->keypad_info->noutputs) { in restore_keys_for_input()
65 if (test_bit(key_index, kp->keys_pressed)) { in restore_keys_for_input()
67 clear_phantom_key(kp, out, in); in restore_keys_for_input()
69 key_index += kp->keypad_info->ninputs; in restore_keys_for_input()
75 static void remove_phantom_keys(struct gpio_kp *kp) in remove_phantom_keys() argument
80 if (kp->some_keys_pressed < 3) in remove_phantom_keys()
83 for (out = 0; out < kp->keypad_info->noutputs; out++) { in remove_phantom_keys()
85 key_index = out * kp->keypad_info->ninputs; in remove_phantom_keys()
86 for (in = 0; in < kp->keypad_info->ninputs; in++, key_index++) { in remove_phantom_keys()
87 if (test_bit(key_index, kp->keys_pressed)) { in remove_phantom_keys()
93 if (!restore_keys_for_input(kp, out + 1, in remove_phantom_keys()
96 clear_phantom_key(kp, out, inp); in remove_phantom_keys()
99 restore_keys_for_input(kp, out, in); in remove_phantom_keys()
105 static void report_key(struct gpio_kp *kp, int key_index, int out, int in) in report_key() argument
107 struct gpio_event_matrix_info *mi = kp->keypad_info; in report_key()
108 int pressed = test_bit(key_index, kp->keys_pressed); in report_key()
113 if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) { in report_key()
126 input_report_key(kp->input_devs->dev[dev], keycode, pressed); in report_key()
136 struct gpio_kp *kp = container_of(timer, struct gpio_kp, timer); in gpio_keypad_timer_func() local
137 struct gpio_event_matrix_info *mi = kp->keypad_info; in gpio_keypad_timer_func()
141 out = kp->current_output; in gpio_keypad_timer_func()
144 kp->last_key_state_changed = kp->key_state_changed; in gpio_keypad_timer_func()
145 kp->key_state_changed = 0; in gpio_keypad_timer_func()
146 kp->some_keys_pressed = 0; in gpio_keypad_timer_func()
152 if (kp->some_keys_pressed < 3) in gpio_keypad_timer_func()
153 kp->some_keys_pressed++; in gpio_keypad_timer_func()
154 kp->key_state_changed |= !__test_and_set_bit( in gpio_keypad_timer_func()
155 key_index, kp->keys_pressed); in gpio_keypad_timer_func()
157 kp->key_state_changed |= __test_and_clear_bit( in gpio_keypad_timer_func()
158 key_index, kp->keys_pressed); in gpio_keypad_timer_func()
167 kp->current_output = out; in gpio_keypad_timer_func()
178 if (kp->key_state_changed) { in gpio_keypad_timer_func()
179 hrtimer_start(&kp->timer, mi->debounce_delay, in gpio_keypad_timer_func()
183 kp->key_state_changed = kp->last_key_state_changed; in gpio_keypad_timer_func()
185 if (kp->key_state_changed) { in gpio_keypad_timer_func()
187 remove_phantom_keys(kp); in gpio_keypad_timer_func()
191 report_key(kp, key_index, out, in); in gpio_keypad_timer_func()
193 if (!kp->use_irq || kp->some_keys_pressed) { in gpio_keypad_timer_func()
207 wake_unlock(&kp->wake_lock); in gpio_keypad_timer_func()
214 struct gpio_kp *kp = dev_id; in gpio_keypad_irq_handler() local
215 struct gpio_event_matrix_info *mi = kp->keypad_info; in gpio_keypad_irq_handler()
218 if (!kp->use_irq) /* ignore interrupt while registering the handler */ in gpio_keypad_irq_handler()
230 wake_lock(&kp->wake_lock); in gpio_keypad_irq_handler()
231 hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL); in gpio_keypad_irq_handler()
235 static int gpio_keypad_request_irqs(struct gpio_kp *kp) in gpio_keypad_request_irqs() argument
241 struct gpio_event_matrix_info *mi = kp->keypad_info; in gpio_keypad_request_irqs()
263 "gpio_kp", kp); in gpio_keypad_request_irqs()
279 free_irq(gpio_to_irq(mi->input_gpios[i]), kp); in gpio_keypad_request_irqs()
293 struct gpio_kp *kp; in gpio_event_matrix_func() local
312 *data = kp = kzalloc(sizeof(*kp) + sizeof(kp->keys_pressed[0]) * in gpio_event_matrix_func()
314 if (kp == NULL) { in gpio_event_matrix_func()
319 kp->input_devs = input_devs; in gpio_event_matrix_func()
320 kp->keypad_info = mi; in gpio_event_matrix_func()
375 kp->current_output = mi->noutputs; in gpio_event_matrix_func()
376 kp->key_state_changed = 1; in gpio_event_matrix_func()
378 hrtimer_init(&kp->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in gpio_event_matrix_func()
379 kp->timer.function = gpio_keypad_timer_func; in gpio_event_matrix_func()
380 wake_lock_init(&kp->wake_lock, WAKE_LOCK_SUSPEND, "gpio_kp"); in gpio_event_matrix_func()
381 err = gpio_keypad_request_irqs(kp); in gpio_event_matrix_func()
382 kp->use_irq = err == 0; in gpio_event_matrix_func()
387 kp->use_irq ? "interrupt" : "polling"); in gpio_event_matrix_func()
389 if (kp->use_irq) in gpio_event_matrix_func()
390 wake_lock(&kp->wake_lock); in gpio_event_matrix_func()
391 hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL); in gpio_event_matrix_func()
397 kp = *data; in gpio_event_matrix_func()
399 if (kp->use_irq) in gpio_event_matrix_func()
401 free_irq(gpio_to_irq(mi->input_gpios[i]), kp); in gpio_event_matrix_func()
403 hrtimer_cancel(&kp->timer); in gpio_event_matrix_func()
404 wake_lock_destroy(&kp->wake_lock); in gpio_event_matrix_func()
418 kfree(kp); in gpio_event_matrix_func()