root/drivers/input/mouse/elan_i2c_smbus.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. elan_smbus_initialize
  2. elan_smbus_set_mode
  3. elan_smbus_sleep_control
  4. elan_smbus_power_control
  5. elan_smbus_calibrate
  6. elan_smbus_calibrate_result
  7. elan_smbus_get_baseline_data
  8. elan_smbus_get_version
  9. elan_smbus_get_sm_version
  10. elan_smbus_get_product_id
  11. elan_smbus_get_checksum
  12. elan_smbus_get_max
  13. elan_smbus_get_resolution
  14. elan_smbus_get_num_traces
  15. elan_smbus_get_pressure_adjustment
  16. elan_smbus_iap_get_mode
  17. elan_smbus_iap_reset
  18. elan_smbus_set_flash_key
  19. elan_smbus_prepare_fw_update
  20. elan_smbus_write_fw_block
  21. elan_smbus_get_report
  22. elan_smbus_finish_fw_update
  23. elan_smbus_get_pattern

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Elan I2C/SMBus Touchpad driver - SMBus interface
   4  *
   5  * Copyright (c) 2013 ELAN Microelectronics Corp.
   6  *
   7  * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw>
   8  *
   9  * Based on cyapa driver:
  10  * copyright (c) 2011-2012 Cypress Semiconductor, Inc.
  11  * copyright (c) 2011-2012 Google, Inc.
  12  *
  13  * Trademarks are the property of their respective owners.
  14  */
  15 
  16 #include <linux/delay.h>
  17 #include <linux/i2c.h>
  18 #include <linux/init.h>
  19 #include <linux/kernel.h>
  20 
  21 #include "elan_i2c.h"
  22 
  23 /* Elan SMbus commands */
  24 #define ETP_SMBUS_IAP_CMD               0x00
  25 #define ETP_SMBUS_ENABLE_TP             0x20
  26 #define ETP_SMBUS_SLEEP_CMD             0x21
  27 #define ETP_SMBUS_IAP_PASSWORD_WRITE    0x29
  28 #define ETP_SMBUS_IAP_PASSWORD_READ     0x80
  29 #define ETP_SMBUS_WRITE_FW_BLOCK        0x2A
  30 #define ETP_SMBUS_IAP_RESET_CMD         0x2B
  31 #define ETP_SMBUS_RANGE_CMD             0xA0
  32 #define ETP_SMBUS_FW_VERSION_CMD        0xA1
  33 #define ETP_SMBUS_XY_TRACENUM_CMD       0xA2
  34 #define ETP_SMBUS_SM_VERSION_CMD        0xA3
  35 #define ETP_SMBUS_UNIQUEID_CMD          0xA3
  36 #define ETP_SMBUS_RESOLUTION_CMD        0xA4
  37 #define ETP_SMBUS_HELLOPACKET_CMD       0xA7
  38 #define ETP_SMBUS_PACKET_QUERY          0xA8
  39 #define ETP_SMBUS_IAP_VERSION_CMD       0xAC
  40 #define ETP_SMBUS_IAP_CTRL_CMD          0xAD
  41 #define ETP_SMBUS_IAP_CHECKSUM_CMD      0xAE
  42 #define ETP_SMBUS_FW_CHECKSUM_CMD       0xAF
  43 #define ETP_SMBUS_MAX_BASELINE_CMD      0xC3
  44 #define ETP_SMBUS_MIN_BASELINE_CMD      0xC4
  45 #define ETP_SMBUS_CALIBRATE_QUERY       0xC5
  46 
  47 #define ETP_SMBUS_REPORT_LEN            32
  48 #define ETP_SMBUS_REPORT_OFFSET         2
  49 #define ETP_SMBUS_HELLOPACKET_LEN       5
  50 #define ETP_SMBUS_IAP_PASSWORD          0x1234
  51 #define ETP_SMBUS_IAP_MODE_ON           (1 << 6)
  52 
  53 static int elan_smbus_initialize(struct i2c_client *client)
  54 {
  55         u8 check[ETP_SMBUS_HELLOPACKET_LEN] = { 0x55, 0x55, 0x55, 0x55, 0x55 };
  56         u8 values[I2C_SMBUS_BLOCK_MAX] = {0};
  57         int len, error;
  58 
  59         /* Get hello packet */
  60         len = i2c_smbus_read_block_data(client,
  61                                         ETP_SMBUS_HELLOPACKET_CMD, values);
  62         if (len != ETP_SMBUS_HELLOPACKET_LEN) {
  63                 dev_err(&client->dev, "hello packet length fail: %d\n", len);
  64                 error = len < 0 ? len : -EIO;
  65                 return error;
  66         }
  67 
  68         /* compare hello packet */
  69         if (memcmp(values, check, ETP_SMBUS_HELLOPACKET_LEN)) {
  70                 dev_err(&client->dev, "hello packet fail [%*ph]\n",
  71                         ETP_SMBUS_HELLOPACKET_LEN, values);
  72                 return -ENXIO;
  73         }
  74 
  75         /* enable tp */
  76         error = i2c_smbus_write_byte(client, ETP_SMBUS_ENABLE_TP);
  77         if (error) {
  78                 dev_err(&client->dev, "failed to enable touchpad: %d\n", error);
  79                 return error;
  80         }
  81 
  82         return 0;
  83 }
  84 
  85 static int elan_smbus_set_mode(struct i2c_client *client, u8 mode)
  86 {
  87         u8 cmd[4] = { 0x00, 0x07, 0x00, mode };
  88 
  89         return i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD,
  90                                           sizeof(cmd), cmd);
  91 }
  92 
  93 static int elan_smbus_sleep_control(struct i2c_client *client, bool sleep)
  94 {
  95         if (sleep)
  96                 return i2c_smbus_write_byte(client, ETP_SMBUS_SLEEP_CMD);
  97         else
  98                 return 0; /* XXX should we send ETP_SMBUS_ENABLE_TP here? */
  99 }
 100 
 101 static int elan_smbus_power_control(struct i2c_client *client, bool enable)
 102 {
 103         return 0; /* A no-op */
 104 }
 105 
 106 static int elan_smbus_calibrate(struct i2c_client *client)
 107 {
 108         u8 cmd[4] = { 0x00, 0x08, 0x00, 0x01 };
 109 
 110         return i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD,
 111                                           sizeof(cmd), cmd);
 112 }
 113 
 114 static int elan_smbus_calibrate_result(struct i2c_client *client, u8 *val)
 115 {
 116         int error;
 117         u8 buf[I2C_SMBUS_BLOCK_MAX] = {0};
 118 
 119         BUILD_BUG_ON(ETP_CALIBRATE_MAX_LEN > sizeof(buf));
 120 
 121         error = i2c_smbus_read_block_data(client,
 122                                           ETP_SMBUS_CALIBRATE_QUERY, buf);
 123         if (error < 0)
 124                 return error;
 125 
 126         memcpy(val, buf, ETP_CALIBRATE_MAX_LEN);
 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[I2C_SMBUS_BLOCK_MAX] = {0};
 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[I2C_SMBUS_BLOCK_MAX] = {0};
 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,
 170                                      u16 *ic_type, u8 *version,
 171                                      u8 *clickpad)
 172 {
 173         int error;
 174         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 175 
 176         error = i2c_smbus_read_block_data(client,
 177                                           ETP_SMBUS_SM_VERSION_CMD, val);
 178         if (error < 0) {
 179                 dev_err(&client->dev, "failed to get SM version: %d\n", error);
 180                 return error;
 181         }
 182 
 183         *version = val[0];
 184         *ic_type = val[1];
 185         *clickpad = val[0] & 0x10;
 186         return 0;
 187 }
 188 
 189 static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id)
 190 {
 191         int error;
 192         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 193 
 194         error = i2c_smbus_read_block_data(client,
 195                                           ETP_SMBUS_UNIQUEID_CMD, val);
 196         if (error < 0) {
 197                 dev_err(&client->dev, "failed to get product ID: %d\n", error);
 198                 return error;
 199         }
 200 
 201         *id = be16_to_cpup((__be16 *)val);
 202         return 0;
 203 }
 204 
 205 static int elan_smbus_get_checksum(struct i2c_client *client,
 206                                    bool iap, u16 *csum)
 207 {
 208         int error;
 209         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 210 
 211         error = i2c_smbus_read_block_data(client,
 212                                           iap ? ETP_SMBUS_FW_CHECKSUM_CMD :
 213                                                 ETP_SMBUS_IAP_CHECKSUM_CMD,
 214                                           val);
 215         if (error < 0) {
 216                 dev_err(&client->dev, "failed to get %s checksum: %d\n",
 217                         iap ? "IAP" : "FW", error);
 218                 return error;
 219         }
 220 
 221         *csum = be16_to_cpup((__be16 *)val);
 222         return 0;
 223 }
 224 
 225 static int elan_smbus_get_max(struct i2c_client *client,
 226                               unsigned int *max_x, unsigned int *max_y)
 227 {
 228         int ret;
 229         int error;
 230         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 231 
 232         ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
 233         if (ret != 3) {
 234                 error = ret < 0 ? ret : -EIO;
 235                 dev_err(&client->dev, "failed to get dimensions: %d\n", error);
 236                 return error;
 237         }
 238 
 239         *max_x = (0x0f & val[0]) << 8 | val[1];
 240         *max_y = (0xf0 & val[0]) << 4 | val[2];
 241 
 242         return 0;
 243 }
 244 
 245 static int elan_smbus_get_resolution(struct i2c_client *client,
 246                                      u8 *hw_res_x, u8 *hw_res_y)
 247 {
 248         int ret;
 249         int error;
 250         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 251 
 252         ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
 253         if (ret != 3) {
 254                 error = ret < 0 ? ret : -EIO;
 255                 dev_err(&client->dev, "failed to get resolution: %d\n", error);
 256                 return error;
 257         }
 258 
 259         *hw_res_x = val[1] & 0x0F;
 260         *hw_res_y = (val[1] & 0xF0) >> 4;
 261 
 262         return 0;
 263 }
 264 
 265 static int elan_smbus_get_num_traces(struct i2c_client *client,
 266                                      unsigned int *x_traces,
 267                                      unsigned int *y_traces)
 268 {
 269         int ret;
 270         int error;
 271         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 272 
 273         ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
 274         if (ret != 3) {
 275                 error = ret < 0 ? ret : -EIO;
 276                 dev_err(&client->dev, "failed to get trace info: %d\n", error);
 277                 return error;
 278         }
 279 
 280         *x_traces = val[1];
 281         *y_traces = val[2];
 282 
 283         return 0;
 284 }
 285 
 286 static int elan_smbus_get_pressure_adjustment(struct i2c_client *client,
 287                                               int *adjustment)
 288 {
 289         *adjustment = ETP_PRESSURE_OFFSET;
 290         return 0;
 291 }
 292 
 293 static int elan_smbus_iap_get_mode(struct i2c_client *client,
 294                                    enum tp_mode *mode)
 295 {
 296         int error;
 297         u16 constant;
 298         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 299 
 300         error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD, val);
 301         if (error < 0) {
 302                 dev_err(&client->dev, "failed to read iap ctrol register: %d\n",
 303                         error);
 304                 return error;
 305         }
 306 
 307         constant = be16_to_cpup((__be16 *)val);
 308         dev_dbg(&client->dev, "iap control reg: 0x%04x.\n", constant);
 309 
 310         *mode = (constant & ETP_SMBUS_IAP_MODE_ON) ? IAP_MODE : MAIN_MODE;
 311 
 312         return 0;
 313 }
 314 
 315 static int elan_smbus_iap_reset(struct i2c_client *client)
 316 {
 317         int error;
 318 
 319         error = i2c_smbus_write_byte(client, ETP_SMBUS_IAP_RESET_CMD);
 320         if (error) {
 321                 dev_err(&client->dev, "cannot reset IC: %d\n", error);
 322                 return error;
 323         }
 324 
 325         return 0;
 326 }
 327 
 328 static int elan_smbus_set_flash_key(struct i2c_client *client)
 329 {
 330         int error;
 331         u8 cmd[4] = { 0x00, 0x0B, 0x00, 0x5A };
 332 
 333         error = i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD,
 334                                            sizeof(cmd), cmd);
 335         if (error) {
 336                 dev_err(&client->dev, "cannot set flash key: %d\n", error);
 337                 return error;
 338         }
 339 
 340         return 0;
 341 }
 342 
 343 static int elan_smbus_prepare_fw_update(struct i2c_client *client)
 344 {
 345         struct device *dev = &client->dev;
 346         int len;
 347         int error;
 348         enum tp_mode mode;
 349         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 350         u8 cmd[4] = {0x0F, 0x78, 0x00, 0x06};
 351         u16 password;
 352 
 353         /* Get FW in which mode (IAP_MODE/MAIN_MODE)  */
 354         error = elan_smbus_iap_get_mode(client, &mode);
 355         if (error)
 356                 return error;
 357 
 358         if (mode == MAIN_MODE) {
 359 
 360                 /* set flash key */
 361                 error = elan_smbus_set_flash_key(client);
 362                 if (error)
 363                         return error;
 364 
 365                 /* write iap password */
 366                 if (i2c_smbus_write_byte(client,
 367                                          ETP_SMBUS_IAP_PASSWORD_WRITE) < 0) {
 368                         dev_err(dev, "cannot write iap password\n");
 369                         return -EIO;
 370                 }
 371 
 372                 error = i2c_smbus_write_block_data(client, ETP_SMBUS_IAP_CMD,
 373                                                    sizeof(cmd), cmd);
 374                 if (error) {
 375                         dev_err(dev, "failed to write iap password: %d\n",
 376                                 error);
 377                         return error;
 378                 }
 379 
 380                 /*
 381                  * Read back password to make sure we enabled flash
 382                  * successfully.
 383                  */
 384                 len = i2c_smbus_read_block_data(client,
 385                                                 ETP_SMBUS_IAP_PASSWORD_READ,
 386                                                 val);
 387                 if (len < (int)sizeof(u16)) {
 388                         error = len < 0 ? len : -EIO;
 389                         dev_err(dev, "failed to read iap password: %d\n",
 390                                 error);
 391                         return error;
 392                 }
 393 
 394                 password = be16_to_cpup((__be16 *)val);
 395                 if (password != ETP_SMBUS_IAP_PASSWORD) {
 396                         dev_err(dev, "wrong iap password = 0x%X\n", password);
 397                         return -EIO;
 398                 }
 399 
 400                 /* Wait 30ms for MAIN_MODE change to IAP_MODE */
 401                 msleep(30);
 402         }
 403 
 404         error = elan_smbus_set_flash_key(client);
 405         if (error)
 406                 return error;
 407 
 408         /* Reset IC */
 409         error = elan_smbus_iap_reset(client);
 410         if (error)
 411                 return error;
 412 
 413         return 0;
 414 }
 415 
 416 
 417 static int elan_smbus_write_fw_block(struct i2c_client *client,
 418                                      const u8 *page, u16 checksum, int idx)
 419 {
 420         struct device *dev = &client->dev;
 421         int error;
 422         u16 result;
 423         u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
 424 
 425         /*
 426          * Due to the limitation of smbus protocol limiting
 427          * transfer to 32 bytes at a time, we must split block
 428          * in 2 transfers.
 429          */
 430         error = i2c_smbus_write_block_data(client,
 431                                            ETP_SMBUS_WRITE_FW_BLOCK,
 432                                            ETP_FW_PAGE_SIZE / 2,
 433                                            page);
 434         if (error) {
 435                 dev_err(dev, "Failed to write page %d (part %d): %d\n",
 436                         idx, 1, error);
 437                 return error;
 438         }
 439 
 440         error = i2c_smbus_write_block_data(client,
 441                                            ETP_SMBUS_WRITE_FW_BLOCK,
 442                                            ETP_FW_PAGE_SIZE / 2,
 443                                            page + ETP_FW_PAGE_SIZE / 2);
 444         if (error) {
 445                 dev_err(dev, "Failed to write page %d (part %d): %d\n",
 446                         idx, 2, error);
 447                 return error;
 448         }
 449 
 450 
 451         /* Wait for F/W to update one page ROM data. */
 452         usleep_range(8000, 10000);
 453 
 454         error = i2c_smbus_read_block_data(client,
 455                                           ETP_SMBUS_IAP_CTRL_CMD, val);
 456         if (error < 0) {
 457                 dev_err(dev, "Failed to read IAP write result: %d\n",
 458                         error);
 459                 return error;
 460         }
 461 
 462         result = be16_to_cpup((__be16 *)val);
 463         if (result & (ETP_FW_IAP_PAGE_ERR | ETP_FW_IAP_INTF_ERR)) {
 464                 dev_err(dev, "IAP reports failed write: %04hx\n",
 465                         result);
 466                 return -EIO;
 467         }
 468 
 469         return 0;
 470 }
 471 
 472 static int elan_smbus_get_report(struct i2c_client *client, u8 *report)
 473 {
 474         int len;
 475 
 476         BUILD_BUG_ON(I2C_SMBUS_BLOCK_MAX > ETP_SMBUS_REPORT_LEN);
 477 
 478         len = i2c_smbus_read_block_data(client,
 479                                         ETP_SMBUS_PACKET_QUERY,
 480                                         &report[ETP_SMBUS_REPORT_OFFSET]);
 481         if (len < 0) {
 482                 dev_err(&client->dev, "failed to read report data: %d\n", len);
 483                 return len;
 484         }
 485 
 486         if (len != ETP_SMBUS_REPORT_LEN) {
 487                 dev_err(&client->dev,
 488                         "wrong report length (%d vs %d expected)\n",
 489                         len, ETP_SMBUS_REPORT_LEN);
 490                 return -EIO;
 491         }
 492 
 493         return 0;
 494 }
 495 
 496 static int elan_smbus_finish_fw_update(struct i2c_client *client,
 497                                        struct completion *fw_completion)
 498 {
 499         /* No special handling unlike I2C transport */
 500         return 0;
 501 }
 502 
 503 static int elan_smbus_get_pattern(struct i2c_client *client, u8 *pattern)
 504 {
 505         *pattern = 0;
 506         return 0;
 507 }
 508 
 509 const struct elan_transport_ops elan_smbus_ops = {
 510         .initialize             = elan_smbus_initialize,
 511         .sleep_control          = elan_smbus_sleep_control,
 512         .power_control          = elan_smbus_power_control,
 513         .set_mode               = elan_smbus_set_mode,
 514 
 515         .calibrate              = elan_smbus_calibrate,
 516         .calibrate_result       = elan_smbus_calibrate_result,
 517 
 518         .get_baseline_data      = elan_smbus_get_baseline_data,
 519 
 520         .get_version            = elan_smbus_get_version,
 521         .get_sm_version         = elan_smbus_get_sm_version,
 522         .get_product_id         = elan_smbus_get_product_id,
 523         .get_checksum           = elan_smbus_get_checksum,
 524         .get_pressure_adjustment = elan_smbus_get_pressure_adjustment,
 525 
 526         .get_max                = elan_smbus_get_max,
 527         .get_resolution         = elan_smbus_get_resolution,
 528         .get_num_traces         = elan_smbus_get_num_traces,
 529 
 530         .iap_get_mode           = elan_smbus_iap_get_mode,
 531         .iap_reset              = elan_smbus_iap_reset,
 532 
 533         .prepare_fw_update      = elan_smbus_prepare_fw_update,
 534         .write_fw_block         = elan_smbus_write_fw_block,
 535         .finish_fw_update       = elan_smbus_finish_fw_update,
 536 
 537         .get_report             = elan_smbus_get_report,
 538         .get_pattern            = elan_smbus_get_pattern,
 539 };

/* [<][>][^][v][top][bottom][index][help] */