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 * @reg: 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, CYAPA_PM_ACTIVE
);
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
,
428 PWR_MODE_OFF
, 0, CYAPA_PM_DEACTIVE
);
430 mutex_unlock(&cyapa
->state_sync_lock
);
433 static int cyapa_create_input_dev(struct cyapa
*cyapa
)
435 struct device
*dev
= &cyapa
->client
->dev
;
436 struct input_dev
*input
;
439 if (!cyapa
->physical_size_x
|| !cyapa
->physical_size_y
)
442 input
= devm_input_allocate_device(dev
);
444 dev_err(dev
, "failed to allocate memory for input device.\n");
448 input
->name
= CYAPA_NAME
;
449 input
->phys
= cyapa
->phys
;
450 input
->id
.bustype
= BUS_I2C
;
451 input
->id
.version
= 1;
452 input
->id
.product
= 0; /* Means any product in eventcomm. */
453 input
->dev
.parent
= &cyapa
->client
->dev
;
455 input
->open
= cyapa_open
;
456 input
->close
= cyapa_close
;
458 input_set_drvdata(input
, cyapa
);
460 __set_bit(EV_ABS
, input
->evbit
);
462 /* Finger position */
463 input_set_abs_params(input
, ABS_MT_POSITION_X
, 0, cyapa
->max_abs_x
, 0,
465 input_set_abs_params(input
, ABS_MT_POSITION_Y
, 0, cyapa
->max_abs_y
, 0,
467 input_set_abs_params(input
, ABS_MT_PRESSURE
, 0, cyapa
->max_z
, 0, 0);
468 if (cyapa
->gen
> CYAPA_GEN3
) {
469 input_set_abs_params(input
, ABS_MT_TOUCH_MAJOR
, 0, 255, 0, 0);
470 input_set_abs_params(input
, ABS_MT_TOUCH_MINOR
, 0, 255, 0, 0);
472 * Orientation is the angle between the vertical axis and
473 * the major axis of the contact ellipse.
474 * The range is -127 to 127.
475 * the positive direction is clockwise form the vertical axis.
476 * If the ellipse of contact degenerates into a circle,
477 * orientation is reported as 0.
479 * Also, for Gen5 trackpad the accurate of this orientation
480 * value is value + (-30 ~ 30).
482 input_set_abs_params(input
, ABS_MT_ORIENTATION
,
485 if (cyapa
->gen
>= CYAPA_GEN5
) {
486 input_set_abs_params(input
, ABS_MT_WIDTH_MAJOR
, 0, 255, 0, 0);
487 input_set_abs_params(input
, ABS_MT_WIDTH_MINOR
, 0, 255, 0, 0);
488 input_set_abs_params(input
, ABS_DISTANCE
, 0, 1, 0, 0);
491 input_abs_set_res(input
, ABS_MT_POSITION_X
,
492 cyapa
->max_abs_x
/ cyapa
->physical_size_x
);
493 input_abs_set_res(input
, ABS_MT_POSITION_Y
,
494 cyapa
->max_abs_y
/ cyapa
->physical_size_y
);
496 if (cyapa
->btn_capability
& CAPABILITY_LEFT_BTN_MASK
)
497 __set_bit(BTN_LEFT
, input
->keybit
);
498 if (cyapa
->btn_capability
& CAPABILITY_MIDDLE_BTN_MASK
)
499 __set_bit(BTN_MIDDLE
, input
->keybit
);
500 if (cyapa
->btn_capability
& CAPABILITY_RIGHT_BTN_MASK
)
501 __set_bit(BTN_RIGHT
, input
->keybit
);
503 if (cyapa
->btn_capability
== CAPABILITY_LEFT_BTN_MASK
)
504 __set_bit(INPUT_PROP_BUTTONPAD
, input
->propbit
);
506 /* Handle pointer emulation and unused slots in core */
507 error
= input_mt_init_slots(input
, CYAPA_MAX_MT_SLOTS
,
508 INPUT_MT_POINTER
| INPUT_MT_DROP_UNUSED
);
510 dev_err(dev
, "failed to initialize MT slots: %d\n", error
);
514 /* Register the device in input subsystem */
515 error
= input_register_device(input
);
517 dev_err(dev
, "failed to register input device: %d\n", error
);
521 cyapa
->input
= input
;
525 static void cyapa_enable_irq_for_cmd(struct cyapa
*cyapa
)
527 struct input_dev
*input
= cyapa
->input
;
529 if (!input
|| !input_device_enabled(input
)) {
531 * When input is NULL, TP must be in deep sleep mode.
532 * In this mode, later non-power I2C command will always failed
533 * if not bring it out of deep sleep mode firstly,
534 * so must command TP to active mode here.
536 if (!input
|| cyapa
->operational
)
537 cyapa
->ops
->set_power_mode(cyapa
,
538 PWR_MODE_FULL_ACTIVE
, 0, CYAPA_PM_ACTIVE
);
539 /* Gen3 always using polling mode for command. */
540 if (cyapa
->gen
>= CYAPA_GEN5
)
541 enable_irq(cyapa
->client
->irq
);
545 static void cyapa_disable_irq_for_cmd(struct cyapa
*cyapa
)
547 struct input_dev
*input
= cyapa
->input
;
549 if (!input
|| !input_device_enabled(input
)) {
550 if (cyapa
->gen
>= CYAPA_GEN5
)
551 disable_irq(cyapa
->client
->irq
);
552 if (!input
|| cyapa
->operational
)
553 cyapa
->ops
->set_power_mode(cyapa
,
554 PWR_MODE_OFF
, 0, CYAPA_PM_ACTIVE
);
559 * cyapa_sleep_time_to_pwr_cmd and cyapa_pwr_cmd_to_sleep_time
561 * These are helper functions that convert to and from integer idle
562 * times and register settings to write to the PowerMode register.
563 * The trackpad supports between 20ms to 1000ms scan intervals.
564 * The time will be increased in increments of 10ms from 20ms to 100ms.
565 * From 100ms to 1000ms, time will be increased in increments of 20ms.
567 * When Idle_Time < 100, the format to convert Idle_Time to Idle_Command is:
568 * Idle_Command = Idle Time / 10;
569 * When Idle_Time >= 100, the format to convert Idle_Time to Idle_Command is:
570 * Idle_Command = Idle Time / 20 + 5;
572 u8
cyapa_sleep_time_to_pwr_cmd(u16 sleep_time
)
576 sleep_time
= clamp_val(sleep_time
, 20, 1000);
577 encoded_time
= sleep_time
< 100 ? sleep_time
/ 10 : sleep_time
/ 20 + 5;
578 return (encoded_time
<< 2) & PWR_MODE_MASK
;
581 u16
cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode
)
583 u8 encoded_time
= pwr_mode
>> 2;
585 return (encoded_time
< 10) ? encoded_time
* 10
586 : (encoded_time
- 5) * 20;
589 /* 0 on driver initialize and detected successfully, negative on failure. */
590 static int cyapa_initialize(struct cyapa
*cyapa
)
594 cyapa
->state
= CYAPA_STATE_NO_DEVICE
;
595 cyapa
->gen
= CYAPA_GEN_UNKNOWN
;
596 mutex_init(&cyapa
->state_sync_lock
);
599 * Set to hard code default, they will be updated with trackpad set
600 * default values after probe and initialized.
602 cyapa
->suspend_power_mode
= PWR_MODE_SLEEP
;
603 cyapa
->suspend_sleep_time
=
604 cyapa_pwr_cmd_to_sleep_time(cyapa
->suspend_power_mode
);
606 /* ops.initialize() is aimed to prepare for module communications. */
607 error
= cyapa_gen3_ops
.initialize(cyapa
);
609 error
= cyapa_gen5_ops
.initialize(cyapa
);
611 error
= cyapa_gen6_ops
.initialize(cyapa
);
615 error
= cyapa_detect(cyapa
);
619 /* Power down the device until we need it. */
620 if (cyapa
->operational
)
621 cyapa
->ops
->set_power_mode(cyapa
,
622 PWR_MODE_OFF
, 0, CYAPA_PM_ACTIVE
);
627 static int cyapa_reinitialize(struct cyapa
*cyapa
)
629 struct device
*dev
= &cyapa
->client
->dev
;
630 struct input_dev
*input
= cyapa
->input
;
633 if (pm_runtime_enabled(dev
))
634 pm_runtime_disable(dev
);
636 /* Avoid command failures when TP was in OFF state. */
637 if (cyapa
->operational
)
638 cyapa
->ops
->set_power_mode(cyapa
,
639 PWR_MODE_FULL_ACTIVE
, 0, CYAPA_PM_ACTIVE
);
641 error
= cyapa_detect(cyapa
);
645 if (!input
&& cyapa
->operational
) {
646 error
= cyapa_create_input_dev(cyapa
);
648 dev_err(dev
, "create input_dev instance failed: %d\n",
655 if (!input
|| !input_device_enabled(input
)) {
656 /* Reset to power OFF state to save power when no user open. */
657 if (cyapa
->operational
)
658 cyapa
->ops
->set_power_mode(cyapa
,
659 PWR_MODE_OFF
, 0, CYAPA_PM_DEACTIVE
);
660 } else if (!error
&& cyapa
->operational
) {
662 * Make sure only enable runtime PM when device is
663 * in operational mode and input->users > 0.
665 pm_runtime_set_active(dev
);
666 pm_runtime_enable(dev
);
668 pm_runtime_get_sync(dev
);
669 pm_runtime_mark_last_busy(dev
);
670 pm_runtime_put_sync_autosuspend(dev
);
676 static irqreturn_t
cyapa_irq(int irq
, void *dev_id
)
678 struct cyapa
*cyapa
= dev_id
;
679 struct device
*dev
= &cyapa
->client
->dev
;
682 if (device_may_wakeup(dev
))
683 pm_wakeup_event(dev
, 0);
685 /* Interrupt event can be caused by host command to trackpad device. */
686 if (cyapa
->ops
->irq_cmd_handler(cyapa
)) {
688 * Interrupt event maybe from trackpad device input reporting.
692 * Still in probing or in firmware image
693 * updating or reading.
695 cyapa
->ops
->sort_empty_output_data(cyapa
,
700 if (cyapa
->operational
) {
701 error
= cyapa
->ops
->irq_handler(cyapa
);
704 * Apply runtime power management to touch report event
705 * except the events caused by the command responses.
707 * It will introduce about 20~40 ms additional delay
708 * time in receiving for first valid touch report data.
709 * The time is used to execute device runtime resume
712 pm_runtime_get_sync(dev
);
713 pm_runtime_mark_last_busy(dev
);
714 pm_runtime_put_sync_autosuspend(dev
);
717 if (!cyapa
->operational
|| error
) {
718 if (!mutex_trylock(&cyapa
->state_sync_lock
)) {
719 cyapa
->ops
->sort_empty_output_data(cyapa
,
723 cyapa_reinitialize(cyapa
);
724 mutex_unlock(&cyapa
->state_sync_lock
);
733 **************************************************************
735 **************************************************************
737 #ifdef CONFIG_PM_SLEEP
738 static ssize_t
cyapa_show_suspend_scanrate(struct device
*dev
,
739 struct device_attribute
*attr
,
742 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
748 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
752 pwr_cmd
= cyapa
->suspend_power_mode
;
753 sleep_time
= cyapa
->suspend_sleep_time
;
755 mutex_unlock(&cyapa
->state_sync_lock
);
758 case PWR_MODE_BTN_ONLY
:
759 len
= scnprintf(buf
, PAGE_SIZE
, "%s\n", BTN_ONLY_MODE_NAME
);
763 len
= scnprintf(buf
, PAGE_SIZE
, "%s\n", OFF_MODE_NAME
);
767 len
= scnprintf(buf
, PAGE_SIZE
, "%u\n",
768 cyapa
->gen
== CYAPA_GEN3
?
769 cyapa_pwr_cmd_to_sleep_time(pwr_cmd
) :
777 static ssize_t
cyapa_update_suspend_scanrate(struct device
*dev
,
778 struct device_attribute
*attr
,
779 const char *buf
, size_t count
)
781 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
785 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
789 if (sysfs_streq(buf
, BTN_ONLY_MODE_NAME
)) {
790 cyapa
->suspend_power_mode
= PWR_MODE_BTN_ONLY
;
791 } else if (sysfs_streq(buf
, OFF_MODE_NAME
)) {
792 cyapa
->suspend_power_mode
= PWR_MODE_OFF
;
793 } else if (!kstrtou16(buf
, 10, &sleep_time
)) {
794 cyapa
->suspend_sleep_time
= min_t(u16
, sleep_time
, 1000);
795 cyapa
->suspend_power_mode
=
796 cyapa_sleep_time_to_pwr_cmd(cyapa
->suspend_sleep_time
);
801 mutex_unlock(&cyapa
->state_sync_lock
);
806 static DEVICE_ATTR(suspend_scanrate_ms
, S_IRUGO
|S_IWUSR
,
807 cyapa_show_suspend_scanrate
,
808 cyapa_update_suspend_scanrate
);
810 static struct attribute
*cyapa_power_wakeup_entries
[] = {
811 &dev_attr_suspend_scanrate_ms
.attr
,
815 static const struct attribute_group cyapa_power_wakeup_group
= {
816 .name
= power_group_name
,
817 .attrs
= cyapa_power_wakeup_entries
,
820 static void cyapa_remove_power_wakeup_group(void *data
)
822 struct cyapa
*cyapa
= data
;
824 sysfs_unmerge_group(&cyapa
->client
->dev
.kobj
,
825 &cyapa_power_wakeup_group
);
828 static int cyapa_prepare_wakeup_controls(struct cyapa
*cyapa
)
830 struct i2c_client
*client
= cyapa
->client
;
831 struct device
*dev
= &client
->dev
;
834 if (device_can_wakeup(dev
)) {
835 error
= sysfs_merge_group(&dev
->kobj
,
836 &cyapa_power_wakeup_group
);
838 dev_err(dev
, "failed to add power wakeup group: %d\n",
843 error
= devm_add_action_or_reset(dev
,
844 cyapa_remove_power_wakeup_group
, cyapa
);
846 dev_err(dev
, "failed to add power cleanup action: %d\n",
855 static inline int cyapa_prepare_wakeup_controls(struct cyapa
*cyapa
)
859 #endif /* CONFIG_PM_SLEEP */
862 static ssize_t
cyapa_show_rt_suspend_scanrate(struct device
*dev
,
863 struct device_attribute
*attr
,
866 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
871 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
875 pwr_cmd
= cyapa
->runtime_suspend_power_mode
;
876 sleep_time
= cyapa
->runtime_suspend_sleep_time
;
878 mutex_unlock(&cyapa
->state_sync_lock
);
880 return scnprintf(buf
, PAGE_SIZE
, "%u\n",
881 cyapa
->gen
== CYAPA_GEN3
?
882 cyapa_pwr_cmd_to_sleep_time(pwr_cmd
) :
886 static ssize_t
cyapa_update_rt_suspend_scanrate(struct device
*dev
,
887 struct device_attribute
*attr
,
888 const char *buf
, size_t count
)
890 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
894 if (buf
== NULL
|| count
== 0 || kstrtou16(buf
, 10, &time
)) {
895 dev_err(dev
, "invalid runtime suspend scanrate ms parameter\n");
900 * When the suspend scanrate is changed, pm_runtime_get to resume
901 * a potentially suspended device, update to the new pwr_cmd
902 * and then pm_runtime_put to suspend into the new power mode.
904 pm_runtime_get_sync(dev
);
906 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
910 cyapa
->runtime_suspend_sleep_time
= min_t(u16
, time
, 1000);
911 cyapa
->runtime_suspend_power_mode
=
912 cyapa_sleep_time_to_pwr_cmd(cyapa
->runtime_suspend_sleep_time
);
914 mutex_unlock(&cyapa
->state_sync_lock
);
916 pm_runtime_put_sync_autosuspend(dev
);
921 static DEVICE_ATTR(runtime_suspend_scanrate_ms
, S_IRUGO
|S_IWUSR
,
922 cyapa_show_rt_suspend_scanrate
,
923 cyapa_update_rt_suspend_scanrate
);
925 static struct attribute
*cyapa_power_runtime_entries
[] = {
926 &dev_attr_runtime_suspend_scanrate_ms
.attr
,
930 static const struct attribute_group cyapa_power_runtime_group
= {
931 .name
= power_group_name
,
932 .attrs
= cyapa_power_runtime_entries
,
935 static void cyapa_remove_power_runtime_group(void *data
)
937 struct cyapa
*cyapa
= data
;
939 sysfs_unmerge_group(&cyapa
->client
->dev
.kobj
,
940 &cyapa_power_runtime_group
);
943 static int cyapa_start_runtime(struct cyapa
*cyapa
)
945 struct device
*dev
= &cyapa
->client
->dev
;
948 cyapa
->runtime_suspend_power_mode
= PWR_MODE_IDLE
;
949 cyapa
->runtime_suspend_sleep_time
=
950 cyapa_pwr_cmd_to_sleep_time(cyapa
->runtime_suspend_power_mode
);
952 error
= sysfs_merge_group(&dev
->kobj
, &cyapa_power_runtime_group
);
955 "failed to create power runtime group: %d\n", error
);
959 error
= devm_add_action_or_reset(dev
, cyapa_remove_power_runtime_group
,
963 "failed to add power runtime cleanup action: %d\n",
968 /* runtime is enabled until device is operational and opened. */
969 pm_runtime_set_suspended(dev
);
970 pm_runtime_use_autosuspend(dev
);
971 pm_runtime_set_autosuspend_delay(dev
, AUTOSUSPEND_DELAY
);
976 static inline int cyapa_start_runtime(struct cyapa
*cyapa
)
980 #endif /* CONFIG_PM */
982 static ssize_t
cyapa_show_fm_ver(struct device
*dev
,
983 struct device_attribute
*attr
, char *buf
)
986 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
988 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
991 error
= scnprintf(buf
, PAGE_SIZE
, "%d.%d\n", cyapa
->fw_maj_ver
,
993 mutex_unlock(&cyapa
->state_sync_lock
);
997 static ssize_t
cyapa_show_product_id(struct device
*dev
,
998 struct device_attribute
*attr
, char *buf
)
1000 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1004 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1007 size
= scnprintf(buf
, PAGE_SIZE
, "%s\n", cyapa
->product_id
);
1008 mutex_unlock(&cyapa
->state_sync_lock
);
1012 static int cyapa_firmware(struct cyapa
*cyapa
, const char *fw_name
)
1014 struct device
*dev
= &cyapa
->client
->dev
;
1015 const struct firmware
*fw
;
1018 error
= request_firmware(&fw
, fw_name
, dev
);
1020 dev_err(dev
, "Could not load firmware from %s: %d\n",
1025 error
= cyapa
->ops
->check_fw(cyapa
, fw
);
1027 dev_err(dev
, "Invalid CYAPA firmware image: %s\n",
1033 * Resume the potentially suspended device because doing FW
1034 * update on a device not in the FULL mode has a chance to
1037 pm_runtime_get_sync(dev
);
1039 /* Require IRQ support for firmware update commands. */
1040 cyapa_enable_irq_for_cmd(cyapa
);
1042 error
= cyapa
->ops
->bl_enter(cyapa
);
1044 dev_err(dev
, "bl_enter failed, %d\n", error
);
1048 error
= cyapa
->ops
->bl_activate(cyapa
);
1050 dev_err(dev
, "bl_activate failed, %d\n", error
);
1054 error
= cyapa
->ops
->bl_initiate(cyapa
, fw
);
1056 dev_err(dev
, "bl_initiate failed, %d\n", error
);
1060 error
= cyapa
->ops
->update_fw(cyapa
, fw
);
1062 dev_err(dev
, "update_fw failed, %d\n", error
);
1067 cyapa_disable_irq_for_cmd(cyapa
);
1068 pm_runtime_put_noidle(dev
);
1071 release_firmware(fw
);
1075 static ssize_t
cyapa_update_fw_store(struct device
*dev
,
1076 struct device_attribute
*attr
,
1077 const char *buf
, size_t count
)
1079 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1080 char fw_name
[NAME_MAX
];
1083 if (count
>= NAME_MAX
) {
1084 dev_err(dev
, "File name too long\n");
1088 memcpy(fw_name
, buf
, count
);
1089 if (fw_name
[count
- 1] == '\n')
1090 fw_name
[count
- 1] = '\0';
1092 fw_name
[count
] = '\0';
1096 * Force the input device to be registered after the firmware
1097 * image is updated, so if the corresponding parameters updated
1098 * in the new firmware image can taken effect immediately.
1100 input_unregister_device(cyapa
->input
);
1101 cyapa
->input
= NULL
;
1104 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1107 * Whatever, do reinitialize to try to recover TP state to
1108 * previous state just as it entered fw update entrance.
1110 cyapa_reinitialize(cyapa
);
1114 error
= cyapa_firmware(cyapa
, fw_name
);
1116 dev_err(dev
, "firmware update failed: %d\n", error
);
1118 dev_dbg(dev
, "firmware update successfully done.\n");
1121 * Re-detect trackpad device states because firmware update process
1122 * will reset trackpad device into bootloader mode.
1124 ret
= cyapa_reinitialize(cyapa
);
1126 dev_err(dev
, "failed to re-detect after updated: %d\n", ret
);
1127 error
= error
? error
: ret
;
1130 mutex_unlock(&cyapa
->state_sync_lock
);
1132 return error
? error
: count
;
1135 static ssize_t
cyapa_calibrate_store(struct device
*dev
,
1136 struct device_attribute
*attr
,
1137 const char *buf
, size_t count
)
1139 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1142 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1146 if (cyapa
->operational
) {
1147 cyapa_enable_irq_for_cmd(cyapa
);
1148 error
= cyapa
->ops
->calibrate_store(dev
, attr
, buf
, count
);
1149 cyapa_disable_irq_for_cmd(cyapa
);
1151 error
= -EBUSY
; /* Still running in bootloader mode. */
1154 mutex_unlock(&cyapa
->state_sync_lock
);
1155 return error
< 0 ? error
: count
;
1158 static ssize_t
cyapa_show_baseline(struct device
*dev
,
1159 struct device_attribute
*attr
, char *buf
)
1161 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1164 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1168 if (cyapa
->operational
) {
1169 cyapa_enable_irq_for_cmd(cyapa
);
1170 error
= cyapa
->ops
->show_baseline(dev
, attr
, buf
);
1171 cyapa_disable_irq_for_cmd(cyapa
);
1173 error
= -EBUSY
; /* Still running in bootloader mode. */
1176 mutex_unlock(&cyapa
->state_sync_lock
);
1180 static char *cyapa_state_to_string(struct cyapa
*cyapa
)
1182 switch (cyapa
->state
) {
1183 case CYAPA_STATE_BL_BUSY
:
1184 return "bootloader busy";
1185 case CYAPA_STATE_BL_IDLE
:
1186 return "bootloader idle";
1187 case CYAPA_STATE_BL_ACTIVE
:
1188 return "bootloader active";
1189 case CYAPA_STATE_GEN5_BL
:
1190 case CYAPA_STATE_GEN6_BL
:
1191 return "bootloader";
1192 case CYAPA_STATE_OP
:
1193 case CYAPA_STATE_GEN5_APP
:
1194 case CYAPA_STATE_GEN6_APP
:
1195 return "operational"; /* Normal valid state. */
1197 return "invalid mode";
1201 static ssize_t
cyapa_show_mode(struct device
*dev
,
1202 struct device_attribute
*attr
, char *buf
)
1204 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1208 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1212 size
= scnprintf(buf
, PAGE_SIZE
, "gen%d %s\n",
1213 cyapa
->gen
, cyapa_state_to_string(cyapa
));
1215 mutex_unlock(&cyapa
->state_sync_lock
);
1219 static DEVICE_ATTR(firmware_version
, S_IRUGO
, cyapa_show_fm_ver
, NULL
);
1220 static DEVICE_ATTR(product_id
, S_IRUGO
, cyapa_show_product_id
, NULL
);
1221 static DEVICE_ATTR(update_fw
, S_IWUSR
, NULL
, cyapa_update_fw_store
);
1222 static DEVICE_ATTR(baseline
, S_IRUGO
, cyapa_show_baseline
, NULL
);
1223 static DEVICE_ATTR(calibrate
, S_IWUSR
, NULL
, cyapa_calibrate_store
);
1224 static DEVICE_ATTR(mode
, S_IRUGO
, cyapa_show_mode
, NULL
);
1226 static struct attribute
*cyapa_sysfs_entries
[] = {
1227 &dev_attr_firmware_version
.attr
,
1228 &dev_attr_product_id
.attr
,
1229 &dev_attr_update_fw
.attr
,
1230 &dev_attr_baseline
.attr
,
1231 &dev_attr_calibrate
.attr
,
1232 &dev_attr_mode
.attr
,
1236 static const struct attribute_group cyapa_sysfs_group
= {
1237 .attrs
= cyapa_sysfs_entries
,
1240 static void cyapa_disable_regulator(void *data
)
1242 struct cyapa
*cyapa
= data
;
1244 regulator_disable(cyapa
->vcc
);
1247 static int cyapa_probe(struct i2c_client
*client
,
1248 const struct i2c_device_id
*dev_id
)
1250 struct device
*dev
= &client
->dev
;
1251 struct cyapa
*cyapa
;
1253 union i2c_smbus_data dummy
;
1256 adapter_func
= cyapa_check_adapter_functionality(client
);
1257 if (adapter_func
== CYAPA_ADAPTER_FUNC_NONE
) {
1258 dev_err(dev
, "not a supported I2C/SMBus adapter\n");
1262 /* Make sure there is something at this address */
1263 if (i2c_smbus_xfer(client
->adapter
, client
->addr
, 0,
1264 I2C_SMBUS_READ
, 0, I2C_SMBUS_BYTE
, &dummy
) < 0)
1267 cyapa
= devm_kzalloc(dev
, sizeof(struct cyapa
), GFP_KERNEL
);
1271 /* i2c isn't supported, use smbus */
1272 if (adapter_func
== CYAPA_ADAPTER_FUNC_SMBUS
)
1273 cyapa
->smbus
= true;
1275 cyapa
->client
= client
;
1276 i2c_set_clientdata(client
, cyapa
);
1277 sprintf(cyapa
->phys
, "i2c-%d-%04x/input0", client
->adapter
->nr
,
1280 cyapa
->vcc
= devm_regulator_get(dev
, "vcc");
1281 if (IS_ERR(cyapa
->vcc
)) {
1282 error
= PTR_ERR(cyapa
->vcc
);
1283 dev_err(dev
, "failed to get vcc regulator: %d\n", error
);
1287 error
= regulator_enable(cyapa
->vcc
);
1289 dev_err(dev
, "failed to enable regulator: %d\n", error
);
1293 error
= devm_add_action_or_reset(dev
, cyapa_disable_regulator
, cyapa
);
1295 dev_err(dev
, "failed to add disable regulator action: %d\n",
1300 error
= cyapa_initialize(cyapa
);
1302 dev_err(dev
, "failed to detect and initialize tp device.\n");
1306 error
= devm_device_add_group(dev
, &cyapa_sysfs_group
);
1308 dev_err(dev
, "failed to create sysfs entries: %d\n", error
);
1312 error
= cyapa_prepare_wakeup_controls(cyapa
);
1314 dev_err(dev
, "failed to prepare wakeup controls: %d\n", error
);
1318 error
= cyapa_start_runtime(cyapa
);
1320 dev_err(dev
, "failed to start pm_runtime: %d\n", error
);
1324 error
= devm_request_threaded_irq(dev
, client
->irq
,
1326 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
1329 dev_err(dev
, "failed to request threaded irq: %d\n", error
);
1333 /* Disable IRQ until the device is opened */
1334 disable_irq(client
->irq
);
1337 * Register the device in the input subsystem when it's operational.
1338 * Otherwise, keep in this driver, so it can be be recovered or updated
1339 * through the sysfs mode and update_fw interfaces by user or apps.
1341 if (cyapa
->operational
) {
1342 error
= cyapa_create_input_dev(cyapa
);
1344 dev_err(dev
, "create input_dev instance failed: %d\n",
1353 static int __maybe_unused
cyapa_suspend(struct device
*dev
)
1355 struct i2c_client
*client
= to_i2c_client(dev
);
1356 struct cyapa
*cyapa
= i2c_get_clientdata(client
);
1360 error
= mutex_lock_interruptible(&cyapa
->state_sync_lock
);
1365 * Runtime PM is enable only when device is in operational mode and
1366 * users in use, so need check it before disable it to
1367 * avoid unbalance warning.
1369 if (pm_runtime_enabled(dev
))
1370 pm_runtime_disable(dev
);
1371 disable_irq(client
->irq
);
1374 * Set trackpad device to idle mode if wakeup is allowed,
1375 * otherwise turn off.
1377 if (cyapa
->operational
) {
1378 power_mode
= device_may_wakeup(dev
) ? cyapa
->suspend_power_mode
1380 error
= cyapa
->ops
->set_power_mode(cyapa
, power_mode
,
1381 cyapa
->suspend_sleep_time
, CYAPA_PM_SUSPEND
);
1383 dev_err(dev
, "suspend set power mode failed: %d\n",
1388 * Disable proximity interrupt when system idle, want true touch to
1391 if (cyapa
->dev_pwr_mode
!= PWR_MODE_OFF
)
1392 cyapa
->ops
->set_proximity(cyapa
, false);
1394 if (device_may_wakeup(dev
))
1395 cyapa
->irq_wake
= (enable_irq_wake(client
->irq
) == 0);
1397 mutex_unlock(&cyapa
->state_sync_lock
);
1401 static int __maybe_unused
cyapa_resume(struct device
*dev
)
1403 struct i2c_client
*client
= to_i2c_client(dev
);
1404 struct cyapa
*cyapa
= i2c_get_clientdata(client
);
1407 mutex_lock(&cyapa
->state_sync_lock
);
1409 if (device_may_wakeup(dev
) && cyapa
->irq_wake
) {
1410 disable_irq_wake(client
->irq
);
1411 cyapa
->irq_wake
= false;
1415 * Update device states and runtime PM states.
1416 * Re-Enable proximity interrupt after enter operational mode.
1418 error
= cyapa_reinitialize(cyapa
);
1420 dev_warn(dev
, "failed to reinitialize TP device: %d\n", error
);
1422 enable_irq(client
->irq
);
1424 mutex_unlock(&cyapa
->state_sync_lock
);
1428 static int __maybe_unused
cyapa_runtime_suspend(struct device
*dev
)
1430 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1433 error
= cyapa
->ops
->set_power_mode(cyapa
,
1434 cyapa
->runtime_suspend_power_mode
,
1435 cyapa
->runtime_suspend_sleep_time
,
1436 CYAPA_PM_RUNTIME_SUSPEND
);
1438 dev_warn(dev
, "runtime suspend failed: %d\n", error
);
1443 static int __maybe_unused
cyapa_runtime_resume(struct device
*dev
)
1445 struct cyapa
*cyapa
= dev_get_drvdata(dev
);
1448 error
= cyapa
->ops
->set_power_mode(cyapa
,
1449 PWR_MODE_FULL_ACTIVE
, 0, CYAPA_PM_RUNTIME_RESUME
);
1451 dev_warn(dev
, "runtime resume failed: %d\n", error
);
1456 static const struct dev_pm_ops cyapa_pm_ops
= {
1457 SET_SYSTEM_SLEEP_PM_OPS(cyapa_suspend
, cyapa_resume
)
1458 SET_RUNTIME_PM_OPS(cyapa_runtime_suspend
, cyapa_runtime_resume
, NULL
)
1461 static const struct i2c_device_id cyapa_id_table
[] = {
1465 MODULE_DEVICE_TABLE(i2c
, cyapa_id_table
);
1468 static const struct acpi_device_id cyapa_acpi_id
[] = {
1469 { "CYAP0000", 0 }, /* Gen3 trackpad with 0x67 I2C address. */
1470 { "CYAP0001", 0 }, /* Gen5 trackpad with 0x24 I2C address. */
1471 { "CYAP0002", 0 }, /* Gen6 trackpad with 0x24 I2C address. */
1474 MODULE_DEVICE_TABLE(acpi
, cyapa_acpi_id
);
1478 static const struct of_device_id cyapa_of_match
[] = {
1479 { .compatible
= "cypress,cyapa" },
1482 MODULE_DEVICE_TABLE(of
, cyapa_of_match
);
1485 static struct i2c_driver cyapa_driver
= {
1488 .pm
= &cyapa_pm_ops
,
1489 .acpi_match_table
= ACPI_PTR(cyapa_acpi_id
),
1490 .of_match_table
= of_match_ptr(cyapa_of_match
),
1493 .probe
= cyapa_probe
,
1494 .id_table
= cyapa_id_table
,
1497 module_i2c_driver(cyapa_driver
);
1499 MODULE_DESCRIPTION("Cypress APA I2C Trackpad Driver");
1500 MODULE_AUTHOR("Dudley Du <dudl@cypress.com>");
1501 MODULE_LICENSE("GPL");