From: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: Michael Walle <michael@walle.cc>,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <brgl@bgdev.pl>,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/3] gpio: regmap: Support registers with more than one bit per GPIO
Date: Mon, 04 Jul 2022 17:03:44 +0100 [thread overview]
Message-ID: <vida3rYRhoYbLy6DJhvZgLhDgrHRy5mn@localhost> (raw)
In-Reply-To: <CAHp75VeosViEcLZ3LF92=_bpSmyGthh2j9V4xYtHTt0Z-fn3-Q@mail.gmail.com>
Andy Shevchenko <andy.shevchenko@gmail.com> writes:
> On Sun, Jul 3, 2022 at 1:11 PM Aidan MacDonald
> <aidanmacdonald.0x0@gmail.com> wrote:
>>
>> Some devices use a multi-bit register field to change the GPIO
>> input/output direction. Add the ->reg_field_xlate() callback to
>> support such devices in gpio-regmap.
>>
>> ->reg_field_xlate() builds on ->reg_mask_xlate() by allowing the
>> driver to return a mask and values to describe a register field.
>> gpio-regmap will use the mask to isolate the field and compare or
>> update it using the values to implement GPIO level and direction
>> get and set ops.
>
> Thanks for the proposal. My comments below.
>
> ...
>
>> +static void
>> +gpio_regmap_simple_field_xlate(struct gpio_regmap *gpio,
>> + unsigned int base, unsigned int offset,
>> + unsigned int *reg, unsigned int *mask,
>> + unsigned int *values)
>> +{
>> + gpio->reg_mask_xlate(gpio, base, offset, reg, mask);
>> + values[0] = 0;
>> + values[1] = *mask;
>
> This is a fragile and less compile-check prone approach. If you know
> the amount of values, make a specific data type for that, or pass the
> length of the output buffer..
>
>> +}
>
> ...
>
>> + unsigned int values[2];
>
>> + return (val & mask) == values[1];
>
>> + unsigned int values[2];
>
> How will the callee know that it's only 2 available?
>
>
>> + regmap_update_bits(gpio->regmap, reg, mask, values[!!val]);
>
> If we have special meaning of the values, perhaps it needs to follow
> an enum of some definitions, so everybody will understand how indices
> are mapped to the actual data in the array.
>
>> + unsigned int values[2];
>
>> + regmap_update_bits(gpio->regmap, reg, mask, values[1]);
>
>> + unsigned int values[2];
>
>> + if ((val & mask) == values[invert])
>
> How do you guarantee this won't overflow? (see above comment about
> indices mapping)
>
>> + unsigned int values[2];
>
> As per above comments.
The documentation states that ->reg_field_xlate returns values[0] and
values[1] for low/high level or input/output direction. IOW, 0 is low
level / input direction and 1 is high level / output direction.
Embedding the array in a struct seems like a better idea though, thanks.
next prev parent reply other threads:[~2022-07-04 16:02 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-03 11:10 [PATCH 0/3] gpio-regmap support for register fields and other hooks Aidan MacDonald
2022-07-03 11:10 ` [PATCH 1/3] gpio: regmap: Support registers with more than one bit per GPIO Aidan MacDonald
2022-07-03 14:09 ` Andy Shevchenko
2022-07-04 16:03 ` Aidan MacDonald [this message]
2022-07-04 12:28 ` Michael Walle
2022-07-04 16:01 ` Aidan MacDonald
2022-07-04 19:46 ` Michael Walle
2022-07-06 20:46 ` Aidan MacDonald
2022-07-07 7:44 ` Michael Walle
2022-07-07 14:58 ` Aidan MacDonald
2022-07-03 11:10 ` [PATCH 2/3] gpio: regmap: Support combined GPIO and pin control drivers Aidan MacDonald
2022-07-03 14:14 ` Andy Shevchenko
2022-07-04 15:31 ` Aidan MacDonald
2022-07-03 11:10 ` [PATCH 3/3] gpio: regmap: Support a custom ->to_irq() hook Aidan MacDonald
2022-07-03 14:24 ` Andy Shevchenko
2022-07-04 16:38 ` Aidan MacDonald
2022-07-04 23:05 ` Linus Walleij
2022-07-05 11:09 ` Aidan MacDonald
2022-07-06 11:45 ` Andy Shevchenko
2022-07-06 20:53 ` Aidan MacDonald
2022-07-06 12:02 ` Linus Walleij
2022-07-06 13:50 ` Aidan MacDonald
2022-07-11 11:48 ` Linus Walleij
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=vida3rYRhoYbLy6DJhvZgLhDgrHRy5mn@localhost \
--to=aidanmacdonald.0x0@gmail.com \
--cc=andy.shevchenko@gmail.com \
--cc=brgl@bgdev.pl \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michael@walle.cc \
/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