xref: /OK3568_Linux_fs/u-boot/drivers/input/cros_ec_keyb.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Chromium OS Matrix Keyboard
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2012 The Chromium OS Authors.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <cros_ec.h>
11*4882a593Smuzhiyun #include <dm.h>
12*4882a593Smuzhiyun #include <errno.h>
13*4882a593Smuzhiyun #include <input.h>
14*4882a593Smuzhiyun #include <keyboard.h>
15*4882a593Smuzhiyun #include <key_matrix.h>
16*4882a593Smuzhiyun #include <stdio_dev.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun enum {
21*4882a593Smuzhiyun 	KBC_MAX_KEYS		= 8,	/* Maximum keys held down at once */
22*4882a593Smuzhiyun 	KBC_REPEAT_RATE_MS	= 30,
23*4882a593Smuzhiyun 	KBC_REPEAT_DELAY_MS	= 240,
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct cros_ec_keyb_priv {
27*4882a593Smuzhiyun 	struct input_config *input;	/* The input layer */
28*4882a593Smuzhiyun 	struct key_matrix matrix;	/* The key matrix layer */
29*4882a593Smuzhiyun 	int key_rows;			/* Number of keyboard rows */
30*4882a593Smuzhiyun 	int key_cols;			/* Number of keyboard columns */
31*4882a593Smuzhiyun 	int ghost_filter;		/* 1 to enable ghost filter, else 0 */
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /**
36*4882a593Smuzhiyun  * Check the keyboard controller and return a list of key matrix positions
37*4882a593Smuzhiyun  * for which a key is pressed
38*4882a593Smuzhiyun  *
39*4882a593Smuzhiyun  * @param dev		Keyboard device
40*4882a593Smuzhiyun  * @param keys		List of keys that we have detected
41*4882a593Smuzhiyun  * @param max_count	Maximum number of keys to return
42*4882a593Smuzhiyun  * @param samep		Set to true if this scan repeats the last, else false
43*4882a593Smuzhiyun  * @return number of pressed keys, 0 for none, -EIO on error
44*4882a593Smuzhiyun  */
check_for_keys(struct udevice * dev,struct key_matrix_key * keys,int max_count,bool * samep)45*4882a593Smuzhiyun static int check_for_keys(struct udevice *dev, struct key_matrix_key *keys,
46*4882a593Smuzhiyun 			  int max_count, bool *samep)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
49*4882a593Smuzhiyun 	struct key_matrix_key *key;
50*4882a593Smuzhiyun 	static struct mbkp_keyscan last_scan;
51*4882a593Smuzhiyun 	static bool last_scan_valid;
52*4882a593Smuzhiyun 	struct mbkp_keyscan scan;
53*4882a593Smuzhiyun 	unsigned int row, col, bit, data;
54*4882a593Smuzhiyun 	int num_keys;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	if (cros_ec_scan_keyboard(dev->parent, &scan)) {
57*4882a593Smuzhiyun 		debug("%s: keyboard scan failed\n", __func__);
58*4882a593Smuzhiyun 		return -EIO;
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun 	*samep = last_scan_valid && !memcmp(&last_scan, &scan, sizeof(scan));
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	/*
63*4882a593Smuzhiyun 	 * This is a bit odd. The EC has no way to tell us that it has run
64*4882a593Smuzhiyun 	 * out of key scans. It just returns the same scan over and over
65*4882a593Smuzhiyun 	 * again. So the only way to detect that we have run out is to detect
66*4882a593Smuzhiyun 	 * that this scan is the same as the last.
67*4882a593Smuzhiyun 	 */
68*4882a593Smuzhiyun 	last_scan_valid = true;
69*4882a593Smuzhiyun 	memcpy(&last_scan, &scan, sizeof(last_scan));
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	for (col = num_keys = bit = 0; col < priv->matrix.num_cols;
72*4882a593Smuzhiyun 			col++) {
73*4882a593Smuzhiyun 		for (row = 0; row < priv->matrix.num_rows; row++) {
74*4882a593Smuzhiyun 			unsigned int mask = 1 << (bit & 7);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 			data = scan.data[bit / 8];
77*4882a593Smuzhiyun 			if ((data & mask) && num_keys < max_count) {
78*4882a593Smuzhiyun 				key = keys + num_keys++;
79*4882a593Smuzhiyun 				key->row = row;
80*4882a593Smuzhiyun 				key->col = col;
81*4882a593Smuzhiyun 				key->valid = 1;
82*4882a593Smuzhiyun 			}
83*4882a593Smuzhiyun 			bit++;
84*4882a593Smuzhiyun 		}
85*4882a593Smuzhiyun 	}
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	return num_keys;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun  * Check the keyboard, and send any keys that are pressed.
92*4882a593Smuzhiyun  *
93*4882a593Smuzhiyun  * This is called by input_tstc() and input_getc() when they need more
94*4882a593Smuzhiyun  * characters
95*4882a593Smuzhiyun  *
96*4882a593Smuzhiyun  * @param input		Input configuration
97*4882a593Smuzhiyun  * @return 1, to indicate that we have something to look at
98*4882a593Smuzhiyun  */
cros_ec_kbc_check(struct input_config * input)99*4882a593Smuzhiyun int cros_ec_kbc_check(struct input_config *input)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	struct udevice *dev = input->dev;
102*4882a593Smuzhiyun 	struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
103*4882a593Smuzhiyun 	static struct key_matrix_key last_keys[KBC_MAX_KEYS];
104*4882a593Smuzhiyun 	static int last_num_keys;
105*4882a593Smuzhiyun 	struct key_matrix_key keys[KBC_MAX_KEYS];
106*4882a593Smuzhiyun 	int keycodes[KBC_MAX_KEYS];
107*4882a593Smuzhiyun 	int num_keys, num_keycodes;
108*4882a593Smuzhiyun 	int irq_pending, sent;
109*4882a593Smuzhiyun 	bool same = false;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	/*
112*4882a593Smuzhiyun 	 * Loop until the EC has no more keyscan records, or we have
113*4882a593Smuzhiyun 	 * received at least one character. This means we know that tstc()
114*4882a593Smuzhiyun 	 * will always return non-zero if keys have been pressed.
115*4882a593Smuzhiyun 	 *
116*4882a593Smuzhiyun 	 * Without this loop, a key release (which generates no new ascii
117*4882a593Smuzhiyun 	 * characters) will cause us to exit this function, and just tstc()
118*4882a593Smuzhiyun 	 * may return 0 before all keys have been read from the EC.
119*4882a593Smuzhiyun 	 */
120*4882a593Smuzhiyun 	do {
121*4882a593Smuzhiyun 		irq_pending = cros_ec_interrupt_pending(dev->parent);
122*4882a593Smuzhiyun 		if (irq_pending) {
123*4882a593Smuzhiyun 			num_keys = check_for_keys(dev, keys, KBC_MAX_KEYS,
124*4882a593Smuzhiyun 						  &same);
125*4882a593Smuzhiyun 			if (num_keys < 0)
126*4882a593Smuzhiyun 				return 0;
127*4882a593Smuzhiyun 			last_num_keys = num_keys;
128*4882a593Smuzhiyun 			memcpy(last_keys, keys, sizeof(keys));
129*4882a593Smuzhiyun 		} else {
130*4882a593Smuzhiyun 			/*
131*4882a593Smuzhiyun 			 * EC doesn't want to be asked, so use keys from last
132*4882a593Smuzhiyun 			 * time.
133*4882a593Smuzhiyun 			 */
134*4882a593Smuzhiyun 			num_keys = last_num_keys;
135*4882a593Smuzhiyun 			memcpy(keys, last_keys, sizeof(keys));
136*4882a593Smuzhiyun 		}
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 		if (num_keys < 0)
139*4882a593Smuzhiyun 			return -1;
140*4882a593Smuzhiyun 		num_keycodes = key_matrix_decode(&priv->matrix, keys,
141*4882a593Smuzhiyun 				num_keys, keycodes, KBC_MAX_KEYS);
142*4882a593Smuzhiyun 		sent = input_send_keycodes(input, keycodes, num_keycodes);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 		/*
145*4882a593Smuzhiyun 		 * For those ECs without an interrupt, stop scanning when we
146*4882a593Smuzhiyun 		 * see that the scan is the same as last time.
147*4882a593Smuzhiyun 		 */
148*4882a593Smuzhiyun 		if ((irq_pending < 0) && same)
149*4882a593Smuzhiyun 			break;
150*4882a593Smuzhiyun 	} while (irq_pending && !sent);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	return 1;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /**
156*4882a593Smuzhiyun  * Decode MBKP keyboard details from the device tree
157*4882a593Smuzhiyun  *
158*4882a593Smuzhiyun  * @param blob		Device tree blob
159*4882a593Smuzhiyun  * @param node		Node to decode from
160*4882a593Smuzhiyun  * @param config	Configuration data read from fdt
161*4882a593Smuzhiyun  * @return 0 if ok, -1 on error
162*4882a593Smuzhiyun  */
cros_ec_keyb_decode_fdt(struct udevice * dev,struct cros_ec_keyb_priv * config)163*4882a593Smuzhiyun static int cros_ec_keyb_decode_fdt(struct udevice *dev,
164*4882a593Smuzhiyun 				   struct cros_ec_keyb_priv *config)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun 	/*
167*4882a593Smuzhiyun 	 * Get keyboard rows and columns - at present we are limited to
168*4882a593Smuzhiyun 	 * 8 columns by the protocol (one byte per row scan)
169*4882a593Smuzhiyun 	 */
170*4882a593Smuzhiyun 	config->key_rows = dev_read_u32_default(dev, "keypad,num-rows", 0);
171*4882a593Smuzhiyun 	config->key_cols = dev_read_u32_default(dev, "keypad,num-columns", 0);
172*4882a593Smuzhiyun 	if (!config->key_rows || !config->key_cols ||
173*4882a593Smuzhiyun 			config->key_rows * config->key_cols / 8
174*4882a593Smuzhiyun 				> CROS_EC_KEYSCAN_COLS) {
175*4882a593Smuzhiyun 		debug("%s: Invalid key matrix size %d x %d\n", __func__,
176*4882a593Smuzhiyun 		      config->key_rows, config->key_cols);
177*4882a593Smuzhiyun 		return -1;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 	config->ghost_filter = dev_read_bool(dev, "google,needs-ghost-filter");
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
cros_ec_kbd_probe(struct udevice * dev)184*4882a593Smuzhiyun static int cros_ec_kbd_probe(struct udevice *dev)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	struct cros_ec_keyb_priv *priv = dev_get_priv(dev);
187*4882a593Smuzhiyun 	struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev);
188*4882a593Smuzhiyun 	struct stdio_dev *sdev = &uc_priv->sdev;
189*4882a593Smuzhiyun 	struct input_config *input = &uc_priv->input;
190*4882a593Smuzhiyun 	int ret;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	ret = cros_ec_keyb_decode_fdt(dev, priv);
193*4882a593Smuzhiyun 	if (ret) {
194*4882a593Smuzhiyun 		debug("%s: Cannot decode node (ret=%d)\n", __func__, ret);
195*4882a593Smuzhiyun 		return -EINVAL;
196*4882a593Smuzhiyun 	}
197*4882a593Smuzhiyun 	input_set_delays(input, KBC_REPEAT_DELAY_MS, KBC_REPEAT_RATE_MS);
198*4882a593Smuzhiyun 	ret = key_matrix_init(&priv->matrix, priv->key_rows, priv->key_cols,
199*4882a593Smuzhiyun 			      priv->ghost_filter);
200*4882a593Smuzhiyun 	if (ret) {
201*4882a593Smuzhiyun 		debug("%s: cannot init key matrix\n", __func__);
202*4882a593Smuzhiyun 		return ret;
203*4882a593Smuzhiyun 	}
204*4882a593Smuzhiyun 	ret = key_matrix_decode_fdt(dev, &priv->matrix);
205*4882a593Smuzhiyun 	if (ret) {
206*4882a593Smuzhiyun 		debug("%s: Could not decode key matrix from fdt\n", __func__);
207*4882a593Smuzhiyun 		return ret;
208*4882a593Smuzhiyun 	}
209*4882a593Smuzhiyun 	debug("%s: Matrix keyboard %dx%d ready\n", __func__, priv->key_rows,
210*4882a593Smuzhiyun 	      priv->key_cols);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	priv->input = input;
213*4882a593Smuzhiyun 	input->dev = dev;
214*4882a593Smuzhiyun 	input_add_tables(input, false);
215*4882a593Smuzhiyun 	input->read_keys = cros_ec_kbc_check;
216*4882a593Smuzhiyun 	strcpy(sdev->name, "cros-ec-keyb");
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* Register the device. cros_ec_init_keyboard() will be called soon */
219*4882a593Smuzhiyun 	return input_stdio_register(sdev);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun static const struct keyboard_ops cros_ec_kbd_ops = {
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun static const struct udevice_id cros_ec_kbd_ids[] = {
226*4882a593Smuzhiyun 	{ .compatible = "google,cros-ec-keyb" },
227*4882a593Smuzhiyun 	{ }
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun U_BOOT_DRIVER(cros_ec_kbd) = {
231*4882a593Smuzhiyun 	.name	= "cros_ec_kbd",
232*4882a593Smuzhiyun 	.id	= UCLASS_KEYBOARD,
233*4882a593Smuzhiyun 	.of_match = cros_ec_kbd_ids,
234*4882a593Smuzhiyun 	.probe = cros_ec_kbd_probe,
235*4882a593Smuzhiyun 	.ops	= &cros_ec_kbd_ops,
236*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct cros_ec_keyb_priv),
237*4882a593Smuzhiyun };
238