Lines Matching refs:ckdev
137 static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf)
140 struct device *dev = ckdev->dev;
141 uint8_t *valid_keys = ckdev->valid_keys;
156 for (col1 = 0; col1 < ckdev->cols; col1++) {
158 for (col2 = col1 + 1; col2 < ckdev->cols; col2++) {
177 static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev,
180 struct input_dev *idev = ckdev->idev;
185 if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) {
191 dev_dbg(ckdev->dev, "ghosting found\n");
195 for (col = 0; col < ckdev->cols; col++) {
196 for (row = 0; row < ckdev->rows; row++) {
197 int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
201 old_state = ckdev->old_kb_state[col] & (1 << row);
203 dev_dbg(ckdev->dev,
212 ckdev->old_kb_state[col] = kb_state[col];
214 input_sync(ckdev->idev);
223 * @ckdev: The keyboard device.
227 static void cros_ec_keyb_report_bs(struct cros_ec_keyb *ckdev,
231 struct input_dev *idev = ckdev->bs_idev;
249 struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb,
259 if (queued_during_suspend && !device_may_wakeup(ckdev->dev))
262 switch (ckdev->ec->event_data.event_type) {
264 pm_wakeup_event(ckdev->dev, 0);
266 if (ckdev->ec->event_size != ckdev->cols) {
267 dev_err(ckdev->dev,
272 cros_ec_keyb_process(ckdev,
273 ckdev->ec->event_data.data.key_matrix,
274 ckdev->ec->event_size);
278 pm_wakeup_event(ckdev->dev, 0);
280 val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq);
281 dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val);
287 pm_wakeup_event(ckdev->dev, 0);
289 if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) {
291 &ckdev->ec->event_data.data.buttons);
295 &ckdev->ec->event_data.data.switches);
298 cros_ec_keyb_report_bs(ckdev, ev_type, val);
312 static void cros_ec_keyb_compute_valid_keys(struct cros_ec_keyb *ckdev)
315 int row_shift = ckdev->row_shift;
316 unsigned short *keymap = ckdev->idev->keycode;
319 BUG_ON(ckdev->idev->keycodesize != sizeof(*keymap));
321 for (col = 0; col < ckdev->cols; col++) {
322 for (row = 0; row < ckdev->rows; row++) {
325 ckdev->valid_keys[col] |= 1 << row;
327 dev_dbg(ckdev->dev, "valid_keys[%02d] = 0x%02x\n",
328 col, ckdev->valid_keys[col]);
402 * @ckdev: The keyboard device
406 static int cros_ec_keyb_query_switches(struct cros_ec_keyb *ckdev)
408 struct cros_ec_device *ec_dev = ckdev->ec;
418 cros_ec_keyb_report_bs(ckdev, EV_SW,
435 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
437 if (ckdev->bs_idev)
438 return cros_ec_keyb_query_switches(ckdev);
451 * but the ckdev->bs_idev will remain NULL when this function exits.
453 * @ckdev: The keyboard device
459 static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev,
462 struct cros_ec_device *ec_dev = ckdev->ec;
463 struct device *dev = ckdev->dev;
511 input_set_drvdata(idev, ckdev);
512 ckdev->bs_idev = idev;
522 ret = cros_ec_keyb_query_switches(ckdev);
528 ret = input_register_device(ckdev->bs_idev);
537 static void cros_ec_keyb_parse_vivaldi_physmap(struct cros_ec_keyb *ckdev)
539 u32 *physmap = ckdev->vdata.function_row_physmap;
545 n_physmap = device_property_count_u32(ckdev->dev,
551 dev_warn(ckdev->dev,
557 error = device_property_read_u32_array(ckdev->dev,
561 dev_warn(ckdev->dev,
574 scancode = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
578 ckdev->vdata.num_function_row_keys = n_physmap;
586 * @ckdev: The keyboard device
590 static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
592 struct cros_ec_device *ec_dev = ckdev->ec;
593 struct device *dev = ckdev->dev;
598 err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols);
602 ckdev->valid_keys = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
603 if (!ckdev->valid_keys)
606 ckdev->old_kb_state = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
607 if (!ckdev->old_kb_state)
631 ckdev->ghost_filter = device_property_read_bool(dev,
634 err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols,
641 ckdev->row_shift = get_count_order(ckdev->cols);
644 input_set_drvdata(idev, ckdev);
645 ckdev->idev = idev;
646 cros_ec_keyb_compute_valid_keys(ckdev);
647 cros_ec_keyb_parse_vivaldi_physmap(ckdev);
649 err = input_register_device(ckdev->idev);
662 const struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
663 const struct vivaldi_data *data = &ckdev->vdata;
680 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
683 !ckdev->vdata.num_function_row_keys)
698 struct cros_ec_keyb *ckdev;
710 ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL);
711 if (!ckdev)
714 ckdev->ec = ec;
715 ckdev->dev = dev;
716 dev_set_drvdata(dev, ckdev);
719 err = cros_ec_keyb_register_matrix(ckdev);
727 err = cros_ec_keyb_register_bs(ckdev, buttons_switches_only);
739 ckdev->notifier.notifier_call = cros_ec_keyb_work;
740 err = blocking_notifier_chain_register(&ckdev->ec->event_notifier,
741 &ckdev->notifier);
747 device_init_wakeup(ckdev->dev, true);
753 struct cros_ec_keyb *ckdev = dev_get_drvdata(&pdev->dev);
755 blocking_notifier_chain_unregister(&ckdev->ec->event_notifier,
756 &ckdev->notifier);