Lines Matching refs:ckdev
67 static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf) in cros_ec_keyb_has_ghosting() argument
70 struct device *dev = ckdev->dev; in cros_ec_keyb_has_ghosting()
71 uint8_t *valid_keys = ckdev->valid_keys; in cros_ec_keyb_has_ghosting()
86 for (col1 = 0; col1 < ckdev->cols; col1++) { in cros_ec_keyb_has_ghosting()
88 for (col2 = col1 + 1; col2 < ckdev->cols; col2++) { in cros_ec_keyb_has_ghosting()
107 static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev, in cros_ec_keyb_process() argument
110 struct input_dev *idev = ckdev->idev; in cros_ec_keyb_process()
118 if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) { in cros_ec_keyb_process()
124 dev_dbg(ckdev->dev, "ghosting found\n"); in cros_ec_keyb_process()
128 for (col = 0; col < ckdev->cols; col++) { in cros_ec_keyb_process()
129 for (row = 0; row < ckdev->rows; row++) { in cros_ec_keyb_process()
130 int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift); in cros_ec_keyb_process()
134 old_state = ckdev->old_kb_state[col] & (1 << row); in cros_ec_keyb_process()
136 dev_dbg(ckdev->dev, in cros_ec_keyb_process()
144 ckdev->old_kb_state[col] = kb_state[col]; in cros_ec_keyb_process()
146 input_sync(ckdev->idev); in cros_ec_keyb_process()
149 static int cros_ec_keyb_get_state(struct cros_ec_keyb *ckdev, uint8_t *kb_state) in cros_ec_keyb_get_state() argument
154 msg = kmalloc(sizeof(*msg) + ckdev->cols, GFP_KERNEL); in cros_ec_keyb_get_state()
160 msg->insize = ckdev->cols; in cros_ec_keyb_get_state()
163 ret = cros_ec_cmd_xfer(ckdev->ec, msg); in cros_ec_keyb_get_state()
165 dev_err(ckdev->dev, "Error transferring EC message %d\n", ret); in cros_ec_keyb_get_state()
169 memcpy(kb_state, msg->data, ckdev->cols); in cros_ec_keyb_get_state()
177 struct cros_ec_keyb *ckdev = data; in cros_ec_keyb_irq() local
178 struct cros_ec_device *ec = ckdev->ec; in cros_ec_keyb_irq()
180 uint8_t kb_state[ckdev->cols]; in cros_ec_keyb_irq()
185 ret = cros_ec_keyb_get_state(ckdev, kb_state); in cros_ec_keyb_irq()
187 cros_ec_keyb_process(ckdev, kb_state, ret); in cros_ec_keyb_irq()
196 struct cros_ec_keyb *ckdev = input_get_drvdata(dev); in cros_ec_keyb_open() local
197 struct cros_ec_device *ec = ckdev->ec; in cros_ec_keyb_open()
201 "cros_ec_keyb", ckdev); in cros_ec_keyb_open()
206 struct cros_ec_keyb *ckdev = input_get_drvdata(dev); in cros_ec_keyb_close() local
207 struct cros_ec_device *ec = ckdev->ec; in cros_ec_keyb_close()
209 free_irq(ec->irq, ckdev); in cros_ec_keyb_close()
216 static void cros_ec_keyb_compute_valid_keys(struct cros_ec_keyb *ckdev) in cros_ec_keyb_compute_valid_keys() argument
219 int row_shift = ckdev->row_shift; in cros_ec_keyb_compute_valid_keys()
220 unsigned short *keymap = ckdev->idev->keycode; in cros_ec_keyb_compute_valid_keys()
223 BUG_ON(ckdev->idev->keycodesize != sizeof(*keymap)); in cros_ec_keyb_compute_valid_keys()
225 for (col = 0; col < ckdev->cols; col++) { in cros_ec_keyb_compute_valid_keys()
226 for (row = 0; row < ckdev->rows; row++) { in cros_ec_keyb_compute_valid_keys()
229 ckdev->valid_keys[col] |= 1 << row; in cros_ec_keyb_compute_valid_keys()
231 dev_dbg(ckdev->dev, "valid_keys[%02d] = 0x%02x\n", in cros_ec_keyb_compute_valid_keys()
232 col, ckdev->valid_keys[col]); in cros_ec_keyb_compute_valid_keys()
240 struct cros_ec_keyb *ckdev; in cros_ec_keyb_probe() local
249 ckdev = devm_kzalloc(&pdev->dev, sizeof(*ckdev), GFP_KERNEL); in cros_ec_keyb_probe()
250 if (!ckdev) in cros_ec_keyb_probe()
252 err = matrix_keypad_parse_of_params(&pdev->dev, &ckdev->rows, in cros_ec_keyb_probe()
253 &ckdev->cols); in cros_ec_keyb_probe()
257 ckdev->valid_keys = devm_kzalloc(&pdev->dev, ckdev->cols, GFP_KERNEL); in cros_ec_keyb_probe()
258 if (!ckdev->valid_keys) in cros_ec_keyb_probe()
261 ckdev->old_kb_state = devm_kzalloc(&pdev->dev, ckdev->cols, GFP_KERNEL); in cros_ec_keyb_probe()
262 if (!ckdev->old_kb_state) in cros_ec_keyb_probe()
274 ckdev->ec = ec; in cros_ec_keyb_probe()
275 ckdev->dev = dev; in cros_ec_keyb_probe()
276 dev_set_drvdata(&pdev->dev, ckdev); in cros_ec_keyb_probe()
289 ckdev->ghost_filter = of_property_read_bool(np, in cros_ec_keyb_probe()
292 err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols, in cros_ec_keyb_probe()
299 ckdev->row_shift = get_count_order(ckdev->cols); in cros_ec_keyb_probe()
302 input_set_drvdata(idev, ckdev); in cros_ec_keyb_probe()
303 ckdev->idev = idev; in cros_ec_keyb_probe()
304 cros_ec_keyb_compute_valid_keys(ckdev); in cros_ec_keyb_probe()
306 err = input_register_device(ckdev->idev); in cros_ec_keyb_probe()
317 static void cros_ec_keyb_clear_keyboard(struct cros_ec_keyb *ckdev) in cros_ec_keyb_clear_keyboard() argument
319 uint8_t old_state[ckdev->cols]; in cros_ec_keyb_clear_keyboard()
320 uint8_t new_state[ckdev->cols]; in cros_ec_keyb_clear_keyboard()
331 ret = cros_ec_keyb_get_state(ckdev, new_state); in cros_ec_keyb_clear_keyboard()
334 ret = cros_ec_keyb_get_state(ckdev, new_state); in cros_ec_keyb_clear_keyboard()
339 dev_info(ckdev->dev, "Discarded %d keyscan(s) in %dus\n", i, in cros_ec_keyb_clear_keyboard()
345 struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); in cros_ec_keyb_resume() local
353 if (!ckdev->ec->was_wake_device) in cros_ec_keyb_resume()
354 cros_ec_keyb_clear_keyboard(ckdev); in cros_ec_keyb_resume()