0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/bitops.h>
0028 #include <linux/delay.h>
0029 #include <linux/gpio/consumer.h>
0030 #include <linux/i2c.h>
0031 #include <linux/input.h>
0032 #include <linux/input/touchscreen.h>
0033 #include <linux/interrupt.h>
0034 #include <linux/irq.h>
0035 #include <linux/module.h>
0036 #include <linux/of.h>
0037
0038
0039 #define I2C_REG_TOUCH0 0x00
0040 #define I2C_REG_TOUCH1 0x01
0041 #define I2C_REG_CHANMASK 0x04
0042 #define I2C_REG_IRQMASK 0x22
0043 #define I2C_REG_IRQSRC 0x23
0044 #define I2C_REG_SOFTRESET 0x3f
0045
0046 #define I2C_REG_SX8650_STAT 0x05
0047 #define SX8650_STAT_CONVIRQ BIT(7)
0048
0049
0050 #define CMD_READ_REGISTER 0x40
0051 #define CMD_PENTRG 0xe0
0052
0053
0054 #define SOFTRESET_VALUE 0xde
0055
0056
0057 #define IRQ_PENTOUCH_TOUCHCONVDONE BIT(3)
0058 #define IRQ_PENRELEASE BIT(2)
0059
0060
0061 #define CONDIRQ 0x20
0062 #define RPDNT_100K 0x00
0063 #define FILT_7SA 0x03
0064
0065
0066 #define CONV_X BIT(7)
0067 #define CONV_Y BIT(6)
0068
0069
0070 #define RATE_MANUAL 0x00
0071 #define RATE_5000CPS 0xf0
0072
0073
0074 #define POWDLY_1_1MS 0x0b
0075
0076
0077
0078
0079 #define SX8650_PENIRQ_TIMEOUT msecs_to_jiffies(10)
0080
0081 #define MAX_12BIT ((1 << 12) - 1)
0082 #define MAX_I2C_READ_LEN 10
0083
0084
0085 #define CH_X 0x00
0086 #define CH_Y 0x01
0087
0088 struct sx865x_data {
0089 u8 cmd_manual;
0090 u8 chan_mask;
0091 bool has_irq_penrelease;
0092 bool has_reg_irqmask;
0093 irq_handler_t irqh;
0094 };
0095
0096 struct sx8654 {
0097 struct input_dev *input;
0098 struct i2c_client *client;
0099 struct gpio_desc *gpio_reset;
0100
0101 spinlock_t lock;
0102 struct timer_list timer;
0103
0104 struct touchscreen_properties props;
0105
0106 const struct sx865x_data *data;
0107 };
0108
0109 static inline void sx865x_penrelease(struct sx8654 *ts)
0110 {
0111 struct input_dev *input_dev = ts->input;
0112
0113 input_report_key(input_dev, BTN_TOUCH, 0);
0114 input_sync(input_dev);
0115 }
0116
0117 static void sx865x_penrelease_timer_handler(struct timer_list *t)
0118 {
0119 struct sx8654 *ts = from_timer(ts, t, timer);
0120 unsigned long flags;
0121
0122 spin_lock_irqsave(&ts->lock, flags);
0123 sx865x_penrelease(ts);
0124 spin_unlock_irqrestore(&ts->lock, flags);
0125 dev_dbg(&ts->client->dev, "penrelease by timer\n");
0126 }
0127
0128 static irqreturn_t sx8650_irq(int irq, void *handle)
0129 {
0130 struct sx8654 *ts = handle;
0131 struct device *dev = &ts->client->dev;
0132 int len, i;
0133 unsigned long flags;
0134 u8 stat;
0135 u16 x, y;
0136 u16 ch;
0137 u16 chdata;
0138 __be16 data[MAX_I2C_READ_LEN / sizeof(__be16)];
0139 u8 nchan = hweight32(ts->data->chan_mask);
0140 u8 readlen = nchan * sizeof(*data);
0141
0142 stat = i2c_smbus_read_byte_data(ts->client, CMD_READ_REGISTER
0143 | I2C_REG_SX8650_STAT);
0144
0145 if (!(stat & SX8650_STAT_CONVIRQ)) {
0146 dev_dbg(dev, "%s ignore stat [0x%02x]", __func__, stat);
0147 return IRQ_HANDLED;
0148 }
0149
0150 len = i2c_master_recv(ts->client, (u8 *)data, readlen);
0151 if (len != readlen) {
0152 dev_dbg(dev, "ignore short recv (%d)\n", len);
0153 return IRQ_HANDLED;
0154 }
0155
0156 spin_lock_irqsave(&ts->lock, flags);
0157
0158 x = 0;
0159 y = 0;
0160 for (i = 0; i < nchan; i++) {
0161 chdata = be16_to_cpu(data[i]);
0162
0163 if (unlikely(chdata == 0xFFFF)) {
0164 dev_dbg(dev, "invalid qualified data @ %d\n", i);
0165 continue;
0166 } else if (unlikely(chdata & 0x8000)) {
0167 dev_warn(dev, "hibit @ %d [0x%04x]\n", i, chdata);
0168 continue;
0169 }
0170
0171 ch = chdata >> 12;
0172 if (ch == CH_X)
0173 x = chdata & MAX_12BIT;
0174 else if (ch == CH_Y)
0175 y = chdata & MAX_12BIT;
0176 else
0177 dev_warn(dev, "unknown channel %d [0x%04x]\n", ch,
0178 chdata);
0179 }
0180
0181 touchscreen_report_pos(ts->input, &ts->props, x, y, false);
0182 input_report_key(ts->input, BTN_TOUCH, 1);
0183 input_sync(ts->input);
0184 dev_dbg(dev, "point(%4d,%4d)\n", x, y);
0185
0186 mod_timer(&ts->timer, jiffies + SX8650_PENIRQ_TIMEOUT);
0187 spin_unlock_irqrestore(&ts->lock, flags);
0188
0189 return IRQ_HANDLED;
0190 }
0191
0192 static irqreturn_t sx8654_irq(int irq, void *handle)
0193 {
0194 struct sx8654 *sx8654 = handle;
0195 int irqsrc;
0196 u8 data[4];
0197 unsigned int x, y;
0198 int retval;
0199
0200 irqsrc = i2c_smbus_read_byte_data(sx8654->client,
0201 CMD_READ_REGISTER | I2C_REG_IRQSRC);
0202 dev_dbg(&sx8654->client->dev, "irqsrc = 0x%x", irqsrc);
0203
0204 if (irqsrc < 0)
0205 goto out;
0206
0207 if (irqsrc & IRQ_PENRELEASE) {
0208 dev_dbg(&sx8654->client->dev, "pen release interrupt");
0209
0210 input_report_key(sx8654->input, BTN_TOUCH, 0);
0211 input_sync(sx8654->input);
0212 }
0213
0214 if (irqsrc & IRQ_PENTOUCH_TOUCHCONVDONE) {
0215 dev_dbg(&sx8654->client->dev, "pen touch interrupt");
0216
0217 retval = i2c_master_recv(sx8654->client, data, sizeof(data));
0218 if (retval != sizeof(data))
0219 goto out;
0220
0221
0222 if (unlikely(data[0] & 0x80 || data[2] & 0x80))
0223 goto out;
0224
0225 x = ((data[0] & 0xf) << 8) | (data[1]);
0226 y = ((data[2] & 0xf) << 8) | (data[3]);
0227
0228 touchscreen_report_pos(sx8654->input, &sx8654->props, x, y,
0229 false);
0230 input_report_key(sx8654->input, BTN_TOUCH, 1);
0231 input_sync(sx8654->input);
0232
0233 dev_dbg(&sx8654->client->dev, "point(%4d,%4d)\n", x, y);
0234 }
0235
0236 out:
0237 return IRQ_HANDLED;
0238 }
0239
0240 static int sx8654_reset(struct sx8654 *ts)
0241 {
0242 int err;
0243
0244 if (ts->gpio_reset) {
0245 gpiod_set_value_cansleep(ts->gpio_reset, 1);
0246 udelay(2);
0247 gpiod_set_value_cansleep(ts->gpio_reset, 0);
0248 } else {
0249 dev_dbg(&ts->client->dev, "NRST unavailable, try softreset\n");
0250 err = i2c_smbus_write_byte_data(ts->client, I2C_REG_SOFTRESET,
0251 SOFTRESET_VALUE);
0252 if (err)
0253 return err;
0254 }
0255
0256 return 0;
0257 }
0258
0259 static int sx8654_open(struct input_dev *dev)
0260 {
0261 struct sx8654 *sx8654 = input_get_drvdata(dev);
0262 struct i2c_client *client = sx8654->client;
0263 int error;
0264
0265
0266 error = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH0,
0267 RATE_5000CPS | POWDLY_1_1MS);
0268 if (error) {
0269 dev_err(&client->dev, "writing to I2C_REG_TOUCH0 failed");
0270 return error;
0271 }
0272
0273 error = i2c_smbus_write_byte(client, CMD_PENTRG);
0274 if (error) {
0275 dev_err(&client->dev, "writing command CMD_PENTRG failed");
0276 return error;
0277 }
0278
0279 enable_irq(client->irq);
0280
0281 return 0;
0282 }
0283
0284 static void sx8654_close(struct input_dev *dev)
0285 {
0286 struct sx8654 *sx8654 = input_get_drvdata(dev);
0287 struct i2c_client *client = sx8654->client;
0288 int error;
0289
0290 disable_irq(client->irq);
0291
0292 if (!sx8654->data->has_irq_penrelease)
0293 del_timer_sync(&sx8654->timer);
0294
0295
0296 error = i2c_smbus_write_byte(client, sx8654->data->cmd_manual);
0297 if (error) {
0298 dev_err(&client->dev, "writing command CMD_MANUAL failed");
0299 return;
0300 }
0301
0302 error = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH0, RATE_MANUAL);
0303 if (error) {
0304 dev_err(&client->dev, "writing to I2C_REG_TOUCH0 failed");
0305 return;
0306 }
0307 }
0308
0309 static int sx8654_probe(struct i2c_client *client,
0310 const struct i2c_device_id *id)
0311 {
0312 struct sx8654 *sx8654;
0313 struct input_dev *input;
0314 int error;
0315
0316 if (!i2c_check_functionality(client->adapter,
0317 I2C_FUNC_SMBUS_READ_WORD_DATA))
0318 return -ENXIO;
0319
0320 sx8654 = devm_kzalloc(&client->dev, sizeof(*sx8654), GFP_KERNEL);
0321 if (!sx8654)
0322 return -ENOMEM;
0323
0324 sx8654->gpio_reset = devm_gpiod_get_optional(&client->dev, "reset",
0325 GPIOD_OUT_HIGH);
0326 if (IS_ERR(sx8654->gpio_reset)) {
0327 error = PTR_ERR(sx8654->gpio_reset);
0328 if (error != -EPROBE_DEFER)
0329 dev_err(&client->dev, "unable to get reset-gpio: %d\n",
0330 error);
0331 return error;
0332 }
0333 dev_dbg(&client->dev, "got GPIO reset pin\n");
0334
0335 sx8654->data = device_get_match_data(&client->dev);
0336 if (!sx8654->data)
0337 sx8654->data = (const struct sx865x_data *)id->driver_data;
0338 if (!sx8654->data) {
0339 dev_err(&client->dev, "invalid or missing device data\n");
0340 return -EINVAL;
0341 }
0342
0343 if (!sx8654->data->has_irq_penrelease) {
0344 dev_dbg(&client->dev, "use timer for penrelease\n");
0345 timer_setup(&sx8654->timer, sx865x_penrelease_timer_handler, 0);
0346 spin_lock_init(&sx8654->lock);
0347 }
0348
0349 input = devm_input_allocate_device(&client->dev);
0350 if (!input)
0351 return -ENOMEM;
0352
0353 input->name = "SX8654 I2C Touchscreen";
0354 input->id.bustype = BUS_I2C;
0355 input->dev.parent = &client->dev;
0356 input->open = sx8654_open;
0357 input->close = sx8654_close;
0358
0359 __set_bit(INPUT_PROP_DIRECT, input->propbit);
0360 input_set_capability(input, EV_KEY, BTN_TOUCH);
0361 input_set_abs_params(input, ABS_X, 0, MAX_12BIT, 0, 0);
0362 input_set_abs_params(input, ABS_Y, 0, MAX_12BIT, 0, 0);
0363
0364 touchscreen_parse_properties(input, false, &sx8654->props);
0365
0366 sx8654->client = client;
0367 sx8654->input = input;
0368
0369 input_set_drvdata(sx8654->input, sx8654);
0370
0371 error = sx8654_reset(sx8654);
0372 if (error) {
0373 dev_err(&client->dev, "reset failed");
0374 return error;
0375 }
0376
0377 error = i2c_smbus_write_byte_data(client, I2C_REG_CHANMASK,
0378 sx8654->data->chan_mask);
0379 if (error) {
0380 dev_err(&client->dev, "writing to I2C_REG_CHANMASK failed");
0381 return error;
0382 }
0383
0384 if (sx8654->data->has_reg_irqmask) {
0385 error = i2c_smbus_write_byte_data(client, I2C_REG_IRQMASK,
0386 IRQ_PENTOUCH_TOUCHCONVDONE |
0387 IRQ_PENRELEASE);
0388 if (error) {
0389 dev_err(&client->dev, "writing I2C_REG_IRQMASK failed");
0390 return error;
0391 }
0392 }
0393
0394 error = i2c_smbus_write_byte_data(client, I2C_REG_TOUCH1,
0395 CONDIRQ | RPDNT_100K | FILT_7SA);
0396 if (error) {
0397 dev_err(&client->dev, "writing to I2C_REG_TOUCH1 failed");
0398 return error;
0399 }
0400
0401 error = devm_request_threaded_irq(&client->dev, client->irq,
0402 NULL, sx8654->data->irqh,
0403 IRQF_ONESHOT,
0404 client->name, sx8654);
0405 if (error) {
0406 dev_err(&client->dev,
0407 "Failed to enable IRQ %d, error: %d\n",
0408 client->irq, error);
0409 return error;
0410 }
0411
0412
0413 disable_irq(client->irq);
0414
0415 error = input_register_device(sx8654->input);
0416 if (error)
0417 return error;
0418
0419 return 0;
0420 }
0421
0422 static const struct sx865x_data sx8650_data = {
0423 .cmd_manual = 0xb0,
0424 .has_irq_penrelease = false,
0425 .has_reg_irqmask = false,
0426 .chan_mask = (CONV_X | CONV_Y),
0427 .irqh = sx8650_irq,
0428 };
0429
0430 static const struct sx865x_data sx8654_data = {
0431 .cmd_manual = 0xc0,
0432 .has_irq_penrelease = true,
0433 .has_reg_irqmask = true,
0434 .chan_mask = (CONV_X | CONV_Y),
0435 .irqh = sx8654_irq,
0436 };
0437
0438 #ifdef CONFIG_OF
0439 static const struct of_device_id sx8654_of_match[] = {
0440 {
0441 .compatible = "semtech,sx8650",
0442 .data = &sx8650_data,
0443 }, {
0444 .compatible = "semtech,sx8654",
0445 .data = &sx8654_data,
0446 }, {
0447 .compatible = "semtech,sx8655",
0448 .data = &sx8654_data,
0449 }, {
0450 .compatible = "semtech,sx8656",
0451 .data = &sx8654_data,
0452 },
0453 { }
0454 };
0455 MODULE_DEVICE_TABLE(of, sx8654_of_match);
0456 #endif
0457
0458 static const struct i2c_device_id sx8654_id_table[] = {
0459 { .name = "semtech_sx8650", .driver_data = (long)&sx8650_data },
0460 { .name = "semtech_sx8654", .driver_data = (long)&sx8654_data },
0461 { .name = "semtech_sx8655", .driver_data = (long)&sx8654_data },
0462 { .name = "semtech_sx8656", .driver_data = (long)&sx8654_data },
0463 { }
0464 };
0465 MODULE_DEVICE_TABLE(i2c, sx8654_id_table);
0466
0467 static struct i2c_driver sx8654_driver = {
0468 .driver = {
0469 .name = "sx8654",
0470 .of_match_table = of_match_ptr(sx8654_of_match),
0471 },
0472 .id_table = sx8654_id_table,
0473 .probe = sx8654_probe,
0474 };
0475 module_i2c_driver(sx8654_driver);
0476
0477 MODULE_AUTHOR("Sébastien Szymanski <sebastien.szymanski@armadeus.com>");
0478 MODULE_DESCRIPTION("Semtech SX8654 I2C Touchscreen Driver");
0479 MODULE_LICENSE("GPL");