sx8654
static inline void sx865x_penrelease(struct sx8654 *ts)
struct sx8654 *ts = timer_container_of(ts, t, timer);
struct sx8654 *ts = handle;
struct sx8654 *sx8654 = handle;
irqsrc = i2c_smbus_read_byte_data(sx8654->client,
dev_dbg(&sx8654->client->dev, "irqsrc = 0x%x", irqsrc);
dev_dbg(&sx8654->client->dev, "pen release interrupt");
input_report_key(sx8654->input, BTN_TOUCH, 0);
input_sync(sx8654->input);
dev_dbg(&sx8654->client->dev, "pen touch interrupt");
retval = i2c_master_recv(sx8654->client, data, sizeof(data));
touchscreen_report_pos(sx8654->input, &sx8654->props, x, y,
input_report_key(sx8654->input, BTN_TOUCH, 1);
input_sync(sx8654->input);
dev_dbg(&sx8654->client->dev, "point(%4d,%4d)\n", x, y);
static int sx8654_reset(struct sx8654 *ts)
struct sx8654 *sx8654 = input_get_drvdata(dev);
struct i2c_client *client = sx8654->client;
struct sx8654 *sx8654 = input_get_drvdata(dev);
struct i2c_client *client = sx8654->client;
if (!sx8654->data->has_irq_penrelease)
timer_delete_sync(&sx8654->timer);
error = i2c_smbus_write_byte(client, sx8654->data->cmd_manual);
struct sx8654 *sx8654;
sx8654 = devm_kzalloc(&client->dev, sizeof(*sx8654), GFP_KERNEL);
if (!sx8654)
sx8654->gpio_reset = devm_gpiod_get_optional(&client->dev, "reset",
if (IS_ERR(sx8654->gpio_reset))
return dev_err_probe(&client->dev, PTR_ERR(sx8654->gpio_reset),
sx8654->data = device_get_match_data(&client->dev);
if (!sx8654->data)
sx8654->data = (const struct sx865x_data *)id->driver_data;
if (!sx8654->data) {
if (!sx8654->data->has_irq_penrelease) {
timer_setup(&sx8654->timer, sx865x_penrelease_timer_handler, 0);
spin_lock_init(&sx8654->lock);
touchscreen_parse_properties(input, false, &sx8654->props);
sx8654->client = client;
sx8654->input = input;
input_set_drvdata(sx8654->input, sx8654);
error = sx8654_reset(sx8654);
sx8654->data->chan_mask);
if (sx8654->data->has_reg_irqmask) {
NULL, sx8654->data->irqh,
client->name, sx8654);
error = input_register_device(sx8654->input);