^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * mcs5000_ts.c - Touchscreen driver for MELFAS MCS-5000 controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2009 Samsung Electronics Co.Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author: Joonyoung Shim <jy0922.shim@samsung.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Based on wm97xx-core.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/platform_data/mcs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define MCS5000_TS_STATUS 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define STATUS_OFFSET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define STATUS_NO (0 << STATUS_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define STATUS_INIT (1 << STATUS_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define STATUS_SENSING (2 << STATUS_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define STATUS_COORD (3 << STATUS_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define STATUS_GESTURE (4 << STATUS_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define ERROR_OFFSET 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ERROR_NO (0 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define ERROR_POWER_ON_RESET (1 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define ERROR_INT_RESET (2 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ERROR_EXT_RESET (3 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define ERROR_INVALID_REG_ADDRESS (8 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define ERROR_INVALID_REG_VALUE (9 << ERROR_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define MCS5000_TS_OP_MODE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define RESET_OFFSET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define RESET_NO (0 << RESET_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define RESET_EXT_SOFT (1 << RESET_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define OP_MODE_OFFSET 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define OP_MODE_SLEEP (0 << OP_MODE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define OP_MODE_ACTIVE (1 << OP_MODE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define GESTURE_OFFSET 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define GESTURE_DISABLE (0 << GESTURE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define GESTURE_ENABLE (1 << GESTURE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define PROXIMITY_OFFSET 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define PROXIMITY_DISABLE (0 << PROXIMITY_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define PROXIMITY_ENABLE (1 << PROXIMITY_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define SCAN_MODE_OFFSET 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define SCAN_MODE_INTERRUPT (0 << SCAN_MODE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define SCAN_MODE_POLLING (1 << SCAN_MODE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define REPORT_RATE_OFFSET 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define REPORT_RATE_40 (0 << REPORT_RATE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define REPORT_RATE_80 (1 << REPORT_RATE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define MCS5000_TS_SENS_CTL 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define MCS5000_TS_FILTER_CTL 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define PRI_FILTER_OFFSET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define SEC_FILTER_OFFSET 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define MCS5000_TS_X_SIZE_UPPER 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define MCS5000_TS_X_SIZE_LOWER 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define MCS5000_TS_Y_SIZE_UPPER 0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define MCS5000_TS_Y_SIZE_LOWER 0x0B
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define MCS5000_TS_INPUT_INFO 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define INPUT_TYPE_OFFSET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define INPUT_TYPE_NONTOUCH (0 << INPUT_TYPE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define INPUT_TYPE_SINGLE (1 << INPUT_TYPE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define INPUT_TYPE_DUAL (2 << INPUT_TYPE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define INPUT_TYPE_PALM (3 << INPUT_TYPE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define INPUT_TYPE_PROXIMITY (7 << INPUT_TYPE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define GESTURE_CODE_OFFSET 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define GESTURE_CODE_NO (0 << GESTURE_CODE_OFFSET)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define MCS5000_TS_X_POS_UPPER 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define MCS5000_TS_X_POS_LOWER 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define MCS5000_TS_Y_POS_UPPER 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define MCS5000_TS_Y_POS_LOWER 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define MCS5000_TS_Z_POS 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define MCS5000_TS_WIDTH 0x16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define MCS5000_TS_GESTURE_VAL 0x17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define MCS5000_TS_MODULE_REV 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define MCS5000_TS_FIRMWARE_VER 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Touchscreen absolute values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define MCS5000_MAX_XC 0x3ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define MCS5000_MAX_YC 0x3ff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) enum mcs5000_ts_read_offset {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) READ_INPUT_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) READ_X_POS_UPPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) READ_X_POS_LOWER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) READ_Y_POS_UPPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) READ_Y_POS_LOWER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) READ_BLOCK_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Each client has this additional data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct mcs5000_ts_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) const struct mcs_platform_data *platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static irqreturn_t mcs5000_ts_interrupt(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct mcs5000_ts_data *data = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) u8 buffer[READ_BLOCK_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) err = i2c_smbus_read_i2c_block_data(client, MCS5000_TS_INPUT_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) READ_BLOCK_SIZE, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) dev_err(&client->dev, "%s, err[%d]\n", __func__, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) switch (buffer[READ_INPUT_INFO]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) case INPUT_TYPE_NONTOUCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) input_report_key(data->input_dev, BTN_TOUCH, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) input_sync(data->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) case INPUT_TYPE_SINGLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) x = (buffer[READ_X_POS_UPPER] << 8) | buffer[READ_X_POS_LOWER];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) y = (buffer[READ_Y_POS_UPPER] << 8) | buffer[READ_Y_POS_LOWER];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) input_report_key(data->input_dev, BTN_TOUCH, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) input_report_abs(data->input_dev, ABS_X, x);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) input_report_abs(data->input_dev, ABS_Y, y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) input_sync(data->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) case INPUT_TYPE_DUAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* TODO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) case INPUT_TYPE_PALM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* TODO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) case INPUT_TYPE_PROXIMITY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* TODO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) dev_err(&client->dev, "Unknown ts input type %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) buffer[READ_INPUT_INFO]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static void mcs5000_ts_phys_init(struct mcs5000_ts_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) const struct mcs_platform_data *platform_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* Touch reset & sleep mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) i2c_smbus_write_byte_data(client, MCS5000_TS_OP_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) RESET_EXT_SOFT | OP_MODE_SLEEP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* Touch size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) i2c_smbus_write_byte_data(client, MCS5000_TS_X_SIZE_UPPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) platform_data->x_size >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) i2c_smbus_write_byte_data(client, MCS5000_TS_X_SIZE_LOWER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) platform_data->x_size & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) i2c_smbus_write_byte_data(client, MCS5000_TS_Y_SIZE_UPPER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) platform_data->y_size >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) i2c_smbus_write_byte_data(client, MCS5000_TS_Y_SIZE_LOWER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) platform_data->y_size & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* Touch active mode & 80 report rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) i2c_smbus_write_byte_data(data->client, MCS5000_TS_OP_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) OP_MODE_ACTIVE | REPORT_RATE_80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static int mcs5000_ts_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) const struct mcs_platform_data *pdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) struct mcs5000_ts_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct input_dev *input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) pdata = dev_get_platdata(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (!pdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) if (!data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) dev_err(&client->dev, "Failed to allocate memory\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) data->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) input_dev = devm_input_allocate_device(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (!input_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) dev_err(&client->dev, "Failed to allocate input device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) input_dev->name = "MELFAS MCS-5000 Touchscreen";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) input_dev->id.bustype = BUS_I2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) input_dev->dev.parent = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) __set_bit(EV_ABS, input_dev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) __set_bit(EV_KEY, input_dev->evbit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) __set_bit(BTN_TOUCH, input_dev->keybit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) input_set_abs_params(input_dev, ABS_X, 0, MCS5000_MAX_XC, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) input_set_abs_params(input_dev, ABS_Y, 0, MCS5000_MAX_YC, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) data->input_dev = input_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (pdata->cfg_pin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) pdata->cfg_pin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) error = devm_request_threaded_irq(&client->dev, client->irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) NULL, mcs5000_ts_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) IRQF_TRIGGER_LOW | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) "mcs5000_ts", data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) dev_err(&client->dev, "Failed to register interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) error = input_register_device(data->input_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) dev_err(&client->dev, "Failed to register input device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) mcs5000_ts_phys_init(data, pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) i2c_set_clientdata(client, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static int __maybe_unused mcs5000_ts_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* Touch sleep mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) i2c_smbus_write_byte_data(client, MCS5000_TS_OP_MODE, OP_MODE_SLEEP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) static int __maybe_unused mcs5000_ts_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct mcs5000_ts_data *data = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) const struct mcs_platform_data *pdata = dev_get_platdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) mcs5000_ts_phys_init(data, pdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static SIMPLE_DEV_PM_OPS(mcs5000_ts_pm, mcs5000_ts_suspend, mcs5000_ts_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) static const struct i2c_device_id mcs5000_ts_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { "mcs5000_ts", 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) MODULE_DEVICE_TABLE(i2c, mcs5000_ts_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static struct i2c_driver mcs5000_ts_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .probe = mcs5000_ts_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) .name = "mcs5000_ts",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .pm = &mcs5000_ts_pm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .id_table = mcs5000_ts_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) module_i2c_driver(mcs5000_ts_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) /* Module information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) MODULE_DESCRIPTION("Touchscreen driver for MELFAS MCS-5000 controller");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) MODULE_LICENSE("GPL");