Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp5170219pxb; Wed, 19 Jan 2022 12:34:41 -0800 (PST) X-Google-Smtp-Source: ABdhPJweyYBHO7gaTJS1eHpHhy7onNhdJK3vxxLtVPKkw2u8wNfxlhc73gLmKgI9duiOjjbqpRHb X-Received: by 2002:a63:1462:: with SMTP id 34mr12577805pgu.229.1642624481155; Wed, 19 Jan 2022 12:34:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642624481; cv=none; d=google.com; s=arc-20160816; b=hYo7iWQILy2Pvu3N3e9f7cb8YVH1eY/dyPn7O1uRKxivy4eCDUa7n6Pv5/hOd0a+Wb zRCAYFSLuvZC+Ygorsi6IlhCewu5pHypRMEX9JnPKH2IMIFcihZnnSHZd1yPFFrp+PRW A+1kmsO0YtYTY8bZqPe+ObipsX+hcV6NjHOjnOINVKJlLq/RdVSIAup+Q5s/CLPH8HKu ExQI/fXlFUyiiovO75xI0syQRdFitv4hsQCcNeLwiXpYLrJicOiCRJk7Dx1dT3Gek/hG +LXwT3llMTxQFcVYxx6kzC7YzaFRDZybhizOWoLjVrUxtAfLN6GvBBBunIXwK6bmxQh0 0K/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=xK1aCyNEs72Nz6kllo8Nxz5IKBPWt0j4OPgxiYbFIoY=; b=t8lGcFuQCNzhxd0J/ESCZ/XpKOGtMhdJprXxSz5cr6/Yrq8FvXWvzslusEVRXOZS2I 26afr2ISsmfjCCwfvSvHRzKUQvFXc71mpW7FUMYZaxVjA1dDSMX/G2agOpZ+Su4rhy+r fzcCeFUFRdLx3vFgfIocuUPt3BAWA4Zi3JTAKMeXbMkwpdh8dnYhrHtz6N78vZmXoiwi hvKRxB+A+uTBZgkYnHLAg3WuU2gOO9WWG52TemB/WqO4THFwDmAJB5zO3e27sTUcAi0u FQHo3R+MGtzHOb+3HnTa8IoB5iG9+oJuSfbfvq0Ef3+mLfhuBN4zsdFVcY+nldQvnt4A zeSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=BTKCQBne; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qe4si729076pjb.149.2022.01.19.12.34.28; Wed, 19 Jan 2022 12:34:41 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=BTKCQBne; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245590AbiARH1Z (ORCPT + 99 others); Tue, 18 Jan 2022 02:27:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43460 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234427AbiARH0l (ORCPT ); Tue, 18 Jan 2022 02:26:41 -0500 Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C0803C061401; Mon, 17 Jan 2022 23:26:41 -0800 (PST) Received: by mail-pg1-x536.google.com with SMTP id h23so13142515pgk.11; Mon, 17 Jan 2022 23:26:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xK1aCyNEs72Nz6kllo8Nxz5IKBPWt0j4OPgxiYbFIoY=; b=BTKCQBne31e6RluyS/R2Sx6f76juUN1wI5IsdkjgC4xwnA/O8BHAilL+eLCi+iBA9z qdgd259NjDQXF14RIZDnbV+73ytj6bAGLFRMUziXUJb+5kXW5s/nIX3nsl5inatSV4Mc GZF64tpcAEPo9DkWJK7x4FZjzeLKDkOoMtZUUhQ4DQ2nAk/u80Uk1LceBFaTjKT9oiTe rxMTX1YgFvQoNuden1ewRcfPVHjmO7WdguMlypPX28UDyyzancnCDsqOfj/DkQKyfEEr 5zEOZBJASBW9N9rUqfXEmWC41qZVmF4HXIrHbMCuTSbXnWnYmTUZF9I9NLQ80Y2t4Ceu 2EgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xK1aCyNEs72Nz6kllo8Nxz5IKBPWt0j4OPgxiYbFIoY=; b=fBBiyMO9oZ3WJA7Y/UvaJV9T7ISegjspCS8N+RYRkwgdpU1MyZa6S6ZKhW8DIE3hu9 17cUz1A/cJt3Ft+gq/rbnWUB+t/VSNm/jR4Kscbq2afKf0/oOz9zLu2b9GWlIcsLwlZt +HtHU4bpsO/TUadP2L1sR9yQJ0jeS4kXKpdPNZG/VB5tfoY01sVh0qyurMP7uYdAiV7c X0E1XF8r8SW2y+jRk0cc4XKjuExyQB2mW/PqaNYQ1GDzByDEzLI04zmR8VCSaYCFXTQm +3w5pGFZtPnv6FI2/3xqirNZ4eghd1X5r+k8oeJBEf2CxoQmuKmsTY3ujriw3jwZmOKU fplg== X-Gm-Message-State: AOAM5326DYrYhVgwy9ythrBiILiD32n8mkIfKVExxDENPWAarZRrofMC JlBu2yJE0mtjLBsIf3OHUy0= X-Received: by 2002:a63:720c:: with SMTP id n12mr22481147pgc.1.1642490801186; Mon, 17 Jan 2022 23:26:41 -0800 (PST) Received: from dtor-ws.mtv.corp.google.com ([2620:15c:202:201:bf2e:59:5029:f4c5]) by smtp.gmail.com with ESMTPSA id y18sm11079816pfl.156.2022.01.17.23.26.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jan 2022 23:26:39 -0800 (PST) From: Dmitry Torokhov To: Jiri Kosina , Benjamin Tissoires Cc: Angela Czubak , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 06/12] HID: i2c-hid: define i2c_hid_read_register() and use it Date: Mon, 17 Jan 2022 23:26:22 -0800 Message-Id: <20220118072628.1617172-7-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.34.1.703.g22d0c6ccf7-goog In-Reply-To: <20220118072628.1617172-1-dmitry.torokhov@gmail.com> References: <20220118072628.1617172-1-dmitry.torokhov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Handling simple read of device registers in __i2c_hid_command() makes it too complicated and the need of special handling for the HID descriptor register adds even more complexity. Instead, let's create simple i2c_hid_read_register() helper on base of i2c_hid_xfer() and use it. Signed-off-by: Dmitry Torokhov --- drivers/hid/i2c-hid/i2c-hid-core.c | 45 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c index c48b75bd81e0..b1a2c6ad374d 100644 --- a/drivers/hid/i2c-hid/i2c-hid-core.c +++ b/drivers/hid/i2c-hid/i2c-hid-core.c @@ -104,14 +104,6 @@ struct i2c_hid_cmd { .opcode = opcode_, .length = 4, \ .registerIndex = offsetof(struct i2c_hid_desc, wCommandRegister) -/* fetch HID descriptor */ -static const struct i2c_hid_cmd hid_descr_cmd = { .length = 2 }; -/* fetch report descriptors */ -static const struct i2c_hid_cmd hid_report_descr_cmd = { - .registerIndex = offsetof(struct i2c_hid_desc, - wReportDescRegister), - .opcode = 0x00, - .length = 2 }; /* commands */ static const struct i2c_hid_cmd hid_reset_cmd = { I2C_HID_CMD(0x01) }; static const struct i2c_hid_cmd hid_get_report_cmd = { I2C_HID_CMD(0x02) }; @@ -243,6 +235,14 @@ static int i2c_hid_xfer(struct i2c_hid *ihid, return 0; } +static int i2c_hid_read_register(struct i2c_hid *ihid, __le16 reg, + void *buf, size_t len) +{ + *(__le16 *)ihid->cmdbuf = reg; + + return i2c_hid_xfer(ihid, ihid->cmdbuf, sizeof(__le16), buf, len); +} + static size_t i2c_hid_encode_command(u8 *buf, u8 opcode, int report_type, int report_id) { @@ -268,13 +268,8 @@ static int __i2c_hid_command(struct i2c_hid *ihid, int length = command->length; unsigned int registerIndex = command->registerIndex; - /* special case for hid_descr_cmd */ - if (command == &hid_descr_cmd) { - *(__le16 *)ihid->cmdbuf = ihid->wHIDDescRegister; - } else { - ihid->cmdbuf[0] = ihid->hdesc_buffer[registerIndex]; - ihid->cmdbuf[1] = ihid->hdesc_buffer[registerIndex + 1]; - } + ihid->cmdbuf[0] = ihid->hdesc_buffer[registerIndex]; + ihid->cmdbuf[1] = ihid->hdesc_buffer[registerIndex + 1]; if (length > 2) { length = sizeof(__le16) + /* register */ @@ -791,8 +786,9 @@ static int i2c_hid_parse(struct hid_device *hid) i2c_hid_dbg(ihid, "asking HID report descriptor\n"); - ret = i2c_hid_command(ihid, &hid_report_descr_cmd, - rdesc, rsize); + ret = i2c_hid_read_register(ihid, + ihid->hdesc.wReportDescRegister, + rdesc, rsize); if (ret) { hid_err(hid, "reading report descriptor failed\n"); kfree(rdesc); @@ -902,7 +898,7 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) struct i2c_client *client = ihid->client; struct i2c_hid_desc *hdesc = &ihid->hdesc; unsigned int dsize; - int ret; + int error; /* i2c hid fetch using a fixed descriptor size (30 bytes) */ if (i2c_hid_get_dmi_i2c_hid_desc_override(client->name)) { @@ -911,11 +907,14 @@ static int i2c_hid_fetch_hid_descriptor(struct i2c_hid *ihid) *i2c_hid_get_dmi_i2c_hid_desc_override(client->name); } else { i2c_hid_dbg(ihid, "Fetching the HID descriptor\n"); - ret = i2c_hid_command(ihid, &hid_descr_cmd, - ihid->hdesc_buffer, - sizeof(struct i2c_hid_desc)); - if (ret) { - dev_err(&ihid->client->dev, "hid_descr_cmd failed\n"); + error = i2c_hid_read_register(ihid, + ihid->wHIDDescRegister, + &ihid->hdesc, + sizeof(ihid->hdesc)); + if (error) { + dev_err(&ihid->client->dev, + "failed to fetch HID descriptor: %d\n", + error); return -ENODEV; } } -- 2.34.1.703.g22d0c6ccf7-goog