[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f3ab3c2d-2056-4802-aa73-2b0db4c7fc30@gmail.com>
Date: Wed, 27 Aug 2025 11:28:36 +0200
From: Osama Abdelkader <osama.abdelkader@...il.com>
To: Dan Carpenter <dan.carpenter@...aro.org>
Cc: gregkh@...uxfoundation.org, dpenkler@...il.com,
matchstick@...erthere.org, arnd@...db.de, linux-kernel@...r.kernel.org,
linux-staging@...ts.linux.dev
Subject: Re: [PATCH] staging: gpib: simplify and fix get_data_lines
On 8/27/25 10:07 AM, Dan Carpenter wrote:
> On Wed, Aug 27, 2025 at 10:15:33AM +0300, Dan Carpenter wrote:
>> On Wed, Aug 27, 2025 at 12:05:02AM +0200, Osama Abdelkader wrote:
>>> The function `get_data_lines()` in gpib_bitbang.c currently reads 8
>>> GPIO descriptors individually and combines them into a byte.
>>> This has two issues:
>>>
>>> * `gpiod_get_value()` returns an `int` which may be negative on
>>> error. Assigning it directly into a `u8` may propagate unexpected
>>> values. Masking ensures only the LSB is used.
>> Using the last bit in an error code is not really "error handling"...
>>
>> What you could do instead would be something like:
>>
>> int ret;
>>
>> for (i = 0; i < 8; i++) {
>> ret |= (gpiod_get_value(lines[i]) & 1) << i;
>> if (ret < 0) {
>> pr_err("something failed\n");
>> return -EINVAL;
> I meant to write "return 0;". It's type u8.
>
> Also that doesn't work. The masks and shift mess it up.
>
> u8 val = 0;
> int ret;
>
> for (i = 0; i < 8; i++) {
> ret = gpiod_get_value(lines[i]);
> if (ret < 0) {
> pr_err("something failed\n");
> continue;
> }
> val |= ret << i;
> }
>
> return ~val;
We can change the return type to int and propagate the error, so:
static int get_data_lines(u8 *out)
{
int val, i;
u8 ret = 0;
struct gpio_desc *lines[8] = { D01, D02, D03, D04, D05, D06, D07, D08 };
for (i = 0; i < 8; i++) { val = gpiod_get_value(lines[i]);
if (val < 0)
return val; // propagate error
ret |= (val & 1) << i;
}
*out = ~ret; return 0;
}
Then in the caller:
u8 data;
if (!get_data_lines(&data))
priv->rbuf[priv->count++] = data;
or we print the error here, What do you think?
>
> regards,
> dan carpenter
>
Powered by blists - more mailing lists