linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sultan Alsawaf <sultan@kerneltoast.com>
To: linux-i2c@vger.kernel.org
Cc: jikos@kernel.org, aaron.ma@canonical.com, admin@kryma.net,
	andriy.shevchenko@linux.intel.com, benjamin.tissoires@redhat.com,
	hdegoede@redhat.com, hn.chen@weidahitech.com,
	jarkko.nikula@linux.intel.com, kai.heng.feng@canonical.com,
	linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	mika.westerberg@linux.intel.com, vicamo.yang@canonical.com,
	wsa@kernel.org, Sultan Alsawaf <sultan@kerneltoast.com>,
	Jiri Kosina <jkosina@suse.cz>
Subject: [PATCH v2 4/4] HID: i2c-hid: Use block reads when possible to save power
Date: Wed, 16 Sep 2020 22:22:56 -0700	[thread overview]
Message-ID: <20200917052256.5770-5-sultan@kerneltoast.com> (raw)
In-Reply-To: <20200917052256.5770-1-sultan@kerneltoast.com>

From: Sultan Alsawaf <sultan@kerneltoast.com>

We have no way of knowing how large an incoming payload is going to be,
so the only strategy available up until now has been to always retrieve
the maximum possible report length over i2c, which can be quite
inefficient. For devices that send reports in block read format, the i2c
controller driver can read the payload length on the fly and terminate
the i2c transaction early, resulting in considerable power savings.

On a Dell Precision 15 5540 with an i9-9880H, resting my finger on the
touchpad causes psys power readings to go up by about 4W and hover there
until I remove my finger. With this patch, my psys readings go from 4.7W
down to 3.1W, yielding about 1.6W in savings. This is because my
touchpad's max report length is 60 bytes, but all of the regular reports
it sends for touch events are only 32 bytes, so the i2c transfer is
roughly halved for the common case.

Acked-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
---
 drivers/hid/i2c-hid/i2c-hid-core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index dbd04492825d..66950f472122 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c
@@ -476,11 +476,14 @@ static void i2c_hid_get_input(struct i2c_hid *ihid)
 	int ret;
 	u32 ret_size;
 	int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
+	u16 flags;
 
 	if (size > ihid->bufsize)
 		size = ihid->bufsize;
 
-	ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
+	/* Try to do a block read if the size fits in one byte */
+	flags = size > 255 ? I2C_M_RD : I2C_M_RD | I2C_M_RECV_LEN;
+	ret = i2c_transfer_buffer_flags(ihid->client, ihid->inbuf, size, flags);
 	if (ret != size) {
 		if (ret < 0)
 			return;
-- 
2.28.0


  parent reply	other threads:[~2020-09-17  5:23 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-17  5:22 [PATCH v2 0/4] i2c-hid: Save power by reducing i2c xfers with block reads Sultan Alsawaf
2020-09-17  5:22 ` [PATCH v2 1/4] i2c: designware: Fix transfer failures for invalid SMBus " Sultan Alsawaf
2020-09-17  5:22 ` [PATCH v2 2/4] i2c: designware: Ensure tx_buf_len is nonzero for " Sultan Alsawaf
2020-09-17 12:47   ` Andy Shevchenko
2020-09-17 13:44   ` Jarkko Nikula
2020-09-17 14:45     ` Andy Shevchenko
2020-09-17  5:22 ` [PATCH v2 3/4] i2c: designware: Allow SMBus block reads up to 255 bytes in length Sultan Alsawaf
2020-09-17 20:57   ` Wolfram Sang
2020-09-17 23:12     ` Sultan Alsawaf
2020-09-17  5:22 ` Sultan Alsawaf [this message]
2020-09-17 14:02 ` [PATCH v2 0/4] i2c-hid: Save power by reducing i2c xfers with block reads Andy Shevchenko
2020-09-23 13:59   ` Jarkko Nikula
2020-09-22  9:19 ` Jiri Kosina
2020-09-22 11:36   ` Wolfram Sang
2020-09-22 19:59     ` Jiri Kosina
2020-09-23  6:02       ` Sultan Alsawaf
2020-10-16 11:16   ` Hans de Goede
2020-10-16 15:24     ` Sultan Alsawaf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200917052256.5770-5-sultan@kerneltoast.com \
    --to=sultan@kerneltoast.com \
    --cc=aaron.ma@canonical.com \
    --cc=admin@kryma.net \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=hn.chen@weidahitech.com \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=jikos@kernel.org \
    --cc=jkosina@suse.cz \
    --cc=kai.heng.feng@canonical.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=vicamo.yang@canonical.com \
    --cc=wsa@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).