Received: by 10.223.176.46 with SMTP id f43csp1160833wra; Wed, 24 Jan 2018 11:39:18 -0800 (PST) X-Google-Smtp-Source: AH8x227st+cLJldKPy6qlbRKKT3WessHECrhOVua82g5jTIVr9fzRbLM1Ow6nIfwIwTWJFFV2uVi X-Received: by 2002:a17:902:c81:: with SMTP id 1-v6mr9084932plt.281.1516822758835; Wed, 24 Jan 2018 11:39:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516822758; cv=none; d=google.com; s=arc-20160816; b=tKsCycEKlicgyB5BiOf8xFHGplS6A+Sox7UWxLB85OoOepq7mFyB9+oibNohXHe6L3 rX9AXDkQ95qBuNtdipv6gM2OktGxAbU1Wn5bE5O6UfQz/w5M6hG8z8yOdEE09elS+hrr fT7pW5CTuhZsAq72vB3O//0VqzdtKtM1At+nzDrrRVqrpgCNAwxAomHZTQGDPrz6FuLy EyrBpkj5N11n2ewz6Azsm/v54060yf11Qj7ux4WMHfiQ4F7KYNicrjNe7tI8IoY3W1Vg a1/a5xLM+/LhBtx5bWxtw4RgyUfwlAJEgpbHx8eEvxKJ0Guf8vhByVIqpEyDyHRLVUQr lK6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=Z6T1fPzGqH3wywongOtvb6Kz31MdHeiNG+y4XetZEjQ=; b=LkIMLm0IOCuvsrlSvt0E/8EHm39nN/i6YeNd8eSSIfKV/IT5SPwNiKHOSrEoEE0G5y yqNrevLs5AawOOmRAsliNdd4HoKKbQLTj4zYNEK1y+i30FeeiEh4881i9QtMsF2LCvCm 63FhWeRGdOj8AFKxVZu3E+o0w5rl2JgZkF9BF2ZI09kwkvmQWl4ZaUQ35LpS56YXKka4 +/wC38lSM1LghGI3HEZABrZ4/ddgIwBpxD9Kl57VQSHAy93hys14224Hlt3DZuHQo03W qt4xfR7AdEkIOCUoxfbuHhABR96NDbPCrjAOt/OwMlKhIRqHGlSJTNxTkloxhv/xOV8n elFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iikZgG2g; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f11-v6si633916plj.596.2018.01.24.11.39.04; Wed, 24 Jan 2018 11:39:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=iikZgG2g; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932514AbeAXTiS (ORCPT + 99 others); Wed, 24 Jan 2018 14:38:18 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:40024 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932458AbeAXTiP (ORCPT ); Wed, 24 Jan 2018 14:38:15 -0500 Received: by mail-pf0-f193.google.com with SMTP id i66so3901495pfd.7; Wed, 24 Jan 2018 11:38:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Z6T1fPzGqH3wywongOtvb6Kz31MdHeiNG+y4XetZEjQ=; b=iikZgG2gVpbTabc6e5Y9/hMRBOihj0/I1c5sM8cx4VDXLiLRxqXZlVWRbZtvCcuo7C bZcVAPSOS4FoX8/mJRIvyogvA4ezP8FJbMeeos7wkLW36J2/ZeDCjgJ1EBe56EfUvQv9 tAvFl9CdnCuDwRPfpEtbHowouqzI/B35zMmjELm+dWcpCdyvBFIfy6rB5bSDLjjp3FQl vCibBMpMUPeprBA258HLh7Z6yZ+BQmlH/ZDaxqV6bEbxT7wDZ53vQXbV3shXPfxz/o7Q nX1A5L5B3+LTh9PXohyRa3C8DmhyhMZe0imsv7BqQSToKBsQSzAksQ5MrsPtrJCeGmtj eU8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Z6T1fPzGqH3wywongOtvb6Kz31MdHeiNG+y4XetZEjQ=; b=mWl3L+9deEakBxOVp/CaF4ZWSRTfjkBhi1hkLWCtxj/FqyXUVcLzTMSeuBca3Vf0lq l3okCJmUqaExEeDYWRqHMy0mHcHqFVrSY7p1UZQoBPXQVMM7hN9aZ6Ltvg/shMBX+80B L7kcwc74/5lhSWhHZ3uvpLcsdV1do09mHwFbyeS8HFGrZKI/oUbkv+OZ6Id22qpd0r7K Lsh1RpapQJeg1zCI1yfuYmHln5+qD/5RI7SZe8s6sPSdtkm+Ud4bApV/l+HtBBrhIp+n Z5nchAyVNB8Rwpl76vfIdf7gD5eFS9HhIdxA31R5+daittrv3nrPbb3/5bNx1I+O5hPy 3iaw== X-Gm-Message-State: AKwxytdj7bPGiwvYTTa3xtcO304sIRPaAM/5JFMNgAxzY6+tWXgf1Gih daQNEoDKUa93tgj1KijYOiI= X-Received: by 10.101.78.141 with SMTP id b13mr9911907pgs.286.1516822694494; Wed, 24 Jan 2018 11:38:14 -0800 (PST) Received: from dtor-ws.mtv.corp.google.com ([2620:0:1000:1611:da80:8749:c06f:9515]) by smtp.gmail.com with ESMTPSA id f188sm11881834pfc.22.2018.01.24.11.38.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Jan 2018 11:38:13 -0800 (PST) From: Dmitry Torokhov To: Simon Shields , Andi Shyti Cc: Rob Herring , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/4] Input: mms114 - add support for mms152 Date: Wed, 24 Jan 2018 11:38:04 -0800 Message-Id: <20180124193804.155654-5-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.16.0.rc1.238.g530d649a79-goog In-Reply-To: <20180124193804.155654-1-dmitry.torokhov@gmail.com> References: <20180124193804.155654-1-dmitry.torokhov@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Simon Shields MMS152 has no configuration registers, but the packet format used in interrupts is identical to mms114. Signed-off-by: Simon Shields Patchwork-Id: 10125841 Signed-off-by: Dmitry Torokhov --- .../bindings/input/touchscreen/mms114.txt | 6 +- drivers/input/touchscreen/mms114.c | 89 +++++++++++++++++----- 2 files changed, 74 insertions(+), 21 deletions(-) diff --git a/Documentation/devicetree/bindings/input/touchscreen/mms114.txt b/Documentation/devicetree/bindings/input/touchscreen/mms114.txt index 8f9f9f38eff4a..2cd954051d299 100644 --- a/Documentation/devicetree/bindings/input/touchscreen/mms114.txt +++ b/Documentation/devicetree/bindings/input/touchscreen/mms114.txt @@ -1,7 +1,9 @@ -* MELFAS MMS114 touchscreen controller +* MELFAS MMS114/MMS152 touchscreen controller Required properties: -- compatible: must be "melfas,mms114" +- compatible: should be one of: + - "melfas,mms114" + - "melfas,mms152" - reg: I2C address of the chip - interrupts: interrupt to which the chip is connected - touchscreen-size-x: See [1] diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c index 69e4288bf8aa3..06d4ce9a3e547 100644 --- a/drivers/input/touchscreen/mms114.c +++ b/drivers/input/touchscreen/mms114.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,9 @@ #define MMS114_INFOMATION 0x10 #define MMS114_TSP_REV 0xF0 +#define MMS152_FW_REV 0xE1 +#define MMS152_COMPAT_GROUP 0xF2 + /* Minimum delay time is 50us between stop and start signal of i2c */ #define MMS114_I2C_DELAY 50 @@ -50,12 +54,18 @@ #define MMS114_TYPE_TOUCHSCREEN 1 #define MMS114_TYPE_TOUCHKEY 2 +enum mms_type { + TYPE_MMS114 = 114, + TYPE_MMS152 = 152, +}; + struct mms114_data { struct i2c_client *client; struct input_dev *input_dev; struct regulator *core_reg; struct regulator *io_reg; struct touchscreen_properties props; + enum mms_type type; unsigned int contact_threshold; unsigned int moving_threshold; @@ -241,12 +251,28 @@ static int mms114_get_version(struct mms114_data *data) u8 buf[6]; int error; - error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf); - if (error < 0) - return error; + switch (data->type) { + case TYPE_MMS152: + error = __mms114_read_reg(data, MMS152_FW_REV, 3, buf); + if (error) + return error; + buf[3] = i2c_smbus_read_byte_data(data->client, + MMS152_COMPAT_GROUP); + if (buf[3] < 0) + return buf[3]; + dev_info(dev, "TSP FW Rev: bootloader 0x%x / core 0x%x / config 0x%x, Compat group: %c\n", + buf[0], buf[1], buf[2], buf[3]); + break; + + case TYPE_MMS114: + error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf); + if (error) + return error; - dev_info(dev, "TSP Rev: 0x%x, HW Rev: 0x%x, Firmware Ver: 0x%x\n", - buf[0], buf[1], buf[3]); + dev_info(dev, "TSP Rev: 0x%x, HW Rev: 0x%x, Firmware Ver: 0x%x\n", + buf[0], buf[1], buf[3]); + break; + } return 0; } @@ -261,6 +287,10 @@ static int mms114_setup_regs(struct mms114_data *data) if (error < 0) return error; + /* MMS152 has no configuration or power on registers */ + if (data->type == TYPE_MMS152) + return 0; + error = mms114_set_active(data, true); if (error < 0) return error; @@ -395,6 +425,7 @@ static int mms114_probe(struct i2c_client *client, { struct mms114_data *data; struct input_dev *input_dev; + const void *match_data; int error; if (!i2c_check_functionality(client->adapter, @@ -415,6 +446,13 @@ static int mms114_probe(struct i2c_client *client, data->client = client; data->input_dev = input_dev; + /* FIXME: switch to device_get_match_data() when available */ + match_data = of_device_get_match_data(&client->dev); + if (!match_data) + return -EINVAL; + + data->type = (enum mms_type)match_data; + input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X); input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y); input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); @@ -435,19 +473,26 @@ static int mms114_probe(struct i2c_client *client, 0, data->props.max_y, 0, 0); } - /* - * The firmware handles movement and pressure fuzz, so - * don't duplicate that in software. - */ - data->moving_threshold = input_abs_get_fuzz(input_dev, - ABS_MT_POSITION_X); - data->contact_threshold = input_abs_get_fuzz(input_dev, - ABS_MT_PRESSURE); - input_abs_set_fuzz(input_dev, ABS_MT_POSITION_X, 0); - input_abs_set_fuzz(input_dev, ABS_MT_POSITION_Y, 0); - input_abs_set_fuzz(input_dev, ABS_MT_PRESSURE, 0); - - input_dev->name = "MELFAS MMS114 Touchscreen"; + if (data->type == TYPE_MMS114) { + /* + * The firmware handles movement and pressure fuzz, so + * don't duplicate that in software. + */ + data->moving_threshold = input_abs_get_fuzz(input_dev, + ABS_MT_POSITION_X); + data->contact_threshold = input_abs_get_fuzz(input_dev, + ABS_MT_PRESSURE); + input_abs_set_fuzz(input_dev, ABS_MT_POSITION_X, 0); + input_abs_set_fuzz(input_dev, ABS_MT_POSITION_Y, 0); + input_abs_set_fuzz(input_dev, ABS_MT_PRESSURE, 0); + } + + input_dev->name = devm_kasprintf(&client->dev, GFP_KERNEL, + "MELFAS MMS%d Touchscreen", + data->type); + if (!input_dev->name) + return -ENOMEM; + input_dev->id.bustype = BUS_I2C; input_dev->dev.parent = &client->dev; input_dev->open = mms114_input_open; @@ -549,7 +594,13 @@ MODULE_DEVICE_TABLE(i2c, mms114_id); #ifdef CONFIG_OF static const struct of_device_id mms114_dt_match[] = { - { .compatible = "melfas,mms114" }, + { + .compatible = "melfas,mms114", + .data = (void *)TYPE_MMS114, + }, { + .compatible = "melfas,mms152", + .data = (void *)TYPE_MMS152, + }, { } }; MODULE_DEVICE_TABLE(of, mms114_dt_match); -- 2.16.0.rc1.238.g530d649a79-goog