All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Cercueil <paul@crapouillou.net>
To: Jonathan Cameron <jic23@kernel.org>
Cc: Artur Rojek <contact@artur-rojek.eu>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Chris Morgan <macromorgan@hotmail.com>,
	linux-mips@vger.kernel.org, linux-iio@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-input@vger.kernel.org
Subject: Re: [PATCH 4/4] input: joystick: Fix buffer data parsing
Date: Mon, 22 Aug 2022 11:03:03 +0200	[thread overview]
Message-ID: <3HE0HR.IPKJTTCKEJUA1@crapouillou.net> (raw)
In-Reply-To: <20220819185339.7f488ad8@jic23-huawei>

Hi Jonathan,

Le ven., août 19 2022 at 18:53:39 +0100, Jonathan Cameron 
<jic23@kernel.org> a écrit :
> On Wed, 17 Aug 2022 12:56:43 +0200
> Artur Rojek <contact@artur-rojek.eu> wrote:
> 
>>  Don't try to access buffer data of a channel by its scan index. 
>> Instead,
>>  use the newly introduced `iio_find_channel_offset_in_buffer` to get 
>> the
>>  correct data offset.
>> 
>>  The scan index of a channel does not represent its position in a 
>> buffer,
>>  as the buffer will contain data for enabled channels only, affecting
>>  data offsets and alignment.
>> 
>>  Fixes: 2c2b364fddd5 ("Input: joystick - add ADC attached joystick 
>> driver.")
>>  Reported-by: Chris Morgan <macromorgan@hotmail.com>
>>  Tested-by: Paul Cercueil <paul@crapouillou.net>
>>  Signed-off-by: Artur Rojek <contact@artur-rojek.eu>
>>  ---
>>   drivers/input/joystick/adc-joystick.c | 26 
>> +++++++++++++++++---------
>>   1 file changed, 17 insertions(+), 9 deletions(-)
>> 
>>  diff --git a/drivers/input/joystick/adc-joystick.c 
>> b/drivers/input/joystick/adc-joystick.c
>>  index c0deff5d4282..aed853ebe1d1 100644
>>  --- a/drivers/input/joystick/adc-joystick.c
>>  +++ b/drivers/input/joystick/adc-joystick.c
>>  @@ -6,6 +6,7 @@
>>   #include <linux/ctype.h>
>>   #include <linux/input.h>
>>   #include <linux/iio/iio.h>
>>  +#include <linux/iio/buffer.h>
>>   #include <linux/iio/consumer.h>
>>   #include <linux/module.h>
>>   #include <linux/platform_device.h>
>>  @@ -46,36 +47,43 @@ static void adc_joystick_poll(struct input_dev 
>> *input)
>>   static int adc_joystick_handle(const void *data, void *private)
>>   {
>>   	struct adc_joystick *joy = private;
>>  +	struct iio_buffer *buffer;
>>   	enum iio_endian endianness;
>>  -	int bytes, msb, val, idx, i;
>>  -	const u16 *data_u16;
>>  +	int bytes, msb, val, off;
>>  +	const u8 *chan_data;
>>  +	unsigned int i;
>>   	bool sign;
>> 
>>   	bytes = joy->chans[0].channel->scan_type.storagebits >> 3;
>> 
>>   	for (i = 0; i < joy->num_chans; ++i) {
>>  -		idx = joy->chans[i].channel->scan_index;
>>   		endianness = joy->chans[i].channel->scan_type.endianness;
>>   		msb = joy->chans[i].channel->scan_type.realbits - 1;
>>   		sign = tolower(joy->chans[i].channel->scan_type.sign) == 's';
>>  +		buffer = iio_channel_cb_get_iio_buffer(joy->buffer);
>>  +		off = iio_find_channel_offset_in_buffer(joy->chans[i].indio_dev,
>>  +							joy->chans[i].channel,
>>  +							buffer);
> 
> With this call replaced with one that instead uses
> 
> 		off = iio_find_channel_offset_in_buffer(joy->chans, i);
> 
> which I'm fairly sure is enough via the info in chans[x]->channel to 
> establish this offset.
> 
> All is good, though you should probably cache it as doing that maths 
> every
> time seems excessive.
> 
> 
>>  +		if (off < 0)
>>  +			return off;
>>  +
>>  +		chan_data = (const u8 *)data + off;
>> 
>>   		switch (bytes) {
>>   		case 1:
>>  -			val = ((const u8 *)data)[idx];
>>  +			val = *chan_data;
>>   			break;
>>   		case 2:
>>  -			data_u16 = (const u16 *)data + idx;
>>  -
>>   			/*
>>   			 * Data is aligned to the sample size by IIO core.
>>   			 * Call `get_unaligned_xe16` to hide type casting.
>>   			 */
>>   			if (endianness == IIO_BE)
>>  -				val = get_unaligned_be16(data_u16);
>>  +				val = get_unaligned_be16(chan_data);
> 
> I obviously missed this previously but these are aligned so we don't 
> need the
> unaligned form.

Yes, the comment above says that it's used to hide type casting.

Cheers,
-Paul

>>   			else if (endianness == IIO_LE)
>>  -				val = get_unaligned_le16(data_u16);
>>  +				val = get_unaligned_le16(chan_data);
>>   			else /* IIO_CPU */
>>  -				val = *data_u16;
>>  +				val = *(const u16 *)chan_data;
>>   			break;
>>   		default:
>>   			return -EINVAL;
> 



  reply	other threads:[~2022-08-22  9:05 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-17 10:56 [PATCH 0/4] iio/adc-joystick: buffer data parsing fixes Artur Rojek
2022-08-17 10:56 ` [PATCH 1/4] iio/adc: ingenic: fix channel offsets in buffer Artur Rojek
2022-08-19  8:12   ` Andy Shevchenko
2022-08-19 10:07     ` Paul Cercueil
2022-08-19 10:15       ` Andy Shevchenko
2022-08-17 10:56 ` [PATCH 2/4] iio: add iio_channel_cb_get_iio_buffer helper Artur Rojek
2022-08-19  8:14   ` Andy Shevchenko
2022-08-19 17:35     ` Jonathan Cameron
2022-08-19 17:44   ` Jonathan Cameron
2022-08-17 10:56 ` [PATCH 3/4] iio: add helper function for reading channel offset in buffer Artur Rojek
2022-08-19  8:17   ` Andy Shevchenko
2022-08-19 10:33     ` Artur Rojek
2022-08-19 10:36       ` Andy Shevchenko
2022-08-19 17:49   ` Jonathan Cameron
2022-08-17 10:56 ` [PATCH 4/4] input: joystick: Fix buffer data parsing Artur Rojek
2022-08-19  8:21   ` Andy Shevchenko
2022-08-19 17:53   ` Jonathan Cameron
2022-08-22  9:03     ` Paul Cercueil [this message]
2022-08-22 19:01       ` Jonathan Cameron
2022-08-18 18:28 ` [PATCH 0/4] iio/adc-joystick: buffer data parsing fixes Chris Morgan
2022-08-19 10:36   ` Artur Rojek

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=3HE0HR.IPKJTTCKEJUA1@crapouillou.net \
    --to=paul@crapouillou.net \
    --cc=contact@artur-rojek.eu \
    --cc=dmitry.torokhov@gmail.com \
    --cc=jic23@kernel.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=macromorgan@hotmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.