1 // SPDX-License-Identifier: GPL-2.0
2 // STMicroelectronics FTS Touchscreen device driver
4 // Copyright (c) 2017 Samsung Electronics Co., Ltd.
5 // Copyright (c) 2017 Andi Shyti <andi.shyti@samsung.com>
7 #include <linux/delay.h>
9 #include <linux/input/mt.h>
10 #include <linux/input/touchscreen.h>
11 #include <linux/interrupt.h>
12 #include <linux/irq.h>
13 #include <linux/leds.h>
14 #include <linux/module.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/regulator/consumer.h>
19 #define STMFTS_READ_INFO 0x80
20 #define STMFTS_READ_STATUS 0x84
21 #define STMFTS_READ_ONE_EVENT 0x85
22 #define STMFTS_READ_ALL_EVENT 0x86
23 #define STMFTS_LATEST_EVENT 0x87
24 #define STMFTS_SLEEP_IN 0x90
25 #define STMFTS_SLEEP_OUT 0x91
26 #define STMFTS_MS_MT_SENSE_OFF 0x92
27 #define STMFTS_MS_MT_SENSE_ON 0x93
28 #define STMFTS_SS_HOVER_SENSE_OFF 0x94
29 #define STMFTS_SS_HOVER_SENSE_ON 0x95
30 #define STMFTS_MS_KEY_SENSE_OFF 0x9a
31 #define STMFTS_MS_KEY_SENSE_ON 0x9b
32 #define STMFTS_SYSTEM_RESET 0xa0
33 #define STMFTS_CLEAR_EVENT_STACK 0xa1
34 #define STMFTS_FULL_FORCE_CALIBRATION 0xa2
35 #define STMFTS_MS_CX_TUNING 0xa3
36 #define STMFTS_SS_CX_TUNING 0xa4
39 #define STMFTS_EV_NO_EVENT 0x00
40 #define STMFTS_EV_MULTI_TOUCH_DETECTED 0x02
41 #define STMFTS_EV_MULTI_TOUCH_ENTER 0x03
42 #define STMFTS_EV_MULTI_TOUCH_LEAVE 0x04
43 #define STMFTS_EV_MULTI_TOUCH_MOTION 0x05
44 #define STMFTS_EV_HOVER_ENTER 0x07
45 #define STMFTS_EV_HOVER_LEAVE 0x08
46 #define STMFTS_EV_HOVER_MOTION 0x09
47 #define STMFTS_EV_KEY_STATUS 0x0e
48 #define STMFTS_EV_ERROR 0x0f
49 #define STMFTS_EV_CONTROLLER_READY 0x10
50 #define STMFTS_EV_SLEEP_OUT_CONTROLLER_READY 0x11
51 #define STMFTS_EV_STATUS 0x16
52 #define STMFTS_EV_DEBUG 0xdb
54 /* multi touch related event masks */
55 #define STMFTS_MASK_EVENT_ID 0x0f
56 #define STMFTS_MASK_TOUCH_ID 0xf0
57 #define STMFTS_MASK_LEFT_EVENT 0x0f
58 #define STMFTS_MASK_X_MSB 0x0f
59 #define STMFTS_MASK_Y_LSB 0xf0
61 /* key related event masks */
62 #define STMFTS_MASK_KEY_NO_TOUCH 0x00
63 #define STMFTS_MASK_KEY_MENU 0x01
64 #define STMFTS_MASK_KEY_BACK 0x02
66 #define STMFTS_EVENT_SIZE 8
67 #define STMFTS_STACK_DEPTH 32
68 #define STMFTS_DATA_MAX_SIZE (STMFTS_EVENT_SIZE * STMFTS_STACK_DEPTH)
69 #define STMFTS_MAX_FINGERS 10
70 #define STMFTS_DEV_NAME "stmfts"
72 enum stmfts_regulators
{
74 STMFTS_REGULATOR_AVDD
,
78 struct i2c_client
*client
;
79 struct input_dev
*input
;
80 struct led_classdev led_cdev
;
83 struct touchscreen_properties prop
;
85 struct regulator_bulk_data regulators
[2];
88 * Presence of ledvdd will be used also to check
89 * whether the LED is supported.
91 struct regulator
*ledvdd
;
99 u8 data
[STMFTS_DATA_MAX_SIZE
];
101 struct completion cmd_done
;
109 static void stmfts_brightness_set(struct led_classdev
*led_cdev
,
110 enum led_brightness value
)
112 struct stmfts_data
*sdata
= container_of(led_cdev
,
113 struct stmfts_data
, led_cdev
);
116 if (value
== sdata
->led_status
|| !sdata
->ledvdd
)
120 regulator_disable(sdata
->ledvdd
);
122 err
= regulator_enable(sdata
->ledvdd
);
124 dev_warn(&sdata
->client
->dev
,
125 "failed to disable ledvdd regulator: %d\n",
129 sdata
->led_status
= value
;
132 static enum led_brightness
stmfts_brightness_get(struct led_classdev
*led_cdev
)
134 struct stmfts_data
*sdata
= container_of(led_cdev
,
135 struct stmfts_data
, led_cdev
);
137 return !!regulator_is_enabled(sdata
->ledvdd
);
141 * We can't simply use i2c_smbus_read_i2c_block_data because we
142 * need to read more than 255 bytes (
144 static int stmfts_read_events(struct stmfts_data
*sdata
)
146 u8 cmd
= STMFTS_READ_ALL_EVENT
;
147 struct i2c_msg msgs
[2] = {
149 .addr
= sdata
->client
->addr
,
154 .addr
= sdata
->client
->addr
,
156 .len
= STMFTS_DATA_MAX_SIZE
,
162 ret
= i2c_transfer(sdata
->client
->adapter
, msgs
, ARRAY_SIZE(msgs
));
166 return ret
== ARRAY_SIZE(msgs
) ? 0 : -EIO
;
169 static void stmfts_report_contact_event(struct stmfts_data
*sdata
,
172 u8 slot_id
= (event
[0] & STMFTS_MASK_TOUCH_ID
) >> 4;
173 u16 x
= event
[1] | ((event
[2] & STMFTS_MASK_X_MSB
) << 8);
174 u16 y
= (event
[2] >> 4) | (event
[3] << 4);
177 u8 orientation
= event
[6];
180 input_mt_slot(sdata
->input
, slot_id
);
182 input_mt_report_slot_state(sdata
->input
, MT_TOOL_FINGER
, true);
183 input_report_abs(sdata
->input
, ABS_MT_POSITION_X
, x
);
184 input_report_abs(sdata
->input
, ABS_MT_POSITION_Y
, y
);
185 input_report_abs(sdata
->input
, ABS_MT_TOUCH_MAJOR
, maj
);
186 input_report_abs(sdata
->input
, ABS_MT_TOUCH_MINOR
, min
);
187 input_report_abs(sdata
->input
, ABS_MT_PRESSURE
, area
);
188 input_report_abs(sdata
->input
, ABS_MT_ORIENTATION
, orientation
);
190 input_sync(sdata
->input
);
193 static void stmfts_report_contact_release(struct stmfts_data
*sdata
,
196 u8 slot_id
= (event
[0] & STMFTS_MASK_TOUCH_ID
) >> 4;
198 input_mt_slot(sdata
->input
, slot_id
);
199 input_mt_report_slot_state(sdata
->input
, MT_TOOL_FINGER
, false);
201 input_sync(sdata
->input
);
204 static void stmfts_report_hover_event(struct stmfts_data
*sdata
,
207 u16 x
= (event
[2] << 4) | (event
[4] >> 4);
208 u16 y
= (event
[3] << 4) | (event
[4] & STMFTS_MASK_Y_LSB
);
211 input_report_abs(sdata
->input
, ABS_X
, x
);
212 input_report_abs(sdata
->input
, ABS_Y
, y
);
213 input_report_abs(sdata
->input
, ABS_DISTANCE
, z
);
215 input_sync(sdata
->input
);
218 static void stmfts_report_key_event(struct stmfts_data
*sdata
, const u8 event
[])
222 input_report_key(sdata
->input
, KEY_BACK
, 0);
223 input_report_key(sdata
->input
, KEY_MENU
, 0);
226 case STMFTS_MASK_KEY_BACK
:
227 input_report_key(sdata
->input
, KEY_BACK
, 1);
230 case STMFTS_MASK_KEY_MENU
:
231 input_report_key(sdata
->input
, KEY_MENU
, 1);
235 dev_warn(&sdata
->client
->dev
,
236 "unknown key event: %#02x\n", event
[2]);
240 input_sync(sdata
->input
);
243 static void stmfts_parse_events(struct stmfts_data
*sdata
)
247 for (i
= 0; i
< STMFTS_STACK_DEPTH
; i
++) {
248 u8
*event
= &sdata
->data
[i
* STMFTS_EVENT_SIZE
];
252 case STMFTS_EV_CONTROLLER_READY
:
253 case STMFTS_EV_SLEEP_OUT_CONTROLLER_READY
:
254 case STMFTS_EV_STATUS
:
255 complete(&sdata
->cmd_done
);
258 case STMFTS_EV_NO_EVENT
:
259 case STMFTS_EV_DEBUG
:
263 switch (event
[0] & STMFTS_MASK_EVENT_ID
) {
265 case STMFTS_EV_MULTI_TOUCH_ENTER
:
266 case STMFTS_EV_MULTI_TOUCH_MOTION
:
267 stmfts_report_contact_event(sdata
, event
);
270 case STMFTS_EV_MULTI_TOUCH_LEAVE
:
271 stmfts_report_contact_release(sdata
, event
);
274 case STMFTS_EV_HOVER_ENTER
:
275 case STMFTS_EV_HOVER_LEAVE
:
276 case STMFTS_EV_HOVER_MOTION
:
277 stmfts_report_hover_event(sdata
, event
);
280 case STMFTS_EV_KEY_STATUS
:
281 stmfts_report_key_event(sdata
, event
);
284 case STMFTS_EV_ERROR
:
285 dev_warn(&sdata
->client
->dev
,
286 "error code: 0x%x%x%x%x%x%x",
287 event
[6], event
[5], event
[4],
288 event
[3], event
[2], event
[1]);
292 dev_err(&sdata
->client
->dev
,
293 "unknown event %#02x\n", event
[0]);
298 static irqreturn_t
stmfts_irq_handler(int irq
, void *dev
)
300 struct stmfts_data
*sdata
= dev
;
303 mutex_lock(&sdata
->mutex
);
305 err
= stmfts_read_events(sdata
);
307 dev_err(&sdata
->client
->dev
,
308 "failed to read events: %d\n", err
);
310 stmfts_parse_events(sdata
);
312 mutex_unlock(&sdata
->mutex
);
316 static int stmfts_command(struct stmfts_data
*sdata
, const u8 cmd
)
320 reinit_completion(&sdata
->cmd_done
);
322 err
= i2c_smbus_write_byte(sdata
->client
, cmd
);
326 if (!wait_for_completion_timeout(&sdata
->cmd_done
,
327 msecs_to_jiffies(1000)))
333 static int stmfts_input_open(struct input_dev
*dev
)
335 struct stmfts_data
*sdata
= input_get_drvdata(dev
);
338 err
= pm_runtime_get_sync(&sdata
->client
->dev
);
342 err
= i2c_smbus_write_byte(sdata
->client
, STMFTS_MS_MT_SENSE_ON
);
346 mutex_lock(&sdata
->mutex
);
347 sdata
->running
= true;
349 if (sdata
->hover_enabled
) {
350 err
= i2c_smbus_write_byte(sdata
->client
,
351 STMFTS_SS_HOVER_SENSE_ON
);
353 dev_warn(&sdata
->client
->dev
,
354 "failed to enable hover\n");
356 mutex_unlock(&sdata
->mutex
);
358 if (sdata
->use_key
) {
359 err
= i2c_smbus_write_byte(sdata
->client
,
360 STMFTS_MS_KEY_SENSE_ON
);
362 /* I can still use only the touch screen */
363 dev_warn(&sdata
->client
->dev
,
364 "failed to enable touchkey\n");
370 static void stmfts_input_close(struct input_dev
*dev
)
372 struct stmfts_data
*sdata
= input_get_drvdata(dev
);
375 err
= i2c_smbus_write_byte(sdata
->client
, STMFTS_MS_MT_SENSE_OFF
);
377 dev_warn(&sdata
->client
->dev
,
378 "failed to disable touchscreen: %d\n", err
);
380 mutex_lock(&sdata
->mutex
);
382 sdata
->running
= false;
384 if (sdata
->hover_enabled
) {
385 err
= i2c_smbus_write_byte(sdata
->client
,
386 STMFTS_SS_HOVER_SENSE_OFF
);
388 dev_warn(&sdata
->client
->dev
,
389 "failed to disable hover: %d\n", err
);
391 mutex_unlock(&sdata
->mutex
);
393 if (sdata
->use_key
) {
394 err
= i2c_smbus_write_byte(sdata
->client
,
395 STMFTS_MS_KEY_SENSE_OFF
);
397 dev_warn(&sdata
->client
->dev
,
398 "failed to disable touchkey: %d\n", err
);
401 pm_runtime_put_sync(&sdata
->client
->dev
);
404 static ssize_t
stmfts_sysfs_chip_id(struct device
*dev
,
405 struct device_attribute
*attr
, char *buf
)
407 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
409 return sprintf(buf
, "%#x\n", sdata
->chip_id
);
412 static ssize_t
stmfts_sysfs_chip_version(struct device
*dev
,
413 struct device_attribute
*attr
, char *buf
)
415 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
417 return sprintf(buf
, "%u\n", sdata
->chip_ver
);
420 static ssize_t
stmfts_sysfs_fw_ver(struct device
*dev
,
421 struct device_attribute
*attr
, char *buf
)
423 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
425 return sprintf(buf
, "%u\n", sdata
->fw_ver
);
428 static ssize_t
stmfts_sysfs_config_id(struct device
*dev
,
429 struct device_attribute
*attr
, char *buf
)
431 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
433 return sprintf(buf
, "%#x\n", sdata
->config_id
);
436 static ssize_t
stmfts_sysfs_config_version(struct device
*dev
,
437 struct device_attribute
*attr
, char *buf
)
439 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
441 return sprintf(buf
, "%u\n", sdata
->config_ver
);
444 static ssize_t
stmfts_sysfs_read_status(struct device
*dev
,
445 struct device_attribute
*attr
, char *buf
)
447 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
451 err
= i2c_smbus_read_i2c_block_data(sdata
->client
, STMFTS_READ_STATUS
,
452 sizeof(status
), status
);
456 return sprintf(buf
, "%#02x\n", status
[0]);
459 static ssize_t
stmfts_sysfs_hover_enable_read(struct device
*dev
,
460 struct device_attribute
*attr
, char *buf
)
462 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
464 return sprintf(buf
, "%u\n", sdata
->hover_enabled
);
467 static ssize_t
stmfts_sysfs_hover_enable_write(struct device
*dev
,
468 struct device_attribute
*attr
,
469 const char *buf
, size_t len
)
471 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
475 if (kstrtoul(buf
, 0, &value
))
478 mutex_lock(&sdata
->mutex
);
480 if (value
& sdata
->hover_enabled
)
484 err
= i2c_smbus_write_byte(sdata
->client
,
485 value
? STMFTS_SS_HOVER_SENSE_ON
:
486 STMFTS_SS_HOVER_SENSE_OFF
);
489 sdata
->hover_enabled
= !!value
;
492 mutex_unlock(&sdata
->mutex
);
497 static DEVICE_ATTR(chip_id
, 0444, stmfts_sysfs_chip_id
, NULL
);
498 static DEVICE_ATTR(chip_version
, 0444, stmfts_sysfs_chip_version
, NULL
);
499 static DEVICE_ATTR(fw_ver
, 0444, stmfts_sysfs_fw_ver
, NULL
);
500 static DEVICE_ATTR(config_id
, 0444, stmfts_sysfs_config_id
, NULL
);
501 static DEVICE_ATTR(config_version
, 0444, stmfts_sysfs_config_version
, NULL
);
502 static DEVICE_ATTR(status
, 0444, stmfts_sysfs_read_status
, NULL
);
503 static DEVICE_ATTR(hover_enable
, 0644, stmfts_sysfs_hover_enable_read
,
504 stmfts_sysfs_hover_enable_write
);
506 static struct attribute
*stmfts_sysfs_attrs
[] = {
507 &dev_attr_chip_id
.attr
,
508 &dev_attr_chip_version
.attr
,
509 &dev_attr_fw_ver
.attr
,
510 &dev_attr_config_id
.attr
,
511 &dev_attr_config_version
.attr
,
512 &dev_attr_status
.attr
,
513 &dev_attr_hover_enable
.attr
,
517 static struct attribute_group stmfts_attribute_group
= {
518 .attrs
= stmfts_sysfs_attrs
521 static int stmfts_power_on(struct stmfts_data
*sdata
)
526 err
= regulator_bulk_enable(ARRAY_SIZE(sdata
->regulators
),
532 * The datasheet does not specify the power on time, but considering
533 * that the reset time is < 10ms, I sleep 20ms to be sure
537 err
= i2c_smbus_read_i2c_block_data(sdata
->client
, STMFTS_READ_INFO
,
541 if (err
!= sizeof(reg
))
544 sdata
->chip_id
= be16_to_cpup((__be16
*)®
[6]);
545 sdata
->chip_ver
= reg
[0];
546 sdata
->fw_ver
= be16_to_cpup((__be16
*)®
[2]);
547 sdata
->config_id
= reg
[4];
548 sdata
->config_ver
= reg
[5];
550 enable_irq(sdata
->client
->irq
);
554 err
= stmfts_command(sdata
, STMFTS_SYSTEM_RESET
);
558 err
= stmfts_command(sdata
, STMFTS_SLEEP_OUT
);
562 /* optional tuning */
563 err
= stmfts_command(sdata
, STMFTS_MS_CX_TUNING
);
565 dev_warn(&sdata
->client
->dev
,
566 "failed to perform mutual auto tune: %d\n", err
);
568 /* optional tuning */
569 err
= stmfts_command(sdata
, STMFTS_SS_CX_TUNING
);
571 dev_warn(&sdata
->client
->dev
,
572 "failed to perform self auto tune: %d\n", err
);
574 err
= stmfts_command(sdata
, STMFTS_FULL_FORCE_CALIBRATION
);
579 * At this point no one is using the touchscreen
580 * and I don't really care about the return value
582 (void) i2c_smbus_write_byte(sdata
->client
, STMFTS_SLEEP_IN
);
587 static void stmfts_power_off(void *data
)
589 struct stmfts_data
*sdata
= data
;
591 disable_irq(sdata
->client
->irq
);
592 regulator_bulk_disable(ARRAY_SIZE(sdata
->regulators
),
596 /* This function is void because I don't want to prevent using the touch key
597 * only because the LEDs don't get registered
599 static int stmfts_enable_led(struct stmfts_data
*sdata
)
603 /* get the regulator for powering the leds on */
604 sdata
->ledvdd
= devm_regulator_get(&sdata
->client
->dev
, "ledvdd");
605 if (IS_ERR(sdata
->ledvdd
))
606 return PTR_ERR(sdata
->ledvdd
);
608 sdata
->led_cdev
.name
= STMFTS_DEV_NAME
;
609 sdata
->led_cdev
.max_brightness
= LED_ON
;
610 sdata
->led_cdev
.brightness
= LED_OFF
;
611 sdata
->led_cdev
.brightness_set
= stmfts_brightness_set
;
612 sdata
->led_cdev
.brightness_get
= stmfts_brightness_get
;
614 err
= devm_led_classdev_register(&sdata
->client
->dev
, &sdata
->led_cdev
);
616 devm_regulator_put(sdata
->ledvdd
);
623 static int stmfts_probe(struct i2c_client
*client
,
624 const struct i2c_device_id
*id
)
627 struct stmfts_data
*sdata
;
629 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
|
630 I2C_FUNC_SMBUS_BYTE_DATA
|
631 I2C_FUNC_SMBUS_I2C_BLOCK
))
634 sdata
= devm_kzalloc(&client
->dev
, sizeof(*sdata
), GFP_KERNEL
);
638 i2c_set_clientdata(client
, sdata
);
640 sdata
->client
= client
;
641 mutex_init(&sdata
->mutex
);
642 init_completion(&sdata
->cmd_done
);
644 sdata
->regulators
[STMFTS_REGULATOR_VDD
].supply
= "vdd";
645 sdata
->regulators
[STMFTS_REGULATOR_AVDD
].supply
= "avdd";
646 err
= devm_regulator_bulk_get(&client
->dev
,
647 ARRAY_SIZE(sdata
->regulators
),
652 sdata
->input
= devm_input_allocate_device(&client
->dev
);
656 sdata
->input
->name
= STMFTS_DEV_NAME
;
657 sdata
->input
->id
.bustype
= BUS_I2C
;
658 sdata
->input
->open
= stmfts_input_open
;
659 sdata
->input
->close
= stmfts_input_close
;
661 input_set_capability(sdata
->input
, EV_ABS
, ABS_MT_POSITION_X
);
662 input_set_capability(sdata
->input
, EV_ABS
, ABS_MT_POSITION_Y
);
663 touchscreen_parse_properties(sdata
->input
, true, &sdata
->prop
);
665 input_set_abs_params(sdata
->input
, ABS_MT_TOUCH_MAJOR
, 0, 255, 0, 0);
666 input_set_abs_params(sdata
->input
, ABS_MT_TOUCH_MINOR
, 0, 255, 0, 0);
667 input_set_abs_params(sdata
->input
, ABS_MT_ORIENTATION
, 0, 255, 0, 0);
668 input_set_abs_params(sdata
->input
, ABS_MT_PRESSURE
, 0, 255, 0, 0);
669 input_set_abs_params(sdata
->input
, ABS_DISTANCE
, 0, 255, 0, 0);
671 sdata
->use_key
= device_property_read_bool(&client
->dev
,
672 "touch-key-connected");
673 if (sdata
->use_key
) {
674 input_set_capability(sdata
->input
, EV_KEY
, KEY_MENU
);
675 input_set_capability(sdata
->input
, EV_KEY
, KEY_BACK
);
678 err
= input_mt_init_slots(sdata
->input
,
679 STMFTS_MAX_FINGERS
, INPUT_MT_DIRECT
);
683 input_set_drvdata(sdata
->input
, sdata
);
686 * stmfts_power_on expects interrupt to be disabled, but
687 * at this point the device is still off and I do not trust
688 * the status of the irq line that can generate some spurious
689 * interrupts. To be on the safe side it's better to not enable
690 * the interrupts during their request.
692 irq_set_status_flags(client
->irq
, IRQ_NOAUTOEN
);
693 err
= devm_request_threaded_irq(&client
->dev
, client
->irq
,
694 NULL
, stmfts_irq_handler
,
696 "stmfts_irq", sdata
);
700 dev_dbg(&client
->dev
, "initializing ST-Microelectronics FTS...\n");
702 err
= stmfts_power_on(sdata
);
706 err
= devm_add_action_or_reset(&client
->dev
, stmfts_power_off
, sdata
);
710 err
= input_register_device(sdata
->input
);
714 if (sdata
->use_key
) {
715 err
= stmfts_enable_led(sdata
);
718 * Even if the LEDs have failed to be initialized and
719 * used in the driver, I can still use the device even
720 * without LEDs. The ledvdd regulator pointer will be
723 dev_warn(&client
->dev
, "unable to use touchkey leds\n");
724 sdata
->ledvdd
= NULL
;
728 err
= devm_device_add_group(&client
->dev
, &stmfts_attribute_group
);
732 pm_runtime_enable(&client
->dev
);
737 static int stmfts_remove(struct i2c_client
*client
)
739 pm_runtime_disable(&client
->dev
);
744 static int __maybe_unused
stmfts_runtime_suspend(struct device
*dev
)
746 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
749 ret
= i2c_smbus_write_byte(sdata
->client
, STMFTS_SLEEP_IN
);
751 dev_warn(dev
, "failed to suspend device: %d\n", ret
);
756 static int __maybe_unused
stmfts_runtime_resume(struct device
*dev
)
758 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
761 ret
= i2c_smbus_write_byte(sdata
->client
, STMFTS_SLEEP_OUT
);
763 dev_err(dev
, "failed to resume device: %d\n", ret
);
768 static int __maybe_unused
stmfts_suspend(struct device
*dev
)
770 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
772 stmfts_power_off(sdata
);
777 static int __maybe_unused
stmfts_resume(struct device
*dev
)
779 struct stmfts_data
*sdata
= dev_get_drvdata(dev
);
781 return stmfts_power_on(sdata
);
784 static const struct dev_pm_ops stmfts_pm_ops
= {
785 SET_SYSTEM_SLEEP_PM_OPS(stmfts_suspend
, stmfts_resume
)
786 SET_RUNTIME_PM_OPS(stmfts_runtime_suspend
, stmfts_runtime_resume
, NULL
)
790 static const struct of_device_id stmfts_of_match
[] = {
791 { .compatible
= "st,stmfts", },
794 MODULE_DEVICE_TABLE(of
, stmfts_of_match
);
797 static const struct i2c_device_id stmfts_id
[] = {
801 MODULE_DEVICE_TABLE(i2c
, stmfts_id
);
803 static struct i2c_driver stmfts_driver
= {
805 .name
= STMFTS_DEV_NAME
,
806 .of_match_table
= of_match_ptr(stmfts_of_match
),
807 .pm
= &stmfts_pm_ops
,
809 .probe
= stmfts_probe
,
810 .remove
= stmfts_remove
,
811 .id_table
= stmfts_id
,
814 module_i2c_driver(stmfts_driver
);
816 MODULE_AUTHOR("Andi Shyti <andi.shyti@samsung.com>");
817 MODULE_DESCRIPTION("STMicroelectronics FTS Touch Screen");
818 MODULE_LICENSE("GPL v2");