From 4952c494ccf8b0019d5b35564ed136df8fff0ed7 Mon Sep 17 00:00:00 2001 From: Ondrej Jirman Date: Fri, 21 Jan 2022 23:24:20 +0100 Subject: [PATCH 316/446] input: kb151: Move default keymap to the drvier Most users will not need to modify it, so let's not stuff device tree by default. DT based keymap is still supported, too. Add a few error messages, to help users with debugging issues with driver probing. Signed-off-by: Ondrej Jirman --- drivers/input/keyboard/kb151.c | 135 ++++++++++++++++++++++++++++++--- 1 file changed, 123 insertions(+), 12 deletions(-) diff --git a/drivers/input/keyboard/kb151.c b/drivers/input/keyboard/kb151.c index bb6250efe..41a68f0c3 100644 --- a/drivers/input/keyboard/kb151.c +++ b/drivers/input/keyboard/kb151.c @@ -1,10 +1,12 @@ // SPDX-License-Identifier: GPL-2.0-only // // Copyright (C) 2021 Samuel Holland +// Copyright (C) 2022 Ondřej Jirman #include #include #include +#include #include #include #include @@ -12,16 +14,113 @@ #define KB151_CRC8_POLYNOMIAL 0x07 #define KB151_DEVICE_ID_HI 0x00 -#define KB151_DEVICE_ID_HI_VALUE 0x4b +#define KB151_DEVICE_ID_HI_VALUE 0x4b #define KB151_DEVICE_ID_LO 0x01 -#define KB151_DEVICE_ID_LO_VALUE 0x42 +#define KB151_DEVICE_ID_LO_VALUE 0x42 #define KB151_FW_REVISION 0x02 #define KB151_FW_FEATURES 0x03 #define KB151_MATRIX_SIZE 0x06 #define KB151_SCAN_CRC 0x07 #define KB151_SCAN_DATA 0x08 #define KB151_SYS_CONFIG 0x20 -#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0) +#define KB151_SYS_CONFIG_DISABLE_SCAN BIT(0) + +/* default regmap from the factory */ + +#define DEFAULT_MAP_ROWS 12 +#define DEFAULT_MAP_COLS 12 + +static const u32 kb151_default_keymap[] = { + MATRIX_KEY(0, 0, KEY_ESC), + MATRIX_KEY(0, 1, KEY_1), + MATRIX_KEY(0, 2, KEY_2), + MATRIX_KEY(0, 3, KEY_3), + MATRIX_KEY(0, 4, KEY_4), + MATRIX_KEY(0, 5, KEY_5), + MATRIX_KEY(0, 6, KEY_6), + MATRIX_KEY(0, 7, KEY_7), + MATRIX_KEY(0, 8, KEY_8), + MATRIX_KEY(0, 9, KEY_9), + MATRIX_KEY(0, 10, KEY_0), + MATRIX_KEY(0, 11, KEY_BACKSPACE), + MATRIX_KEY(1, 0, KEY_TAB), + MATRIX_KEY(1, 1, KEY_Q), + MATRIX_KEY(1, 2, KEY_W), + MATRIX_KEY(1, 3, KEY_E), + MATRIX_KEY(1, 4, KEY_R), + MATRIX_KEY(1, 5, KEY_T), + MATRIX_KEY(1, 6, KEY_Y), + MATRIX_KEY(1, 7, KEY_U), + MATRIX_KEY(1, 8, KEY_I), + MATRIX_KEY(1, 9, KEY_O), + MATRIX_KEY(1, 10, KEY_P), + MATRIX_KEY(1, 11, KEY_ENTER), + MATRIX_KEY(2, 0, KEY_LEFTMETA), + MATRIX_KEY(2, 1, KEY_A), + MATRIX_KEY(2, 2, KEY_S), + MATRIX_KEY(2, 3, KEY_D), + MATRIX_KEY(2, 4, KEY_F), + MATRIX_KEY(2, 5, KEY_G), + MATRIX_KEY(2, 6, KEY_H), + MATRIX_KEY(2, 7, KEY_J), + MATRIX_KEY(2, 8, KEY_K), + MATRIX_KEY(2, 9, KEY_L), + MATRIX_KEY(2, 10, KEY_SEMICOLON), + MATRIX_KEY(3, 0, KEY_LEFTSHIFT), + MATRIX_KEY(3, 1, KEY_Z), + MATRIX_KEY(3, 2, KEY_X), + MATRIX_KEY(3, 3, KEY_C), + MATRIX_KEY(3, 4, KEY_V), + MATRIX_KEY(3, 5, KEY_B), + MATRIX_KEY(3, 6, KEY_N), + MATRIX_KEY(3, 7, KEY_M), + MATRIX_KEY(3, 8, KEY_COMMA), + MATRIX_KEY(3, 9, KEY_DOT), + MATRIX_KEY(3, 10, KEY_SLASH), + MATRIX_KEY(4, 1, KEY_LEFTCTRL), + MATRIX_KEY(4, 4, KEY_SPACE), + MATRIX_KEY(4, 6, KEY_APOSTROPHE), + MATRIX_KEY(4, 8, KEY_RIGHTBRACE), + MATRIX_KEY(4, 9, KEY_LEFTBRACE), + MATRIX_KEY(5, 2, KEY_FN), + MATRIX_KEY(5, 3, KEY_LEFTALT), + MATRIX_KEY(5, 5, KEY_RIGHTALT), + + /* FN layer */ + MATRIX_KEY(6, 1, KEY_BACKSLASH), // | + MATRIX_KEY(6, 2, KEY_BACKSLASH), + MATRIX_KEY(6, 3, KEY_DOLLAR), + MATRIX_KEY(6, 4, KEY_EURO), + MATRIX_KEY(6, 5, KEY_GRAVE), // ~ + MATRIX_KEY(6, 6, KEY_GRAVE), + MATRIX_KEY(6, 7, KEY_MINUS), // _ + MATRIX_KEY(6, 8, KEY_EQUAL), + MATRIX_KEY(6, 9, KEY_MINUS), + MATRIX_KEY(6, 10, KEY_EQUAL), + MATRIX_KEY(6, 11, KEY_DELETE), + + MATRIX_KEY(8, 0, KEY_SYSRQ), + MATRIX_KEY(8, 10, KEY_INSERT), + + MATRIX_KEY(9, 0, KEY_LEFTSHIFT), + MATRIX_KEY(9, 8, KEY_HOME), + MATRIX_KEY(9, 9, KEY_UP), + MATRIX_KEY(9, 10, KEY_END), + + MATRIX_KEY(10, 1, KEY_LEFTCTRL), + MATRIX_KEY(10, 6, KEY_LEFT), + MATRIX_KEY(10, 8, KEY_RIGHT), + MATRIX_KEY(10, 9, KEY_DOWN), + + MATRIX_KEY(11, 2, KEY_FN), + MATRIX_KEY(11, 3, KEY_LEFTALT), + MATRIX_KEY(11, 5, KEY_RIGHTALT), +}; + +static const struct matrix_keymap_data kb151_default_keymap_data = { + .keymap = kb151_default_keymap, + .keymap_size = ARRAY_SIZE(kb151_default_keymap), +}; struct kb151 { struct input_dev *input; @@ -86,8 +185,9 @@ static void kb151_update(struct i2c_client *client) dev_dbg(&client->dev, "FN is now %s\n", pressed ? "pressed" : "released"); kb151->fn_state = pressed; - } else - input_report_key(kb151->input, keymap[code], pressed); + } else { + input_report_key(kb151->input, keymap[code], pressed); + } } } input_sync(kb151->input); @@ -156,26 +256,36 @@ static int kb151_probe(struct i2c_client *client) struct device *dev = &client->dev; u8 info[KB151_MATRIX_SIZE + 1]; unsigned int kb_rows, kb_cols; - unsigned int map_rows, map_cols; + unsigned int map_rows = DEFAULT_MAP_ROWS, map_cols = DEFAULT_MAP_COLS; struct kb151 *kb151; + bool has_of_keymap; int ret; + has_of_keymap = of_property_read_bool(dev->of_node, "linux,keymap"); + ret = i2c_smbus_read_i2c_block_data(client, 0, sizeof(info), info); - if (ret != sizeof(info)) + if (ret != sizeof(info)) { + dev_err(dev, "KB151 was not detected on the bus (%d)\n", ret); return ret; + } if (info[KB151_DEVICE_ID_HI] != KB151_DEVICE_ID_HI_VALUE || - info[KB151_DEVICE_ID_LO] != KB151_DEVICE_ID_LO_VALUE) + info[KB151_DEVICE_ID_LO] != KB151_DEVICE_ID_LO_VALUE) { + dev_warn(dev, "Device on address %hu doesn't look like KB151\n", + client->addr); return -ENODEV; + } dev_info(dev, "Found KB151 with firmware %d.%d (features=%#x)\n", info[KB151_FW_REVISION] >> 4, info[KB151_FW_REVISION] & 0xf, info[KB151_FW_FEATURES]); - ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols); - if (ret) - return ret; + if (has_of_keymap) { + ret = matrix_keypad_parse_properties(dev, &map_rows, &map_cols); + if (ret) + return ret; + } kb_rows = info[KB151_MATRIX_SIZE] & 0xf; kb_cols = info[KB151_MATRIX_SIZE] >> 4; @@ -212,7 +322,8 @@ static int kb151_probe(struct i2c_client *client) __set_bit(EV_REP, kb151->input->evbit); - ret = matrix_keypad_build_keymap(NULL, NULL, map_rows, map_cols, + ret = matrix_keypad_build_keymap(has_of_keymap ? NULL : &kb151_default_keymap_data, + NULL, map_rows, map_cols, NULL, kb151->input); if (ret) return dev_err_probe(dev, ret, "Failed to build keymap\n"); -- 2.31.1