Lines Matching refs:ckdev

116 static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf)
119 struct device *dev = ckdev->dev;
120 uint8_t *valid_keys = ckdev->valid_keys;
135 for (col1 = 0; col1 < ckdev->cols; col1++) {
137 for (col2 = col1 + 1; col2 < ckdev->cols; col2++) {
156 static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev,
159 struct input_dev *idev = ckdev->idev;
164 if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) {
170 dev_dbg(ckdev->dev, "ghosting found\n");
174 for (col = 0; col < ckdev->cols; col++) {
175 for (row = 0; row < ckdev->rows; row++) {
176 int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
180 old_state = ckdev->old_kb_state[col] & (1 << row);
182 dev_dbg(ckdev->dev,
191 ckdev->old_kb_state[col] = kb_state[col];
193 input_sync(ckdev->idev);
202 * @ckdev: The keyboard device.
206 static void cros_ec_keyb_report_bs(struct cros_ec_keyb *ckdev,
210 struct input_dev *idev = ckdev->bs_idev;
228 struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb,
238 if (queued_during_suspend && !device_may_wakeup(ckdev->dev))
241 switch (ckdev->ec->event_data.event_type) {
243 pm_wakeup_event(ckdev->dev, 0);
245 if (ckdev->ec->event_size != ckdev->cols) {
246 dev_err(ckdev->dev,
251 cros_ec_keyb_process(ckdev,
252 ckdev->ec->event_data.data.key_matrix,
253 ckdev->ec->event_size);
257 pm_wakeup_event(ckdev->dev, 0);
259 val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq);
260 dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val);
266 pm_wakeup_event(ckdev->dev, 0);
268 if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) {
270 &ckdev->ec->event_data.data.buttons);
274 &ckdev->ec->event_data.data.switches);
277 cros_ec_keyb_report_bs(ckdev, ev_type, val);
291 static void cros_ec_keyb_compute_valid_keys(struct cros_ec_keyb *ckdev)
294 int row_shift = ckdev->row_shift;
295 unsigned short *keymap = ckdev->idev->keycode;
298 BUG_ON(ckdev->idev->keycodesize != sizeof(*keymap));
300 for (col = 0; col < ckdev->cols; col++) {
301 for (row = 0; row < ckdev->rows; row++) {
304 ckdev->valid_keys[col] |= 1 << row;
306 dev_dbg(ckdev->dev, "valid_keys[%02d] = 0x%02x\n",
307 col, ckdev->valid_keys[col]);
381 * @ckdev: The keyboard device
385 static int cros_ec_keyb_query_switches(struct cros_ec_keyb *ckdev)
387 struct cros_ec_device *ec_dev = ckdev->ec;
397 cros_ec_keyb_report_bs(ckdev, EV_SW,
414 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
416 if (ckdev->bs_idev)
417 return cros_ec_keyb_query_switches(ckdev);
430 * but the ckdev->bs_idev will remain NULL when this function exits.
432 * @ckdev: The keyboard device
436 static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev)
438 struct cros_ec_device *ec_dev = ckdev->ec;
439 struct device *dev = ckdev->dev;
487 input_set_drvdata(idev, ckdev);
488 ckdev->bs_idev = idev;
498 ret = cros_ec_keyb_query_switches(ckdev);
504 ret = input_register_device(ckdev->bs_idev);
518 * @ckdev: The keyboard device
522 static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
524 struct cros_ec_device *ec_dev = ckdev->ec;
525 struct device *dev = ckdev->dev;
530 err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols);
534 ckdev->valid_keys = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
535 if (!ckdev->valid_keys)
538 ckdev->old_kb_state = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
539 if (!ckdev->old_kb_state)
563 ckdev->ghost_filter = of_property_read_bool(dev->of_node,
566 err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols,
573 ckdev->row_shift = get_count_order(ckdev->cols);
576 input_set_drvdata(idev, ckdev);
577 ckdev->idev = idev;
578 cros_ec_keyb_compute_valid_keys(ckdev);
580 err = input_register_device(ckdev->idev);
593 struct cros_ec_keyb *ckdev;
599 ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL);
600 if (!ckdev)
603 ckdev->ec = ec;
604 ckdev->dev = dev;
605 dev_set_drvdata(dev, ckdev);
607 err = cros_ec_keyb_register_matrix(ckdev);
613 err = cros_ec_keyb_register_bs(ckdev);
619 ckdev->notifier.notifier_call = cros_ec_keyb_work;
620 err = blocking_notifier_chain_register(&ckdev->ec->event_notifier,
621 &ckdev->notifier);
627 device_init_wakeup(ckdev->dev, true);
633 struct cros_ec_keyb *ckdev = dev_get_drvdata(&pdev->dev);
635 blocking_notifier_chain_unregister(&ckdev->ec->event_notifier,
636 &ckdev->notifier);