From: Kent Gibson <warthog618@gmail.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Linus Walleij <linus.walleij@linaro.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
linux-gpio@vger.kernel.org
Subject: Re: [libgpiod v2][PATCH v3 2/3] line-config: expose the override logic to users
Date: Sat, 5 Mar 2022 13:51:07 +0800 [thread overview]
Message-ID: <20220305055107.GB9638@sol> (raw)
In-Reply-To: <20220303091836.168223-3-brgl@bgdev.pl>
On Thu, Mar 03, 2022 at 10:18:35AM +0100, Bartosz Golaszewski wrote:
> We've already added getters for line-config but without exposing some
> parts of the internal logic of the object, the user can't really get
> the full picture and inspect the contents. This patch reworks the
> accessors further by providing access to the underlying override
> mechanism.
>
> For every setting, we expose a getter and setter for the default value
> as well as a set of four functions for setting, getting, clearing and
> checking per-offset overrides.
>
> An override can initially have the same value as the defaults but will
> retain the overridden value should the defaults change.
>
> We also complete the API by providing functions that allow to retrieve
> the overridden offsets and their corresponding property types.
>
> This way the caller can fully inspect the line_config and high-level
> language bindings can provide stringification methods.
>
> While at it: we fix a couple bugs in the implementation of struct
> line_config and add new constructors that take a variable list of
> arguments.
>
The variadic constructor is new for patch v3.
It bundles default constructor + default mutators, so doesn't add
functionality that wasn't already available - it just makes it
accessible via a single function call.
Is the variadic form beneficial for bindings, say Python, where you
would prefer not to be making a bunch of C calls?
Or is this just sugar?
No major objection, just curious about the rationale for adding it.
[snip]
> +/**
> + * @brief Get the total number of overridden settings currently stored by this
> + * line config object.
> + * @param config Line config object.
> + * @return Number of individual overridden settings.
> + */
> +unsigned int
> +gpiod_line_config_get_num_overrides(struct gpiod_line_config *config);
> +
> +/**
> + * @brief Get the list of overridden offsets and the corresponding types of
> + * overridden settings.
> + * @param config Line config object.
> + * @param offsets Array to store the overidden offsets. Must hold at least the
> + * number of unsigned integers returned by
> + * ::gpiod_line_config_get_output_value_offset.
> + * @param props Array to store the types of overridden settings. Must hold at
> + * least the number of integers returned by
> + * gpiod_line_config_get_output_value_offset.
> + */
The purpose of the offsets and props arrays is not clear.
Clarify that you are returning a list of (offset,prop), split across the
two arrays.
Replace them with a single array of (offset,prop) unless there is
a good reason to keep them separate?
Guessing it should be gpiod_line_config_get_num_overrides(), not
gpiod_line_config_get_output_value_offset() which returns 0 or 1, or
even better -1 for inputs?
[snip]
> +GPIOD_API unsigned int
> +gpiod_line_config_get_num_overrides(struct gpiod_line_config *config)
> +{
> + struct override_config *override;
> + unsigned int i, j, count = 0;
>
> - errno = ENXIO;
> + for (i = 0; i < GPIO_V2_LINES_MAX; i++) {
> + override = &config->overrides[i];
> +
> + if (override_used(override)) {
> + for (j = 0; j < NUM_OVERRIDE_FLAGS; j++) {
> + if (override->override_flags &
> + override_flag_list[j])
> + count++;
> + }
> + }
> + }
> +
> + return count;
> +}
> +
Using GPIO_V2_LINES_MAX for the size of the overrides array is
confusing, and the two should be de-coupled so you can more easily resize
the array if necessary.
Provide a NUM_OVERRIDES_MAX, or similar, and use that when referring
to the size of the overrides array.
> +static int override_flag_to_prop(int flag)
> +{
> + switch (flag) {
> + case OVERRIDE_FLAG_DIRECTION:
> + return GPIOD_LINE_CONFIG_PROP_DIRECTION;
> + case OVERRIDE_FLAG_EDGE:
> + return GPIOD_LINE_CONFIG_PROP_EDGE;
> + case OVERRIDE_FLAG_BIAS:
> + return GPIOD_LINE_CONFIG_PROP_BIAS;
> + case OVERRIDE_FLAG_DRIVE:
> + return GPIOD_LINE_CONFIG_PROP_DRIVE;
> + case OVERRIDE_FLAG_ACTIVE_LOW:
> + return GPIOD_LINE_CONFIG_PROP_ACTIVE_LOW;
> + case OVERRIDE_FLAG_DEBOUNCE_PERIOD:
> + return GPIOD_LINE_CONFIG_PROP_DEBOUNCE_PERIOD;
> + case OVERRIDE_FLAG_CLOCK:
> + return GPIOD_LINE_CONFIG_PROP_EVENT_CLOCK;
> + case OVERRIDE_FLAG_OUTPUT_VALUE:
> + return GPIOD_LINE_CONFIG_PROP_OUTPUT_VALUE;
> + }
> +
> + /* Can't happen. */
> return -1;
> }
>
> +GPIOD_API void
> +gpiod_line_config_get_overrides(struct gpiod_line_config *config,
> + unsigned int *offsets, int *props)
> +{
> + struct override_config *override;
> + unsigned int i, j, count = 0;
> +
> + for (i = 0; i < GPIO_V2_LINES_MAX; i++) {
> + override = &config->overrides[i];
> +
> + if (override_used(override)) {
> + for (j = 0; j < NUM_OVERRIDE_FLAGS; j++) {
> + if (override->override_flags &
> + override_flag_list[j]) {
> + offsets[count] = override->offset;
> + props[count] = override_flag_to_prop(
> + override_flag_list[j]);
> + count++;
> + }
> + }
> + }
> + }
> +}
> +
Return the count?
Would be a bit redundant, as the user needs to call
gpiod_line_config_get_num_overrides() to size the offsets and props
arrays beforehand, but the usual patten when writing into a passed array
is to return the number of elements written.
Cheers,
Kent.
next prev parent reply other threads:[~2022-03-05 5:51 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-03 9:18 [libgpiod v2][PATCH v3 0/3] libgpiod v2: rewrite tests for the C library Bartosz Golaszewski
2022-03-03 9:18 ` [libgpiod v2][PATCH v3 1/3] API: add an enum for line values Bartosz Golaszewski
2022-03-05 5:50 ` Kent Gibson
2022-03-03 9:18 ` [libgpiod v2][PATCH v3 2/3] line-config: expose the override logic to users Bartosz Golaszewski
2022-03-05 5:51 ` Kent Gibson [this message]
2022-03-05 20:57 ` Bartosz Golaszewski
2022-03-03 9:18 ` [libgpiod v2][PATCH v3 3/3] tests: rewrite core C tests using libgpiosim Bartosz Golaszewski
2022-03-05 5:51 ` Kent Gibson
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=20220305055107.GB9638@sol \
--to=warthog618@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=brgl@bgdev.pl \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@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).