diff options
Diffstat (limited to 'drivers/input/touchscreen/elo.c')
| -rw-r--r-- | drivers/input/touchscreen/elo.c | 221 | 
1 files changed, 118 insertions, 103 deletions
diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c index 8f38c5e55ce..486d31ba9c0 100644 --- a/drivers/input/touchscreen/elo.c +++ b/drivers/input/touchscreen/elo.c @@ -72,45 +72,49 @@ 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++) { -		case 0: -			elo->csum = 0xaa; -			if (data != ELO10_LEAD_BYTE) { -				pr_debug("elo: unsynchronized data: 0x%02x\n", data); -				elo->idx = 0; -			} -			break; -		case 9: +	switch (elo->idx++) { +	case 0: +		elo->csum = 0xaa; +		if (data != ELO10_LEAD_BYTE) { +			dev_dbg(&elo->serio->dev, +				"unsynchronized data: 0x%02x\n", data);  			elo->idx = 0; -			if (data != elo->csum) { -				pr_debug("elo: bad checksum: 0x%02x, expected 0x%02x\n", -					 data, elo->csum); -				break; -			} -			if (elo->data[1] != elo->expected_packet) { -				if (elo->data[1] != ELO10_TOUCH_PACKET) -					pr_debug("elo: unexpected packet: 0x%02x\n", -						 elo->data[1]); -				break; -			} -			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) -					input_report_abs(dev, ABS_PRESSURE, -							(elo->data[8] << 8) | elo->data[7]); -				input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH); -				input_sync(dev); -			} else if (elo->data[1] == ELO10_ACK_PACKET) { -				if (elo->data[2] == '0') -					elo->expected_packet = ELO10_TOUCH_PACKET; -				complete(&elo->cmd_done); -			} else { -				memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN); -				elo->expected_packet = ELO10_ACK_PACKET; -			} +		} +		break; + +	case 9: +		elo->idx = 0; +		if (data != elo->csum) { +			dev_dbg(&elo->serio->dev, +				"bad checksum: 0x%02x, expected 0x%02x\n", +				 data, elo->csum);  			break; +		} +		if (elo->data[1] != elo->expected_packet) { +			if (elo->data[1] != ELO10_TOUCH_PACKET) +				dev_dbg(&elo->serio->dev, +					"unexpected packet: 0x%02x\n", +					 elo->data[1]); +			break; +		} +		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) +				input_report_abs(dev, ABS_PRESSURE, +						(elo->data[8] << 8) | elo->data[7]); +			input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH); +			input_sync(dev); +		} else if (elo->data[1] == ELO10_ACK_PACKET) { +			if (elo->data[2] == '0') +				elo->expected_packet = ELO10_TOUCH_PACKET; +			complete(&elo->cmd_done); +		} else { +			memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN); +			elo->expected_packet = ELO10_ACK_PACKET; +		} +		break;  	}  	elo->csum += data;  } @@ -123,42 +127,53 @@ static void elo_process_data_6(struct elo *elo, unsigned char data)  	switch (elo->idx++) { -		case 0: if ((data & 0xc0) != 0xc0) elo->idx = 0; break; -		case 1: if ((data & 0xc0) != 0x80) elo->idx = 0; break; -		case 2: if ((data & 0xc0) != 0x40) elo->idx = 0; break; - -		case 3: -			if (data & 0xc0) { -				elo->idx = 0; -				break; -			} +	case 0: +		if ((data & 0xc0) != 0xc0) +			elo->idx = 0; +		break; -			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)); +	case 1: +		if ((data & 0xc0) != 0x80) +			elo->idx = 0; +		break; -			if (elo->id == 2) { -				input_report_key(dev, BTN_TOUCH, 1); -				input_sync(dev); -				elo->idx = 0; -			} +	case 2: +		if ((data & 0xc0) != 0x40) +			elo->idx = 0; +		break; +	case 3: +		if (data & 0xc0) { +			elo->idx = 0;  			break; +		} -		case 4: -			if (data) { -				input_sync(dev); -				elo->idx = 0; -			} -			break; +		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)); -		case 5: -			if ((data & 0xf0) == 0) { -				input_report_abs(dev, ABS_PRESSURE, elo->data[5]); -				input_report_key(dev, BTN_TOUCH, !!elo->data[5]); -			} +		if (elo->id == 2) { +			input_report_key(dev, BTN_TOUCH, 1);  			input_sync(dev);  			elo->idx = 0; -			break; +		} + +		break; + +	case 4: +		if (data) { +			input_sync(dev); +			elo->idx = 0; +		} +		break; + +	case 5: +		if ((data & 0xf0) == 0) { +			input_report_abs(dev, ABS_PRESSURE, elo->data[5]); +			input_report_key(dev, BTN_TOUCH, !!elo->data[5]); +		} +		input_sync(dev); +		elo->idx = 0; +		break;  	}  } @@ -170,17 +185,17 @@ static void elo_process_data_3(struct elo *elo, unsigned char data)  	switch (elo->idx++) { -		case 0: -			if ((data & 0x7f) != 0x01) -				elo->idx = 0; -			break; -		case 2: -			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]); -			input_sync(dev); +	case 0: +		if ((data & 0x7f) != 0x01)  			elo->idx = 0; -			break; +		break; +	case 2: +		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]); +		input_sync(dev); +		elo->idx = 0; +		break;  	}  } @@ -189,19 +204,19 @@ static irqreturn_t elo_interrupt(struct serio *serio,  {  	struct elo *elo = serio_get_drvdata(serio); -	switch(elo->id) { -		case 0: -			elo_process_data_10(elo, data); -			break; +	switch (elo->id) { +	case 0: +		elo_process_data_10(elo, data); +		break; -		case 1: -		case 2: -			elo_process_data_6(elo, data); -			break; +	case 1: +	case 2: +		elo_process_data_6(elo, data); +		break; -		case 3: -			elo_process_data_3(elo, data); -			break; +	case 3: +		elo_process_data_3(elo, data); +		break;  	}  	return IRQ_HANDLED; @@ -261,10 +276,10 @@ static int elo_setup_10(struct elo *elo)  	if (packet[3] & ELO10_PRESSURE)  		input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); -	printk(KERN_INFO "elo: %sTouch touchscreen, fw: %02x.%02x, " -		"features: 0x%02x, controller: 0x%02x\n", -		elo_types[(packet[1] -'0') & 0x03], -		packet[5], packet[4], packet[3], packet[7]); +	dev_info(&elo->serio->dev, +		 "%sTouch touchscreen, fw: %02x.%02x, features: 0x%02x, controller: 0x%02x\n", +		 elo_types[(packet[1] -'0') & 0x03], +		 packet[5], packet[4], packet[3], packet[7]);  	return 0;  } @@ -330,24 +345,24 @@ static int elo_connect(struct serio *serio, struct serio_driver *drv)  	switch (elo->id) { -		case 0: /* 10-byte protocol */ -			if (elo_setup_10(elo)) -				goto fail3; +	case 0: /* 10-byte protocol */ +		if (elo_setup_10(elo)) +			goto fail3; -			break; +		break; -		case 1: /* 6-byte protocol */ -			input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); +	case 1: /* 6-byte protocol */ +		input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); -		case 2: /* 4-byte protocol */ -			input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); -			input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); -			break; +	case 2: /* 4-byte protocol */ +		input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); +		input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); +		break; -		case 3: /* 3-byte protocol */ -			input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); -			input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); -			break; +	case 3: /* 3-byte protocol */ +		input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); +		input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); +		break;  	}  	err = input_register_device(elo->dev);  |