elo
(elo->data[8] << 8) | elo->data[7]);
input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH);
} else if (elo->data[1] == ELO10_ACK_PACKET) {
if (elo->data[2] == '0')
elo->expected_packet = ELO10_TOUCH_PACKET;
complete(&elo->cmd_done);
memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN);
elo->expected_packet = ELO10_ACK_PACKET;
elo->csum += data;
static void elo_process_data_6(struct elo *elo, unsigned char data)
struct input_dev *dev = elo->dev;
elo->data[elo->idx] = data;
switch (elo->idx++) {
elo->idx = 0;
elo->idx = 0;
elo->idx = 0;
elo->idx = 0;
input_report_abs(dev, ABS_X, ((elo->data[0] & 0x3f) << 6) | (elo->data[1] & 0x3f));
input_report_abs(dev, ABS_Y, ((elo->data[2] & 0x3f) << 6) | (elo->data[3] & 0x3f));
if (elo->id == 2) {
elo->idx = 0;
elo->idx = 0;
input_report_abs(dev, ABS_PRESSURE, elo->data[5]);
input_report_key(dev, BTN_TOUCH, !!elo->data[5]);
elo->idx = 0;
static void elo_process_data_3(struct elo *elo, unsigned char data)
struct input_dev *dev = elo->dev;
elo->data[elo->idx] = data;
switch (elo->idx++) {
elo->idx = 0;
input_report_key(dev, BTN_TOUCH, !(elo->data[1] & 0x80));
input_report_abs(dev, ABS_X, elo->data[1]);
input_report_abs(dev, ABS_Y, elo->data[2]);
elo->idx = 0;
struct elo *elo = serio_get_drvdata(serio);
switch (elo->id) {
elo_process_data_10(elo, data);
elo_process_data_6(elo, data);
elo_process_data_3(elo, data);
static int elo_command_10(struct elo *elo, unsigned char *packet)
mutex_lock(&elo->cmd_mutex);
scoped_guard(serio_pause_rx, elo->serio) {
elo->expected_packet = toupper(packet[0]);
init_completion(&elo->cmd_done);
if (serio_write(elo->serio, ELO10_LEAD_BYTE))
if (serio_write(elo->serio, packet[i]))
if (serio_write(elo->serio, csum))
wait_for_completion_timeout(&elo->cmd_done, HZ);
if (elo->expected_packet == ELO10_TOUCH_PACKET) {
memcpy(packet, elo->response, ELO10_PACKET_LEN);
mutex_unlock(&elo->cmd_mutex);
static int elo_setup_10(struct elo *elo)
struct input_dev *dev = elo->dev;
if (elo_command_10(elo, packet))
dev_info(&elo->serio->dev,
struct elo *elo = serio_get_drvdata(serio);
input_get_device(elo->dev);
input_unregister_device(elo->dev);
input_put_device(elo->dev);
kfree(elo);
struct elo *elo;
elo = kzalloc_obj(*elo);
if (!elo || !input_dev) {
elo->serio = serio;
elo->id = serio->id.id;
elo->dev = input_dev;
elo->expected_packet = ELO10_TOUCH_PACKET;
mutex_init(&elo->cmd_mutex);
init_completion(&elo->cmd_done);
scnprintf(elo->phys, sizeof(elo->phys), "%s/input0", serio->phys);
input_dev->phys = elo->phys;
input_dev->id.product = elo->id;
serio_set_drvdata(serio, elo);
switch (elo->id) {
if (elo_setup_10(elo)) {
err = input_register_device(elo->dev);
kfree(elo);
static void elo_process_data_10(struct elo *elo, unsigned char data)
struct input_dev *dev = elo->dev;
elo->data[elo->idx] = data;
switch (elo->idx++) {
elo->csum = 0xaa;
dev_dbg(&elo->serio->dev,
elo->idx = 0;
elo->idx = 0;
if (data != elo->csum) {
dev_dbg(&elo->serio->dev,
data, elo->csum);
if (elo->data[1] != elo->expected_packet) {
if (elo->data[1] != ELO10_TOUCH_PACKET)
dev_dbg(&elo->serio->dev,
elo->data[1]);
if (likely(elo->data[1] == ELO10_TOUCH_PACKET)) {
input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]);
input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]);
if (elo->data[2] & ELO10_PRESSURE)