2 * Cypress APA trackpad with I2C interface
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>
9 * Copyright (C) 2011-2015 Cypress Semiconductor, Inc.
10 * Copyright (C) 2011-2012 Google, Inc.
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
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/regulator/consumer.h>
25 #include <linux/slab.h>
26 #include <linux/uaccess.h>
27 #include <linux/pm_runtime.h>
28 #include <linux/acpi.h>
33 #define CYAPA_ADAPTER_FUNC_NONE 0
34 #define CYAPA_ADAPTER_FUNC_I2C 1
35 #define CYAPA_ADAPTER_FUNC_SMBUS 2
36 #define CYAPA_ADAPTER_FUNC_BOTH 3
38 #define CYAPA_FW_NAME "cyapa.bin"
40 const char product_id
[] = "CYTRA";
42 static int cyapa_reinitialize(struct cyapa
*cyapa
);
44 bool cyapa_is_pip_bl_mode(struct cyapa
*cyapa
)
46 if (cyapa
->gen
== CYAPA_GEN6
&& cyapa
->state
== CYAPA_STATE_GEN6_BL
)
49 if (cyapa
->gen
== CYAPA_GEN5
&& cyapa
->state
== CYAPA_STATE_GEN5_BL
)
55 bool cyapa_is_pip_app_mode(struct cyapa
*cyapa
)
57 if (cyapa
->gen
== CYAPA_GEN6
&& cyapa
->state
== CYAPA_STATE_GEN6_APP
)
60 if (cyapa
->gen
== CYAPA_GEN5
&& cyapa
->state
== CYAPA_STATE_GEN5_APP
)
66 static bool cyapa_is_bootloader_mode(struct cyapa
*cyapa
)
68 if (cyapa_is_pip_bl_mode(cyapa
))
71 if (cyapa
->gen
== CYAPA_GEN3
&&
72 cyapa
->state
>= CYAPA_STATE_BL_BUSY
&&
73 cyapa
->state
<= CYAPA_STATE_BL_ACTIVE
)
79 static inline bool cyapa_is_operational_mode(struct cyapa
*cyapa
)
81 if (cyapa_is_pip_app_mode(cyapa
))
84 if (cyapa
->gen
== CYAPA_GEN3
&& cyapa
->state
== CYAPA_STATE_OP
)
90 /* Returns 0 on success, else negative errno on failure. */
91 static ssize_t
cyapa_i2c_read(struct cyapa
*cyapa
, u8 reg
, size_t len
,
94 struct i2c_client
*client
= cyapa
->client
;
95 struct i2c_msg msgs
[] = {
103 .addr
= client
->addr
,
111 ret
= i2c_transfer(client
->adapter
, msgs
, ARRAY_SIZE(msgs
));
113 if (ret
!= ARRAY_SIZE(msgs
))
114 return ret
< 0 ? ret
: -EIO
;
120 * cyapa_i2c_write - Execute i2c block data write operation
121 * @cyapa: Handle to this driver
122 * @ret: Offset of the data to written in the register map
123 * @len: number of bytes to write
124 * @values: Data to be written
126 * Return negative errno code on error; return zero when success.
128 static int cyapa_i2c_write(struct cyapa
*cyapa
, u8 reg
,
129 size_t len
, const void *values
)
131 struct i2c_client
*client
= cyapa
->client
;
135 if (len
> sizeof(buf
) - 1)
139 memcpy(&buf
[1], values
, len
);
141 ret
= i2c_master_send(client
, buf
, len
+ 1);
143 return ret
< 0 ? ret
: -EIO
;
148 static u8
cyapa_check_adapter_functionality(struct i2c_client
*client
)
150 u8 ret
= CYAPA_ADAPTER_FUNC_NONE
;
152 if (i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
))
153 ret
|= CYAPA_ADAPTER_FUNC_I2C
;
154 if (i2c_check_functionality(client
->adapter
, I2C_FUNC_SMBUS_BYTE_DATA
|
155 I2C_FUNC_SMBUS_BLOCK_DATA
|
156 I2C_FUNC_SMBUS_I2C_BLOCK
))
157 ret
|= CYAPA_ADAPTER_FUNC_SMBUS
;
162 * Query device for its current operating state.
164 static int cyapa_get_state(struct cyapa
*cyapa
)
166 u8 status
[BL_STATUS_SIZE
];
168 /* The i2c address of gen4 and gen5 trackpad device must be even. */
169 bool even_addr
= ((cyapa
->client
->addr
& 0x0001) == 0);
174 cyapa
->state
= CYAPA_STATE_NO_DEVICE
;
177 * Get trackpad status by reading 3 registers starting from 0.
178 * If the device is in the bootloader, this will be BL_HEAD.
179 * If the device is in operation mode, this will be the DATA regs.
182 error
= cyapa_i2c_reg_read_block(cyapa
, BL_HEAD_OFFSET
, BL_STATUS_SIZE
,
186 * On smbus systems in OP mode, the i2c_reg_read will fail with
187 * -ETIMEDOUT. In this case, try again using the smbus equivalent
188 * command. This should return a BL_HEAD indicating CYAPA_STATE_OP.
190 if (cyapa
->smbus
&& (error
== -ETIMEDOUT
|| error
== -ENXIO
)) {
192 error
= cyapa_read_block(cyapa
,
193 CYAPA_CMD_BL_STATUS
, status
);
197 if (error
!= BL_STATUS_SIZE
)
201 * Detect trackpad protocol based on characteristic registers and bits.
204 cyapa
->status
[REG_OP_STATUS
] = status
[REG_OP_STATUS
];
205 cyapa
->status
[REG_BL_STATUS
] = status
[REG_BL_STATUS
];
206 cyapa
->status
[REG_BL_ERROR
] = status
[REG_BL_ERROR
];
208 if (cyapa
->gen
== CYAPA_GEN_UNKNOWN
||
209 cyapa
->gen
== CYAPA_GEN3
) {
210 error
= cyapa_gen3_ops
.state_parse(cyapa
,
211 status
, BL_STATUS_SIZE
);
215 if (cyapa
->gen
== CYAPA_GEN_UNKNOWN
||
216 cyapa
->gen
== CYAPA_GEN6
||
217 cyapa
->gen
== CYAPA_GEN5
) {
218 error
= cyapa_pip_state_parse(cyapa
,
219 status
, BL_STATUS_SIZE
);
223 /* For old Gen5 trackpads detecting. */
224 if ((cyapa
->gen
== CYAPA_GEN_UNKNOWN
||
225 cyapa
->gen
== CYAPA_GEN5
) &&
226 !smbus
&& even_addr
) {
227 error
= cyapa_gen5_ops
.state_parse(cyapa
,
228 status
, BL_STATUS_SIZE
);
234 * Write 0x00 0x00 to trackpad device to force update its
235 * status, then redo the detection again.
240 error
= cyapa_i2c_write(cyapa
, 0, 2, cmd
);
246 error
= cyapa_i2c_read(cyapa
, BL_HEAD_OFFSET
,
247 BL_STATUS_SIZE
, status
);
251 } while (--retries
> 0 && !smbus
);
256 if (cyapa
->state
<= CYAPA_STATE_BL_BUSY
)
261 return (error
< 0) ? error
: -EAGAIN
;
265 * Poll device for its status in a loop, waiting up to timeout for a response.
267 * When the device switches state, it usually takes ~300 ms.
268 * However, when running a new firmware image, the device must calibrate its
269 * sensors, which can take as long as 2 seconds.
271 * Note: The timeout has granularity of the polling rate, which is 100 ms.
274 * 0 when the device eventually responds with a valid non-busy state.
275 * -ETIMEDOUT if device never responds (too many -EAGAIN)
276 * -EAGAIN if bootload is busy, or unknown state.
279 int cyapa_poll_state(struct cyapa
*cyapa
, unsigned int timeout
)
282 int tries
= timeout
/ 100;
285 error
= cyapa_get_state(cyapa
);
286 if (!error
&& cyapa
->state
> CYAPA_STATE_BL_BUSY
)
292 return (error
== -EAGAIN
|| error
== -ETIMEDOUT
) ? -ETIMEDOUT
: error
;
296 * Check if device is operational.
298 * An operational device is responding, has exited bootloader, and has
299 * firmware supported by this driver.
303 * -EBUSY no device or in bootloader
304 * -EIO failure while reading from device
305 * -ETIMEDOUT timeout failure for bus idle or bus no response
306 * -EAGAIN device is still in bootloader
307 * if ->state = CYAPA_STATE_BL_IDLE, device has invalid firmware
308 * -EINVAL device is in operational mode, but not supported by this driver
309 * 0 device is supported
311 static int cyapa_check_is_operational(struct cyapa
*cyapa
)
315 error
= cyapa_poll_state(cyapa
, 4000);
319 switch (cyapa
->gen
) {
321 cyapa
->ops
= &cyapa_gen6_ops
;
324 cyapa
->ops
= &cyapa_gen5_ops
;
327 cyapa
->ops
= &cyapa_gen3_ops
;
333 error
= cyapa
->ops
->operational_check(cyapa
);
334 if (!error
&& cyapa_is_operational_mode(cyapa
))
335 cyapa
->operational
= true;
337 cyapa
->operational
= false;
344 * Returns 0 on device detected, negative errno on no device detected.
345 * And when the device is detected and operational, it will be reset to
346 * full power active mode automatically.
348 static int cyapa_detect(struct cyapa
*cyapa
)
350 struct device
*dev
= &cyapa
->client
->dev
;
353 error
= cyapa_check_is_operational(cyapa
);
355 if (error
!= -ETIMEDOUT
&& error
!= -ENODEV
&&
356 cyapa_is_bootloader_mode(cyapa
)) {
357 dev_warn(dev
, "device detected but not operational\n");
361 dev_err(dev
, "no device detected: %d\n", error
);
368 static int cyapa_open(struct input_dev
*input
)
370 struct cyapa
*cyapa
= input_get_drvdata(input
);
371 struct i2c_client
*client
= cyapa
->client
;
372 struct device
*dev
= &client
->dev
;
375 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
379 if (cyapa
->operational
) {
381 * though failed to set active power mode,
382 * but still may be able to work in lower scan rate
383 * when in operational mode.
385 error
= cyapa
->ops
->set_power_mode(cyapa
,
386 PWR_MODE_FULL_ACTIVE
, 0, false);
388 dev_warn(dev
, "set active power failed: %d\n", error
);
392 error
= cyapa_reinitialize(cyapa
);
393 if (error
|| !cyapa
->operational
) {
394 error
= error
? error
: -EAGAIN
;
399 enable_irq(client
->irq
);
400 if (!pm_runtime_enabled(dev
)) {
401 pm_runtime_set_active(dev
);
402 pm_runtime_enable(dev
);
405 pm_runtime_get_sync(dev
);
406 pm_runtime_mark_last_busy(dev
);
407 pm_runtime_put_sync_autosuspend(dev
);
409 mutex_unlock(&cyapa
->state_sync_lock
);
413 static void cyapa_close(struct input_dev
*input
)
415 struct cyapa
*cyapa
= input_get_drvdata(input
);
416 struct i2c_client
*client
= cyapa
->client
;
417 struct device
*dev
= &cyapa
->client
->dev
;
419 mutex_lock(&cyapa
->state_sync_lock
);
421 disable_irq(client
->irq
);
422 if (pm_runtime_enabled(dev
))
423 pm_runtime_disable(dev
);
424 pm_runtime_set_suspended(dev
);
426 if (cyapa
->operational
)
427 cyapa
->ops
->set_power_mode(cyapa
, PWR_MODE_OFF
, 0, false);
429 mutex_unlock(&cyapa
->state_sync_lock
);
432 static int cyapa_create_input_dev(struct cyapa
*cyapa
)
434 struct device
*dev
= &cyapa
->client
->dev
;
435 struct input_dev
*input
;
438 if (!cyapa
->physical_size_x
|| !cyapa
->physical_size_y
)
441 input
= devm_input_allocate_device(dev
);
443 dev_err(dev
, "failed to allocate memory for input device.\n");
447 input
->name
= CYAPA_NAME
;
448 input
->phys
= cyapa
->phys
;
449 input
->id
.bustype
= BUS_I2C
;
450 input
->id
.version
= 1;
451 input
->id
.product
= 0; /* Means any product in eventcomm. */
452 input
->dev
.parent
= &cyapa
->client
->dev
;
454 input
->open
= cyapa_open
;
455 input
->close
= cyapa_close
;
457 input_set_drvdata(input
, cyapa
);
459 __set_bit(EV_ABS
, input
->evbit
);
461 /* Finger position */
462 input_set_abs_params(input
, ABS_MT_POSITION_X
, 0, cyapa
->max_abs_x
, 0,
464 input_set_abs_params(input
, ABS_MT_POSITION_Y
, 0, cyapa
->max_abs_y
, 0,
466 input_set_abs_params(input
, ABS_MT_PRESSURE
, 0, cyapa
->max_z
, 0, 0);
467 if (cyapa
->gen
> CYAPA_GEN3
) {
468 input_set_abs_params(input
, ABS_MT_TOUCH_MAJOR
, 0, 255, 0, 0);
469 input_set_abs_params(input
, ABS_MT_TOUCH_MINOR
, 0, 255, 0, 0);
471 * Orientation is the angle between the vertical axis and
472 * the major axis of the contact ellipse.
473 * The range is -127 to 127.
474 * the positive direction is clockwise form the vertical axis.
475 * If the ellipse of contact degenerates into a circle,
476 * orientation is reported as 0.
478 * Also, for Gen5 trackpad the accurate of this orientation
479 * value is value + (-30 ~ 30).
481 input_set_abs_params(input
, ABS_MT_ORIENTATION
,
484 if (cyapa
->gen
>= CYAPA_GEN5
) {
485 input_set_abs_params(input
, ABS_MT_WIDTH_MAJOR
, 0, 255, 0, 0);
486 input_set_abs_params(input
, ABS_MT_WIDTH_MINOR
, 0, 255, 0, 0);
487 input_set_abs_params(input
, ABS_DISTANCE
, 0, 1, 0, 0);
490 input_abs_set_res(input
, ABS_MT_POSITION_X
,
491 cyapa
->max_abs_x
/ cyapa
->physical_size_x
);
492 input_abs_set_res(input
, ABS_MT_POSITION_Y
,
493 cyapa
->max_abs_y
/ cyapa
->physical_size_y
);
495 if (cyapa
->btn_capability
& CAPABILITY_LEFT_BTN_MASK
)
496 __set_bit(BTN_LEFT
, input
->keybit
);
497 if (cyapa
->btn_capability
& CAPABILITY_MIDDLE_BTN_MASK
)
498 __set_bit(BTN_MIDDLE
, input
->keybit
);
499 if (cyapa
->btn_capability
& CAPABILITY_RIGHT_BTN_MASK
)
500 __set_bit(BTN_RIGHT
, input
->keybit
);
502 if (cyapa
->btn_capability
== CAPABILITY_LEFT_BTN_MASK
)
503 __set_bit(INPUT_PROP_BUTTONPAD
, input
->propbit
);
505 /* Handle pointer emulation and unused slots in core */
506 error
= input_mt_init_slots(input
, CYAPA_MAX_MT_SLOTS
,
507 INPUT_MT_POINTER
| INPUT_MT_DROP_UNUSED
);
509 dev_err(dev
, "failed to initialize MT slots: %d\n", error
);
513 /* Register the device in input subsystem */
514 error
= input_register_device(input
);
516 dev_err(dev
, "failed to register input device: %d\n", error
);
520 cyapa
->input
= input
;
524 static void cyapa_enable_irq_for_cmd(struct cyapa
*cyapa
)
526 struct input_dev
*input
= cyapa
->input
;
528 if (!input
|| !input
->users
) {
530 * When input is NULL, TP must be in deep sleep mode.
531 * In this mode, later non-power I2C command will always failed
532 * if not bring it out of deep sleep mode firstly,
533 * so must command TP to active mode here.
535 if (!input
|| cyapa
->operational
)
536 cyapa
->ops
->set_power_mode(cyapa
,
537 PWR_MODE_FULL_ACTIVE
, 0, false);
538 /* Gen3 always using polling mode for command. */
539 if (cyapa
->gen
>= CYAPA_GEN5
)
540 enable_irq(cyapa
->client
->irq
);
544 static void cyapa_disable_irq_for_cmd(struct cyapa
*cyapa
)
546 struct input_dev
*input
= cyapa
->input
;
548 if (!input
|| !input
->users
) {
549 if (cyapa
->gen
>= CYAPA_GEN5
)
550 disable_irq(cyapa
->client
->irq
);
551 if (!input
|| cyapa
->operational
)
552 cyapa
->ops
->set_power_mode(cyapa
,
553 PWR_MODE_OFF
, 0, false);
558 * cyapa_sleep_time_to_pwr_cmd and cyapa_pwr_cmd_to_sleep_time
560 * These are helper functions that convert to and from integer idle
561 * times and register settings to write to the PowerMode register.
562 * The trackpad supports between 20ms to 1000ms scan intervals.
563 * The time will be increased in increments of 10ms from 20ms to 100ms.
564 * From 100ms to 1000ms, time will be increased in increments of 20ms.
566 * When Idle_Time < 100, the format to convert Idle_Time to Idle_Command is:
567 * Idle_Command = Idle Time / 10;
568 * When Idle_Time >= 100, the format to convert Idle_Time to Idle_Command is:
569 * Idle_Command = Idle Time / 20 + 5;
571 u8
cyapa_sleep_time_to_pwr_cmd(u16 sleep_time
)
575 sleep_time
= clamp_val(sleep_time
, 20, 1000);
576 encoded_time
= sleep_time
< 100 ? sleep_time
/ 10 : sleep_time
/ 20 + 5;
577 return (encoded_time
<< 2) & PWR_MODE_MASK
;
580 u16
cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode
)
582 u8 encoded_time
= pwr_mode
>> 2;
584 return (encoded_time
< 10) ? encoded_time
* 10
585 : (encoded_time
- 5) * 20;
588 /* 0 on driver initialize and detected successfully, negative on failure. */
589 static int cyapa_initialize(struct cyapa
*cyapa
)
593 cyapa
->state
= CYAPA_STATE_NO_DEVICE
;
594 cyapa
->gen
= CYAPA_GEN_UNKNOWN
;
595 mutex_init(&cyapa
->state_sync_lock
);
598 * Set to hard code default, they will be updated with trackpad set
599 * default values after probe and initialized.
601 cyapa
->suspend_power_mode
= PWR_MODE_SLEEP
;
602 cyapa
->suspend_sleep_time
=
603 cyapa_pwr_cmd_to_sleep_time(cyapa
->suspend_power_mode
);
605 /* ops.initialize() is aimed to prepare for module communications. */
606 error
= cyapa_gen3_ops
.initialize(cyapa
);
608 error
= cyapa_gen5_ops
.initialize(cyapa
);
610 error
= cyapa_gen6_ops
.initialize(cyapa
);
614 error
= cyapa_detect(cyapa
);
618 /* Power down the device until we need it. */
619 if (cyapa
->operational
)
620 cyapa
->ops
->set_power_mode(cyapa
, PWR_MODE_OFF
, 0, false);
625 static int cyapa_reinitialize(struct cyapa
*cyapa
)
627 struct device
*dev
= &cyapa
->client
->dev
;
628 struct input_dev
*input
= cyapa
->input
;
631 if (pm_runtime_enabled(dev
))
632 pm_runtime_disable(dev
);
634 /* Avoid command failures when TP was in OFF state. */
635 if (cyapa
->operational
)
636 cyapa
->ops
->set_power_mode(cyapa
,
637 PWR_MODE_FULL_ACTIVE
, 0, false);
639 error
= cyapa_detect(cyapa
);
643 if (!input
&& cyapa
->operational
) {
644 error
= cyapa_create_input_dev(cyapa
);
646 dev_err(dev
, "create input_dev instance failed: %d\n",
653 if (!input
|| !input
->users
) {
654 /* Reset to power OFF state to save power when no user open. */
655 if (cyapa
->operational
)
656 cyapa
->ops
->set_power_mode(cyapa
,
657 PWR_MODE_OFF
, 0, false);
658 } else if (!error
&& cyapa
->operational
) {
660 * Make sure only enable runtime PM when device is
661 * in operational mode and input->users > 0.
663 pm_runtime_set_active(dev
);
664 pm_runtime_enable(dev
);
666 pm_runtime_get_sync(dev
);
667 pm_runtime_mark_last_busy(dev
);
668 pm_runtime_put_sync_autosuspend(dev
);
674 static irqreturn_t
cyapa_irq(int irq
, void *dev_id
)
676 struct cyapa
*cyapa
= dev_id
;
677 struct device
*dev
= &cyapa
->client
->dev
;
680 if (device_may_wakeup(dev
))
681 pm_wakeup_event(dev
, 0);
683 /* Interrupt event can be caused by host command to trackpad device. */
684 if (cyapa
->ops
->irq_cmd_handler(cyapa
)) {
686 * Interrupt event maybe from trackpad device input reporting.
690 * Still in probing or in firmware image
691 * updating or reading.
693 cyapa
->ops
->sort_empty_output_data(cyapa
,
698 if (cyapa
->operational
) {
699 error
= cyapa
->ops
->irq_handler(cyapa
);
702 * Apply runtime power management to touch report event
703 * except the events caused by the command responses.
705 * It will introduce about 20~40 ms additional delay
706 * time in receiving for first valid touch report data.
707 * The time is used to execute device runtime resume
710 pm_runtime_get_sync(dev
);
711 pm_runtime_mark_last_busy(dev
);
712 pm_runtime_put_sync_autosuspend(dev
);
715 if (!cyapa
->operational
|| error
) {
716 if (!mutex_trylock(&cyapa
->state_sync_lock
)) {
717 cyapa
->ops
->sort_empty_output_data(cyapa
,
721 cyapa_reinitialize(cyapa
);
722 mutex_unlock(&cyapa
->state_sync_lock
);
731 **************************************************************
733 **************************************************************
735 #ifdef CONFIG_PM_SLEEP
736 static ssize_t
cyapa_show_suspend_scanrate(struct device
*dev
,
737 struct device_attribute
*attr
,
740 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
741 u8 pwr_cmd
= cyapa
->suspend_power_mode
;
746 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
750 pwr_cmd
= cyapa
->suspend_power_mode
;
751 sleep_time
= cyapa
->suspend_sleep_time
;
753 mutex_unlock(&cyapa
->state_sync_lock
);
756 case PWR_MODE_BTN_ONLY
:
757 len
= scnprintf(buf
, PAGE_SIZE
, "%s\n", BTN_ONLY_MODE_NAME
);
761 len
= scnprintf(buf
, PAGE_SIZE
, "%s\n", OFF_MODE_NAME
);
765 len
= scnprintf(buf
, PAGE_SIZE
, "%u\n",
766 cyapa
->gen
== CYAPA_GEN3
?
767 cyapa_pwr_cmd_to_sleep_time(pwr_cmd
) :
775 static ssize_t
cyapa_update_suspend_scanrate(struct device
*dev
,
776 struct device_attribute
*attr
,
777 const char *buf
, size_t count
)
779 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
783 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
787 if (sysfs_streq(buf
, BTN_ONLY_MODE_NAME
)) {
788 cyapa
->suspend_power_mode
= PWR_MODE_BTN_ONLY
;
789 } else if (sysfs_streq(buf
, OFF_MODE_NAME
)) {
790 cyapa
->suspend_power_mode
= PWR_MODE_OFF
;
791 } else if (!kstrtou16(buf
, 10, &sleep_time
)) {
792 cyapa
->suspend_sleep_time
= min_t(u16
, sleep_time
, 1000);
793 cyapa
->suspend_power_mode
=
794 cyapa_sleep_time_to_pwr_cmd(cyapa
->suspend_sleep_time
);
799 mutex_unlock(&cyapa
->state_sync_lock
);
804 static DEVICE_ATTR(suspend_scanrate_ms
, S_IRUGO
|S_IWUSR
,
805 cyapa_show_suspend_scanrate
,
806 cyapa_update_suspend_scanrate
);
808 static struct attribute
*cyapa_power_wakeup_entries
[] = {
809 &dev_attr_suspend_scanrate_ms
.attr
,
813 static const struct attribute_group cyapa_power_wakeup_group
= {
814 .name
= power_group_name
,
815 .attrs
= cyapa_power_wakeup_entries
,
818 static void cyapa_remove_power_wakeup_group(void *data
)
820 struct cyapa
*cyapa
= data
;
822 sysfs_unmerge_group(&cyapa
->client
->dev
.kobj
,
823 &cyapa_power_wakeup_group
);
826 static int cyapa_prepare_wakeup_controls(struct cyapa
*cyapa
)
828 struct i2c_client
*client
= cyapa
->client
;
829 struct device
*dev
= &client
->dev
;
832 if (device_can_wakeup(dev
)) {
833 error
= sysfs_merge_group(&client
->dev
.kobj
,
834 &cyapa_power_wakeup_group
);
836 dev_err(dev
, "failed to add power wakeup group: %d\n",
841 error
= devm_add_action(dev
,
842 cyapa_remove_power_wakeup_group
, cyapa
);
844 cyapa_remove_power_wakeup_group(cyapa
);
845 dev_err(dev
, "failed to add power cleanup action: %d\n",
854 static inline int cyapa_prepare_wakeup_controls(struct cyapa
*cyapa
)
858 #endif /* CONFIG_PM_SLEEP */
861 static ssize_t
cyapa_show_rt_suspend_scanrate(struct device
*dev
,
862 struct device_attribute
*attr
,
865 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
870 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
874 pwr_cmd
= cyapa
->runtime_suspend_power_mode
;
875 sleep_time
= cyapa
->runtime_suspend_sleep_time
;
877 mutex_unlock(&cyapa
->state_sync_lock
);
879 return scnprintf(buf
, PAGE_SIZE
, "%u\n",
880 cyapa
->gen
== CYAPA_GEN3
?
881 cyapa_pwr_cmd_to_sleep_time(pwr_cmd
) :
885 static ssize_t
cyapa_update_rt_suspend_scanrate(struct device
*dev
,
886 struct device_attribute
*attr
,
887 const char *buf
, size_t count
)
889 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
893 if (buf
== NULL
|| count
== 0 || kstrtou16(buf
, 10, &time
)) {
894 dev_err(dev
, "invalid runtime suspend scanrate ms parameter\n");
899 * When the suspend scanrate is changed, pm_runtime_get to resume
900 * a potentially suspended device, update to the new pwr_cmd
901 * and then pm_runtime_put to suspend into the new power mode.
903 pm_runtime_get_sync(dev
);
905 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
909 cyapa
->runtime_suspend_sleep_time
= min_t(u16
, time
, 1000);
910 cyapa
->runtime_suspend_power_mode
=
911 cyapa_sleep_time_to_pwr_cmd(cyapa
->runtime_suspend_sleep_time
);
913 mutex_unlock(&cyapa
->state_sync_lock
);
915 pm_runtime_put_sync_autosuspend(dev
);
920 static DEVICE_ATTR(runtime_suspend_scanrate_ms
, S_IRUGO
|S_IWUSR
,
921 cyapa_show_rt_suspend_scanrate
,
922 cyapa_update_rt_suspend_scanrate
);
924 static struct attribute
*cyapa_power_runtime_entries
[] = {
925 &dev_attr_runtime_suspend_scanrate_ms
.attr
,
929 static const struct attribute_group cyapa_power_runtime_group
= {
930 .name
= power_group_name
,
931 .attrs
= cyapa_power_runtime_entries
,
934 static void cyapa_remove_power_runtime_group(void *data
)
936 struct cyapa
*cyapa
= data
;
938 sysfs_unmerge_group(&cyapa
->client
->dev
.kobj
,
939 &cyapa_power_runtime_group
);
942 static int cyapa_start_runtime(struct cyapa
*cyapa
)
944 struct device
*dev
= &cyapa
->client
->dev
;
947 cyapa
->runtime_suspend_power_mode
= PWR_MODE_IDLE
;
948 cyapa
->runtime_suspend_sleep_time
=
949 cyapa_pwr_cmd_to_sleep_time(cyapa
->runtime_suspend_power_mode
);
951 error
= sysfs_merge_group(&dev
->kobj
, &cyapa_power_runtime_group
);
954 "failed to create power runtime group: %d\n", error
);
958 error
= devm_add_action(dev
, cyapa_remove_power_runtime_group
, cyapa
);
960 cyapa_remove_power_runtime_group(cyapa
);
962 "failed to add power runtime cleanup action: %d\n",
967 /* runtime is enabled until device is operational and opened. */
968 pm_runtime_set_suspended(dev
);
969 pm_runtime_use_autosuspend(dev
);
970 pm_runtime_set_autosuspend_delay(dev
, AUTOSUSPEND_DELAY
);
975 static inline int cyapa_start_runtime(struct cyapa
*cyapa
)
979 #endif /* CONFIG_PM */
981 static ssize_t
cyapa_show_fm_ver(struct device
*dev
,
982 struct device_attribute
*attr
, char *buf
)
985 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
987 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
990 error
= scnprintf(buf
, PAGE_SIZE
, "%d.%d\n", cyapa
->fw_maj_ver
,
992 mutex_unlock(&cyapa
->state_sync_lock
);
996 static ssize_t
cyapa_show_product_id(struct device
*dev
,
997 struct device_attribute
*attr
, char *buf
)
999 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1003 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1006 size
= scnprintf(buf
, PAGE_SIZE
, "%s\n", cyapa
->product_id
);
1007 mutex_unlock(&cyapa
->state_sync_lock
);
1011 static int cyapa_firmware(struct cyapa
*cyapa
, const char *fw_name
)
1013 struct device
*dev
= &cyapa
->client
->dev
;
1014 const struct firmware
*fw
;
1017 error
= request_firmware(&fw
, fw_name
, dev
);
1019 dev_err(dev
, "Could not load firmware from %s: %d\n",
1024 error
= cyapa
->ops
->check_fw(cyapa
, fw
);
1026 dev_err(dev
, "Invalid CYAPA firmware image: %s\n",
1032 * Resume the potentially suspended device because doing FW
1033 * update on a device not in the FULL mode has a chance to
1036 pm_runtime_get_sync(dev
);
1038 /* Require IRQ support for firmware update commands. */
1039 cyapa_enable_irq_for_cmd(cyapa
);
1041 error
= cyapa
->ops
->bl_enter(cyapa
);
1043 dev_err(dev
, "bl_enter failed, %d\n", error
);
1047 error
= cyapa
->ops
->bl_activate(cyapa
);
1049 dev_err(dev
, "bl_activate failed, %d\n", error
);
1053 error
= cyapa
->ops
->bl_initiate(cyapa
, fw
);
1055 dev_err(dev
, "bl_initiate failed, %d\n", error
);
1059 error
= cyapa
->ops
->update_fw(cyapa
, fw
);
1061 dev_err(dev
, "update_fw failed, %d\n", error
);
1066 cyapa_disable_irq_for_cmd(cyapa
);
1067 pm_runtime_put_noidle(dev
);
1070 release_firmware(fw
);
1074 static ssize_t
cyapa_update_fw_store(struct device
*dev
,
1075 struct device_attribute
*attr
,
1076 const char *buf
, size_t count
)
1078 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1079 char fw_name
[NAME_MAX
];
1082 if (count
>= NAME_MAX
) {
1083 dev_err(dev
, "File name too long\n");
1087 memcpy(fw_name
, buf
, count
);
1088 if (fw_name
[count
- 1] == '\n')
1089 fw_name
[count
- 1] = '\0';
1091 fw_name
[count
] = '\0';
1095 * Force the input device to be registered after the firmware
1096 * image is updated, so if the corresponding parameters updated
1097 * in the new firmware image can taken effect immediately.
1099 input_unregister_device(cyapa
->input
);
1100 cyapa
->input
= NULL
;
1103 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1106 * Whatever, do reinitialize to try to recover TP state to
1107 * previous state just as it entered fw update entrance.
1109 cyapa_reinitialize(cyapa
);
1113 error
= cyapa_firmware(cyapa
, fw_name
);
1115 dev_err(dev
, "firmware update failed: %d\n", error
);
1117 dev_dbg(dev
, "firmware update successfully done.\n");
1120 * Re-detect trackpad device states because firmware update process
1121 * will reset trackpad device into bootloader mode.
1123 ret
= cyapa_reinitialize(cyapa
);
1125 dev_err(dev
, "failed to re-detect after updated: %d\n", ret
);
1126 error
= error
? error
: ret
;
1129 mutex_unlock(&cyapa
->state_sync_lock
);
1131 return error
? error
: count
;
1134 static ssize_t
cyapa_calibrate_store(struct device
*dev
,
1135 struct device_attribute
*attr
,
1136 const char *buf
, size_t count
)
1138 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1141 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1145 if (cyapa
->operational
) {
1146 cyapa_enable_irq_for_cmd(cyapa
);
1147 error
= cyapa
->ops
->calibrate_store(dev
, attr
, buf
, count
);
1148 cyapa_disable_irq_for_cmd(cyapa
);
1150 error
= -EBUSY
; /* Still running in bootloader mode. */
1153 mutex_unlock(&cyapa
->state_sync_lock
);
1154 return error
< 0 ? error
: count
;
1157 static ssize_t
cyapa_show_baseline(struct device
*dev
,
1158 struct device_attribute
*attr
, char *buf
)
1160 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1163 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1167 if (cyapa
->operational
) {
1168 cyapa_enable_irq_for_cmd(cyapa
);
1169 error
= cyapa
->ops
->show_baseline(dev
, attr
, buf
);
1170 cyapa_disable_irq_for_cmd(cyapa
);
1172 error
= -EBUSY
; /* Still running in bootloader mode. */
1175 mutex_unlock(&cyapa
->state_sync_lock
);
1179 static char *cyapa_state_to_string(struct cyapa
*cyapa
)
1181 switch (cyapa
->state
) {
1182 case CYAPA_STATE_BL_BUSY
:
1183 return "bootloader busy";
1184 case CYAPA_STATE_BL_IDLE
:
1185 return "bootloader idle";
1186 case CYAPA_STATE_BL_ACTIVE
:
1187 return "bootloader active";
1188 case CYAPA_STATE_GEN5_BL
:
1189 case CYAPA_STATE_GEN6_BL
:
1190 return "bootloader";
1191 case CYAPA_STATE_OP
:
1192 case CYAPA_STATE_GEN5_APP
:
1193 case CYAPA_STATE_GEN6_APP
:
1194 return "operational"; /* Normal valid state. */
1196 return "invalid mode";
1200 static ssize_t
cyapa_show_mode(struct device
*dev
,
1201 struct device_attribute
*attr
, char *buf
)
1203 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1207 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1211 size
= scnprintf(buf
, PAGE_SIZE
, "gen%d %s\n",
1212 cyapa
->gen
, cyapa_state_to_string(cyapa
));
1214 mutex_unlock(&cyapa
->state_sync_lock
);
1218 static DEVICE_ATTR(firmware_version
, S_IRUGO
, cyapa_show_fm_ver
, NULL
);
1219 static DEVICE_ATTR(product_id
, S_IRUGO
, cyapa_show_product_id
, NULL
);
1220 static DEVICE_ATTR(update_fw
, S_IWUSR
, NULL
, cyapa_update_fw_store
);
1221 static DEVICE_ATTR(baseline
, S_IRUGO
, cyapa_show_baseline
, NULL
);
1222 static DEVICE_ATTR(calibrate
, S_IWUSR
, NULL
, cyapa_calibrate_store
);
1223 static DEVICE_ATTR(mode
, S_IRUGO
, cyapa_show_mode
, NULL
);
1225 static struct attribute
*cyapa_sysfs_entries
[] = {
1226 &dev_attr_firmware_version
.attr
,
1227 &dev_attr_product_id
.attr
,
1228 &dev_attr_update_fw
.attr
,
1229 &dev_attr_baseline
.attr
,
1230 &dev_attr_calibrate
.attr
,
1231 &dev_attr_mode
.attr
,
1235 static const struct attribute_group cyapa_sysfs_group
= {
1236 .attrs
= cyapa_sysfs_entries
,
1239 static void cyapa_remove_sysfs_group(void *data
)
1241 struct cyapa
*cyapa
= data
;
1243 sysfs_remove_group(&cyapa
->client
->dev
.kobj
, &cyapa_sysfs_group
);
1246 static void cyapa_disable_regulator(void *data
)
1248 struct cyapa
*cyapa
= data
;
1250 regulator_disable(cyapa
->vcc
);
1253 static int cyapa_probe(struct i2c_client
*client
,
1254 const struct i2c_device_id
*dev_id
)
1256 struct device
*dev
= &client
->dev
;
1257 struct cyapa
*cyapa
;
1259 union i2c_smbus_data dummy
;
1262 adapter_func
= cyapa_check_adapter_functionality(client
);
1263 if (adapter_func
== CYAPA_ADAPTER_FUNC_NONE
) {
1264 dev_err(dev
, "not a supported I2C/SMBus adapter\n");
1268 /* Make sure there is something at this address */
1269 if (i2c_smbus_xfer(client
->adapter
, client
->addr
, 0,
1270 I2C_SMBUS_READ
, 0, I2C_SMBUS_BYTE
, &dummy
) < 0)
1273 cyapa
= devm_kzalloc(dev
, sizeof(struct cyapa
), GFP_KERNEL
);
1277 /* i2c isn't supported, use smbus */
1278 if (adapter_func
== CYAPA_ADAPTER_FUNC_SMBUS
)
1279 cyapa
->smbus
= true;
1281 cyapa
->client
= client
;
1282 i2c_set_clientdata(client
, cyapa
);
1283 sprintf(cyapa
->phys
, "i2c-%d-%04x/input0", client
->adapter
->nr
,
1286 cyapa
->vcc
= devm_regulator_get(dev
, "vcc");
1287 if (IS_ERR(cyapa
->vcc
)) {
1288 error
= PTR_ERR(cyapa
->vcc
);
1289 dev_err(dev
, "failed to get vcc regulator: %d\n", error
);
1293 error
= regulator_enable(cyapa
->vcc
);
1295 dev_err(dev
, "failed to enable regulator: %d\n", error
);
1299 error
= devm_add_action(dev
, cyapa_disable_regulator
, cyapa
);
1301 cyapa_disable_regulator(cyapa
);
1302 dev_err(dev
, "failed to add disable regulator action: %d\n",
1307 error
= cyapa_initialize(cyapa
);
1309 dev_err(dev
, "failed to detect and initialize tp device.\n");
1313 error
= sysfs_create_group(&client
->dev
.kobj
, &cyapa_sysfs_group
);
1315 dev_err(dev
, "failed to create sysfs entries: %d\n", error
);
1319 error
= devm_add_action(dev
, cyapa_remove_sysfs_group
, cyapa
);
1321 cyapa_remove_sysfs_group(cyapa
);
1322 dev_err(dev
, "failed to add sysfs cleanup action: %d\n", error
);
1326 error
= cyapa_prepare_wakeup_controls(cyapa
);
1328 dev_err(dev
, "failed to prepare wakeup controls: %d\n", error
);
1332 error
= cyapa_start_runtime(cyapa
);
1334 dev_err(dev
, "failed to start pm_runtime: %d\n", error
);
1338 error
= devm_request_threaded_irq(dev
, client
->irq
,
1340 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
1343 dev_err(dev
, "failed to request threaded irq: %d\n", error
);
1347 /* Disable IRQ until the device is opened */
1348 disable_irq(client
->irq
);
1351 * Register the device in the input subsystem when it's operational.
1352 * Otherwise, keep in this driver, so it can be be recovered or updated
1353 * through the sysfs mode and update_fw interfaces by user or apps.
1355 if (cyapa
->operational
) {
1356 error
= cyapa_create_input_dev(cyapa
);
1358 dev_err(dev
, "create input_dev instance failed: %d\n",
1367 static int __maybe_unused
cyapa_suspend(struct device
*dev
)
1369 struct i2c_client
*client
= to_i2c_client(dev
);
1370 struct cyapa
*cyapa
= i2c_get_clientdata(client
);
1374 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1379 * Runtime PM is enable only when device is in operational mode and
1380 * users in use, so need check it before disable it to
1381 * avoid unbalance warning.
1383 if (pm_runtime_enabled(dev
))
1384 pm_runtime_disable(dev
);
1385 disable_irq(client
->irq
);
1388 * Set trackpad device to idle mode if wakeup is allowed,
1389 * otherwise turn off.
1391 if (cyapa
->operational
) {
1392 power_mode
= device_may_wakeup(dev
) ? cyapa
->suspend_power_mode
1394 error
= cyapa
->ops
->set_power_mode(cyapa
, power_mode
,
1395 cyapa
->suspend_sleep_time
, true);
1397 dev_err(dev
, "suspend set power mode failed: %d\n",
1402 * Disable proximity interrupt when system idle, want true touch to
1405 if (cyapa
->dev_pwr_mode
!= PWR_MODE_OFF
)
1406 cyapa
->ops
->set_proximity(cyapa
, false);
1408 if (device_may_wakeup(dev
))
1409 cyapa
->irq_wake
= (enable_irq_wake(client
->irq
) == 0);
1411 mutex_unlock(&cyapa
->state_sync_lock
);
1415 static int __maybe_unused
cyapa_resume(struct device
*dev
)
1417 struct i2c_client
*client
= to_i2c_client(dev
);
1418 struct cyapa
*cyapa
= i2c_get_clientdata(client
);
1421 mutex_lock(&cyapa
->state_sync_lock
);
1423 if (device_may_wakeup(dev
) && cyapa
->irq_wake
) {
1424 disable_irq_wake(client
->irq
);
1425 cyapa
->irq_wake
= false;
1429 * Update device states and runtime PM states.
1430 * Re-Enable proximity interrupt after enter operational mode.
1432 error
= cyapa_reinitialize(cyapa
);
1434 dev_warn(dev
, "failed to reinitialize TP device: %d\n", error
);
1436 enable_irq(client
->irq
);
1438 mutex_unlock(&cyapa
->state_sync_lock
);
1442 static int __maybe_unused
cyapa_runtime_suspend(struct device
*dev
)
1444 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1447 error
= cyapa
->ops
->set_power_mode(cyapa
,
1448 cyapa
->runtime_suspend_power_mode
,
1449 cyapa
->runtime_suspend_sleep_time
,
1452 dev_warn(dev
, "runtime suspend failed: %d\n", error
);
1457 static int __maybe_unused
cyapa_runtime_resume(struct device
*dev
)
1459 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1462 error
= cyapa
->ops
->set_power_mode(cyapa
,
1463 PWR_MODE_FULL_ACTIVE
, 0, false);
1465 dev_warn(dev
, "runtime resume failed: %d\n", error
);
1470 static const struct dev_pm_ops cyapa_pm_ops
= {
1471 SET_SYSTEM_SLEEP_PM_OPS(cyapa_suspend
, cyapa_resume
)
1472 SET_RUNTIME_PM_OPS(cyapa_runtime_suspend
, cyapa_runtime_resume
, NULL
)
1475 static const struct i2c_device_id cyapa_id_table
[] = {
1479 MODULE_DEVICE_TABLE(i2c
, cyapa_id_table
);
1482 static const struct acpi_device_id cyapa_acpi_id
[] = {
1483 { "CYAP0000", 0 }, /* Gen3 trackpad with 0x67 I2C address. */
1484 { "CYAP0001", 0 }, /* Gen5 trackpad with 0x24 I2C address. */
1485 { "CYAP0002", 0 }, /* Gen6 trackpad with 0x24 I2C address. */
1488 MODULE_DEVICE_TABLE(acpi
, cyapa_acpi_id
);
1492 static const struct of_device_id cyapa_of_match
[] = {
1493 { .compatible
= "cypress,cyapa" },
1496 MODULE_DEVICE_TABLE(of
, cyapa_of_match
);
1499 static struct i2c_driver cyapa_driver
= {
1502 .pm
= &cyapa_pm_ops
,
1503 .acpi_match_table
= ACPI_PTR(cyapa_acpi_id
),
1504 .of_match_table
= of_match_ptr(cyapa_of_match
),
1507 .probe
= cyapa_probe
,
1508 .id_table
= cyapa_id_table
,
1511 module_i2c_driver(cyapa_driver
);
1513 MODULE_DESCRIPTION("Cypress APA I2C Trackpad Driver");
1514 MODULE_AUTHOR("Dudley Du <dudl@cypress.com>");
1515 MODULE_LICENSE("GPL");