1 /* 2 * Cypress APA trackpad with I2C interface 3 * 4 * Author: Dudley Du <dudl@cypress.com> 5 * Further cleanup and restructuring by: 6 * Daniel Kurtz <djkurtz@chromium.org> 7 * Benson Leung <bleung@chromium.org> 8 * 9 * Copyright (C) 2011-2014 Cypress Semiconductor, Inc. 10 * Copyright (C) 2011-2012 Google, Inc. 11 * 12 * This file is subject to the terms and conditions of the GNU General Public 13 * License. See the file COPYING in the main directory of this archive for 14 * more details. 15 */ 16 17 #include <linux/delay.h> 18 #include <linux/i2c.h> 19 #include <linux/input.h> 20 #include <linux/input/mt.h> 21 #include <linux/interrupt.h> 22 #include <linux/module.h> 23 #include <linux/mutex.h> 24 #include <linux/slab.h> 25 #include <linux/uaccess.h> 26 #include <linux/pm_runtime.h> 27 #include <linux/acpi.h> 28 #include "cyapa.h" 29 30 31 #define CYAPA_ADAPTER_FUNC_NONE 0 32 #define CYAPA_ADAPTER_FUNC_I2C 1 33 #define CYAPA_ADAPTER_FUNC_SMBUS 2 34 #define CYAPA_ADAPTER_FUNC_BOTH 3 35 36 #define CYAPA_FW_NAME "cyapa.bin" 37 38 const char product_id[] = "CYTRA"; 39 40 static int cyapa_reinitialize(struct cyapa *cyapa); 41 42 static inline bool cyapa_is_bootloader_mode(struct cyapa *cyapa) 43 { 44 if (cyapa->gen == CYAPA_GEN5 && cyapa->state == CYAPA_STATE_GEN5_BL) 45 return true; 46 47 if (cyapa->gen == CYAPA_GEN3 && 48 cyapa->state >= CYAPA_STATE_BL_BUSY && 49 cyapa->state <= CYAPA_STATE_BL_ACTIVE) 50 return true; 51 52 return false; 53 } 54 55 static inline bool cyapa_is_operational_mode(struct cyapa *cyapa) 56 { 57 if (cyapa->gen == CYAPA_GEN5 && cyapa->state == CYAPA_STATE_GEN5_APP) 58 return true; 59 60 if (cyapa->gen == CYAPA_GEN3 && cyapa->state == CYAPA_STATE_OP) 61 return true; 62 63 return false; 64 } 65 66 /* Returns 0 on success, else negative errno on failure. */ 67 static ssize_t cyapa_i2c_read(struct cyapa *cyapa, u8 reg, size_t len, 68 u8 *values) 69 { 70 struct i2c_client *client = cyapa->client; 71 struct i2c_msg msgs[] = { 72 { 73 .addr = client->addr, 74 .flags = 0, 75 .len = 1, 76 .buf = ®, 77 }, 78 { 79 .addr = client->addr, 80 .flags = I2C_M_RD, 81 .len = len, 82 .buf = values, 83 }, 84 }; 85 int ret; 86 87 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 88 89 if (ret != ARRAY_SIZE(msgs)) 90 return ret < 0 ? ret : -EIO; 91 92 return 0; 93 } 94 95 /** 96 * cyapa_i2c_write - Execute i2c block data write operation 97 * @cyapa: Handle to this driver 98 * @ret: Offset of the data to written in the register map 99 * @len: number of bytes to write 100 * @values: Data to be written 101 * 102 * Return negative errno code on error; return zero when success. 103 */ 104 static int cyapa_i2c_write(struct cyapa *cyapa, u8 reg, 105 size_t len, const void *values) 106 { 107 struct i2c_client *client = cyapa->client; 108 char buf[32]; 109 int ret; 110 111 if (len > sizeof(buf) - 1) 112 return -ENOMEM; 113 114 buf[0] = reg; 115 memcpy(&buf[1], values, len); 116 117 ret = i2c_master_send(client, buf, len + 1); 118 if (ret != len + 1) 119 return ret < 0 ? ret : -EIO; 120 121 return 0; 122 } 123 124 static u8 cyapa_check_adapter_functionality(struct i2c_client *client) 125 { 126 u8 ret = CYAPA_ADAPTER_FUNC_NONE; 127 128 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) 129 ret |= CYAPA_ADAPTER_FUNC_I2C; 130 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | 131 I2C_FUNC_SMBUS_BLOCK_DATA | 132 I2C_FUNC_SMBUS_I2C_BLOCK)) 133 ret |= CYAPA_ADAPTER_FUNC_SMBUS; 134 return ret; 135 } 136 137 /* 138 * Query device for its current operating state. 139 */ 140 static int cyapa_get_state(struct cyapa *cyapa) 141 { 142 u8 status[BL_STATUS_SIZE]; 143 u8 cmd[32]; 144 /* The i2c address of gen4 and gen5 trackpad device must be even. */ 145 bool even_addr = ((cyapa->client->addr & 0x0001) == 0); 146 bool smbus = false; 147 int retries = 2; 148 int error; 149 150 cyapa->state = CYAPA_STATE_NO_DEVICE; 151 152 /* 153 * Get trackpad status by reading 3 registers starting from 0. 154 * If the device is in the bootloader, this will be BL_HEAD. 155 * If the device is in operation mode, this will be the DATA regs. 156 * 157 */ 158 error = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE, 159 status); 160 161 /* 162 * On smbus systems in OP mode, the i2c_reg_read will fail with 163 * -ETIMEDOUT. In this case, try again using the smbus equivalent 164 * command. This should return a BL_HEAD indicating CYAPA_STATE_OP. 165 */ 166 if (cyapa->smbus && (error == -ETIMEDOUT || error == -ENXIO)) { 167 if (!even_addr) 168 error = cyapa_read_block(cyapa, 169 CYAPA_CMD_BL_STATUS, status); 170 smbus = true; 171 } 172 173 if (error != BL_STATUS_SIZE) 174 goto error; 175 176 /* 177 * Detect trackpad protocol based on characteristic registers and bits. 178 */ 179 do { 180 cyapa->status[REG_OP_STATUS] = status[REG_OP_STATUS]; 181 cyapa->status[REG_BL_STATUS] = status[REG_BL_STATUS]; 182 cyapa->status[REG_BL_ERROR] = status[REG_BL_ERROR]; 183 184 if (cyapa->gen == CYAPA_GEN_UNKNOWN || 185 cyapa->gen == CYAPA_GEN3) { 186 error = cyapa_gen3_ops.state_parse(cyapa, 187 status, BL_STATUS_SIZE); 188 if (!error) 189 goto out_detected; 190 } 191 if ((cyapa->gen == CYAPA_GEN_UNKNOWN || 192 cyapa->gen == CYAPA_GEN5) && 193 !smbus && even_addr) { 194 error = cyapa_gen5_ops.state_parse(cyapa, 195 status, BL_STATUS_SIZE); 196 if (!error) 197 goto out_detected; 198 } 199 200 /* 201 * Write 0x00 0x00 to trackpad device to force update its 202 * status, then redo the detection again. 203 */ 204 if (!smbus) { 205 cmd[0] = 0x00; 206 cmd[1] = 0x00; 207 error = cyapa_i2c_write(cyapa, 0, 2, cmd); 208 if (error) 209 goto error; 210 211 msleep(50); 212 213 error = cyapa_i2c_read(cyapa, BL_HEAD_OFFSET, 214 BL_STATUS_SIZE, status); 215 if (error) 216 goto error; 217 } 218 } while (--retries > 0 && !smbus); 219 220 goto error; 221 222 out_detected: 223 if (cyapa->state <= CYAPA_STATE_BL_BUSY) 224 return -EAGAIN; 225 return 0; 226 227 error: 228 return (error < 0) ? error : -EAGAIN; 229 } 230 231 /* 232 * Poll device for its status in a loop, waiting up to timeout for a response. 233 * 234 * When the device switches state, it usually takes ~300 ms. 235 * However, when running a new firmware image, the device must calibrate its 236 * sensors, which can take as long as 2 seconds. 237 * 238 * Note: The timeout has granularity of the polling rate, which is 100 ms. 239 * 240 * Returns: 241 * 0 when the device eventually responds with a valid non-busy state. 242 * -ETIMEDOUT if device never responds (too many -EAGAIN) 243 * -EAGAIN if bootload is busy, or unknown state. 244 * < 0 other errors 245 */ 246 int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout) 247 { 248 int error; 249 int tries = timeout / 100; 250 251 do { 252 error = cyapa_get_state(cyapa); 253 if (!error && cyapa->state > CYAPA_STATE_BL_BUSY) 254 return 0; 255 256 msleep(100); 257 } while (tries--); 258 259 return (error == -EAGAIN || error == -ETIMEDOUT) ? -ETIMEDOUT : error; 260 } 261 262 /* 263 * Check if device is operational. 264 * 265 * An operational device is responding, has exited bootloader, and has 266 * firmware supported by this driver. 267 * 268 * Returns: 269 * -ENODEV no device 270 * -EBUSY no device or in bootloader 271 * -EIO failure while reading from device 272 * -ETIMEDOUT timeout failure for bus idle or bus no response 273 * -EAGAIN device is still in bootloader 274 * if ->state = CYAPA_STATE_BL_IDLE, device has invalid firmware 275 * -EINVAL device is in operational mode, but not supported by this driver 276 * 0 device is supported 277 */ 278 static int cyapa_check_is_operational(struct cyapa *cyapa) 279 { 280 int error; 281 282 error = cyapa_poll_state(cyapa, 4000); 283 if (error) 284 return error; 285 286 switch (cyapa->gen) { 287 case CYAPA_GEN5: 288 cyapa->ops = &cyapa_gen5_ops; 289 break; 290 case CYAPA_GEN3: 291 cyapa->ops = &cyapa_gen3_ops; 292 break; 293 default: 294 return -ENODEV; 295 } 296 297 error = cyapa->ops->operational_check(cyapa); 298 if (!error && cyapa_is_operational_mode(cyapa)) 299 cyapa->operational = true; 300 else 301 cyapa->operational = false; 302 303 return error; 304 } 305 306 307 /* 308 * Returns 0 on device detected, negative errno on no device detected. 309 * And when the device is detected and opertaional, it will be reset to 310 * full power active mode automatically. 311 */ 312 static int cyapa_detect(struct cyapa *cyapa) 313 { 314 struct device *dev = &cyapa->client->dev; 315 int error; 316 317 error = cyapa_check_is_operational(cyapa); 318 if (error) { 319 if (error != -ETIMEDOUT && error != -ENODEV && 320 cyapa_is_bootloader_mode(cyapa)) { 321 dev_warn(dev, "device detected but not operational\n"); 322 return 0; 323 } 324 325 dev_err(dev, "no device detected: %d\n", error); 326 return error; 327 } 328 329 return 0; 330 } 331 332 static int cyapa_open(struct input_dev *input) 333 { 334 struct cyapa *cyapa = input_get_drvdata(input); 335 struct i2c_client *client = cyapa->client; 336 int error; 337 338 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 339 if (error) 340 return error; 341 342 if (cyapa->operational) { 343 /* 344 * though failed to set active power mode, 345 * but still may be able to work in lower scan rate 346 * when in operational mode. 347 */ 348 error = cyapa->ops->set_power_mode(cyapa, 349 PWR_MODE_FULL_ACTIVE, 0); 350 if (error) { 351 dev_warn(&client->dev, 352 "set active power failed: %d\n", error); 353 goto out; 354 } 355 } else { 356 error = cyapa_reinitialize(cyapa); 357 if (error || !cyapa->operational) { 358 error = error ? error : -EAGAIN; 359 goto out; 360 } 361 } 362 363 enable_irq(client->irq); 364 if (!pm_runtime_enabled(&client->dev)) { 365 pm_runtime_set_active(&client->dev); 366 pm_runtime_enable(&client->dev); 367 } 368 out: 369 mutex_unlock(&cyapa->state_sync_lock); 370 return error; 371 } 372 373 static void cyapa_close(struct input_dev *input) 374 { 375 struct cyapa *cyapa = input_get_drvdata(input); 376 struct i2c_client *client = cyapa->client; 377 378 mutex_lock(&cyapa->state_sync_lock); 379 380 disable_irq(client->irq); 381 if (pm_runtime_enabled(&client->dev)) 382 pm_runtime_disable(&client->dev); 383 pm_runtime_set_suspended(&client->dev); 384 385 if (cyapa->operational) 386 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); 387 388 mutex_unlock(&cyapa->state_sync_lock); 389 } 390 391 static int cyapa_create_input_dev(struct cyapa *cyapa) 392 { 393 struct device *dev = &cyapa->client->dev; 394 struct input_dev *input; 395 int error; 396 397 if (!cyapa->physical_size_x || !cyapa->physical_size_y) 398 return -EINVAL; 399 400 input = devm_input_allocate_device(dev); 401 if (!input) { 402 dev_err(dev, "failed to allocate memory for input device.\n"); 403 return -ENOMEM; 404 } 405 406 input->name = CYAPA_NAME; 407 input->phys = cyapa->phys; 408 input->id.bustype = BUS_I2C; 409 input->id.version = 1; 410 input->id.product = 0; /* Means any product in eventcomm. */ 411 input->dev.parent = &cyapa->client->dev; 412 413 input->open = cyapa_open; 414 input->close = cyapa_close; 415 416 input_set_drvdata(input, cyapa); 417 418 __set_bit(EV_ABS, input->evbit); 419 420 /* Finger position */ 421 input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0, 422 0); 423 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0, 424 0); 425 input_set_abs_params(input, ABS_MT_PRESSURE, 0, cyapa->max_z, 0, 0); 426 if (cyapa->gen > CYAPA_GEN3) { 427 input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); 428 input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0); 429 /* 430 * Orientation is the angle between the vertical axis and 431 * the major axis of the contact ellipse. 432 * The range is -127 to 127. 433 * the positive direction is clockwise form the vertical axis. 434 * If the ellipse of contact degenerates into a circle, 435 * orientation is reported as 0. 436 * 437 * Also, for Gen5 trackpad the accurate of this orientation 438 * value is value + (-30 ~ 30). 439 */ 440 input_set_abs_params(input, ABS_MT_ORIENTATION, 441 -127, 127, 0, 0); 442 } 443 if (cyapa->gen >= CYAPA_GEN5) { 444 input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); 445 input_set_abs_params(input, ABS_MT_WIDTH_MINOR, 0, 255, 0, 0); 446 } 447 448 input_abs_set_res(input, ABS_MT_POSITION_X, 449 cyapa->max_abs_x / cyapa->physical_size_x); 450 input_abs_set_res(input, ABS_MT_POSITION_Y, 451 cyapa->max_abs_y / cyapa->physical_size_y); 452 453 if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) 454 __set_bit(BTN_LEFT, input->keybit); 455 if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) 456 __set_bit(BTN_MIDDLE, input->keybit); 457 if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) 458 __set_bit(BTN_RIGHT, input->keybit); 459 460 if (cyapa->btn_capability == CAPABILITY_LEFT_BTN_MASK) 461 __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 462 463 /* Handle pointer emulation and unused slots in core */ 464 error = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS, 465 INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED); 466 if (error) { 467 dev_err(dev, "failed to initialize MT slots: %d\n", error); 468 return error; 469 } 470 471 /* Register the device in input subsystem */ 472 error = input_register_device(input); 473 if (error) { 474 dev_err(dev, "failed to register input device: %d\n", error); 475 return error; 476 } 477 478 cyapa->input = input; 479 return 0; 480 } 481 482 static void cyapa_enable_irq_for_cmd(struct cyapa *cyapa) 483 { 484 struct input_dev *input = cyapa->input; 485 486 if (!input || !input->users) { 487 /* 488 * When input is NULL, TP must be in deep sleep mode. 489 * In this mode, later non-power I2C command will always failed 490 * if not bring it out of deep sleep mode firstly, 491 * so must command TP to active mode here. 492 */ 493 if (!input || cyapa->operational) 494 cyapa->ops->set_power_mode(cyapa, 495 PWR_MODE_FULL_ACTIVE, 0); 496 /* Gen3 always using polling mode for command. */ 497 if (cyapa->gen >= CYAPA_GEN5) 498 enable_irq(cyapa->client->irq); 499 } 500 } 501 502 static void cyapa_disable_irq_for_cmd(struct cyapa *cyapa) 503 { 504 struct input_dev *input = cyapa->input; 505 506 if (!input || !input->users) { 507 if (cyapa->gen >= CYAPA_GEN5) 508 disable_irq(cyapa->client->irq); 509 if (!input || cyapa->operational) 510 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); 511 } 512 } 513 514 /* 515 * cyapa_sleep_time_to_pwr_cmd and cyapa_pwr_cmd_to_sleep_time 516 * 517 * These are helper functions that convert to and from integer idle 518 * times and register settings to write to the PowerMode register. 519 * The trackpad supports between 20ms to 1000ms scan intervals. 520 * The time will be increased in increments of 10ms from 20ms to 100ms. 521 * From 100ms to 1000ms, time will be increased in increments of 20ms. 522 * 523 * When Idle_Time < 100, the format to convert Idle_Time to Idle_Command is: 524 * Idle_Command = Idle Time / 10; 525 * When Idle_Time >= 100, the format to convert Idle_Time to Idle_Command is: 526 * Idle_Command = Idle Time / 20 + 5; 527 */ 528 u8 cyapa_sleep_time_to_pwr_cmd(u16 sleep_time) 529 { 530 u16 encoded_time; 531 532 sleep_time = clamp_val(sleep_time, 20, 1000); 533 encoded_time = sleep_time < 100 ? sleep_time / 10 : sleep_time / 20 + 5; 534 return (encoded_time << 2) & PWR_MODE_MASK; 535 } 536 537 u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode) 538 { 539 u8 encoded_time = pwr_mode >> 2; 540 541 return (encoded_time < 10) ? encoded_time * 10 542 : (encoded_time - 5) * 20; 543 } 544 545 /* 0 on driver initialize and detected successfully, negative on failure. */ 546 static int cyapa_initialize(struct cyapa *cyapa) 547 { 548 int error = 0; 549 550 cyapa->state = CYAPA_STATE_NO_DEVICE; 551 cyapa->gen = CYAPA_GEN_UNKNOWN; 552 mutex_init(&cyapa->state_sync_lock); 553 554 /* 555 * Set to hard code default, they will be updated with trackpad set 556 * default values after probe and initialized. 557 */ 558 cyapa->suspend_power_mode = PWR_MODE_SLEEP; 559 cyapa->suspend_sleep_time = 560 cyapa_pwr_cmd_to_sleep_time(cyapa->suspend_power_mode); 561 562 /* ops.initialize() is aimed to prepare for module communications. */ 563 error = cyapa_gen3_ops.initialize(cyapa); 564 if (!error) 565 error = cyapa_gen5_ops.initialize(cyapa); 566 if (error) 567 return error; 568 569 error = cyapa_detect(cyapa); 570 if (error) 571 return error; 572 573 /* Power down the device until we need it. */ 574 if (cyapa->operational) 575 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); 576 577 return 0; 578 } 579 580 static int cyapa_reinitialize(struct cyapa *cyapa) 581 { 582 struct device *dev = &cyapa->client->dev; 583 struct input_dev *input = cyapa->input; 584 int error; 585 586 if (pm_runtime_enabled(dev)) 587 pm_runtime_disable(dev); 588 589 /* Avoid command failures when TP was in OFF state. */ 590 if (cyapa->operational) 591 cyapa->ops->set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE, 0); 592 593 error = cyapa_detect(cyapa); 594 if (error) 595 goto out; 596 597 if (!input && cyapa->operational) { 598 error = cyapa_create_input_dev(cyapa); 599 if (error) { 600 dev_err(dev, "create input_dev instance failed: %d\n", 601 error); 602 goto out; 603 } 604 } 605 606 out: 607 if (!input || !input->users) { 608 /* Reset to power OFF state to save power when no user open. */ 609 if (cyapa->operational) 610 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); 611 } else if (!error && cyapa->operational) { 612 /* 613 * Make sure only enable runtime PM when device is 614 * in operational mode and input->users > 0. 615 */ 616 pm_runtime_set_active(dev); 617 pm_runtime_enable(dev); 618 } 619 620 return error; 621 } 622 623 static irqreturn_t cyapa_irq(int irq, void *dev_id) 624 { 625 struct cyapa *cyapa = dev_id; 626 struct device *dev = &cyapa->client->dev; 627 628 pm_runtime_get_sync(dev); 629 if (device_may_wakeup(dev)) 630 pm_wakeup_event(dev, 0); 631 632 /* Interrupt event maybe cuased by host command to trackpad device. */ 633 if (cyapa->ops->irq_cmd_handler(cyapa)) { 634 /* 635 * Interrupt event maybe from trackpad device input reporting. 636 */ 637 if (!cyapa->input) { 638 /* 639 * Still in probling or in firware image 640 * udpating or reading. 641 */ 642 cyapa->ops->sort_empty_output_data(cyapa, 643 NULL, NULL, NULL); 644 goto out; 645 } 646 647 if (!cyapa->operational || cyapa->ops->irq_handler(cyapa)) { 648 if (!mutex_trylock(&cyapa->state_sync_lock)) { 649 cyapa->ops->sort_empty_output_data(cyapa, 650 NULL, NULL, NULL); 651 goto out; 652 } 653 cyapa_reinitialize(cyapa); 654 mutex_unlock(&cyapa->state_sync_lock); 655 } 656 } 657 658 out: 659 pm_runtime_mark_last_busy(dev); 660 pm_runtime_put_sync_autosuspend(dev); 661 return IRQ_HANDLED; 662 } 663 664 /* 665 ************************************************************** 666 * sysfs interface 667 ************************************************************** 668 */ 669 #ifdef CONFIG_PM_SLEEP 670 static ssize_t cyapa_show_suspend_scanrate(struct device *dev, 671 struct device_attribute *attr, 672 char *buf) 673 { 674 struct cyapa *cyapa = dev_get_drvdata(dev); 675 u8 pwr_cmd = cyapa->suspend_power_mode; 676 u16 sleep_time; 677 int len; 678 int error; 679 680 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 681 if (error) 682 return error; 683 684 pwr_cmd = cyapa->suspend_power_mode; 685 sleep_time = cyapa->suspend_sleep_time; 686 687 mutex_unlock(&cyapa->state_sync_lock); 688 689 switch (pwr_cmd) { 690 case PWR_MODE_BTN_ONLY: 691 len = scnprintf(buf, PAGE_SIZE, "%s\n", BTN_ONLY_MODE_NAME); 692 break; 693 694 case PWR_MODE_OFF: 695 len = scnprintf(buf, PAGE_SIZE, "%s\n", OFF_MODE_NAME); 696 break; 697 698 default: 699 len = scnprintf(buf, PAGE_SIZE, "%u\n", 700 cyapa->gen == CYAPA_GEN3 ? 701 cyapa_pwr_cmd_to_sleep_time(pwr_cmd) : 702 sleep_time); 703 break; 704 } 705 706 return len; 707 } 708 709 static ssize_t cyapa_update_suspend_scanrate(struct device *dev, 710 struct device_attribute *attr, 711 const char *buf, size_t count) 712 { 713 struct cyapa *cyapa = dev_get_drvdata(dev); 714 u16 sleep_time; 715 int error; 716 717 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 718 if (error) 719 return error; 720 721 if (sysfs_streq(buf, BTN_ONLY_MODE_NAME)) { 722 cyapa->suspend_power_mode = PWR_MODE_BTN_ONLY; 723 } else if (sysfs_streq(buf, OFF_MODE_NAME)) { 724 cyapa->suspend_power_mode = PWR_MODE_OFF; 725 } else if (!kstrtou16(buf, 10, &sleep_time)) { 726 cyapa->suspend_sleep_time = min_t(u16, sleep_time, 1000); 727 cyapa->suspend_power_mode = 728 cyapa_sleep_time_to_pwr_cmd(cyapa->suspend_sleep_time); 729 } else { 730 count = -EINVAL; 731 } 732 733 mutex_unlock(&cyapa->state_sync_lock); 734 735 return count; 736 } 737 738 static DEVICE_ATTR(suspend_scanrate_ms, S_IRUGO|S_IWUSR, 739 cyapa_show_suspend_scanrate, 740 cyapa_update_suspend_scanrate); 741 742 static struct attribute *cyapa_power_wakeup_entries[] = { 743 &dev_attr_suspend_scanrate_ms.attr, 744 NULL, 745 }; 746 747 static const struct attribute_group cyapa_power_wakeup_group = { 748 .name = power_group_name, 749 .attrs = cyapa_power_wakeup_entries, 750 }; 751 752 static void cyapa_remove_power_wakeup_group(void *data) 753 { 754 struct cyapa *cyapa = data; 755 756 sysfs_unmerge_group(&cyapa->client->dev.kobj, 757 &cyapa_power_wakeup_group); 758 } 759 760 static int cyapa_prepare_wakeup_controls(struct cyapa *cyapa) 761 { 762 struct i2c_client *client = cyapa->client; 763 struct device *dev = &client->dev; 764 int error; 765 766 if (device_can_wakeup(dev)) { 767 error = sysfs_merge_group(&client->dev.kobj, 768 &cyapa_power_wakeup_group); 769 if (error) { 770 dev_err(dev, "failed to add power wakeup group: %d\n", 771 error); 772 return error; 773 } 774 775 error = devm_add_action(dev, 776 cyapa_remove_power_wakeup_group, cyapa); 777 if (error) { 778 cyapa_remove_power_wakeup_group(cyapa); 779 dev_err(dev, "failed to add power cleanup action: %d\n", 780 error); 781 return error; 782 } 783 } 784 785 return 0; 786 } 787 #else 788 static inline int cyapa_prepare_wakeup_controls(struct cyapa *cyapa) 789 { 790 return 0; 791 } 792 #endif /* CONFIG_PM_SLEEP */ 793 794 #ifdef CONFIG_PM 795 static ssize_t cyapa_show_rt_suspend_scanrate(struct device *dev, 796 struct device_attribute *attr, 797 char *buf) 798 { 799 struct cyapa *cyapa = dev_get_drvdata(dev); 800 u8 pwr_cmd; 801 u16 sleep_time; 802 int error; 803 804 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 805 if (error) 806 return error; 807 808 pwr_cmd = cyapa->runtime_suspend_power_mode; 809 sleep_time = cyapa->runtime_suspend_sleep_time; 810 811 mutex_unlock(&cyapa->state_sync_lock); 812 813 return scnprintf(buf, PAGE_SIZE, "%u\n", 814 cyapa->gen == CYAPA_GEN3 ? 815 cyapa_pwr_cmd_to_sleep_time(pwr_cmd) : 816 sleep_time); 817 } 818 819 static ssize_t cyapa_update_rt_suspend_scanrate(struct device *dev, 820 struct device_attribute *attr, 821 const char *buf, size_t count) 822 { 823 struct cyapa *cyapa = dev_get_drvdata(dev); 824 u16 time; 825 int error; 826 827 if (buf == NULL || count == 0 || kstrtou16(buf, 10, &time)) { 828 dev_err(dev, "invalid runtime suspend scanrate ms parameter\n"); 829 return -EINVAL; 830 } 831 832 /* 833 * When the suspend scanrate is changed, pm_runtime_get to resume 834 * a potentially suspended device, update to the new pwr_cmd 835 * and then pm_runtime_put to suspend into the new power mode. 836 */ 837 pm_runtime_get_sync(dev); 838 839 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 840 if (error) 841 return error; 842 843 cyapa->runtime_suspend_sleep_time = min_t(u16, time, 1000); 844 cyapa->runtime_suspend_power_mode = 845 cyapa_sleep_time_to_pwr_cmd(cyapa->runtime_suspend_sleep_time); 846 847 mutex_unlock(&cyapa->state_sync_lock); 848 849 pm_runtime_put_sync_autosuspend(dev); 850 851 return count; 852 } 853 854 static DEVICE_ATTR(runtime_suspend_scanrate_ms, S_IRUGO|S_IWUSR, 855 cyapa_show_rt_suspend_scanrate, 856 cyapa_update_rt_suspend_scanrate); 857 858 static struct attribute *cyapa_power_runtime_entries[] = { 859 &dev_attr_runtime_suspend_scanrate_ms.attr, 860 NULL, 861 }; 862 863 static const struct attribute_group cyapa_power_runtime_group = { 864 .name = power_group_name, 865 .attrs = cyapa_power_runtime_entries, 866 }; 867 868 static void cyapa_remove_power_runtime_group(void *data) 869 { 870 struct cyapa *cyapa = data; 871 872 sysfs_unmerge_group(&cyapa->client->dev.kobj, 873 &cyapa_power_runtime_group); 874 } 875 876 static int cyapa_start_runtime(struct cyapa *cyapa) 877 { 878 struct device *dev = &cyapa->client->dev; 879 int error; 880 881 cyapa->runtime_suspend_power_mode = PWR_MODE_IDLE; 882 cyapa->runtime_suspend_sleep_time = 883 cyapa_pwr_cmd_to_sleep_time(cyapa->runtime_suspend_power_mode); 884 885 error = sysfs_merge_group(&dev->kobj, &cyapa_power_runtime_group); 886 if (error) { 887 dev_err(dev, 888 "failed to create power runtime group: %d\n", error); 889 return error; 890 } 891 892 error = devm_add_action(dev, cyapa_remove_power_runtime_group, cyapa); 893 if (error) { 894 cyapa_remove_power_runtime_group(cyapa); 895 dev_err(dev, 896 "failed to add power runtime cleanup action: %d\n", 897 error); 898 return error; 899 } 900 901 /* runtime is enabled until device is operational and opened. */ 902 pm_runtime_set_suspended(dev); 903 pm_runtime_use_autosuspend(dev); 904 pm_runtime_set_autosuspend_delay(dev, AUTOSUSPEND_DELAY); 905 906 return 0; 907 } 908 #else 909 static inline int cyapa_start_runtime(struct cyapa *cyapa) 910 { 911 return 0; 912 } 913 #endif /* CONFIG_PM */ 914 915 static ssize_t cyapa_show_fm_ver(struct device *dev, 916 struct device_attribute *attr, char *buf) 917 { 918 int error; 919 struct cyapa *cyapa = dev_get_drvdata(dev); 920 921 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 922 if (error) 923 return error; 924 error = scnprintf(buf, PAGE_SIZE, "%d.%d\n", cyapa->fw_maj_ver, 925 cyapa->fw_min_ver); 926 mutex_unlock(&cyapa->state_sync_lock); 927 return error; 928 } 929 930 static ssize_t cyapa_show_product_id(struct device *dev, 931 struct device_attribute *attr, char *buf) 932 { 933 struct cyapa *cyapa = dev_get_drvdata(dev); 934 int size; 935 int error; 936 937 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 938 if (error) 939 return error; 940 size = scnprintf(buf, PAGE_SIZE, "%s\n", cyapa->product_id); 941 mutex_unlock(&cyapa->state_sync_lock); 942 return size; 943 } 944 945 static int cyapa_firmware(struct cyapa *cyapa, const char *fw_name) 946 { 947 struct device *dev = &cyapa->client->dev; 948 const struct firmware *fw; 949 int error; 950 951 error = request_firmware(&fw, fw_name, dev); 952 if (error) { 953 dev_err(dev, "Could not load firmware from %s: %d\n", 954 fw_name, error); 955 return error; 956 } 957 958 error = cyapa->ops->check_fw(cyapa, fw); 959 if (error) { 960 dev_err(dev, "Invalid CYAPA firmware image: %s\n", 961 fw_name); 962 goto done; 963 } 964 965 /* 966 * Resume the potentially suspended device because doing FW 967 * update on a device not in the FULL mode has a chance to 968 * fail. 969 */ 970 pm_runtime_get_sync(dev); 971 972 /* Require IRQ support for firmware update commands. */ 973 cyapa_enable_irq_for_cmd(cyapa); 974 975 error = cyapa->ops->bl_enter(cyapa); 976 if (error) { 977 dev_err(dev, "bl_enter failed, %d\n", error); 978 goto err_detect; 979 } 980 981 error = cyapa->ops->bl_activate(cyapa); 982 if (error) { 983 dev_err(dev, "bl_activate failed, %d\n", error); 984 goto err_detect; 985 } 986 987 error = cyapa->ops->bl_initiate(cyapa, fw); 988 if (error) { 989 dev_err(dev, "bl_initiate failed, %d\n", error); 990 goto err_detect; 991 } 992 993 error = cyapa->ops->update_fw(cyapa, fw); 994 if (error) { 995 dev_err(dev, "update_fw failed, %d\n", error); 996 goto err_detect; 997 } 998 999 err_detect: 1000 cyapa_disable_irq_for_cmd(cyapa); 1001 pm_runtime_put_noidle(dev); 1002 1003 done: 1004 release_firmware(fw); 1005 return error; 1006 } 1007 1008 static ssize_t cyapa_update_fw_store(struct device *dev, 1009 struct device_attribute *attr, 1010 const char *buf, size_t count) 1011 { 1012 struct cyapa *cyapa = dev_get_drvdata(dev); 1013 char fw_name[NAME_MAX]; 1014 int ret, error; 1015 1016 if (count >= NAME_MAX) { 1017 dev_err(dev, "File name too long\n"); 1018 return -EINVAL; 1019 } 1020 1021 memcpy(fw_name, buf, count); 1022 if (fw_name[count - 1] == '\n') 1023 fw_name[count - 1] = '\0'; 1024 else 1025 fw_name[count] = '\0'; 1026 1027 if (cyapa->input) { 1028 /* 1029 * Force the input device to be registered after the firmware 1030 * image is updated, so if the corresponding parameters updated 1031 * in the new firmware image can taken effect immediately. 1032 */ 1033 input_unregister_device(cyapa->input); 1034 cyapa->input = NULL; 1035 } 1036 1037 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 1038 if (error) { 1039 /* 1040 * Whatever, do reinitialize to try to recover TP state to 1041 * previous state just as it entered fw update entrance. 1042 */ 1043 cyapa_reinitialize(cyapa); 1044 return error; 1045 } 1046 1047 error = cyapa_firmware(cyapa, fw_name); 1048 if (error) 1049 dev_err(dev, "firmware update failed: %d\n", error); 1050 else 1051 dev_dbg(dev, "firmware update successfully done.\n"); 1052 1053 /* 1054 * Redetect trackpad device states because firmware update process 1055 * will reset trackpad device into bootloader mode. 1056 */ 1057 ret = cyapa_reinitialize(cyapa); 1058 if (ret) { 1059 dev_err(dev, "failed to redetect after updated: %d\n", ret); 1060 error = error ? error : ret; 1061 } 1062 1063 mutex_unlock(&cyapa->state_sync_lock); 1064 1065 return error ? error : count; 1066 } 1067 1068 static ssize_t cyapa_calibrate_store(struct device *dev, 1069 struct device_attribute *attr, 1070 const char *buf, size_t count) 1071 { 1072 struct cyapa *cyapa = dev_get_drvdata(dev); 1073 int error; 1074 1075 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 1076 if (error) 1077 return error; 1078 1079 if (cyapa->operational) { 1080 cyapa_enable_irq_for_cmd(cyapa); 1081 error = cyapa->ops->calibrate_store(dev, attr, buf, count); 1082 cyapa_disable_irq_for_cmd(cyapa); 1083 } else { 1084 error = -EBUSY; /* Still running in bootloader mode. */ 1085 } 1086 1087 mutex_unlock(&cyapa->state_sync_lock); 1088 return error < 0 ? error : count; 1089 } 1090 1091 static ssize_t cyapa_show_baseline(struct device *dev, 1092 struct device_attribute *attr, char *buf) 1093 { 1094 struct cyapa *cyapa = dev_get_drvdata(dev); 1095 ssize_t error; 1096 1097 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 1098 if (error) 1099 return error; 1100 1101 if (cyapa->operational) { 1102 cyapa_enable_irq_for_cmd(cyapa); 1103 error = cyapa->ops->show_baseline(dev, attr, buf); 1104 cyapa_disable_irq_for_cmd(cyapa); 1105 } else { 1106 error = -EBUSY; /* Still running in bootloader mode. */ 1107 } 1108 1109 mutex_unlock(&cyapa->state_sync_lock); 1110 return error; 1111 } 1112 1113 static char *cyapa_state_to_string(struct cyapa *cyapa) 1114 { 1115 switch (cyapa->state) { 1116 case CYAPA_STATE_BL_BUSY: 1117 return "bootloader busy"; 1118 case CYAPA_STATE_BL_IDLE: 1119 return "bootloader idle"; 1120 case CYAPA_STATE_BL_ACTIVE: 1121 return "bootloader active"; 1122 case CYAPA_STATE_GEN5_BL: 1123 return "bootloader"; 1124 case CYAPA_STATE_OP: 1125 case CYAPA_STATE_GEN5_APP: 1126 return "operational"; /* Normal valid state. */ 1127 default: 1128 return "invalid mode"; 1129 } 1130 } 1131 1132 static ssize_t cyapa_show_mode(struct device *dev, 1133 struct device_attribute *attr, char *buf) 1134 { 1135 struct cyapa *cyapa = dev_get_drvdata(dev); 1136 int size; 1137 int error; 1138 1139 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 1140 if (error) 1141 return error; 1142 1143 size = scnprintf(buf, PAGE_SIZE, "gen%d %s\n", 1144 cyapa->gen, cyapa_state_to_string(cyapa)); 1145 1146 mutex_unlock(&cyapa->state_sync_lock); 1147 return size; 1148 } 1149 1150 static DEVICE_ATTR(firmware_version, S_IRUGO, cyapa_show_fm_ver, NULL); 1151 static DEVICE_ATTR(product_id, S_IRUGO, cyapa_show_product_id, NULL); 1152 static DEVICE_ATTR(update_fw, S_IWUSR, NULL, cyapa_update_fw_store); 1153 static DEVICE_ATTR(baseline, S_IRUGO, cyapa_show_baseline, NULL); 1154 static DEVICE_ATTR(calibrate, S_IWUSR, NULL, cyapa_calibrate_store); 1155 static DEVICE_ATTR(mode, S_IRUGO, cyapa_show_mode, NULL); 1156 1157 static struct attribute *cyapa_sysfs_entries[] = { 1158 &dev_attr_firmware_version.attr, 1159 &dev_attr_product_id.attr, 1160 &dev_attr_update_fw.attr, 1161 &dev_attr_baseline.attr, 1162 &dev_attr_calibrate.attr, 1163 &dev_attr_mode.attr, 1164 NULL, 1165 }; 1166 1167 static const struct attribute_group cyapa_sysfs_group = { 1168 .attrs = cyapa_sysfs_entries, 1169 }; 1170 1171 static void cyapa_remove_sysfs_group(void *data) 1172 { 1173 struct cyapa *cyapa = data; 1174 1175 sysfs_remove_group(&cyapa->client->dev.kobj, &cyapa_sysfs_group); 1176 } 1177 1178 static int cyapa_probe(struct i2c_client *client, 1179 const struct i2c_device_id *dev_id) 1180 { 1181 struct device *dev = &client->dev; 1182 struct cyapa *cyapa; 1183 u8 adapter_func; 1184 union i2c_smbus_data dummy; 1185 int error; 1186 1187 adapter_func = cyapa_check_adapter_functionality(client); 1188 if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) { 1189 dev_err(dev, "not a supported I2C/SMBus adapter\n"); 1190 return -EIO; 1191 } 1192 1193 /* Make sure there is something at this address */ 1194 if (i2c_smbus_xfer(client->adapter, client->addr, 0, 1195 I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &dummy) < 0) 1196 return -ENODEV; 1197 1198 cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL); 1199 if (!cyapa) 1200 return -ENOMEM; 1201 1202 /* i2c isn't supported, use smbus */ 1203 if (adapter_func == CYAPA_ADAPTER_FUNC_SMBUS) 1204 cyapa->smbus = true; 1205 1206 cyapa->client = client; 1207 i2c_set_clientdata(client, cyapa); 1208 sprintf(cyapa->phys, "i2c-%d-%04x/input0", client->adapter->nr, 1209 client->addr); 1210 1211 error = cyapa_initialize(cyapa); 1212 if (error) { 1213 dev_err(dev, "failed to detect and initialize tp device.\n"); 1214 return error; 1215 } 1216 1217 error = sysfs_create_group(&client->dev.kobj, &cyapa_sysfs_group); 1218 if (error) { 1219 dev_err(dev, "failed to create sysfs entries: %d\n", error); 1220 return error; 1221 } 1222 1223 error = devm_add_action(dev, cyapa_remove_sysfs_group, cyapa); 1224 if (error) { 1225 cyapa_remove_sysfs_group(cyapa); 1226 dev_err(dev, "failed to add sysfs cleanup action: %d\n", error); 1227 return error; 1228 } 1229 1230 error = cyapa_prepare_wakeup_controls(cyapa); 1231 if (error) { 1232 dev_err(dev, "failed to prepare wakeup controls: %d\n", error); 1233 return error; 1234 } 1235 1236 error = cyapa_start_runtime(cyapa); 1237 if (error) { 1238 dev_err(dev, "failed to start pm_runtime: %d\n", error); 1239 return error; 1240 } 1241 1242 error = devm_request_threaded_irq(dev, client->irq, 1243 NULL, cyapa_irq, 1244 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 1245 "cyapa", cyapa); 1246 if (error) { 1247 dev_err(dev, "failed to request threaded irq: %d\n", error); 1248 return error; 1249 } 1250 1251 /* Disable IRQ until the device is opened */ 1252 disable_irq(client->irq); 1253 1254 /* 1255 * Register the device in the input subsystem when it's operational. 1256 * Otherwise, keep in this driver, so it can be be recovered or updated 1257 * through the sysfs mode and update_fw interfaces by user or apps. 1258 */ 1259 if (cyapa->operational) { 1260 error = cyapa_create_input_dev(cyapa); 1261 if (error) { 1262 dev_err(dev, "create input_dev instance failed: %d\n", 1263 error); 1264 return error; 1265 } 1266 } 1267 1268 return 0; 1269 } 1270 1271 static int __maybe_unused cyapa_suspend(struct device *dev) 1272 { 1273 struct i2c_client *client = to_i2c_client(dev); 1274 struct cyapa *cyapa = i2c_get_clientdata(client); 1275 u8 power_mode; 1276 int error; 1277 1278 error = mutex_lock_interruptible(&cyapa->state_sync_lock); 1279 if (error) 1280 return error; 1281 1282 /* 1283 * Runtime PM is enable only when device is in operational mode and 1284 * users in use, so need check it before disable it to 1285 * avoid unbalance warning. 1286 */ 1287 if (pm_runtime_enabled(dev)) 1288 pm_runtime_disable(dev); 1289 disable_irq(client->irq); 1290 1291 /* 1292 * Set trackpad device to idle mode if wakeup is allowed, 1293 * otherwise turn off. 1294 */ 1295 if (cyapa->operational) { 1296 power_mode = device_may_wakeup(dev) ? cyapa->suspend_power_mode 1297 : PWR_MODE_OFF; 1298 error = cyapa->ops->set_power_mode(cyapa, power_mode, 1299 cyapa->suspend_sleep_time); 1300 if (error) 1301 dev_err(dev, "suspend set power mode failed: %d\n", 1302 error); 1303 } 1304 1305 if (device_may_wakeup(dev)) 1306 cyapa->irq_wake = (enable_irq_wake(client->irq) == 0); 1307 1308 mutex_unlock(&cyapa->state_sync_lock); 1309 return 0; 1310 } 1311 1312 static int __maybe_unused cyapa_resume(struct device *dev) 1313 { 1314 struct i2c_client *client = to_i2c_client(dev); 1315 struct cyapa *cyapa = i2c_get_clientdata(client); 1316 int error; 1317 1318 mutex_lock(&cyapa->state_sync_lock); 1319 1320 if (device_may_wakeup(dev) && cyapa->irq_wake) { 1321 disable_irq_wake(client->irq); 1322 cyapa->irq_wake = false; 1323 } 1324 1325 /* Update device states and runtime PM states. */ 1326 error = cyapa_reinitialize(cyapa); 1327 if (error) 1328 dev_warn(dev, "failed to reinitialize TP device: %d\n", error); 1329 1330 enable_irq(client->irq); 1331 1332 mutex_unlock(&cyapa->state_sync_lock); 1333 return 0; 1334 } 1335 1336 static int __maybe_unused cyapa_runtime_suspend(struct device *dev) 1337 { 1338 struct cyapa *cyapa = dev_get_drvdata(dev); 1339 int error; 1340 1341 error = cyapa->ops->set_power_mode(cyapa, 1342 cyapa->runtime_suspend_power_mode, 1343 cyapa->runtime_suspend_sleep_time); 1344 if (error) 1345 dev_warn(dev, "runtime suspend failed: %d\n", error); 1346 1347 return 0; 1348 } 1349 1350 static int __maybe_unused cyapa_runtime_resume(struct device *dev) 1351 { 1352 struct cyapa *cyapa = dev_get_drvdata(dev); 1353 int error; 1354 1355 error = cyapa->ops->set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE, 0); 1356 if (error) 1357 dev_warn(dev, "runtime resume failed: %d\n", error); 1358 1359 return 0; 1360 } 1361 1362 static const struct dev_pm_ops cyapa_pm_ops = { 1363 SET_SYSTEM_SLEEP_PM_OPS(cyapa_suspend, cyapa_resume) 1364 SET_RUNTIME_PM_OPS(cyapa_runtime_suspend, cyapa_runtime_resume, NULL) 1365 }; 1366 1367 static const struct i2c_device_id cyapa_id_table[] = { 1368 { "cyapa", 0 }, 1369 { }, 1370 }; 1371 MODULE_DEVICE_TABLE(i2c, cyapa_id_table); 1372 1373 #ifdef CONFIG_ACPI 1374 static const struct acpi_device_id cyapa_acpi_id[] = { 1375 { "CYAP0000", 0 }, /* Gen3 trackpad with 0x67 I2C address. */ 1376 { "CYAP0001", 0 }, /* Gen5 trackpad with 0x24 I2C address. */ 1377 { } 1378 }; 1379 MODULE_DEVICE_TABLE(acpi, cyapa_acpi_id); 1380 #endif 1381 1382 static struct i2c_driver cyapa_driver = { 1383 .driver = { 1384 .name = "cyapa", 1385 .owner = THIS_MODULE, 1386 .pm = &cyapa_pm_ops, 1387 .acpi_match_table = ACPI_PTR(cyapa_acpi_id), 1388 }, 1389 1390 .probe = cyapa_probe, 1391 .id_table = cyapa_id_table, 1392 }; 1393 1394 module_i2c_driver(cyapa_driver); 1395 1396 MODULE_DESCRIPTION("Cypress APA I2C Trackpad Driver"); 1397 MODULE_AUTHOR("Dudley Du <dudl@cypress.com>"); 1398 MODULE_LICENSE("GPL"); 1399