Dear Dmitry: It worked! Thank you. Here's the patch that I had to manually massage to apply (the one you sent doesn't apply to Linux 4.1.10). I don't currently have touchscreen working though, only touchpad. Maybe I just need to configure something in userspace to turn the touchscreen on? Regards, Zooko
diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt index 1852906..fd2344d 100644 --- a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt +++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt @@ -9,6 +9,12 @@ Required properties: - interrupts: The sink for the touchpad's IRQ output See ../interrupt-controller/interrupts.txt +Optional properties: + +- linux,config-name: name of configuration file that should be loaded + into device for optimal functioning. If not specified "maxtouch.cfg" + will be used. + Optional properties for main touchpad device: - linux,gpio-keymap: When enabled, the SPT_GPIOPWN_T19 object sends messages diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 40b98dd..f50d4b5 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -2035,7 +2035,8 @@ static int mxt_initialize(struct mxt_data *data) if (error) goto err_free_object_table; - error = request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME, + error = request_firmware_nowait(THIS_MODULE, true, + data->pdata->cfg_name ?: MXT_CFG_NAME, &client->dev, GFP_KERNEL, data, mxt_config_cb); if (error) { @@ -2375,6 +2376,7 @@ static void mxt_input_close(struct input_dev *dev) #ifdef CONFIG_OF static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) { + struct device_node *np; struct mxt_platform_data *pdata; u32 *keymap; u32 keycode; @@ -2383,6 +2385,10 @@ static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) if (!client->dev.of_node) return ERR_PTR(-ENOENT); + np = client->dev.of_node; + if (!np) + return ERR_PTR(-ENOENT); + pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return ERR_PTR(-ENOMEM); @@ -2409,6 +2415,8 @@ static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) pdata->t19_keymap = keymap; } + of_property_read_string(np, "linux,config-name", &pdata->cfg_name); + return pdata; } #else @@ -2439,11 +2447,15 @@ static struct mxt_acpi_platform_data samus_platform_data[] = { .pdata = { .t19_num_keys = ARRAY_SIZE(samus_touchpad_buttons), .t19_keymap = samus_touchpad_buttons, + .cfg_name = "samus-337t.raw", }, }, { /* Touchscreen */ .hid = "ATML0001", + .pdata = { + .cfg_name = "samus-2954t2.raw", + }, }, { } }; diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c index a04019a..bff39fe 100644 --- a/drivers/platform/chrome/chromeos_laptop.c +++ b/drivers/platform/chrome/chromeos_laptop.c @@ -111,6 +111,7 @@ static struct mxt_platform_data atmel_224s_tp_platform_data = { .irqflags = IRQF_TRIGGER_FALLING, .t19_num_keys = ARRAY_SIZE(mxt_t19_keys), .t19_keymap = mxt_t19_keys, + .cfg_name = "link-224sl.raw", }; static struct i2c_board_info atmel_224s_tp_device = { @@ -121,6 +122,7 @@ static struct i2c_board_info atmel_224s_tp_device = { static struct mxt_platform_data atmel_1664s_platform_data = { .irqflags = IRQF_TRIGGER_FALLING, + .cfg_name = "link-1664s.raw", }; static struct i2c_board_info atmel_1664s_device = { diff --git a/include/linux/i2c/atmel_mxt_ts.h b/include/linux/i2c/atmel_mxt_ts.h index 02bf6ea..aeb8c9a 100644 --- a/include/linux/i2c/atmel_mxt_ts.h +++ b/include/linux/i2c/atmel_mxt_ts.h @@ -20,6 +20,7 @@ struct mxt_platform_data { unsigned long irqflags; u8 t19_num_keys; const unsigned int *t19_keymap; + const char *cfg_name; }; #endif /* __LINUX_ATMEL_MXT_TS_H */