cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cros_ec_keyb.c (19819B)


      1// SPDX-License-Identifier: GPL-2.0
      2// ChromeOS EC keyboard driver
      3//
      4// Copyright (C) 2012 Google, Inc.
      5//
      6// This driver uses the ChromeOS EC byte-level message-based protocol for
      7// communicating the keyboard state (which keys are pressed) from a keyboard EC
      8// to the AP over some bus (such as i2c, lpc, spi).  The EC does debouncing,
      9// but everything else (including deghosting) is done here.  The main
     10// motivation for this is to keep the EC firmware as simple as possible, since
     11// it cannot be easily upgraded and EC flash/IRAM space is relatively
     12// expensive.
     13
     14#include <linux/module.h>
     15#include <linux/bitops.h>
     16#include <linux/i2c.h>
     17#include <linux/input.h>
     18#include <linux/input/vivaldi-fmap.h>
     19#include <linux/interrupt.h>
     20#include <linux/kernel.h>
     21#include <linux/notifier.h>
     22#include <linux/platform_device.h>
     23#include <linux/slab.h>
     24#include <linux/sysrq.h>
     25#include <linux/input/matrix_keypad.h>
     26#include <linux/platform_data/cros_ec_commands.h>
     27#include <linux/platform_data/cros_ec_proto.h>
     28
     29#include <asm/unaligned.h>
     30
     31/**
     32 * struct cros_ec_keyb - Structure representing EC keyboard device
     33 *
     34 * @rows: Number of rows in the keypad
     35 * @cols: Number of columns in the keypad
     36 * @row_shift: log2 or number of rows, rounded up
     37 * @keymap_data: Matrix keymap data used to convert to keyscan values
     38 * @ghost_filter: true to enable the matrix key-ghosting filter
     39 * @valid_keys: bitmap of existing keys for each matrix column
     40 * @old_kb_state: bitmap of keys pressed last scan
     41 * @dev: Device pointer
     42 * @ec: Top level ChromeOS device to use to talk to EC
     43 * @idev: The input device for the matrix keys.
     44 * @bs_idev: The input device for non-matrix buttons and switches (or NULL).
     45 * @notifier: interrupt event notifier for transport devices
     46 * @vdata: vivaldi function row data
     47 */
     48struct cros_ec_keyb {
     49	unsigned int rows;
     50	unsigned int cols;
     51	int row_shift;
     52	const struct matrix_keymap_data *keymap_data;
     53	bool ghost_filter;
     54	uint8_t *valid_keys;
     55	uint8_t *old_kb_state;
     56
     57	struct device *dev;
     58	struct cros_ec_device *ec;
     59
     60	struct input_dev *idev;
     61	struct input_dev *bs_idev;
     62	struct notifier_block notifier;
     63
     64	struct vivaldi_data vdata;
     65};
     66
     67/**
     68 * struct cros_ec_bs_map - Mapping between Linux keycodes and EC button/switch
     69 *	bitmap #defines
     70 *
     71 * @ev_type: The type of the input event to generate (e.g., EV_KEY).
     72 * @code: A linux keycode
     73 * @bit: A #define like EC_MKBP_POWER_BUTTON or EC_MKBP_LID_OPEN
     74 * @inverted: If the #define and EV_SW have opposite meanings, this is true.
     75 *            Only applicable to switches.
     76 */
     77struct cros_ec_bs_map {
     78	unsigned int ev_type;
     79	unsigned int code;
     80	u8 bit;
     81	bool inverted;
     82};
     83
     84/* cros_ec_keyb_bs - Map EC button/switch #defines into kernel ones */
     85static const struct cros_ec_bs_map cros_ec_keyb_bs[] = {
     86	/* Buttons */
     87	{
     88		.ev_type	= EV_KEY,
     89		.code		= KEY_POWER,
     90		.bit		= EC_MKBP_POWER_BUTTON,
     91	},
     92	{
     93		.ev_type	= EV_KEY,
     94		.code		= KEY_VOLUMEUP,
     95		.bit		= EC_MKBP_VOL_UP,
     96	},
     97	{
     98		.ev_type	= EV_KEY,
     99		.code		= KEY_VOLUMEDOWN,
    100		.bit		= EC_MKBP_VOL_DOWN,
    101	},
    102
    103	/* Switches */
    104	{
    105		.ev_type	= EV_SW,
    106		.code		= SW_LID,
    107		.bit		= EC_MKBP_LID_OPEN,
    108		.inverted	= true,
    109	},
    110	{
    111		.ev_type	= EV_SW,
    112		.code		= SW_TABLET_MODE,
    113		.bit		= EC_MKBP_TABLET_MODE,
    114	},
    115};
    116
    117/*
    118 * Returns true when there is at least one combination of pressed keys that
    119 * results in ghosting.
    120 */
    121static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf)
    122{
    123	int col1, col2, buf1, buf2;
    124	struct device *dev = ckdev->dev;
    125	uint8_t *valid_keys = ckdev->valid_keys;
    126
    127	/*
    128	 * Ghosting happens if for any pressed key X there are other keys
    129	 * pressed both in the same row and column of X as, for instance,
    130	 * in the following diagram:
    131	 *
    132	 * . . Y . g .
    133	 * . . . . . .
    134	 * . . . . . .
    135	 * . . X . Z .
    136	 *
    137	 * In this case only X, Y, and Z are pressed, but g appears to be
    138	 * pressed too (see Wikipedia).
    139	 */
    140	for (col1 = 0; col1 < ckdev->cols; col1++) {
    141		buf1 = buf[col1] & valid_keys[col1];
    142		for (col2 = col1 + 1; col2 < ckdev->cols; col2++) {
    143			buf2 = buf[col2] & valid_keys[col2];
    144			if (hweight8(buf1 & buf2) > 1) {
    145				dev_dbg(dev, "ghost found at: B[%02d]:0x%02x & B[%02d]:0x%02x",
    146					col1, buf1, col2, buf2);
    147				return true;
    148			}
    149		}
    150	}
    151
    152	return false;
    153}
    154
    155
    156/*
    157 * Compares the new keyboard state to the old one and produces key
    158 * press/release events accordingly.  The keyboard state is 13 bytes (one byte
    159 * per column)
    160 */
    161static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev,
    162			 uint8_t *kb_state, int len)
    163{
    164	struct input_dev *idev = ckdev->idev;
    165	int col, row;
    166	int new_state;
    167	int old_state;
    168
    169	if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) {
    170		/*
    171		 * Simple-minded solution: ignore this state. The obvious
    172		 * improvement is to only ignore changes to keys involved in
    173		 * the ghosting, but process the other changes.
    174		 */
    175		dev_dbg(ckdev->dev, "ghosting found\n");
    176		return;
    177	}
    178
    179	for (col = 0; col < ckdev->cols; col++) {
    180		for (row = 0; row < ckdev->rows; row++) {
    181			int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
    182			const unsigned short *keycodes = idev->keycode;
    183
    184			new_state = kb_state[col] & (1 << row);
    185			old_state = ckdev->old_kb_state[col] & (1 << row);
    186			if (new_state != old_state) {
    187				dev_dbg(ckdev->dev,
    188					"changed: [r%d c%d]: byte %02x\n",
    189					row, col, new_state);
    190
    191				input_event(idev, EV_MSC, MSC_SCAN, pos);
    192				input_report_key(idev, keycodes[pos],
    193						 new_state);
    194			}
    195		}
    196		ckdev->old_kb_state[col] = kb_state[col];
    197	}
    198	input_sync(ckdev->idev);
    199}
    200
    201/**
    202 * cros_ec_keyb_report_bs - Report non-matrixed buttons or switches
    203 *
    204 * This takes a bitmap of buttons or switches from the EC and reports events,
    205 * syncing at the end.
    206 *
    207 * @ckdev: The keyboard device.
    208 * @ev_type: The input event type (e.g., EV_KEY).
    209 * @mask: A bitmap of buttons from the EC.
    210 */
    211static void cros_ec_keyb_report_bs(struct cros_ec_keyb *ckdev,
    212				   unsigned int ev_type, u32 mask)
    213
    214{
    215	struct input_dev *idev = ckdev->bs_idev;
    216	int i;
    217
    218	for (i = 0; i < ARRAY_SIZE(cros_ec_keyb_bs); i++) {
    219		const struct cros_ec_bs_map *map = &cros_ec_keyb_bs[i];
    220
    221		if (map->ev_type != ev_type)
    222			continue;
    223
    224		input_event(idev, ev_type, map->code,
    225			    !!(mask & BIT(map->bit)) ^ map->inverted);
    226	}
    227	input_sync(idev);
    228}
    229
    230static int cros_ec_keyb_work(struct notifier_block *nb,
    231			     unsigned long queued_during_suspend, void *_notify)
    232{
    233	struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb,
    234						  notifier);
    235	u32 val;
    236	unsigned int ev_type;
    237
    238	/*
    239	 * If not wake enabled, discard key state changes during
    240	 * suspend. Switches will be re-checked in
    241	 * cros_ec_keyb_resume() to be sure nothing is lost.
    242	 */
    243	if (queued_during_suspend && !device_may_wakeup(ckdev->dev))
    244		return NOTIFY_OK;
    245
    246	switch (ckdev->ec->event_data.event_type) {
    247	case EC_MKBP_EVENT_KEY_MATRIX:
    248		pm_wakeup_event(ckdev->dev, 0);
    249
    250		if (ckdev->ec->event_size != ckdev->cols) {
    251			dev_err(ckdev->dev,
    252				"Discarded incomplete key matrix event.\n");
    253			return NOTIFY_OK;
    254		}
    255
    256		cros_ec_keyb_process(ckdev,
    257				     ckdev->ec->event_data.data.key_matrix,
    258				     ckdev->ec->event_size);
    259		break;
    260
    261	case EC_MKBP_EVENT_SYSRQ:
    262		pm_wakeup_event(ckdev->dev, 0);
    263
    264		val = get_unaligned_le32(&ckdev->ec->event_data.data.sysrq);
    265		dev_dbg(ckdev->dev, "sysrq code from EC: %#x\n", val);
    266		handle_sysrq(val);
    267		break;
    268
    269	case EC_MKBP_EVENT_BUTTON:
    270	case EC_MKBP_EVENT_SWITCH:
    271		pm_wakeup_event(ckdev->dev, 0);
    272
    273		if (ckdev->ec->event_data.event_type == EC_MKBP_EVENT_BUTTON) {
    274			val = get_unaligned_le32(
    275					&ckdev->ec->event_data.data.buttons);
    276			ev_type = EV_KEY;
    277		} else {
    278			val = get_unaligned_le32(
    279					&ckdev->ec->event_data.data.switches);
    280			ev_type = EV_SW;
    281		}
    282		cros_ec_keyb_report_bs(ckdev, ev_type, val);
    283		break;
    284
    285	default:
    286		return NOTIFY_DONE;
    287	}
    288
    289	return NOTIFY_OK;
    290}
    291
    292/*
    293 * Walks keycodes flipping bit in buffer COLUMNS deep where bit is ROW.  Used by
    294 * ghosting logic to ignore NULL or virtual keys.
    295 */
    296static void cros_ec_keyb_compute_valid_keys(struct cros_ec_keyb *ckdev)
    297{
    298	int row, col;
    299	int row_shift = ckdev->row_shift;
    300	unsigned short *keymap = ckdev->idev->keycode;
    301	unsigned short code;
    302
    303	BUG_ON(ckdev->idev->keycodesize != sizeof(*keymap));
    304
    305	for (col = 0; col < ckdev->cols; col++) {
    306		for (row = 0; row < ckdev->rows; row++) {
    307			code = keymap[MATRIX_SCAN_CODE(row, col, row_shift)];
    308			if (code && (code != KEY_BATTERY))
    309				ckdev->valid_keys[col] |= 1 << row;
    310		}
    311		dev_dbg(ckdev->dev, "valid_keys[%02d] = 0x%02x\n",
    312			col, ckdev->valid_keys[col]);
    313	}
    314}
    315
    316/**
    317 * cros_ec_keyb_info - Wrap the EC command EC_CMD_MKBP_INFO
    318 *
    319 * This wraps the EC_CMD_MKBP_INFO, abstracting out all of the marshalling and
    320 * unmarshalling and different version nonsense into something simple.
    321 *
    322 * @ec_dev: The EC device
    323 * @info_type: Either EC_MKBP_INFO_SUPPORTED or EC_MKBP_INFO_CURRENT.
    324 * @event_type: Either EC_MKBP_EVENT_BUTTON or EC_MKBP_EVENT_SWITCH.  Actually
    325 *              in some cases this could be EC_MKBP_EVENT_KEY_MATRIX or
    326 *              EC_MKBP_EVENT_HOST_EVENT too but we don't use in this driver.
    327 * @result: Where we'll store the result; a union
    328 * @result_size: The size of the result.  Expected to be the size of one of
    329 *               the elements in the union.
    330 *
    331 * Returns 0 if no error or -error upon error.
    332 */
    333static int cros_ec_keyb_info(struct cros_ec_device *ec_dev,
    334			     enum ec_mkbp_info_type info_type,
    335			     enum ec_mkbp_event event_type,
    336			     union ec_response_get_next_data *result,
    337			     size_t result_size)
    338{
    339	struct ec_params_mkbp_info *params;
    340	struct cros_ec_command *msg;
    341	int ret;
    342
    343	msg = kzalloc(sizeof(*msg) + max_t(size_t, result_size,
    344					   sizeof(*params)), GFP_KERNEL);
    345	if (!msg)
    346		return -ENOMEM;
    347
    348	msg->command = EC_CMD_MKBP_INFO;
    349	msg->version = 1;
    350	msg->outsize = sizeof(*params);
    351	msg->insize = result_size;
    352	params = (struct ec_params_mkbp_info *)msg->data;
    353	params->info_type = info_type;
    354	params->event_type = event_type;
    355
    356	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
    357	if (ret == -ENOPROTOOPT) {
    358		/* With older ECs we just return 0 for everything */
    359		memset(result, 0, result_size);
    360		ret = 0;
    361	} else if (ret < 0) {
    362		dev_warn(ec_dev->dev, "Transfer error %d/%d: %d\n",
    363			 (int)info_type, (int)event_type, ret);
    364	} else if (ret != result_size) {
    365		dev_warn(ec_dev->dev, "Wrong size %d/%d: %d != %zu\n",
    366			 (int)info_type, (int)event_type,
    367			 ret, result_size);
    368		ret = -EPROTO;
    369	} else {
    370		memcpy(result, msg->data, result_size);
    371		ret = 0;
    372	}
    373
    374	kfree(msg);
    375
    376	return ret;
    377}
    378
    379/**
    380 * cros_ec_keyb_query_switches - Query the state of switches and report
    381 *
    382 * This will ask the EC about the current state of switches and report to the
    383 * kernel.  Note that we don't query for buttons because they are more
    384 * transitory and we'll get an update on the next release / press.
    385 *
    386 * @ckdev: The keyboard device
    387 *
    388 * Returns 0 if no error or -error upon error.
    389 */
    390static int cros_ec_keyb_query_switches(struct cros_ec_keyb *ckdev)
    391{
    392	struct cros_ec_device *ec_dev = ckdev->ec;
    393	union ec_response_get_next_data event_data = {};
    394	int ret;
    395
    396	ret = cros_ec_keyb_info(ec_dev, EC_MKBP_INFO_CURRENT,
    397				EC_MKBP_EVENT_SWITCH, &event_data,
    398				sizeof(event_data.switches));
    399	if (ret)
    400		return ret;
    401
    402	cros_ec_keyb_report_bs(ckdev, EV_SW,
    403			       get_unaligned_le32(&event_data.switches));
    404
    405	return 0;
    406}
    407
    408/**
    409 * cros_ec_keyb_resume - Resume the keyboard
    410 *
    411 * We use the resume notification as a chance to query the EC for switches.
    412 *
    413 * @dev: The keyboard device
    414 *
    415 * Returns 0 if no error or -error upon error.
    416 */
    417static __maybe_unused int cros_ec_keyb_resume(struct device *dev)
    418{
    419	struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
    420
    421	if (ckdev->bs_idev)
    422		return cros_ec_keyb_query_switches(ckdev);
    423
    424	return 0;
    425}
    426
    427/**
    428 * cros_ec_keyb_register_bs - Register non-matrix buttons/switches
    429 *
    430 * Handles all the bits of the keyboard driver related to non-matrix buttons
    431 * and switches, including asking the EC about which are present and telling
    432 * the kernel to expect them.
    433 *
    434 * If this device has no support for buttons and switches we'll return no error
    435 * but the ckdev->bs_idev will remain NULL when this function exits.
    436 *
    437 * @ckdev: The keyboard device
    438 * @expect_buttons_switches: Indicates that EC must report button and/or
    439 *   switch events
    440 *
    441 * Returns 0 if no error or -error upon error.
    442 */
    443static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev,
    444				    bool expect_buttons_switches)
    445{
    446	struct cros_ec_device *ec_dev = ckdev->ec;
    447	struct device *dev = ckdev->dev;
    448	struct input_dev *idev;
    449	union ec_response_get_next_data event_data = {};
    450	const char *phys;
    451	u32 buttons;
    452	u32 switches;
    453	int ret;
    454	int i;
    455
    456	ret = cros_ec_keyb_info(ec_dev, EC_MKBP_INFO_SUPPORTED,
    457				EC_MKBP_EVENT_BUTTON, &event_data,
    458				sizeof(event_data.buttons));
    459	if (ret)
    460		return ret;
    461	buttons = get_unaligned_le32(&event_data.buttons);
    462
    463	ret = cros_ec_keyb_info(ec_dev, EC_MKBP_INFO_SUPPORTED,
    464				EC_MKBP_EVENT_SWITCH, &event_data,
    465				sizeof(event_data.switches));
    466	if (ret)
    467		return ret;
    468	switches = get_unaligned_le32(&event_data.switches);
    469
    470	if (!buttons && !switches)
    471		return expect_buttons_switches ? -EINVAL : 0;
    472
    473	/*
    474	 * We call the non-matrix buttons/switches 'input1', if present.
    475	 * Allocate phys before input dev, to ensure correct tear-down
    476	 * ordering.
    477	 */
    478	phys = devm_kasprintf(dev, GFP_KERNEL, "%s/input1", ec_dev->phys_name);
    479	if (!phys)
    480		return -ENOMEM;
    481
    482	idev = devm_input_allocate_device(dev);
    483	if (!idev)
    484		return -ENOMEM;
    485
    486	idev->name = "cros_ec_buttons";
    487	idev->phys = phys;
    488	__set_bit(EV_REP, idev->evbit);
    489
    490	idev->id.bustype = BUS_VIRTUAL;
    491	idev->id.version = 1;
    492	idev->id.product = 0;
    493	idev->dev.parent = dev;
    494
    495	input_set_drvdata(idev, ckdev);
    496	ckdev->bs_idev = idev;
    497
    498	for (i = 0; i < ARRAY_SIZE(cros_ec_keyb_bs); i++) {
    499		const struct cros_ec_bs_map *map = &cros_ec_keyb_bs[i];
    500
    501		if ((map->ev_type == EV_KEY && (buttons & BIT(map->bit))) ||
    502		    (map->ev_type == EV_SW && (switches & BIT(map->bit))))
    503			input_set_capability(idev, map->ev_type, map->code);
    504	}
    505
    506	ret = cros_ec_keyb_query_switches(ckdev);
    507	if (ret) {
    508		dev_err(dev, "cannot query switches\n");
    509		return ret;
    510	}
    511
    512	ret = input_register_device(ckdev->bs_idev);
    513	if (ret) {
    514		dev_err(dev, "cannot register input device\n");
    515		return ret;
    516	}
    517
    518	return 0;
    519}
    520
    521/**
    522 * cros_ec_keyb_register_matrix - Register matrix keys
    523 *
    524 * Handles all the bits of the keyboard driver related to matrix keys.
    525 *
    526 * @ckdev: The keyboard device
    527 *
    528 * Returns 0 if no error or -error upon error.
    529 */
    530static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
    531{
    532	struct cros_ec_device *ec_dev = ckdev->ec;
    533	struct device *dev = ckdev->dev;
    534	struct input_dev *idev;
    535	const char *phys;
    536	int err;
    537	struct property *prop;
    538	const __be32 *p;
    539	u32 *physmap;
    540	u32 key_pos;
    541	unsigned int row, col, scancode, n_physmap;
    542
    543	err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols);
    544	if (err)
    545		return err;
    546
    547	ckdev->valid_keys = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
    548	if (!ckdev->valid_keys)
    549		return -ENOMEM;
    550
    551	ckdev->old_kb_state = devm_kzalloc(dev, ckdev->cols, GFP_KERNEL);
    552	if (!ckdev->old_kb_state)
    553		return -ENOMEM;
    554
    555	/*
    556	 * We call the keyboard matrix 'input0'. Allocate phys before input
    557	 * dev, to ensure correct tear-down ordering.
    558	 */
    559	phys = devm_kasprintf(dev, GFP_KERNEL, "%s/input0", ec_dev->phys_name);
    560	if (!phys)
    561		return -ENOMEM;
    562
    563	idev = devm_input_allocate_device(dev);
    564	if (!idev)
    565		return -ENOMEM;
    566
    567	idev->name = CROS_EC_DEV_NAME;
    568	idev->phys = phys;
    569	__set_bit(EV_REP, idev->evbit);
    570
    571	idev->id.bustype = BUS_VIRTUAL;
    572	idev->id.version = 1;
    573	idev->id.product = 0;
    574	idev->dev.parent = dev;
    575
    576	ckdev->ghost_filter = of_property_read_bool(dev->of_node,
    577					"google,needs-ghost-filter");
    578
    579	err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols,
    580					 NULL, idev);
    581	if (err) {
    582		dev_err(dev, "cannot build key matrix\n");
    583		return err;
    584	}
    585
    586	ckdev->row_shift = get_count_order(ckdev->cols);
    587
    588	input_set_capability(idev, EV_MSC, MSC_SCAN);
    589	input_set_drvdata(idev, ckdev);
    590	ckdev->idev = idev;
    591	cros_ec_keyb_compute_valid_keys(ckdev);
    592
    593	physmap = ckdev->vdata.function_row_physmap;
    594	n_physmap = 0;
    595	of_property_for_each_u32(dev->of_node, "function-row-physmap",
    596				 prop, p, key_pos) {
    597		if (n_physmap == VIVALDI_MAX_FUNCTION_ROW_KEYS) {
    598			dev_warn(dev, "Only support up to %d top row keys\n",
    599				 VIVALDI_MAX_FUNCTION_ROW_KEYS);
    600			break;
    601		}
    602		row = KEY_ROW(key_pos);
    603		col = KEY_COL(key_pos);
    604		scancode = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
    605		physmap[n_physmap++] = scancode;
    606	}
    607	ckdev->vdata.num_function_row_keys = n_physmap;
    608
    609	err = input_register_device(ckdev->idev);
    610	if (err) {
    611		dev_err(dev, "cannot register input device\n");
    612		return err;
    613	}
    614
    615	return 0;
    616}
    617
    618static ssize_t function_row_physmap_show(struct device *dev,
    619					 struct device_attribute *attr,
    620					 char *buf)
    621{
    622	const struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
    623	const struct vivaldi_data *data = &ckdev->vdata;
    624
    625	return vivaldi_function_row_physmap_show(data, buf);
    626}
    627
    628static DEVICE_ATTR_RO(function_row_physmap);
    629
    630static struct attribute *cros_ec_keyb_attrs[] = {
    631	&dev_attr_function_row_physmap.attr,
    632	NULL,
    633};
    634
    635static umode_t cros_ec_keyb_attr_is_visible(struct kobject *kobj,
    636					    struct attribute *attr,
    637					    int n)
    638{
    639	struct device *dev = kobj_to_dev(kobj);
    640	struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
    641
    642	if (attr == &dev_attr_function_row_physmap.attr &&
    643	    !ckdev->vdata.num_function_row_keys)
    644		return 0;
    645
    646	return attr->mode;
    647}
    648
    649static const struct attribute_group cros_ec_keyb_attr_group = {
    650	.is_visible = cros_ec_keyb_attr_is_visible,
    651	.attrs = cros_ec_keyb_attrs,
    652};
    653
    654static int cros_ec_keyb_probe(struct platform_device *pdev)
    655{
    656	struct cros_ec_device *ec = dev_get_drvdata(pdev->dev.parent);
    657	struct device *dev = &pdev->dev;
    658	struct cros_ec_keyb *ckdev;
    659	bool buttons_switches_only = device_get_match_data(dev);
    660	int err;
    661
    662	if (!dev->of_node)
    663		return -ENODEV;
    664
    665	ckdev = devm_kzalloc(dev, sizeof(*ckdev), GFP_KERNEL);
    666	if (!ckdev)
    667		return -ENOMEM;
    668
    669	ckdev->ec = ec;
    670	ckdev->dev = dev;
    671	dev_set_drvdata(dev, ckdev);
    672
    673	if (!buttons_switches_only) {
    674		err = cros_ec_keyb_register_matrix(ckdev);
    675		if (err) {
    676			dev_err(dev, "cannot register matrix inputs: %d\n",
    677				err);
    678			return err;
    679		}
    680	}
    681
    682	err = cros_ec_keyb_register_bs(ckdev, buttons_switches_only);
    683	if (err) {
    684		dev_err(dev, "cannot register non-matrix inputs: %d\n", err);
    685		return err;
    686	}
    687
    688	err = devm_device_add_group(dev, &cros_ec_keyb_attr_group);
    689	if (err) {
    690		dev_err(dev, "failed to create attributes: %d\n", err);
    691		return err;
    692	}
    693
    694	ckdev->notifier.notifier_call = cros_ec_keyb_work;
    695	err = blocking_notifier_chain_register(&ckdev->ec->event_notifier,
    696					       &ckdev->notifier);
    697	if (err) {
    698		dev_err(dev, "cannot register notifier: %d\n", err);
    699		return err;
    700	}
    701
    702	device_init_wakeup(ckdev->dev, true);
    703	return 0;
    704}
    705
    706static int cros_ec_keyb_remove(struct platform_device *pdev)
    707{
    708	struct cros_ec_keyb *ckdev = dev_get_drvdata(&pdev->dev);
    709
    710	blocking_notifier_chain_unregister(&ckdev->ec->event_notifier,
    711					   &ckdev->notifier);
    712
    713	return 0;
    714}
    715
    716#ifdef CONFIG_OF
    717static const struct of_device_id cros_ec_keyb_of_match[] = {
    718	{ .compatible = "google,cros-ec-keyb" },
    719	{ .compatible = "google,cros-ec-keyb-switches", .data = (void *)true },
    720	{}
    721};
    722MODULE_DEVICE_TABLE(of, cros_ec_keyb_of_match);
    723#endif
    724
    725static SIMPLE_DEV_PM_OPS(cros_ec_keyb_pm_ops, NULL, cros_ec_keyb_resume);
    726
    727static struct platform_driver cros_ec_keyb_driver = {
    728	.probe = cros_ec_keyb_probe,
    729	.remove = cros_ec_keyb_remove,
    730	.driver = {
    731		.name = "cros-ec-keyb",
    732		.of_match_table = of_match_ptr(cros_ec_keyb_of_match),
    733		.pm = &cros_ec_keyb_pm_ops,
    734	},
    735};
    736
    737module_platform_driver(cros_ec_keyb_driver);
    738
    739MODULE_LICENSE("GPL v2");
    740MODULE_DESCRIPTION("ChromeOS EC keyboard driver");
    741MODULE_ALIAS("platform:cros-ec-keyb");