From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Bogdan Togorean <bogdan.togorean@analog.com>
Cc: linux-input@vger.kernel.org, gustavo@embeddedor.com,
linux-kernel@vger.kernel.org, Michael.Hennerich@analog.com
Subject: Re: [PATCH RESEND] input: adp5589: Add gpio_set_multiple interface
Date: Thu, 23 May 2019 00:18:20 -0700 [thread overview]
Message-ID: <20190523071820.GA121292@dtor-ws> (raw)
In-Reply-To: <20190521083821.26540-1-bogdan.togorean@analog.com>
Hi Bogdan,
On Tue, May 21, 2019 at 11:38:22AM +0300, Bogdan Togorean wrote:
> This patch implements the gpio_set_multiple interface for ADP558x chip.
>
> Signed-off-by: Bogdan Togorean <bogdan.togorean@analog.com>
> ---
> drivers/input/keyboard/adp5589-keys.c | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
>
> diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c
> index 2835fba71c33..143871bd60ef 100644
> --- a/drivers/input/keyboard/adp5589-keys.c
> +++ b/drivers/input/keyboard/adp5589-keys.c
> @@ -416,6 +416,30 @@ static void adp5589_gpio_set_value(struct gpio_chip *chip,
> mutex_unlock(&kpad->gpio_lock);
> }
>
> +static void adp5589_gpio_set_multiple(struct gpio_chip *chip,
> + unsigned long *mask, unsigned long *bits)
> +{
> + struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc);
> + u8 bank, reg_mask, reg_bits;
> +
> + mutex_lock(&kpad->gpio_lock);
> +
> + for (bank = 0; bank <= kpad->var->bank(kpad->var->maxgpio); bank++) {
> + if (bank > kpad->var->bank(get_bitmask_order(*mask) - 1))
> + break;
I wonder if we should have:
last_gpio = min(kpad->var->maxgpio, get_bitmask_order(*mask) - 1);
last_bank = kpad->var->bank(last_bank);
for (bank = 0; bank <= last_bank; bank++) {
...
}
> + reg_mask = mask[bank / sizeof(*mask)] >>
> + ((bank % sizeof(*mask)) * BITS_PER_BYTE);
> + reg_bits = bits[bank / sizeof(*bits)] >>
> + ((bank % sizeof(*bits)) * BITS_PER_BYTE);
This s really hard to parse. We know that "bank" is a byte, and mask is
long, we do not have to be this roundabout it.
> + kpad->dat_out[bank] &= ~reg_mask;
> + kpad->dat_out[bank] |= reg_bits & reg_mask;
> + adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) + bank,
> + kpad->dat_out[bank]);
> + }
However the biggest issue is that this implementation seems to ignore
the kpad->gpiomap that translates GPIO numbers as seen by gpiolib to
GPIO numbers used by the chip. You need to reshuffle the mask and bits,
and only then do the writes.
Given the complexities, does set_multiple really save anything?
Thanks.
--
Dmitry
next prev parent reply other threads:[~2019-05-23 7:18 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-15 12:25 [PATCH 1/1] input: adp5589: Add gpio_set_multiple interface Bogdan Togorean
2019-05-21 8:38 ` [PATCH RESEND] " Bogdan Togorean
2019-05-23 7:18 ` Dmitry Torokhov [this message]
2019-05-27 8:40 ` Togorean, Bogdan
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=20190523071820.GA121292@dtor-ws \
--to=dmitry.torokhov@gmail.com \
--cc=Michael.Hennerich@analog.com \
--cc=bogdan.togorean@analog.com \
--cc=gustavo@embeddedor.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.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).