Commit 53fefdd1 authored by Linus Walleij's avatar Linus Walleij Committed by Dmitry Torokhov
Browse files

Input: mms114 - support MMS136



The Melfas MMS136 is similar to the other MMS variants but
has event packages of 6 bytes rather than 8 as the others.

The define is named FINGER_EVENT_SZ in the vendor drivers
so I renamed it from MMS*_PACKET_SZ to MMS*_EVENT_SZ.

After this patch, the touchscreen on the Samsung GT-I8530
works fine with PostmarketOS.

Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20210404232619.3092682-1-linus.walleij@linaro.org


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent a811ecf8
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
// Melfas MMS114/MMS152 touchscreen device driver
// Melfas MMS114/MMS136/MMS152 touchscreen device driver
//
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
// Author: Joonyoung Shim <jy0922.shim@samsung.com>
@@ -44,7 +44,8 @@
#define MMS114_MAX_AREA			0xff

#define MMS114_MAX_TOUCH		10
#define MMS114_PACKET_NUM		8
#define MMS114_EVENT_SIZE		8
#define MMS136_EVENT_SIZE		6

/* Touch type */
#define MMS114_TYPE_NONE		0
@@ -53,6 +54,7 @@

enum mms_type {
	TYPE_MMS114	= 114,
	TYPE_MMS136	= 136,
	TYPE_MMS152	= 152,
	TYPE_MMS345L	= 345,
};
@@ -209,7 +211,11 @@ static irqreturn_t mms114_interrupt(int irq, void *dev_id)
	if (packet_size <= 0)
		goto out;

	touch_size = packet_size / MMS114_PACKET_NUM;
	/* MMS136 has slightly different event size */
	if (data->type == TYPE_MMS136)
		touch_size = packet_size / MMS136_EVENT_SIZE;
	else
		touch_size = packet_size / MMS114_EVENT_SIZE;

	error = __mms114_read_reg(data, MMS114_INFORMATION, packet_size,
			(u8 *)touch);
@@ -275,6 +281,7 @@ static int mms114_get_version(struct mms114_data *data)
		break;

	case TYPE_MMS114:
	case TYPE_MMS136:
		error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf);
		if (error)
			return error;
@@ -297,8 +304,8 @@ static int mms114_setup_regs(struct mms114_data *data)
	if (error < 0)
		return error;

	/* Only MMS114 has configuration and power on registers */
	if (data->type != TYPE_MMS114)
	/* Only MMS114 and MMS136 have configuration and power on registers */
	if (data->type != TYPE_MMS114 && data->type != TYPE_MMS136)
		return 0;

	error = mms114_set_active(data, true);
@@ -480,7 +487,7 @@ static int mms114_probe(struct i2c_client *client,
				     0, data->props.max_y, 0, 0);
	}

	if (data->type == TYPE_MMS114) {
	if (data->type == TYPE_MMS114 || data->type == TYPE_MMS136) {
		/*
		 * The firmware handles movement and pressure fuzz, so
		 * don't duplicate that in software.
@@ -604,6 +611,9 @@ static const struct of_device_id mms114_dt_match[] = {
	{
		.compatible = "melfas,mms114",
		.data = (void *)TYPE_MMS114,
	}, {
		.compatible = "melfas,mms136",
		.data = (void *)TYPE_MMS136,
	}, {
		.compatible = "melfas,mms152",
		.data = (void *)TYPE_MMS152,