Lines Matching refs:ckdev
125 static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf) in cros_ec_keyb_has_ghosting() argument
128 struct device *dev = ckdev->dev; in cros_ec_keyb_has_ghosting()
129 uint8_t *valid_keys = ckdev->valid_keys; in cros_ec_keyb_has_ghosting()
144 for (col1 = 0; col1 < ckdev->cols; col1++) { in cros_ec_keyb_has_ghosting()
146 for (col2 = col1 + 1; col2 < ckdev->cols; col2++) { in cros_ec_keyb_has_ghosting()
165 static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev, in cros_ec_keyb_process() argument
168 struct input_dev *idev = ckdev->idev; in cros_ec_keyb_process()
173 if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) { in cros_ec_keyb_process()
179 dev_dbg(ckdev->dev, "ghosting found\n"); in cros_ec_keyb_process()
183 for (col = 0; col < ckdev->cols; col++) { in cros_ec_keyb_process()
184 for (row = 0; row < ckdev->rows; row++) { in cros_ec_keyb_process()
185 int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift); in cros_ec_keyb_process()
189 old_state = ckdev->old_kb_state[col] & (1 << row); in cros_ec_keyb_process()
191 dev_dbg(ckdev->dev, in cros_ec_keyb_process()
200 ckdev->old_kb_state[col] = kb_state[col]; in cros_ec_keyb_process()
202 input_sync(ckdev->idev); in cros_ec_keyb_process()
215 static void cros_ec_keyb_report_bs(struct cros_ec_keyb *ckdev, in cros_ec_keyb_report_bs() argument
219 struct input_dev *idev = ckdev->bs_idev; in cros_ec_keyb_report_bs()
237 struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb, in cros_ec_keyb_work() local
247 if (queued_during_suspend && !device_may_wakeup(ckdev->dev)) in cros_ec_keyb_work()
250 switch (ckdev->ec->event_data.event_type) { in cros_ec_keyb_work()
252 pm_wakeup_event(ckdev->dev, 0); in cros_ec_keyb_work()
254 if (ckdev->ec->event_size != ckdev->cols) { in cros_ec_keyb_work()
255 dev_err(ckdev->dev, in cros_ec_keyb_work()
260 cros_ec_keyb_process(ckdev, in cros_ec_keyb_work()
261 ckdev->ec->event_data.data.key_matrix, in cros_ec_keyb_work()
262 ckdev->ec->event_size); in cros_ec_keyb_work()
266 pm_wakeup_event(ckdev->dev, 0); in cros_ec_keyb_work()
268 val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq); in cros_ec_keyb_work()
269 dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val); in cros_ec_keyb_work()
275 pm_wakeup_event(ckdev->dev, 0); in cros_ec_keyb_work()
277 if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) { in cros_ec_keyb_work()
279 &ckdev->ec->event_data.data.buttons); in cros_ec_keyb_work()
283 &ckdev->ec->event_data.data.switches); in cros_ec_keyb_work()
286 cros_ec_keyb_report_bs(ckdev, ev_type, val); in cros_ec_keyb_work()
300 static void cros_ec_keyb_compute_valid_keys(struct cros_ec_keyb *ckdev) in cros_ec_keyb_compute_valid_keys() argument
303 int row_shift = ckdev->row_shift; in cros_ec_keyb_compute_valid_keys()
304 unsigned short *keymap = ckdev->idev->keycode; in cros_ec_keyb_compute_valid_keys()
307 BUG_ON(ckdev->idev->keycodesize != sizeof(*keymap)); in cros_ec_keyb_compute_valid_keys()
309 for (col = 0; col < ckdev->cols; col++) { in cros_ec_keyb_compute_valid_keys()
310 for (row = 0; row < ckdev->rows; row++) { in cros_ec_keyb_compute_valid_keys()
313 ckdev->valid_keys[col] |= 1 << row; in cros_ec_keyb_compute_valid_keys()
315 dev_dbg(ckdev->dev, "valid_keys[%02d] = 0x%02x\n", in cros_ec_keyb_compute_valid_keys()
316 col, ckdev->valid_keys[col]); in cros_ec_keyb_compute_valid_keys()
394 static int cros_ec_keyb_query_switches(struct cros_ec_keyb *ckdev) in cros_ec_keyb_query_switches() argument
396 struct cros_ec_device *ec_dev = ckdev->ec; in cros_ec_keyb_query_switches()
406 cros_ec_keyb_report_bs(ckdev, EV_SW, in cros_ec_keyb_query_switches()
423 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); in cros_ec_keyb_resume() local
425 if (ckdev->bs_idev) in cros_ec_keyb_resume()
426 return cros_ec_keyb_query_switches(ckdev); in cros_ec_keyb_resume()
445 static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev) in cros_ec_keyb_register_bs() argument
447 struct cros_ec_device *ec_dev = ckdev->ec; in cros_ec_keyb_register_bs()
448 struct device *dev = ckdev->dev; in cros_ec_keyb_register_bs()
496 input_set_drvdata(idev, ckdev); in cros_ec_keyb_register_bs()
497 ckdev->bs_idev = idev; in cros_ec_keyb_register_bs()
507 ret = cros_ec_keyb_query_switches(ckdev); in cros_ec_keyb_register_bs()
513 ret = input_register_device(ckdev->bs_idev); in cros_ec_keyb_register_bs()
531 static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) in cros_ec_keyb_register_matrix() argument
533 struct cros_ec_device *ec_dev = ckdev->ec; in cros_ec_keyb_register_matrix()
534 struct device *dev = ckdev->dev; in cros_ec_keyb_register_matrix()
544 err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols); in cros_ec_keyb_register_matrix()
548 ckdev->valid_keys = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL); in cros_ec_keyb_register_matrix()
549 if (!ckdev->valid_keys) in cros_ec_keyb_register_matrix()
552 ckdev->old_kb_state = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL); in cros_ec_keyb_register_matrix()
553 if (!ckdev->old_kb_state) in cros_ec_keyb_register_matrix()
577 ckdev->ghost_filter = of_property_read_bool(dev->of_node, in cros_ec_keyb_register_matrix()
580 err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols, in cros_ec_keyb_register_matrix()
587 ckdev->row_shift = get_count_order(ckdev->cols); in cros_ec_keyb_register_matrix()
590 input_set_drvdata(idev, ckdev); in cros_ec_keyb_register_matrix()
591 ckdev->idev = idev; in cros_ec_keyb_register_matrix()
592 cros_ec_keyb_compute_valid_keys(ckdev); in cros_ec_keyb_register_matrix()
594 physmap = ckdev->function_row_physmap; in cros_ec_keyb_register_matrix()
597 if (ckdev->num_function_row_keys == MAX_NUM_TOP_ROW_KEYS) { in cros_ec_keyb_register_matrix()
604 *physmap = MATRIX_SCAN_CODE(row, col, ckdev->row_shift); in cros_ec_keyb_register_matrix()
606 ckdev->num_function_row_keys++; in cros_ec_keyb_register_matrix()
609 err = input_register_device(ckdev->idev); in cros_ec_keyb_register_matrix()
624 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); in function_row_physmap_show() local
625 u16 *physmap = ckdev->function_row_physmap; in function_row_physmap_show()
627 for (i = 0; i < ckdev->num_function_row_keys; i++) in function_row_physmap_show()
648 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); in cros_ec_keyb_attr_is_visible() local
651 !ckdev->num_function_row_keys) in cros_ec_keyb_attr_is_visible()
667 struct cros_ec_keyb *ckdev; in cros_ec_keyb_probe() local
673 ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL); in cros_ec_keyb_probe()
674 if (!ckdev) in cros_ec_keyb_probe()
677 ckdev->ec = ec; in cros_ec_keyb_probe()
678 ckdev->dev = dev; in cros_ec_keyb_probe()
679 dev_set_drvdata(dev, ckdev); in cros_ec_keyb_probe()
681 err = cros_ec_keyb_register_matrix(ckdev); in cros_ec_keyb_probe()
687 err = cros_ec_keyb_register_bs(ckdev); in cros_ec_keyb_probe()
699 ckdev->notifier.notifier_call = cros_ec_keyb_work; in cros_ec_keyb_probe()
700 err = blocking_notifier_chain_register(&ckdev->ec->event_notifier, in cros_ec_keyb_probe()
701 &ckdev->notifier); in cros_ec_keyb_probe()
707 device_init_wakeup(ckdev->dev, true); in cros_ec_keyb_probe()
713 struct cros_ec_keyb *ckdev = dev_get_drvdata(&pdev->dev); in cros_ec_keyb_remove() local
715 blocking_notifier_chain_unregister(&ckdev->ec->event_notifier, in cros_ec_keyb_remove()
716 &ckdev->notifier); in cros_ec_keyb_remove()