Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: add driver for Elan I2C/SMbus touchpad

This driver supports Elan I2C/SMbus touchpads found in some laptops and
also in many Chromebooks.

Signed-off-by: Duson Lin <dusonlin@emc.com.tw>
Reviewed-by: Benson Leung <bleung@chromium.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Duson Lin and committed by
Dmitry Torokhov
6696777c dae7aa8d

+2418
+34
Documentation/devicetree/bindings/input/elan_i2c.txt
··· 1 + Elantech I2C Touchpad 2 + 3 + Required properties: 4 + - compatible: must be "elan,ekth3000". 5 + - reg: I2C address of the chip. 6 + - interrupt-parent: a phandle for the interrupt controller (see interrupt 7 + binding[0]). 8 + - interrupts: interrupt to which the chip is connected (see interrupt 9 + binding[0]). 10 + 11 + Optional properties: 12 + - wakeup-source: touchpad can be used as a wakeup source. 13 + - pinctrl-names: should be "default" (see pinctrl binding [1]). 14 + - pinctrl-0: a phandle pointing to the pin settings for the device (see 15 + pinctrl binding [1]). 16 + - vcc-supply: a phandle for the regulator supplying 3.3V power. 17 + 18 + [0]: Documentation/devicetree/bindings/interrupt-controller/interrupts.txt 19 + [1]: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt 20 + 21 + Example: 22 + &i2c1 { 23 + /* ... */ 24 + 25 + touchpad@15 { 26 + compatible = "elan,ekth3000"; 27 + reg = <0x15>; 28 + interrupt-parent = <&gpio4>; 29 + interrupts = <0x0 IRQ_TYPE_EDGE_FALLING>; 30 + wakeup-source; 31 + }; 32 + 33 + /* ... */ 34 + };
+1
Documentation/devicetree/bindings/vendor-prefixes.txt
··· 42 42 dmo Data Modul AG 43 43 ebv EBV Elektronik 44 44 edt Emerging Display Technologies 45 + elan Elan Microelectronic Corp. 45 46 emmicro EM Microelectronic 46 47 epcos EPCOS AG 47 48 epfl Ecole Polytechnique Fédérale de Lausanne
+30
drivers/input/mouse/Kconfig
··· 215 215 To compile this driver as a module, choose M here: the module will be 216 216 called cyapa. 217 217 218 + config MOUSE_ELAN_I2C 219 + tristate "ELAN I2C Touchpad support" 220 + depends on I2C 221 + help 222 + This driver adds support for Elan I2C/SMbus Trackpads. 223 + 224 + Say Y here if you have a ELAN I2C/SMbus Touchpad. 225 + 226 + To compile this driver as a module, choose M here: the module will be 227 + called elan_i2c. 228 + 229 + config MOUSE_ELAN_I2C_I2C 230 + bool "Enable I2C support" 231 + depends on MOUSE_ELAN_I2C 232 + default y 233 + help 234 + Say Y here if Elan Touchpad in your system is connected to 235 + a standard I2C controller. 236 + 237 + If unsure, say Y. 238 + 239 + config MOUSE_ELAN_I2C_SMBUS 240 + bool "Enable SMbus support" 241 + depends on MOUSE_ELAN_I2C 242 + help 243 + Say Y here if Elan Touchpad in your system is connected to 244 + a SMbus adapter. 245 + 246 + If unsure, say Y. 247 + 218 248 config MOUSE_INPORT 219 249 tristate "InPort/MS/ATIXL busmouse" 220 250 depends on ISA
+5
drivers/input/mouse/Makefile
··· 9 9 obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o 10 10 obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o 11 11 obj-$(CONFIG_MOUSE_CYAPA) += cyapa.o 12 + obj-$(CONFIG_MOUSE_ELAN_I2C) += elan_i2c.o 12 13 obj-$(CONFIG_MOUSE_GPIO) += gpio_mouse.o 13 14 obj-$(CONFIG_MOUSE_INPORT) += inport.o 14 15 obj-$(CONFIG_MOUSE_LOGIBM) += logibm.o ··· 35 34 psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT) += trackpoint.o 36 35 psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT) += touchkit_ps2.o 37 36 psmouse-$(CONFIG_MOUSE_PS2_CYPRESS) += cypress_ps2.o 37 + 38 + elan_i2c-objs := elan_i2c_core.o 39 + elan_i2c-$(CONFIG_MOUSE_ELAN_I2C_I2C) += elan_i2c_i2c.o 40 + elan_i2c-$(CONFIG_MOUSE_ELAN_I2C_SMBUS) += elan_i2c_smbus.o
+86
drivers/input/mouse/elan_i2c.h
··· 1 + /* 2 + * Elan I2C/SMBus Touchpad driver 3 + * 4 + * Copyright (c) 2013 ELAN Microelectronics Corp. 5 + * 6 + * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 7 + * Version: 1.5.5 8 + * 9 + * Based on cyapa driver: 10 + * copyright (c) 2011-2012 Cypress Semiconductor, Inc. 11 + * copyright (c) 2011-2012 Google, Inc. 12 + * 13 + * This program is free software; you can redistribute it and/or modify it 14 + * under the terms of the GNU General Public License version 2 as published 15 + * by the Free Software Foundation. 16 + * 17 + * Trademarks are the property of their respective owners. 18 + */ 19 + 20 + #ifndef _ELAN_I2C_H 21 + #define _ELAN_i2C_H 22 + 23 + #include <linux/types.h> 24 + 25 + #define ETP_ENABLE_ABS 0x0001 26 + #define ETP_ENABLE_CALIBRATE 0x0002 27 + #define ETP_DISABLE_CALIBRATE 0x0000 28 + #define ETP_DISABLE_POWER 0x0001 29 + 30 + /* IAP Firmware handling */ 31 + #define ETP_FW_NAME "elan_i2c.bin" 32 + #define ETP_IAP_START_ADDR 0x0083 33 + #define ETP_FW_IAP_PAGE_ERR (1 << 5) 34 + #define ETP_FW_IAP_INTF_ERR (1 << 4) 35 + #define ETP_FW_PAGE_SIZE 64 36 + #define ETP_FW_PAGE_COUNT 768 37 + #define ETP_FW_SIZE (ETP_FW_PAGE_SIZE * ETP_FW_PAGE_COUNT) 38 + 39 + struct i2c_client; 40 + struct completion; 41 + 42 + enum tp_mode { 43 + IAP_MODE = 1, 44 + MAIN_MODE 45 + }; 46 + 47 + struct elan_transport_ops { 48 + int (*initialize)(struct i2c_client *client); 49 + int (*sleep_control)(struct i2c_client *, bool sleep); 50 + int (*power_control)(struct i2c_client *, bool enable); 51 + int (*set_mode)(struct i2c_client *client, u8 mode); 52 + 53 + int (*calibrate)(struct i2c_client *client); 54 + int (*calibrate_result)(struct i2c_client *client, u8 *val); 55 + 56 + int (*get_baseline_data)(struct i2c_client *client, 57 + bool max_baseliune, u8 *value); 58 + 59 + int (*get_version)(struct i2c_client *client, bool iap, u8 *version); 60 + int (*get_sm_version)(struct i2c_client *client, u8 *version); 61 + int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); 62 + int (*get_product_id)(struct i2c_client *client, u8 *id); 63 + 64 + int (*get_max)(struct i2c_client *client, 65 + unsigned int *max_x, unsigned int *max_y); 66 + int (*get_resolution)(struct i2c_client *client, 67 + u8 *hw_res_x, u8 *hw_res_y); 68 + int (*get_num_traces)(struct i2c_client *client, 69 + unsigned int *x_tracenum, 70 + unsigned int *y_tracenum); 71 + 72 + int (*iap_get_mode)(struct i2c_client *client, enum tp_mode *mode); 73 + int (*iap_reset)(struct i2c_client *client); 74 + 75 + int (*prepare_fw_update)(struct i2c_client *client); 76 + int (*write_fw_block)(struct i2c_client *client, 77 + const u8 *page, u16 checksum, int idx); 78 + int (*finish_fw_update)(struct i2c_client *client, 79 + struct completion *reset_done); 80 + 81 + int (*get_report)(struct i2c_client *client, u8 *report); 82 + }; 83 + 84 + extern const struct elan_transport_ops elan_smbus_ops, elan_i2c_ops; 85 + 86 + #endif /* _ELAN_I2C_H */
+1137
drivers/input/mouse/elan_i2c_core.c
··· 1 + /* 2 + * Elan I2C/SMBus Touchpad driver 3 + * 4 + * Copyright (c) 2013 ELAN Microelectronics Corp. 5 + * 6 + * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 7 + * Version: 1.5.5 8 + * 9 + * Based on cyapa driver: 10 + * copyright (c) 2011-2012 Cypress Semiconductor, Inc. 11 + * copyright (c) 2011-2012 Google, Inc. 12 + * 13 + * This program is free software; you can redistribute it and/or modify it 14 + * under the terms of the GNU General Public License version 2 as published 15 + * by the Free Software Foundation. 16 + * 17 + * Trademarks are the property of their respective owners. 18 + */ 19 + 20 + #include <linux/acpi.h> 21 + #include <linux/delay.h> 22 + #include <linux/device.h> 23 + #include <linux/firmware.h> 24 + #include <linux/i2c.h> 25 + #include <linux/init.h> 26 + #include <linux/input/mt.h> 27 + #include <linux/interrupt.h> 28 + #include <linux/module.h> 29 + #include <linux/slab.h> 30 + #include <linux/kernel.h> 31 + #include <linux/sched.h> 32 + #include <linux/input.h> 33 + #include <linux/uaccess.h> 34 + #include <linux/jiffies.h> 35 + #include <linux/completion.h> 36 + #include <linux/of.h> 37 + #include <linux/regulator/consumer.h> 38 + #include <asm/unaligned.h> 39 + 40 + #include "elan_i2c.h" 41 + 42 + #define DRIVER_NAME "elan_i2c" 43 + #define ELAN_DRIVER_VERSION "1.5.5" 44 + #define ETP_PRESSURE_OFFSET 25 45 + #define ETP_MAX_PRESSURE 255 46 + #define ETP_FWIDTH_REDUCE 90 47 + #define ETP_FINGER_WIDTH 15 48 + #define ETP_RETRY_COUNT 3 49 + 50 + #define ETP_MAX_FINGERS 5 51 + #define ETP_FINGER_DATA_LEN 5 52 + #define ETP_REPORT_ID 0x5D 53 + #define ETP_REPORT_ID_OFFSET 2 54 + #define ETP_TOUCH_INFO_OFFSET 3 55 + #define ETP_FINGER_DATA_OFFSET 4 56 + #define ETP_MAX_REPORT_LEN 34 57 + 58 + /* The main device structure */ 59 + struct elan_tp_data { 60 + struct i2c_client *client; 61 + struct input_dev *input; 62 + struct regulator *vcc; 63 + 64 + const struct elan_transport_ops *ops; 65 + 66 + /* for fw update */ 67 + struct completion fw_completion; 68 + bool in_fw_update; 69 + 70 + struct mutex sysfs_mutex; 71 + 72 + unsigned int max_x; 73 + unsigned int max_y; 74 + unsigned int width_x; 75 + unsigned int width_y; 76 + unsigned int x_res; 77 + unsigned int y_res; 78 + 79 + u8 product_id; 80 + u8 fw_version; 81 + u8 sm_version; 82 + u8 iap_version; 83 + u16 fw_checksum; 84 + 85 + u8 mode; 86 + 87 + bool irq_wake; 88 + 89 + u8 min_baseline; 90 + u8 max_baseline; 91 + bool baseline_ready; 92 + }; 93 + 94 + static int elan_enable_power(struct elan_tp_data *data) 95 + { 96 + int repeat = ETP_RETRY_COUNT; 97 + int error; 98 + 99 + error = regulator_enable(data->vcc); 100 + if (error) { 101 + dev_err(&data->client->dev, 102 + "Failed to enable regulator: %d\n", error); 103 + return error; 104 + } 105 + 106 + do { 107 + error = data->ops->power_control(data->client, true); 108 + if (error >= 0) 109 + return 0; 110 + 111 + msleep(30); 112 + } while (--repeat > 0); 113 + 114 + return error; 115 + } 116 + 117 + static int elan_disable_power(struct elan_tp_data *data) 118 + { 119 + int repeat = ETP_RETRY_COUNT; 120 + int error; 121 + 122 + do { 123 + error = data->ops->power_control(data->client, false); 124 + if (!error) { 125 + error = regulator_disable(data->vcc); 126 + if (error) { 127 + dev_err(&data->client->dev, 128 + "Failed to disable regulator: %d\n", 129 + error); 130 + /* Attempt to power the chip back up */ 131 + data->ops->power_control(data->client, true); 132 + break; 133 + } 134 + 135 + return 0; 136 + } 137 + 138 + msleep(30); 139 + } while (--repeat > 0); 140 + 141 + return error; 142 + } 143 + 144 + static int elan_sleep(struct elan_tp_data *data) 145 + { 146 + int repeat = ETP_RETRY_COUNT; 147 + int error; 148 + 149 + do { 150 + error = data->ops->sleep_control(data->client, true); 151 + if (!error) 152 + return 0; 153 + 154 + msleep(30); 155 + } while (--repeat > 0); 156 + 157 + return error; 158 + } 159 + 160 + static int __elan_initialize(struct elan_tp_data *data) 161 + { 162 + struct i2c_client *client = data->client; 163 + int error; 164 + 165 + error = data->ops->initialize(client); 166 + if (error) { 167 + dev_err(&client->dev, "device initialize failed: %d\n", error); 168 + return error; 169 + } 170 + 171 + data->mode |= ETP_ENABLE_ABS; 172 + error = data->ops->set_mode(client, data->mode); 173 + if (error) { 174 + dev_err(&client->dev, 175 + "failed to switch to absolute mode: %d\n", error); 176 + return error; 177 + } 178 + 179 + error = data->ops->sleep_control(client, false); 180 + if (error) { 181 + dev_err(&client->dev, 182 + "failed to wake device up: %d\n", error); 183 + return error; 184 + } 185 + 186 + return 0; 187 + } 188 + 189 + static int elan_initialize(struct elan_tp_data *data) 190 + { 191 + int repeat = ETP_RETRY_COUNT; 192 + int error; 193 + 194 + do { 195 + error = __elan_initialize(data); 196 + if (!error) 197 + return 0; 198 + 199 + repeat--; 200 + msleep(30); 201 + } while (--repeat > 0); 202 + 203 + return error; 204 + } 205 + 206 + static int elan_query_device_info(struct elan_tp_data *data) 207 + { 208 + int error; 209 + 210 + error = data->ops->get_product_id(data->client, &data->product_id); 211 + if (error) 212 + return error; 213 + 214 + error = data->ops->get_version(data->client, false, &data->fw_version); 215 + if (error) 216 + return error; 217 + 218 + error = data->ops->get_checksum(data->client, false, 219 + &data->fw_checksum); 220 + if (error) 221 + return error; 222 + 223 + error = data->ops->get_sm_version(data->client, &data->sm_version); 224 + if (error) 225 + return error; 226 + 227 + error = data->ops->get_version(data->client, true, &data->iap_version); 228 + if (error) 229 + return error; 230 + 231 + return 0; 232 + } 233 + 234 + static unsigned int elan_convert_resolution(u8 val) 235 + { 236 + /* 237 + * (value from firmware) * 10 + 790 = dpi 238 + * 239 + * We also have to convert dpi to dots/mm (*10/254 to avoid floating 240 + * point). 241 + */ 242 + 243 + return ((int)(char)val * 10 + 790) * 10 / 254; 244 + } 245 + 246 + static int elan_query_device_parameters(struct elan_tp_data *data) 247 + { 248 + unsigned int x_traces, y_traces; 249 + u8 hw_x_res, hw_y_res; 250 + int error; 251 + 252 + error = data->ops->get_max(data->client, &data->max_x, &data->max_y); 253 + if (error) 254 + return error; 255 + 256 + error = data->ops->get_num_traces(data->client, &x_traces, &y_traces); 257 + if (error) 258 + return error; 259 + 260 + data->width_x = data->max_x / x_traces; 261 + data->width_y = data->max_y / y_traces; 262 + 263 + error = data->ops->get_resolution(data->client, &hw_x_res, &hw_y_res); 264 + if (error) 265 + return error; 266 + 267 + data->x_res = elan_convert_resolution(hw_x_res); 268 + data->y_res = elan_convert_resolution(hw_y_res); 269 + 270 + return 0; 271 + } 272 + 273 + /* 274 + ********************************************************** 275 + * IAP firmware updater related routines 276 + ********************************************************** 277 + */ 278 + static int elan_write_fw_block(struct elan_tp_data *data, 279 + const u8 *page, u16 checksum, int idx) 280 + { 281 + int retry = ETP_RETRY_COUNT; 282 + int error; 283 + 284 + do { 285 + error = data->ops->write_fw_block(data->client, 286 + page, checksum, idx); 287 + if (!error) 288 + return 0; 289 + 290 + dev_dbg(&data->client->dev, 291 + "IAP retrying page %d (error: %d)\n", idx, error); 292 + } while (--retry > 0); 293 + 294 + return error; 295 + } 296 + 297 + static int __elan_update_firmware(struct elan_tp_data *data, 298 + const struct firmware *fw) 299 + { 300 + struct i2c_client *client = data->client; 301 + struct device *dev = &client->dev; 302 + int i, j; 303 + int error; 304 + u16 iap_start_addr; 305 + u16 boot_page_count; 306 + u16 sw_checksum = 0, fw_checksum = 0; 307 + 308 + error = data->ops->prepare_fw_update(client); 309 + if (error) 310 + return error; 311 + 312 + iap_start_addr = get_unaligned_le16(&fw->data[ETP_IAP_START_ADDR * 2]); 313 + 314 + boot_page_count = (iap_start_addr * 2) / ETP_FW_PAGE_SIZE; 315 + for (i = boot_page_count; i < ETP_FW_PAGE_COUNT; i++) { 316 + u16 checksum = 0; 317 + const u8 *page = &fw->data[i * ETP_FW_PAGE_SIZE]; 318 + 319 + for (j = 0; j < ETP_FW_PAGE_SIZE; j += 2) 320 + checksum += ((page[j + 1] << 8) | page[j]); 321 + 322 + error = elan_write_fw_block(data, page, checksum, i); 323 + if (error) { 324 + dev_err(dev, "write page %d fail: %d\n", i, error); 325 + return error; 326 + } 327 + 328 + sw_checksum += checksum; 329 + } 330 + 331 + /* Wait WDT reset and power on reset */ 332 + msleep(600); 333 + 334 + error = data->ops->finish_fw_update(client, &data->fw_completion); 335 + if (error) 336 + return error; 337 + 338 + error = data->ops->get_checksum(client, true, &fw_checksum); 339 + if (error) 340 + return error; 341 + 342 + if (sw_checksum != fw_checksum) { 343 + dev_err(dev, "checksum diff sw=[%04X], fw=[%04X]\n", 344 + sw_checksum, fw_checksum); 345 + return -EIO; 346 + } 347 + 348 + return 0; 349 + } 350 + 351 + static int elan_update_firmware(struct elan_tp_data *data, 352 + const struct firmware *fw) 353 + { 354 + struct i2c_client *client = data->client; 355 + int retval; 356 + 357 + dev_dbg(&client->dev, "Starting firmware update....\n"); 358 + 359 + disable_irq(client->irq); 360 + data->in_fw_update = true; 361 + 362 + retval = __elan_update_firmware(data, fw); 363 + if (retval) { 364 + dev_err(&client->dev, "firmware update failed: %d\n", retval); 365 + data->ops->iap_reset(client); 366 + } else { 367 + /* Reinitialize TP after fw is updated */ 368 + elan_initialize(data); 369 + elan_query_device_info(data); 370 + } 371 + 372 + data->in_fw_update = false; 373 + enable_irq(client->irq); 374 + 375 + return retval; 376 + } 377 + 378 + /* 379 + ******************************************************************* 380 + * SYSFS attributes 381 + ******************************************************************* 382 + */ 383 + static ssize_t elan_sysfs_read_fw_checksum(struct device *dev, 384 + struct device_attribute *attr, 385 + char *buf) 386 + { 387 + struct i2c_client *client = to_i2c_client(dev); 388 + struct elan_tp_data *data = i2c_get_clientdata(client); 389 + 390 + return sprintf(buf, "0x%04x\n", data->fw_checksum); 391 + } 392 + 393 + static ssize_t elan_sysfs_read_product_id(struct device *dev, 394 + struct device_attribute *attr, 395 + char *buf) 396 + { 397 + struct i2c_client *client = to_i2c_client(dev); 398 + struct elan_tp_data *data = i2c_get_clientdata(client); 399 + 400 + return sprintf(buf, "%d.0\n", data->product_id); 401 + } 402 + 403 + static ssize_t elan_sysfs_read_fw_ver(struct device *dev, 404 + struct device_attribute *attr, 405 + char *buf) 406 + { 407 + struct i2c_client *client = to_i2c_client(dev); 408 + struct elan_tp_data *data = i2c_get_clientdata(client); 409 + 410 + return sprintf(buf, "%d.0\n", data->fw_version); 411 + } 412 + 413 + static ssize_t elan_sysfs_read_sm_ver(struct device *dev, 414 + struct device_attribute *attr, 415 + char *buf) 416 + { 417 + struct i2c_client *client = to_i2c_client(dev); 418 + struct elan_tp_data *data = i2c_get_clientdata(client); 419 + 420 + return sprintf(buf, "%d.0\n", data->sm_version); 421 + } 422 + 423 + static ssize_t elan_sysfs_read_iap_ver(struct device *dev, 424 + struct device_attribute *attr, 425 + char *buf) 426 + { 427 + struct i2c_client *client = to_i2c_client(dev); 428 + struct elan_tp_data *data = i2c_get_clientdata(client); 429 + 430 + return sprintf(buf, "%d.0\n", data->iap_version); 431 + } 432 + 433 + static ssize_t elan_sysfs_update_fw(struct device *dev, 434 + struct device_attribute *attr, 435 + const char *buf, size_t count) 436 + { 437 + struct i2c_client *client = to_i2c_client(dev); 438 + struct elan_tp_data *data = i2c_get_clientdata(client); 439 + const struct firmware *fw; 440 + int error; 441 + 442 + error = request_firmware(&fw, ETP_FW_NAME, dev); 443 + if (error) { 444 + dev_err(dev, "cannot load firmware %s: %d\n", 445 + ETP_FW_NAME, error); 446 + return error; 447 + } 448 + 449 + /* Firmware must be exactly PAGE_NUM * PAGE_SIZE bytes */ 450 + if (fw->size != ETP_FW_SIZE) { 451 + dev_err(dev, "invalid firmware size = %zu, expected %d.\n", 452 + fw->size, ETP_FW_SIZE); 453 + error = -EBADF; 454 + goto out_release_fw; 455 + } 456 + 457 + error = mutex_lock_interruptible(&data->sysfs_mutex); 458 + if (error) 459 + goto out_release_fw; 460 + 461 + error = elan_update_firmware(data, fw); 462 + 463 + mutex_unlock(&data->sysfs_mutex); 464 + 465 + out_release_fw: 466 + release_firmware(fw); 467 + return error ?: count; 468 + } 469 + 470 + static ssize_t calibrate_store(struct device *dev, 471 + struct device_attribute *attr, 472 + const char *buf, size_t count) 473 + { 474 + struct i2c_client *client = to_i2c_client(dev); 475 + struct elan_tp_data *data = i2c_get_clientdata(client); 476 + int tries = 20; 477 + int retval; 478 + int error; 479 + u8 val[3]; 480 + 481 + retval = mutex_lock_interruptible(&data->sysfs_mutex); 482 + if (retval) 483 + return retval; 484 + 485 + disable_irq(client->irq); 486 + 487 + data->mode |= ETP_ENABLE_CALIBRATE; 488 + retval = data->ops->set_mode(client, data->mode); 489 + if (retval) { 490 + dev_err(dev, "failed to enable calibration mode: %d\n", 491 + retval); 492 + goto out; 493 + } 494 + 495 + retval = data->ops->calibrate(client); 496 + if (retval) { 497 + dev_err(dev, "failed to start calibration: %d\n", 498 + retval); 499 + goto out_disable_calibrate; 500 + } 501 + 502 + val[0] = 0xff; 503 + do { 504 + /* Wait 250ms before checking if calibration has completed. */ 505 + msleep(250); 506 + 507 + retval = data->ops->calibrate_result(client, val); 508 + if (retval) 509 + dev_err(dev, "failed to check calibration result: %d\n", 510 + retval); 511 + else if (val[0] == 0) 512 + break; /* calibration done */ 513 + 514 + } while (--tries); 515 + 516 + if (tries == 0) { 517 + dev_err(dev, "failed to calibrate. Timeout.\n"); 518 + retval = -ETIMEDOUT; 519 + } 520 + 521 + out_disable_calibrate: 522 + data->mode &= ~ETP_ENABLE_CALIBRATE; 523 + error = data->ops->set_mode(data->client, data->mode); 524 + if (error) { 525 + dev_err(dev, "failed to disable calibration mode: %d\n", 526 + error); 527 + if (!retval) 528 + retval = error; 529 + } 530 + out: 531 + enable_irq(client->irq); 532 + mutex_unlock(&data->sysfs_mutex); 533 + return retval ?: count; 534 + } 535 + 536 + static ssize_t elan_sysfs_read_mode(struct device *dev, 537 + struct device_attribute *attr, 538 + char *buf) 539 + { 540 + struct i2c_client *client = to_i2c_client(dev); 541 + struct elan_tp_data *data = i2c_get_clientdata(client); 542 + int error; 543 + enum tp_mode mode; 544 + 545 + error = mutex_lock_interruptible(&data->sysfs_mutex); 546 + if (error) 547 + return error; 548 + 549 + error = data->ops->iap_get_mode(data->client, &mode); 550 + 551 + mutex_unlock(&data->sysfs_mutex); 552 + 553 + if (error) 554 + return error; 555 + 556 + return sprintf(buf, "%d\n", (int)mode); 557 + } 558 + 559 + static DEVICE_ATTR(product_id, S_IRUGO, elan_sysfs_read_product_id, NULL); 560 + static DEVICE_ATTR(firmware_version, S_IRUGO, elan_sysfs_read_fw_ver, NULL); 561 + static DEVICE_ATTR(sample_version, S_IRUGO, elan_sysfs_read_sm_ver, NULL); 562 + static DEVICE_ATTR(iap_version, S_IRUGO, elan_sysfs_read_iap_ver, NULL); 563 + static DEVICE_ATTR(fw_checksum, S_IRUGO, elan_sysfs_read_fw_checksum, NULL); 564 + static DEVICE_ATTR(mode, S_IRUGO, elan_sysfs_read_mode, NULL); 565 + static DEVICE_ATTR(update_fw, S_IWUSR, NULL, elan_sysfs_update_fw); 566 + 567 + static DEVICE_ATTR_WO(calibrate); 568 + 569 + static struct attribute *elan_sysfs_entries[] = { 570 + &dev_attr_product_id.attr, 571 + &dev_attr_firmware_version.attr, 572 + &dev_attr_sample_version.attr, 573 + &dev_attr_iap_version.attr, 574 + &dev_attr_fw_checksum.attr, 575 + &dev_attr_calibrate.attr, 576 + &dev_attr_mode.attr, 577 + &dev_attr_update_fw.attr, 578 + NULL, 579 + }; 580 + 581 + static const struct attribute_group elan_sysfs_group = { 582 + .attrs = elan_sysfs_entries, 583 + }; 584 + 585 + static ssize_t acquire_store(struct device *dev, struct device_attribute *attr, 586 + const char *buf, size_t count) 587 + { 588 + struct i2c_client *client = to_i2c_client(dev); 589 + struct elan_tp_data *data = i2c_get_clientdata(client); 590 + int error; 591 + int retval; 592 + 593 + retval = mutex_lock_interruptible(&data->sysfs_mutex); 594 + if (retval) 595 + return retval; 596 + 597 + disable_irq(client->irq); 598 + 599 + data->baseline_ready = false; 600 + 601 + data->mode |= ETP_ENABLE_CALIBRATE; 602 + retval = data->ops->set_mode(data->client, data->mode); 603 + if (retval) { 604 + dev_err(dev, "Failed to enable calibration mode to get baseline: %d\n", 605 + retval); 606 + goto out; 607 + } 608 + 609 + msleep(250); 610 + 611 + retval = data->ops->get_baseline_data(data->client, true, 612 + &data->max_baseline); 613 + if (retval) { 614 + dev_err(dev, "Failed to read max baseline form device: %d\n", 615 + retval); 616 + goto out_disable_calibrate; 617 + } 618 + 619 + retval = data->ops->get_baseline_data(data->client, false, 620 + &data->min_baseline); 621 + if (retval) { 622 + dev_err(dev, "Failed to read min baseline form device: %d\n", 623 + retval); 624 + goto out_disable_calibrate; 625 + } 626 + 627 + data->baseline_ready = true; 628 + 629 + out_disable_calibrate: 630 + data->mode &= ~ETP_ENABLE_CALIBRATE; 631 + error = data->ops->set_mode(data->client, data->mode); 632 + if (error) { 633 + dev_err(dev, "Failed to disable calibration mode after acquiring baseline: %d\n", 634 + error); 635 + if (!retval) 636 + retval = error; 637 + } 638 + out: 639 + enable_irq(client->irq); 640 + mutex_unlock(&data->sysfs_mutex); 641 + return retval ?: count; 642 + } 643 + 644 + static ssize_t min_show(struct device *dev, 645 + struct device_attribute *attr, char *buf) 646 + { 647 + struct i2c_client *client = to_i2c_client(dev); 648 + struct elan_tp_data *data = i2c_get_clientdata(client); 649 + int retval; 650 + 651 + retval = mutex_lock_interruptible(&data->sysfs_mutex); 652 + if (retval) 653 + return retval; 654 + 655 + if (!data->baseline_ready) { 656 + retval = -ENODATA; 657 + goto out; 658 + } 659 + 660 + retval = snprintf(buf, PAGE_SIZE, "%d", data->min_baseline); 661 + 662 + out: 663 + mutex_unlock(&data->sysfs_mutex); 664 + return retval; 665 + } 666 + 667 + static ssize_t max_show(struct device *dev, 668 + struct device_attribute *attr, char *buf) 669 + { 670 + struct i2c_client *client = to_i2c_client(dev); 671 + struct elan_tp_data *data = i2c_get_clientdata(client); 672 + int retval; 673 + 674 + retval = mutex_lock_interruptible(&data->sysfs_mutex); 675 + if (retval) 676 + return retval; 677 + 678 + if (!data->baseline_ready) { 679 + retval = -ENODATA; 680 + goto out; 681 + } 682 + 683 + retval = snprintf(buf, PAGE_SIZE, "%d", data->max_baseline); 684 + 685 + out: 686 + mutex_unlock(&data->sysfs_mutex); 687 + return retval; 688 + } 689 + 690 + 691 + static DEVICE_ATTR_WO(acquire); 692 + static DEVICE_ATTR_RO(min); 693 + static DEVICE_ATTR_RO(max); 694 + 695 + static struct attribute *elan_baseline_sysfs_entries[] = { 696 + &dev_attr_acquire.attr, 697 + &dev_attr_min.attr, 698 + &dev_attr_max.attr, 699 + NULL, 700 + }; 701 + 702 + static const struct attribute_group elan_baseline_sysfs_group = { 703 + .name = "baseline", 704 + .attrs = elan_baseline_sysfs_entries, 705 + }; 706 + 707 + static const struct attribute_group *elan_sysfs_groups[] = { 708 + &elan_sysfs_group, 709 + &elan_baseline_sysfs_group, 710 + NULL 711 + }; 712 + 713 + /* 714 + ****************************************************************** 715 + * Elan isr functions 716 + ****************************************************************** 717 + */ 718 + static void elan_report_contact(struct elan_tp_data *data, 719 + int contact_num, bool contact_valid, 720 + u8 *finger_data) 721 + { 722 + struct input_dev *input = data->input; 723 + unsigned int pos_x, pos_y; 724 + unsigned int pressure, mk_x, mk_y; 725 + unsigned int area_x, area_y, major, minor, new_pressure; 726 + 727 + 728 + if (contact_valid) { 729 + pos_x = ((finger_data[0] & 0xf0) << 4) | 730 + finger_data[1]; 731 + pos_y = ((finger_data[0] & 0x0f) << 8) | 732 + finger_data[2]; 733 + mk_x = (finger_data[3] & 0x0f); 734 + mk_y = (finger_data[3] >> 4); 735 + pressure = finger_data[4]; 736 + 737 + if (pos_x > data->max_x || pos_y > data->max_y) { 738 + dev_dbg(input->dev.parent, 739 + "[%d] x=%d y=%d over max (%d, %d)", 740 + contact_num, pos_x, pos_y, 741 + data->max_x, data->max_y); 742 + return; 743 + } 744 + 745 + /* 746 + * To avoid treating large finger as palm, let's reduce the 747 + * width x and y per trace. 748 + */ 749 + area_x = mk_x * (data->width_x - ETP_FWIDTH_REDUCE); 750 + area_y = mk_y * (data->width_y - ETP_FWIDTH_REDUCE); 751 + 752 + major = max(area_x, area_y); 753 + minor = min(area_x, area_y); 754 + 755 + new_pressure = pressure + ETP_PRESSURE_OFFSET; 756 + if (new_pressure > ETP_MAX_PRESSURE) 757 + new_pressure = ETP_MAX_PRESSURE; 758 + 759 + input_mt_slot(input, contact_num); 760 + input_mt_report_slot_state(input, MT_TOOL_FINGER, true); 761 + input_report_abs(input, ABS_MT_POSITION_X, pos_x); 762 + input_report_abs(input, ABS_MT_POSITION_Y, data->max_y - pos_y); 763 + input_report_abs(input, ABS_MT_PRESSURE, new_pressure); 764 + input_report_abs(input, ABS_TOOL_WIDTH, mk_x); 765 + input_report_abs(input, ABS_MT_TOUCH_MAJOR, major); 766 + input_report_abs(input, ABS_MT_TOUCH_MINOR, minor); 767 + } else { 768 + input_mt_slot(input, contact_num); 769 + input_mt_report_slot_state(input, MT_TOOL_FINGER, false); 770 + } 771 + } 772 + 773 + static void elan_report_absolute(struct elan_tp_data *data, u8 *packet) 774 + { 775 + struct input_dev *input = data->input; 776 + u8 *finger_data = &packet[ETP_FINGER_DATA_OFFSET]; 777 + int i; 778 + u8 tp_info = packet[ETP_TOUCH_INFO_OFFSET]; 779 + bool contact_valid; 780 + 781 + for (i = 0; i < ETP_MAX_FINGERS; i++) { 782 + contact_valid = tp_info & (1U << (3 + i)); 783 + elan_report_contact(data, i, contact_valid, finger_data); 784 + 785 + if (contact_valid) 786 + finger_data += ETP_FINGER_DATA_LEN; 787 + } 788 + 789 + input_report_key(input, BTN_LEFT, tp_info & 0x01); 790 + input_mt_report_pointer_emulation(input, true); 791 + input_sync(input); 792 + } 793 + 794 + static irqreturn_t elan_isr(int irq, void *dev_id) 795 + { 796 + struct elan_tp_data *data = dev_id; 797 + struct device *dev = &data->client->dev; 798 + int error; 799 + u8 report[ETP_MAX_REPORT_LEN]; 800 + 801 + /* 802 + * When device is connected to i2c bus, when all IAP page writes 803 + * complete, the driver will receive interrupt and must read 804 + * 0000 to confirm that IAP is finished. 805 + */ 806 + if (data->in_fw_update) { 807 + complete(&data->fw_completion); 808 + goto out; 809 + } 810 + 811 + error = data->ops->get_report(data->client, report); 812 + if (error) 813 + goto out; 814 + 815 + if (report[ETP_REPORT_ID_OFFSET] != ETP_REPORT_ID) 816 + dev_err(dev, "invalid report id data (%x)\n", 817 + report[ETP_REPORT_ID_OFFSET]); 818 + else 819 + elan_report_absolute(data, report); 820 + 821 + out: 822 + return IRQ_HANDLED; 823 + } 824 + 825 + /* 826 + ****************************************************************** 827 + * Elan initialization functions 828 + ****************************************************************** 829 + */ 830 + static int elan_setup_input_device(struct elan_tp_data *data) 831 + { 832 + struct device *dev = &data->client->dev; 833 + struct input_dev *input; 834 + unsigned int max_width = max(data->width_x, data->width_y); 835 + unsigned int min_width = min(data->width_x, data->width_y); 836 + int error; 837 + 838 + input = devm_input_allocate_device(dev); 839 + if (!input) 840 + return -ENOMEM; 841 + 842 + input->name = "Elan Touchpad"; 843 + input->id.bustype = BUS_I2C; 844 + input_set_drvdata(input, data); 845 + 846 + error = input_mt_init_slots(input, ETP_MAX_FINGERS, 847 + INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED); 848 + if (error) { 849 + dev_err(dev, "failed to initialize MT slots: %d\n", error); 850 + return error; 851 + } 852 + 853 + __set_bit(EV_ABS, input->evbit); 854 + __set_bit(INPUT_PROP_POINTER, input->propbit); 855 + __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 856 + __set_bit(BTN_LEFT, input->keybit); 857 + 858 + /* Set up ST parameters */ 859 + input_set_abs_params(input, ABS_X, 0, data->max_x, 0, 0); 860 + input_set_abs_params(input, ABS_Y, 0, data->max_y, 0, 0); 861 + input_abs_set_res(input, ABS_X, data->x_res); 862 + input_abs_set_res(input, ABS_Y, data->y_res); 863 + input_set_abs_params(input, ABS_PRESSURE, 0, ETP_MAX_PRESSURE, 0, 0); 864 + input_set_abs_params(input, ABS_TOOL_WIDTH, 0, ETP_FINGER_WIDTH, 0, 0); 865 + 866 + /* And MT parameters */ 867 + input_set_abs_params(input, ABS_MT_POSITION_X, 0, data->max_x, 0, 0); 868 + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, data->max_y, 0, 0); 869 + input_abs_set_res(input, ABS_MT_POSITION_X, data->x_res); 870 + input_abs_set_res(input, ABS_MT_POSITION_Y, data->y_res); 871 + input_set_abs_params(input, ABS_MT_PRESSURE, 0, 872 + ETP_MAX_PRESSURE, 0, 0); 873 + input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 874 + ETP_FINGER_WIDTH * max_width, 0, 0); 875 + input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 876 + ETP_FINGER_WIDTH * min_width, 0, 0); 877 + 878 + data->input = input; 879 + 880 + return 0; 881 + } 882 + 883 + static void elan_disable_regulator(void *_data) 884 + { 885 + struct elan_tp_data *data = _data; 886 + 887 + regulator_disable(data->vcc); 888 + } 889 + 890 + static void elan_remove_sysfs_groups(void *_data) 891 + { 892 + struct elan_tp_data *data = _data; 893 + 894 + sysfs_remove_groups(&data->client->dev.kobj, elan_sysfs_groups); 895 + } 896 + 897 + static int elan_probe(struct i2c_client *client, 898 + const struct i2c_device_id *dev_id) 899 + { 900 + const struct elan_transport_ops *transport_ops; 901 + struct device *dev = &client->dev; 902 + struct elan_tp_data *data; 903 + unsigned long irqflags; 904 + int error; 905 + 906 + if (IS_ENABLED(CONFIG_MOUSE_ELAN_I2C_I2C) && 907 + i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 908 + transport_ops = &elan_i2c_ops; 909 + } else if (IS_ENABLED(CONFIG_MOUSE_ELAN_I2C_SMBUS) && 910 + i2c_check_functionality(client->adapter, 911 + I2C_FUNC_SMBUS_BYTE_DATA | 912 + I2C_FUNC_SMBUS_BLOCK_DATA | 913 + I2C_FUNC_SMBUS_I2C_BLOCK)) { 914 + transport_ops = &elan_smbus_ops; 915 + } else { 916 + dev_err(dev, "not a supported I2C/SMBus adapter\n"); 917 + return -EIO; 918 + } 919 + 920 + data = devm_kzalloc(&client->dev, sizeof(struct elan_tp_data), 921 + GFP_KERNEL); 922 + if (!data) 923 + return -ENOMEM; 924 + 925 + i2c_set_clientdata(client, data); 926 + 927 + data->ops = transport_ops; 928 + data->client = client; 929 + init_completion(&data->fw_completion); 930 + mutex_init(&data->sysfs_mutex); 931 + 932 + data->vcc = devm_regulator_get(&client->dev, "vcc"); 933 + if (IS_ERR(data->vcc)) { 934 + error = PTR_ERR(data->vcc); 935 + if (error != -EPROBE_DEFER) 936 + dev_err(&client->dev, 937 + "Failed to get 'vcc' regulator: %d\n", 938 + error); 939 + return error; 940 + } 941 + 942 + error = regulator_enable(data->vcc); 943 + if (error) { 944 + dev_err(&client->dev, 945 + "Failed to enable regulator: %d\n", error); 946 + return error; 947 + } 948 + 949 + error = devm_add_action(&client->dev, 950 + elan_disable_regulator, data); 951 + if (error) { 952 + regulator_disable(data->vcc); 953 + dev_err(&client->dev, 954 + "Failed to add disable regulator action: %d\n", 955 + error); 956 + return error; 957 + } 958 + 959 + /* Initialize the touchpad. */ 960 + error = elan_initialize(data); 961 + if (error) 962 + return error; 963 + 964 + error = elan_query_device_info(data); 965 + if (error) 966 + return error; 967 + 968 + error = elan_query_device_parameters(data); 969 + if (error) 970 + return error; 971 + 972 + dev_dbg(&client->dev, 973 + "Elan Touchpad Information:\n" 974 + " Module product ID: 0x%04x\n" 975 + " Firmware Version: 0x%04x\n" 976 + " Sample Version: 0x%04x\n" 977 + " IAP Version: 0x%04x\n" 978 + " Max ABS X,Y: %d,%d\n" 979 + " Width X,Y: %d,%d\n" 980 + " Resolution X,Y: %d,%d (dots/mm)\n", 981 + data->product_id, 982 + data->fw_version, 983 + data->sm_version, 984 + data->iap_version, 985 + data->max_x, data->max_y, 986 + data->width_x, data->width_y, 987 + data->x_res, data->y_res); 988 + 989 + /* Set up input device properties based on queried parameters. */ 990 + error = elan_setup_input_device(data); 991 + if (error) 992 + return error; 993 + 994 + /* 995 + * Systems using device tree should set up interrupt via DTS, 996 + * the rest will use the default falling edge interrupts. 997 + */ 998 + irqflags = client->dev.of_node ? 0 : IRQF_TRIGGER_FALLING; 999 + 1000 + error = devm_request_threaded_irq(&client->dev, client->irq, 1001 + NULL, elan_isr, 1002 + irqflags | IRQF_ONESHOT, 1003 + client->name, data); 1004 + if (error) { 1005 + dev_err(&client->dev, "cannot register irq=%d\n", client->irq); 1006 + return error; 1007 + } 1008 + 1009 + error = sysfs_create_groups(&client->dev.kobj, elan_sysfs_groups); 1010 + if (error) { 1011 + dev_err(&client->dev, "failed to create sysfs attributes: %d\n", 1012 + error); 1013 + return error; 1014 + } 1015 + 1016 + error = devm_add_action(&client->dev, 1017 + elan_remove_sysfs_groups, data); 1018 + if (error) { 1019 + elan_remove_sysfs_groups(data); 1020 + dev_err(&client->dev, 1021 + "Failed to add sysfs cleanup action: %d\n", 1022 + error); 1023 + return error; 1024 + } 1025 + 1026 + error = input_register_device(data->input); 1027 + if (error) { 1028 + dev_err(&client->dev, "failed to register input device: %d\n", 1029 + error); 1030 + return error; 1031 + } 1032 + 1033 + /* 1034 + * Systems using device tree should set up wakeup via DTS, 1035 + * the rest will configure device as wakeup source by default. 1036 + */ 1037 + if (!client->dev.of_node) 1038 + device_init_wakeup(&client->dev, true); 1039 + 1040 + return 0; 1041 + } 1042 + 1043 + static int __maybe_unused elan_suspend(struct device *dev) 1044 + { 1045 + struct i2c_client *client = to_i2c_client(dev); 1046 + struct elan_tp_data *data = i2c_get_clientdata(client); 1047 + int ret; 1048 + 1049 + /* 1050 + * We are taking the mutex to make sure sysfs operations are 1051 + * complete before we attempt to bring the device into low[er] 1052 + * power mode. 1053 + */ 1054 + ret = mutex_lock_interruptible(&data->sysfs_mutex); 1055 + if (ret) 1056 + return ret; 1057 + 1058 + disable_irq(client->irq); 1059 + 1060 + if (device_may_wakeup(dev)) { 1061 + ret = elan_sleep(data); 1062 + /* Enable wake from IRQ */ 1063 + data->irq_wake = (enable_irq_wake(client->irq) == 0); 1064 + } else { 1065 + ret = elan_disable_power(data); 1066 + } 1067 + 1068 + mutex_unlock(&data->sysfs_mutex); 1069 + return ret; 1070 + } 1071 + 1072 + static int __maybe_unused elan_resume(struct device *dev) 1073 + { 1074 + struct i2c_client *client = to_i2c_client(dev); 1075 + struct elan_tp_data *data = i2c_get_clientdata(client); 1076 + int error; 1077 + 1078 + if (device_may_wakeup(dev) && data->irq_wake) { 1079 + disable_irq_wake(client->irq); 1080 + data->irq_wake = false; 1081 + } 1082 + 1083 + error = elan_enable_power(data); 1084 + if (error) 1085 + dev_err(dev, "power up when resuming failed: %d\n", error); 1086 + 1087 + error = elan_initialize(data); 1088 + if (error) 1089 + dev_err(dev, "initialize when resuming failed: %d\n", error); 1090 + 1091 + enable_irq(data->client->irq); 1092 + 1093 + return 0; 1094 + } 1095 + 1096 + static SIMPLE_DEV_PM_OPS(elan_pm_ops, elan_suspend, elan_resume); 1097 + 1098 + static const struct i2c_device_id elan_id[] = { 1099 + { DRIVER_NAME, 0 }, 1100 + { }, 1101 + }; 1102 + MODULE_DEVICE_TABLE(i2c, elan_id); 1103 + 1104 + #ifdef CONFIG_ACPI 1105 + static const struct acpi_device_id elan_acpi_id[] = { 1106 + { "ELAN0000", 0 }, 1107 + { } 1108 + }; 1109 + MODULE_DEVICE_TABLE(acpi, elan_acpi_id); 1110 + #endif 1111 + 1112 + #ifdef CONFIG_OF 1113 + static const struct of_device_id elan_of_match[] = { 1114 + { .compatible = "elan,ekth3000" }, 1115 + { /* sentinel */ } 1116 + }; 1117 + MODULE_DEVICE_TABLE(of, elan_of_match); 1118 + #endif 1119 + 1120 + static struct i2c_driver elan_driver = { 1121 + .driver = { 1122 + .name = DRIVER_NAME, 1123 + .owner = THIS_MODULE, 1124 + .pm = &elan_pm_ops, 1125 + .acpi_match_table = ACPI_PTR(elan_acpi_id), 1126 + .of_match_table = of_match_ptr(elan_of_match), 1127 + }, 1128 + .probe = elan_probe, 1129 + .id_table = elan_id, 1130 + }; 1131 + 1132 + module_i2c_driver(elan_driver); 1133 + 1134 + MODULE_AUTHOR("Duson Lin <dusonlin@emc.com.tw>"); 1135 + MODULE_DESCRIPTION("Elan I2C/SMBus Touchpad driver"); 1136 + MODULE_LICENSE("GPL"); 1137 + MODULE_VERSION(ELAN_DRIVER_VERSION);
+611
drivers/input/mouse/elan_i2c_i2c.c
··· 1 + /* 2 + * Elan I2C/SMBus Touchpad driver - I2C interface 3 + * 4 + * Copyright (c) 2013 ELAN Microelectronics Corp. 5 + * 6 + * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 7 + * Version: 1.5.5 8 + * 9 + * Based on cyapa driver: 10 + * copyright (c) 2011-2012 Cypress Semiconductor, Inc. 11 + * copyright (c) 2011-2012 Google, Inc. 12 + * 13 + * This program is free software; you can redistribute it and/or modify it 14 + * under the terms of the GNU General Public License version 2 as published 15 + * by the Free Software Foundation. 16 + * 17 + * Trademarks are the property of their respective owners. 18 + */ 19 + 20 + #include <linux/completion.h> 21 + #include <linux/delay.h> 22 + #include <linux/i2c.h> 23 + #include <linux/interrupt.h> 24 + #include <linux/jiffies.h> 25 + #include <linux/kernel.h> 26 + #include <linux/sched.h> 27 + #include <asm/unaligned.h> 28 + 29 + #include "elan_i2c.h" 30 + 31 + /* Elan i2c commands */ 32 + #define ETP_I2C_RESET 0x0100 33 + #define ETP_I2C_WAKE_UP 0x0800 34 + #define ETP_I2C_SLEEP 0x0801 35 + #define ETP_I2C_DESC_CMD 0x0001 36 + #define ETP_I2C_REPORT_DESC_CMD 0x0002 37 + #define ETP_I2C_STAND_CMD 0x0005 38 + #define ETP_I2C_UNIQUEID_CMD 0x0101 39 + #define ETP_I2C_FW_VERSION_CMD 0x0102 40 + #define ETP_I2C_SM_VERSION_CMD 0x0103 41 + #define ETP_I2C_XY_TRACENUM_CMD 0x0105 42 + #define ETP_I2C_MAX_X_AXIS_CMD 0x0106 43 + #define ETP_I2C_MAX_Y_AXIS_CMD 0x0107 44 + #define ETP_I2C_RESOLUTION_CMD 0x0108 45 + #define ETP_I2C_IAP_VERSION_CMD 0x0110 46 + #define ETP_I2C_SET_CMD 0x0300 47 + #define ETP_I2C_POWER_CMD 0x0307 48 + #define ETP_I2C_FW_CHECKSUM_CMD 0x030F 49 + #define ETP_I2C_IAP_CTRL_CMD 0x0310 50 + #define ETP_I2C_IAP_CMD 0x0311 51 + #define ETP_I2C_IAP_RESET_CMD 0x0314 52 + #define ETP_I2C_IAP_CHECKSUM_CMD 0x0315 53 + #define ETP_I2C_CALIBRATE_CMD 0x0316 54 + #define ETP_I2C_MAX_BASELINE_CMD 0x0317 55 + #define ETP_I2C_MIN_BASELINE_CMD 0x0318 56 + 57 + #define ETP_I2C_REPORT_LEN 34 58 + #define ETP_I2C_DESC_LENGTH 30 59 + #define ETP_I2C_REPORT_DESC_LENGTH 158 60 + #define ETP_I2C_INF_LENGTH 2 61 + #define ETP_I2C_IAP_PASSWORD 0x1EA5 62 + #define ETP_I2C_IAP_RESET 0xF0F0 63 + #define ETP_I2C_MAIN_MODE_ON (1 << 9) 64 + #define ETP_I2C_IAP_REG_L 0x01 65 + #define ETP_I2C_IAP_REG_H 0x06 66 + 67 + static int elan_i2c_read_block(struct i2c_client *client, 68 + u16 reg, u8 *val, u16 len) 69 + { 70 + __le16 buf[] = { 71 + cpu_to_le16(reg), 72 + }; 73 + struct i2c_msg msgs[] = { 74 + { 75 + .addr = client->addr, 76 + .flags = client->flags & I2C_M_TEN, 77 + .len = sizeof(buf), 78 + .buf = (u8 *)buf, 79 + }, 80 + { 81 + .addr = client->addr, 82 + .flags = (client->flags & I2C_M_TEN) | I2C_M_RD, 83 + .len = len, 84 + .buf = val, 85 + } 86 + }; 87 + int ret; 88 + 89 + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 90 + return ret == ARRAY_SIZE(msgs) ? 0 : (ret < 0 ? ret : -EIO); 91 + } 92 + 93 + static int elan_i2c_read_cmd(struct i2c_client *client, u16 reg, u8 *val) 94 + { 95 + int retval; 96 + 97 + retval = elan_i2c_read_block(client, reg, val, ETP_I2C_INF_LENGTH); 98 + if (retval < 0) { 99 + dev_err(&client->dev, "reading cmd (0x%04x) fail.\n", reg); 100 + return retval; 101 + } 102 + 103 + return 0; 104 + } 105 + 106 + static int elan_i2c_write_cmd(struct i2c_client *client, u16 reg, u16 cmd) 107 + { 108 + __le16 buf[] = { 109 + cpu_to_le16(reg), 110 + cpu_to_le16(cmd), 111 + }; 112 + struct i2c_msg msg = { 113 + .addr = client->addr, 114 + .flags = client->flags & I2C_M_TEN, 115 + .len = sizeof(buf), 116 + .buf = (u8 *)buf, 117 + }; 118 + int ret; 119 + 120 + ret = i2c_transfer(client->adapter, &msg, 1); 121 + return ret == 1 ? 0 : (ret < 0 ? ret : -EIO); 122 + } 123 + 124 + static int elan_i2c_initialize(struct i2c_client *client) 125 + { 126 + struct device *dev = &client->dev; 127 + int error; 128 + u8 val[256]; 129 + 130 + error = elan_i2c_write_cmd(client, ETP_I2C_STAND_CMD, ETP_I2C_RESET); 131 + if (error) { 132 + dev_err(dev, "device reset failed: %d\n", error); 133 + return error; 134 + } 135 + 136 + /* Wait for the device to reset */ 137 + msleep(100); 138 + 139 + /* get reset acknowledgement 0000 */ 140 + error = i2c_master_recv(client, val, ETP_I2C_INF_LENGTH); 141 + if (error < 0) { 142 + dev_err(dev, "failed to read reset response: %d\n", error); 143 + return error; 144 + } 145 + 146 + error = elan_i2c_read_block(client, ETP_I2C_DESC_CMD, 147 + val, ETP_I2C_DESC_LENGTH); 148 + if (error) { 149 + dev_err(dev, "cannot get device descriptor: %d\n", error); 150 + return error; 151 + } 152 + 153 + error = elan_i2c_read_block(client, ETP_I2C_REPORT_DESC_CMD, 154 + val, ETP_I2C_REPORT_DESC_LENGTH); 155 + if (error) { 156 + dev_err(dev, "fetching report descriptor failed.: %d\n", error); 157 + return error; 158 + } 159 + 160 + return 0; 161 + } 162 + 163 + static int elan_i2c_sleep_control(struct i2c_client *client, bool sleep) 164 + { 165 + return elan_i2c_write_cmd(client, ETP_I2C_STAND_CMD, 166 + sleep ? ETP_I2C_SLEEP : ETP_I2C_WAKE_UP); 167 + } 168 + 169 + static int elan_i2c_power_control(struct i2c_client *client, bool enable) 170 + { 171 + u8 val[2]; 172 + u16 reg; 173 + int error; 174 + 175 + error = elan_i2c_read_cmd(client, ETP_I2C_POWER_CMD, val); 176 + if (error) { 177 + dev_err(&client->dev, 178 + "failed to read current power state: %d\n", 179 + error); 180 + return error; 181 + } 182 + 183 + reg = le16_to_cpup((__le16 *)val); 184 + if (enable) 185 + reg &= ~ETP_DISABLE_POWER; 186 + else 187 + reg |= ETP_DISABLE_POWER; 188 + 189 + error = elan_i2c_write_cmd(client, ETP_I2C_POWER_CMD, reg); 190 + if (error) { 191 + dev_err(&client->dev, 192 + "failed to write current power state: %d\n", 193 + error); 194 + return error; 195 + } 196 + 197 + return 0; 198 + } 199 + 200 + static int elan_i2c_set_mode(struct i2c_client *client, u8 mode) 201 + { 202 + return elan_i2c_write_cmd(client, ETP_I2C_SET_CMD, mode); 203 + } 204 + 205 + 206 + static int elan_i2c_calibrate(struct i2c_client *client) 207 + { 208 + return elan_i2c_write_cmd(client, ETP_I2C_CALIBRATE_CMD, 1); 209 + } 210 + 211 + static int elan_i2c_calibrate_result(struct i2c_client *client, u8 *val) 212 + { 213 + return elan_i2c_read_block(client, ETP_I2C_CALIBRATE_CMD, val, 1); 214 + } 215 + 216 + static int elan_i2c_get_baseline_data(struct i2c_client *client, 217 + bool max_baseline, u8 *value) 218 + { 219 + int error; 220 + u8 val[3]; 221 + 222 + error = elan_i2c_read_cmd(client, 223 + max_baseline ? ETP_I2C_MAX_BASELINE_CMD : 224 + ETP_I2C_MIN_BASELINE_CMD, 225 + val); 226 + if (error) 227 + return error; 228 + 229 + *value = le16_to_cpup((__le16 *)val); 230 + 231 + return 0; 232 + } 233 + 234 + static int elan_i2c_get_version(struct i2c_client *client, 235 + bool iap, u8 *version) 236 + { 237 + int error; 238 + u8 val[3]; 239 + 240 + error = elan_i2c_read_cmd(client, 241 + iap ? ETP_I2C_IAP_VERSION_CMD : 242 + ETP_I2C_FW_VERSION_CMD, 243 + val); 244 + if (error) { 245 + dev_err(&client->dev, "failed to get %s version: %d\n", 246 + iap ? "IAP" : "FW", error); 247 + return error; 248 + } 249 + 250 + *version = val[0]; 251 + return 0; 252 + } 253 + 254 + static int elan_i2c_get_sm_version(struct i2c_client *client, u8 *version) 255 + { 256 + int error; 257 + u8 val[3]; 258 + 259 + error = elan_i2c_read_cmd(client, ETP_I2C_SM_VERSION_CMD, val); 260 + if (error) { 261 + dev_err(&client->dev, "failed to get SM version: %d\n", error); 262 + return error; 263 + } 264 + 265 + *version = val[0]; 266 + return 0; 267 + } 268 + 269 + static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id) 270 + { 271 + int error; 272 + u8 val[3]; 273 + 274 + error = elan_i2c_read_cmd(client, ETP_I2C_UNIQUEID_CMD, val); 275 + if (error) { 276 + dev_err(&client->dev, "failed to get product ID: %d\n", error); 277 + return error; 278 + } 279 + 280 + *id = val[0]; 281 + return 0; 282 + } 283 + 284 + static int elan_i2c_get_checksum(struct i2c_client *client, 285 + bool iap, u16 *csum) 286 + { 287 + int error; 288 + u8 val[3]; 289 + 290 + error = elan_i2c_read_cmd(client, 291 + iap ? ETP_I2C_IAP_CHECKSUM_CMD : 292 + ETP_I2C_FW_CHECKSUM_CMD, 293 + val); 294 + if (error) { 295 + dev_err(&client->dev, "failed to get %s checksum: %d\n", 296 + iap ? "IAP" : "FW", error); 297 + return error; 298 + } 299 + 300 + *csum = le16_to_cpup((__le16 *)val); 301 + return 0; 302 + } 303 + 304 + static int elan_i2c_get_max(struct i2c_client *client, 305 + unsigned int *max_x, unsigned int *max_y) 306 + { 307 + int error; 308 + u8 val[3]; 309 + 310 + error = elan_i2c_read_cmd(client, ETP_I2C_MAX_X_AXIS_CMD, val); 311 + if (error) { 312 + dev_err(&client->dev, "failed to get X dimension: %d\n", error); 313 + return error; 314 + } 315 + 316 + *max_x = le16_to_cpup((__le16 *)val) & 0x0fff; 317 + 318 + error = elan_i2c_read_cmd(client, ETP_I2C_MAX_Y_AXIS_CMD, val); 319 + if (error) { 320 + dev_err(&client->dev, "failed to get Y dimension: %d\n", error); 321 + return error; 322 + } 323 + 324 + *max_y = le16_to_cpup((__le16 *)val) & 0x0fff; 325 + 326 + return 0; 327 + } 328 + 329 + static int elan_i2c_get_resolution(struct i2c_client *client, 330 + u8 *hw_res_x, u8 *hw_res_y) 331 + { 332 + int error; 333 + u8 val[3]; 334 + 335 + error = elan_i2c_read_cmd(client, ETP_I2C_RESOLUTION_CMD, val); 336 + if (error) { 337 + dev_err(&client->dev, "failed to get resolution: %d\n", error); 338 + return error; 339 + } 340 + 341 + *hw_res_x = val[0]; 342 + *hw_res_y = val[1]; 343 + 344 + return 0; 345 + } 346 + 347 + static int elan_i2c_get_num_traces(struct i2c_client *client, 348 + unsigned int *x_traces, 349 + unsigned int *y_traces) 350 + { 351 + int error; 352 + u8 val[3]; 353 + 354 + error = elan_i2c_read_cmd(client, ETP_I2C_XY_TRACENUM_CMD, val); 355 + if (error) { 356 + dev_err(&client->dev, "failed to get trace info: %d\n", error); 357 + return error; 358 + } 359 + 360 + *x_traces = val[0] - 1; 361 + *y_traces = val[1] - 1; 362 + 363 + return 0; 364 + } 365 + 366 + static int elan_i2c_iap_get_mode(struct i2c_client *client, enum tp_mode *mode) 367 + { 368 + int error; 369 + u16 constant; 370 + u8 val[3]; 371 + 372 + error = elan_i2c_read_cmd(client, ETP_I2C_IAP_CTRL_CMD, val); 373 + if (error) { 374 + dev_err(&client->dev, 375 + "failed to read iap control register: %d\n", 376 + error); 377 + return error; 378 + } 379 + 380 + constant = le16_to_cpup((__le16 *)val); 381 + dev_dbg(&client->dev, "iap control reg: 0x%04x.\n", constant); 382 + 383 + *mode = (constant & ETP_I2C_MAIN_MODE_ON) ? MAIN_MODE : IAP_MODE; 384 + 385 + return 0; 386 + } 387 + 388 + static int elan_i2c_iap_reset(struct i2c_client *client) 389 + { 390 + int error; 391 + 392 + error = elan_i2c_write_cmd(client, ETP_I2C_IAP_RESET_CMD, 393 + ETP_I2C_IAP_RESET); 394 + if (error) { 395 + dev_err(&client->dev, "cannot reset IC: %d\n", error); 396 + return error; 397 + } 398 + 399 + return 0; 400 + } 401 + 402 + static int elan_i2c_set_flash_key(struct i2c_client *client) 403 + { 404 + int error; 405 + 406 + error = elan_i2c_write_cmd(client, ETP_I2C_IAP_CMD, 407 + ETP_I2C_IAP_PASSWORD); 408 + if (error) { 409 + dev_err(&client->dev, "cannot set flash key: %d\n", error); 410 + return error; 411 + } 412 + 413 + return 0; 414 + } 415 + 416 + static int elan_i2c_prepare_fw_update(struct i2c_client *client) 417 + { 418 + struct device *dev = &client->dev; 419 + int error; 420 + enum tp_mode mode; 421 + u8 val[3]; 422 + u16 password; 423 + 424 + /* Get FW in which mode (IAP_MODE/MAIN_MODE) */ 425 + error = elan_i2c_iap_get_mode(client, &mode); 426 + if (error) 427 + return error; 428 + 429 + if (mode == IAP_MODE) { 430 + /* Reset IC */ 431 + error = elan_i2c_iap_reset(client); 432 + if (error) 433 + return error; 434 + 435 + msleep(30); 436 + } 437 + 438 + /* Set flash key*/ 439 + error = elan_i2c_set_flash_key(client); 440 + if (error) 441 + return error; 442 + 443 + /* Wait for F/W IAP initialization */ 444 + msleep(mode == MAIN_MODE ? 100 : 30); 445 + 446 + /* Check if we are in IAP mode or not */ 447 + error = elan_i2c_iap_get_mode(client, &mode); 448 + if (error) 449 + return error; 450 + 451 + if (mode == MAIN_MODE) { 452 + dev_err(dev, "wrong mode: %d\n", mode); 453 + return -EIO; 454 + } 455 + 456 + /* Set flash key again */ 457 + error = elan_i2c_set_flash_key(client); 458 + if (error) 459 + return error; 460 + 461 + /* Wait for F/W IAP initialization */ 462 + msleep(30); 463 + 464 + /* read back to check we actually enabled successfully. */ 465 + error = elan_i2c_read_cmd(client, ETP_I2C_IAP_CMD, val); 466 + if (error) { 467 + dev_err(dev, "cannot read iap password: %d\n", 468 + error); 469 + return error; 470 + } 471 + 472 + password = le16_to_cpup((__le16 *)val); 473 + if (password != ETP_I2C_IAP_PASSWORD) { 474 + dev_err(dev, "wrong iap password: 0x%X\n", password); 475 + return -EIO; 476 + } 477 + 478 + return 0; 479 + } 480 + 481 + static int elan_i2c_write_fw_block(struct i2c_client *client, 482 + const u8 *page, u16 checksum, int idx) 483 + { 484 + struct device *dev = &client->dev; 485 + u8 page_store[ETP_FW_PAGE_SIZE + 4]; 486 + u8 val[3]; 487 + u16 result; 488 + int ret, error; 489 + 490 + page_store[0] = ETP_I2C_IAP_REG_L; 491 + page_store[1] = ETP_I2C_IAP_REG_H; 492 + memcpy(&page_store[2], page, ETP_FW_PAGE_SIZE); 493 + /* recode checksum at last two bytes */ 494 + put_unaligned_le16(checksum, &page_store[ETP_FW_PAGE_SIZE + 2]); 495 + 496 + ret = i2c_master_send(client, page_store, sizeof(page_store)); 497 + if (ret != sizeof(page_store)) { 498 + error = ret < 0 ? ret : -EIO; 499 + dev_err(dev, "Failed to write page %d: %d\n", idx, error); 500 + return error; 501 + } 502 + 503 + /* Wait for F/W to update one page ROM data. */ 504 + msleep(20); 505 + 506 + error = elan_i2c_read_cmd(client, ETP_I2C_IAP_CTRL_CMD, val); 507 + if (error) { 508 + dev_err(dev, "Failed to read IAP write result: %d\n", error); 509 + return error; 510 + } 511 + 512 + result = le16_to_cpup((__le16 *)val); 513 + if (result & (ETP_FW_IAP_PAGE_ERR | ETP_FW_IAP_INTF_ERR)) { 514 + dev_err(dev, "IAP reports failed write: %04hx\n", 515 + result); 516 + return -EIO; 517 + } 518 + 519 + return 0; 520 + } 521 + 522 + static int elan_i2c_finish_fw_update(struct i2c_client *client, 523 + struct completion *completion) 524 + { 525 + struct device *dev = &client->dev; 526 + long ret; 527 + int error; 528 + int len; 529 + u8 buffer[ETP_I2C_INF_LENGTH]; 530 + 531 + reinit_completion(completion); 532 + enable_irq(client->irq); 533 + 534 + error = elan_i2c_write_cmd(client, ETP_I2C_STAND_CMD, ETP_I2C_RESET); 535 + if (!error) 536 + ret = wait_for_completion_interruptible_timeout(completion, 537 + msecs_to_jiffies(300)); 538 + disable_irq(client->irq); 539 + 540 + if (error) { 541 + dev_err(dev, "device reset failed: %d\n", error); 542 + return error; 543 + } else if (ret == 0) { 544 + dev_err(dev, "timeout waiting for device reset\n"); 545 + return -ETIMEDOUT; 546 + } else if (ret < 0) { 547 + error = ret; 548 + dev_err(dev, "error waiting for device reset: %d\n", error); 549 + return error; 550 + } 551 + 552 + len = i2c_master_recv(client, buffer, ETP_I2C_INF_LENGTH); 553 + if (len != ETP_I2C_INF_LENGTH) { 554 + error = len < 0 ? len : -EIO; 555 + dev_err(dev, "failed to read INT signal: %d (%d)\n", 556 + error, len); 557 + return error; 558 + } 559 + 560 + return 0; 561 + } 562 + 563 + static int elan_i2c_get_report(struct i2c_client *client, u8 *report) 564 + { 565 + int len; 566 + 567 + len = i2c_master_recv(client, report, ETP_I2C_REPORT_LEN); 568 + if (len < 0) { 569 + dev_err(&client->dev, "failed to read report data: %d\n", len); 570 + return len; 571 + } 572 + 573 + if (len != ETP_I2C_REPORT_LEN) { 574 + dev_err(&client->dev, 575 + "wrong report length (%d vs %d expected)\n", 576 + len, ETP_I2C_REPORT_LEN); 577 + return -EIO; 578 + } 579 + 580 + return 0; 581 + } 582 + 583 + const struct elan_transport_ops elan_i2c_ops = { 584 + .initialize = elan_i2c_initialize, 585 + .sleep_control = elan_i2c_sleep_control, 586 + .power_control = elan_i2c_power_control, 587 + .set_mode = elan_i2c_set_mode, 588 + 589 + .calibrate = elan_i2c_calibrate, 590 + .calibrate_result = elan_i2c_calibrate_result, 591 + 592 + .get_baseline_data = elan_i2c_get_baseline_data, 593 + 594 + .get_version = elan_i2c_get_version, 595 + .get_sm_version = elan_i2c_get_sm_version, 596 + .get_product_id = elan_i2c_get_product_id, 597 + .get_checksum = elan_i2c_get_checksum, 598 + 599 + .get_max = elan_i2c_get_max, 600 + .get_resolution = elan_i2c_get_resolution, 601 + .get_num_traces = elan_i2c_get_num_traces, 602 + 603 + .iap_get_mode = elan_i2c_iap_get_mode, 604 + .iap_reset = elan_i2c_iap_reset, 605 + 606 + .prepare_fw_update = elan_i2c_prepare_fw_update, 607 + .write_fw_block = elan_i2c_write_fw_block, 608 + .finish_fw_update = elan_i2c_finish_fw_update, 609 + 610 + .get_report = elan_i2c_get_report, 611 + };
+514
drivers/input/mouse/elan_i2c_smbus.c
··· 1 + /* 2 + * Elan I2C/SMBus Touchpad driver - SMBus interface 3 + * 4 + * Copyright (c) 2013 ELAN Microelectronics Corp. 5 + * 6 + * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 7 + * Version: 1.5.5 8 + * 9 + * Based on cyapa driver: 10 + * copyright (c) 2011-2012 Cypress Semiconductor, Inc. 11 + * copyright (c) 2011-2012 Google, Inc. 12 + * 13 + * This program is free software; you can redistribute it and/or modify it 14 + * under the terms of the GNU General Public License version 2 as published 15 + * by the Free Software Foundation. 16 + * 17 + * Trademarks are the property of their respective owners. 18 + */ 19 + 20 + #include <linux/delay.h> 21 + #include <linux/i2c.h> 22 + #include <linux/init.h> 23 + #include <linux/kernel.h> 24 + 25 + #include "elan_i2c.h" 26 + 27 + /* Elan SMbus commands */ 28 + #define ETP_SMBUS_IAP_CMD 0x00 29 + #define ETP_SMBUS_ENABLE_TP 0x20 30 + #define ETP_SMBUS_SLEEP_CMD 0x21 31 + #define ETP_SMBUS_IAP_PASSWORD_WRITE 0x29 32 + #define ETP_SMBUS_IAP_PASSWORD_READ 0x80 33 + #define ETP_SMBUS_WRITE_FW_BLOCK 0x2A 34 + #define ETP_SMBUS_IAP_RESET_CMD 0x2B 35 + #define ETP_SMBUS_RANGE_CMD 0xA0 36 + #define ETP_SMBUS_FW_VERSION_CMD 0xA1 37 + #define ETP_SMBUS_XY_TRACENUM_CMD 0xA2 38 + #define ETP_SMBUS_SM_VERSION_CMD 0xA3 39 + #define ETP_SMBUS_UNIQUEID_CMD 0xA3 40 + #define ETP_SMBUS_RESOLUTION_CMD 0xA4 41 + #define ETP_SMBUS_HELLOPACKET_CMD 0xA7 42 + #define ETP_SMBUS_PACKET_QUERY 0xA8 43 + #define ETP_SMBUS_IAP_VERSION_CMD 0xAC 44 + #define ETP_SMBUS_IAP_CTRL_CMD 0xAD 45 + #define ETP_SMBUS_IAP_CHECKSUM_CMD 0xAE 46 + #define ETP_SMBUS_FW_CHECKSUM_CMD 0xAF 47 + #define ETP_SMBUS_MAX_BASELINE_CMD 0xC3 48 + #define ETP_SMBUS_MIN_BASELINE_CMD 0xC4 49 + #define ETP_SMBUS_CALIBRATE_QUERY 0xC5 50 + 51 + #define ETP_SMBUS_REPORT_LEN 32 52 + #define ETP_SMBUS_REPORT_OFFSET 2 53 + #define ETP_SMBUS_HELLOPACKET_LEN 5 54 + #define ETP_SMBUS_IAP_PASSWORD 0x1234 55 + #define ETP_SMBUS_IAP_MODE_ON (1 << 6) 56 + 57 + static int elan_smbus_initialize(struct i2c_client *client) 58 + { 59 + u8 check[ETP_SMBUS_HELLOPACKET_LEN] = { 0x55, 0x55, 0x55, 0x55, 0x55 }; 60 + u8 values[ETP_SMBUS_HELLOPACKET_LEN] = { 0, 0, 0, 0, 0 }; 61 + int len, error; 62 + 63 + /* Get hello packet */ 64 + len = i2c_smbus_read_block_data(client, 65 + ETP_SMBUS_HELLOPACKET_CMD, values); 66 + if (len != ETP_SMBUS_HELLOPACKET_LEN) { 67 + dev_err(&client->dev, "hello packet length fail: %d\n", len); 68 + error = len < 0 ? len : -EIO; 69 + return error; 70 + } 71 + 72 + /* compare hello packet */ 73 + if (memcmp(values, check, ETP_SMBUS_HELLOPACKET_LEN)) { 74 + dev_err(&client->dev, "hello packet fail [%*px]\n", 75 + ETP_SMBUS_HELLOPACKET_LEN, values); 76 + return -ENXIO; 77 + } 78 + 79 + /* enable tp */ 80 + error = i2c_smbus_write_byte(client, ETP_SMBUS_ENABLE_TP); 81 + if (error) { 82 + dev_err(&client->dev, "failed to enable touchpad: %d\n", error); 83 + return error; 84 + } 85 + 86 + return 0; 87 + } 88 + 89 + static int elan_smbus_set_mode(struct i2c_client *client, u8 mode) 90 + { 91 + u8 cmd[4] = { 0x00, 0x07, 0x00, mode }; 92 + 93 + return i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD, 94 + sizeof(cmd), cmd); 95 + } 96 + 97 + static int elan_smbus_sleep_control(struct i2c_client *client, bool sleep) 98 + { 99 + if (sleep) 100 + return i2c_smbus_write_byte(client, ETP_SMBUS_SLEEP_CMD); 101 + else 102 + return 0; /* XXX should we send ETP_SMBUS_ENABLE_TP here? */ 103 + } 104 + 105 + static int elan_smbus_power_control(struct i2c_client *client, bool enable) 106 + { 107 + return 0; /* A no-op */ 108 + } 109 + 110 + static int elan_smbus_calibrate(struct i2c_client *client) 111 + { 112 + u8 cmd[4] = { 0x00, 0x08, 0x00, 0x01 }; 113 + 114 + return i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD, 115 + sizeof(cmd), cmd); 116 + } 117 + 118 + static int elan_smbus_calibrate_result(struct i2c_client *client, u8 *val) 119 + { 120 + int error; 121 + 122 + error = i2c_smbus_read_block_data(client, 123 + ETP_SMBUS_CALIBRATE_QUERY, val); 124 + if (error < 0) 125 + return error; 126 + 127 + return 0; 128 + } 129 + 130 + static int elan_smbus_get_baseline_data(struct i2c_client *client, 131 + bool max_baseline, u8 *value) 132 + { 133 + int error; 134 + u8 val[3]; 135 + 136 + error = i2c_smbus_read_block_data(client, 137 + max_baseline ? 138 + ETP_SMBUS_MAX_BASELINE_CMD : 139 + ETP_SMBUS_MIN_BASELINE_CMD, 140 + val); 141 + if (error < 0) 142 + return error; 143 + 144 + *value = be16_to_cpup((__be16 *)val); 145 + 146 + return 0; 147 + } 148 + 149 + static int elan_smbus_get_version(struct i2c_client *client, 150 + bool iap, u8 *version) 151 + { 152 + int error; 153 + u8 val[3]; 154 + 155 + error = i2c_smbus_read_block_data(client, 156 + iap ? ETP_SMBUS_IAP_VERSION_CMD : 157 + ETP_SMBUS_FW_VERSION_CMD, 158 + val); 159 + if (error < 0) { 160 + dev_err(&client->dev, "failed to get %s version: %d\n", 161 + iap ? "IAP" : "FW", error); 162 + return error; 163 + } 164 + 165 + *version = val[2]; 166 + return 0; 167 + } 168 + 169 + static int elan_smbus_get_sm_version(struct i2c_client *client, u8 *version) 170 + { 171 + int error; 172 + u8 val[3]; 173 + 174 + error = i2c_smbus_read_block_data(client, 175 + ETP_SMBUS_SM_VERSION_CMD, val); 176 + if (error < 0) { 177 + dev_err(&client->dev, "failed to get SM version: %d\n", error); 178 + return error; 179 + } 180 + 181 + *version = val[0]; /* XXX Why 0 and not 2 as in IAP/FW versions? */ 182 + return 0; 183 + } 184 + 185 + static int elan_smbus_get_product_id(struct i2c_client *client, u8 *id) 186 + { 187 + int error; 188 + u8 val[3]; 189 + 190 + error = i2c_smbus_read_block_data(client, 191 + ETP_SMBUS_UNIQUEID_CMD, val); 192 + if (error < 0) { 193 + dev_err(&client->dev, "failed to get product ID: %d\n", error); 194 + return error; 195 + } 196 + 197 + *id = val[1]; 198 + return 0; 199 + } 200 + 201 + static int elan_smbus_get_checksum(struct i2c_client *client, 202 + bool iap, u16 *csum) 203 + { 204 + int error; 205 + u8 val[3]; 206 + 207 + error = i2c_smbus_read_block_data(client, 208 + iap ? ETP_SMBUS_FW_CHECKSUM_CMD : 209 + ETP_SMBUS_IAP_CHECKSUM_CMD, 210 + val); 211 + if (error < 0) { 212 + dev_err(&client->dev, "failed to get %s checksum: %d\n", 213 + iap ? "IAP" : "FW", error); 214 + return error; 215 + } 216 + 217 + *csum = be16_to_cpup((__be16 *)val); 218 + return 0; 219 + } 220 + 221 + static int elan_smbus_get_max(struct i2c_client *client, 222 + unsigned int *max_x, unsigned int *max_y) 223 + { 224 + int error; 225 + u8 val[3]; 226 + 227 + error = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val); 228 + if (error) { 229 + dev_err(&client->dev, "failed to get dimensions: %d\n", error); 230 + return error; 231 + } 232 + 233 + *max_x = (0x0f & val[0]) << 8 | val[1]; 234 + *max_y = (0xf0 & val[0]) << 4 | val[2]; 235 + 236 + return 0; 237 + } 238 + 239 + static int elan_smbus_get_resolution(struct i2c_client *client, 240 + u8 *hw_res_x, u8 *hw_res_y) 241 + { 242 + int error; 243 + u8 val[3]; 244 + 245 + error = i2c_smbus_read_block_data(client, 246 + ETP_SMBUS_RESOLUTION_CMD, val); 247 + if (error) { 248 + dev_err(&client->dev, "failed to get resolution: %d\n", error); 249 + return error; 250 + } 251 + 252 + *hw_res_x = val[1] & 0x0F; 253 + *hw_res_y = (val[1] & 0xF0) >> 4; 254 + 255 + return 0; 256 + } 257 + 258 + static int elan_smbus_get_num_traces(struct i2c_client *client, 259 + unsigned int *x_traces, 260 + unsigned int *y_traces) 261 + { 262 + int error; 263 + u8 val[3]; 264 + 265 + error = i2c_smbus_read_block_data(client, 266 + ETP_SMBUS_XY_TRACENUM_CMD, val); 267 + if (error) { 268 + dev_err(&client->dev, "failed to get trace info: %d\n", error); 269 + return error; 270 + } 271 + 272 + *x_traces = val[1] - 1; 273 + *y_traces = val[2] - 1; 274 + 275 + return 0; 276 + } 277 + 278 + static int elan_smbus_iap_get_mode(struct i2c_client *client, 279 + enum tp_mode *mode) 280 + { 281 + int error; 282 + u16 constant; 283 + u8 val[3]; 284 + 285 + error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD, val); 286 + if (error < 0) { 287 + dev_err(&client->dev, "failed to read iap ctrol register: %d\n", 288 + error); 289 + return error; 290 + } 291 + 292 + constant = be16_to_cpup((__be16 *)val); 293 + dev_dbg(&client->dev, "iap control reg: 0x%04x.\n", constant); 294 + 295 + *mode = (constant & ETP_SMBUS_IAP_MODE_ON) ? IAP_MODE : MAIN_MODE; 296 + 297 + return 0; 298 + } 299 + 300 + static int elan_smbus_iap_reset(struct i2c_client *client) 301 + { 302 + int error; 303 + 304 + error = i2c_smbus_write_byte(client, ETP_SMBUS_IAP_RESET_CMD); 305 + if (error) { 306 + dev_err(&client->dev, "cannot reset IC: %d\n", error); 307 + return error; 308 + } 309 + 310 + return 0; 311 + } 312 + 313 + static int elan_smbus_set_flash_key(struct i2c_client *client) 314 + { 315 + int error; 316 + u8 cmd[4] = { 0x00, 0x0B, 0x00, 0x5A }; 317 + 318 + error = i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD, 319 + sizeof(cmd), cmd); 320 + if (error) { 321 + dev_err(&client->dev, "cannot set flash key: %d\n", error); 322 + return error; 323 + } 324 + 325 + return 0; 326 + } 327 + 328 + static int elan_smbus_prepare_fw_update(struct i2c_client *client) 329 + { 330 + struct device *dev = &client->dev; 331 + int len; 332 + int error; 333 + enum tp_mode mode; 334 + u8 val[3]; 335 + u8 cmd[4] = {0x0F, 0x78, 0x00, 0x06}; 336 + u16 password; 337 + 338 + /* Get FW in which mode (IAP_MODE/MAIN_MODE) */ 339 + error = elan_smbus_iap_get_mode(client, &mode); 340 + if (error) 341 + return error; 342 + 343 + if (mode == MAIN_MODE) { 344 + 345 + /* set flash key */ 346 + error = elan_smbus_set_flash_key(client); 347 + if (error) 348 + return error; 349 + 350 + /* write iap password */ 351 + if (i2c_smbus_write_byte(client, 352 + ETP_SMBUS_IAP_PASSWORD_WRITE) < 0) { 353 + dev_err(dev, "cannot write iap password\n"); 354 + return -EIO; 355 + } 356 + 357 + error = i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD, 358 + sizeof(cmd), cmd); 359 + if (error) { 360 + dev_err(dev, "failed to write iap password: %d\n", 361 + error); 362 + return error; 363 + } 364 + 365 + /* 366 + * Read back password to make sure we enabled flash 367 + * successfully. 368 + */ 369 + len = i2c_smbus_read_block_data(client, 370 + ETP_SMBUS_IAP_PASSWORD_READ, 371 + val); 372 + if (len < sizeof(u16)) { 373 + error = len < 0 ? len : -EIO; 374 + dev_err(dev, "failed to read iap password: %d\n", 375 + error); 376 + return error; 377 + } 378 + 379 + password = be16_to_cpup((__be16 *)val); 380 + if (password != ETP_SMBUS_IAP_PASSWORD) { 381 + dev_err(dev, "wrong iap password = 0x%X\n", password); 382 + return -EIO; 383 + } 384 + 385 + /* Wait 30ms for MAIN_MODE change to IAP_MODE */ 386 + msleep(30); 387 + } 388 + 389 + error = elan_smbus_set_flash_key(client); 390 + if (error) 391 + return error; 392 + 393 + /* Reset IC */ 394 + error = elan_smbus_iap_reset(client); 395 + if (error) 396 + return error; 397 + 398 + return 0; 399 + } 400 + 401 + 402 + static int elan_smbus_write_fw_block(struct i2c_client *client, 403 + const u8 *page, u16 checksum, int idx) 404 + { 405 + struct device *dev = &client->dev; 406 + int error; 407 + u16 result; 408 + u8 val[3]; 409 + 410 + /* 411 + * Due to the limitation of smbus protocol limiting 412 + * transfer to 32 bytes at a time, we must split block 413 + * in 2 transfers. 414 + */ 415 + error = i2c_smbus_write_block_data(client, 416 + ETP_SMBUS_WRITE_FW_BLOCK, 417 + ETP_FW_PAGE_SIZE / 2, 418 + page); 419 + if (error) { 420 + dev_err(dev, "Failed to write page %d (part %d): %d\n", 421 + idx, 1, error); 422 + return error; 423 + } 424 + 425 + error = i2c_smbus_write_block_data(client, 426 + ETP_SMBUS_WRITE_FW_BLOCK, 427 + ETP_FW_PAGE_SIZE / 2, 428 + page + ETP_FW_PAGE_SIZE / 2); 429 + if (error) { 430 + dev_err(dev, "Failed to write page %d (part %d): %d\n", 431 + idx, 2, error); 432 + return error; 433 + } 434 + 435 + 436 + /* Wait for F/W to update one page ROM data. */ 437 + usleep_range(8000, 10000); 438 + 439 + error = i2c_smbus_read_block_data(client, 440 + ETP_SMBUS_IAP_CTRL_CMD, val); 441 + if (error < 0) { 442 + dev_err(dev, "Failed to read IAP write result: %d\n", 443 + error); 444 + return error; 445 + } 446 + 447 + result = be16_to_cpup((__be16 *)val); 448 + if (result & (ETP_FW_IAP_PAGE_ERR | ETP_FW_IAP_INTF_ERR)) { 449 + dev_err(dev, "IAP reports failed write: %04hx\n", 450 + result); 451 + return -EIO; 452 + } 453 + 454 + return 0; 455 + } 456 + 457 + static int elan_smbus_get_report(struct i2c_client *client, u8 *report) 458 + { 459 + int len; 460 + 461 + len = i2c_smbus_read_block_data(client, 462 + ETP_SMBUS_PACKET_QUERY, 463 + &report[ETP_SMBUS_REPORT_OFFSET]); 464 + if (len < 0) { 465 + dev_err(&client->dev, "failed to read report data: %d\n", len); 466 + return len; 467 + } 468 + 469 + if (len != ETP_SMBUS_REPORT_LEN) { 470 + dev_err(&client->dev, 471 + "wrong report length (%d vs %d expected)\n", 472 + len, ETP_SMBUS_REPORT_LEN); 473 + return -EIO; 474 + } 475 + 476 + return 0; 477 + } 478 + 479 + static int elan_smbus_finish_fw_update(struct i2c_client *client, 480 + struct completion *fw_completion) 481 + { 482 + /* No special handling unlike I2C transport */ 483 + return 0; 484 + } 485 + 486 + const struct elan_transport_ops elan_smbus_ops = { 487 + .initialize = elan_smbus_initialize, 488 + .sleep_control = elan_smbus_sleep_control, 489 + .power_control = elan_smbus_power_control, 490 + .set_mode = elan_smbus_set_mode, 491 + 492 + .calibrate = elan_smbus_calibrate, 493 + .calibrate_result = elan_smbus_calibrate_result, 494 + 495 + .get_baseline_data = elan_smbus_get_baseline_data, 496 + 497 + .get_version = elan_smbus_get_version, 498 + .get_sm_version = elan_smbus_get_sm_version, 499 + .get_product_id = elan_smbus_get_product_id, 500 + .get_checksum = elan_smbus_get_checksum, 501 + 502 + .get_max = elan_smbus_get_max, 503 + .get_resolution = elan_smbus_get_resolution, 504 + .get_num_traces = elan_smbus_get_num_traces, 505 + 506 + .iap_get_mode = elan_smbus_iap_get_mode, 507 + .iap_reset = elan_smbus_iap_reset, 508 + 509 + .prepare_fw_update = elan_smbus_prepare_fw_update, 510 + .write_fw_block = elan_smbus_write_fw_block, 511 + .finish_fw_update = elan_smbus_finish_fw_update, 512 + 513 + .get_report = elan_smbus_get_report, 514 + };