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>,
Jack Winch <sunt.un.morcov@gmail.com>,
Helmut Grohne <helmut.grohne@intenta.de>,
Ben Hutchings <ben.hutchings@essensium.com>,
linux-gpio@vger.kernel.org
Subject: Re: [libgpiod v2.0][PATCH] core: extend config objects
Date: Sat, 7 Aug 2021 16:48:09 +0800 [thread overview]
Message-ID: <20210807084809.GA17852@sol> (raw)
In-Reply-To: <20210806132810.23556-1-brgl@bgdev.pl>
On Fri, Aug 06, 2021 at 03:28:10PM +0200, Bartosz Golaszewski wrote:
> Kent suggested that we may want to add getters for the config objects in
> his reviews under the C++ patches. Indeed when working on Python bindings
> I noticed it would be useful for implementing __str__ and __repr__
> callbacks. In C++ too we could use them for overloading stream operators.
>
> This extends the config objects with getters. They are straightforward for
> the request config but for the line config, they allow to only read
> per-offset values that would be used if the object was used in a request
> at this moment. We also add getters for the output values: both taking
> the line offset as argument as well as ones that take the index and allow
> to iterate over all configured output values.
>
> The sanitization of input for the getters has subsequently been changed
> so that we never return invalid values. The input values are verified
> immediately and if an invalid value is passed, it's silently replaced
> by the default value for given setting.
>
> This patch also adds the reset function for the line config object - it
> can be used to reset all stored configuration if - for example - the
> config has become too complex.
>
> As this patch will be squashed into the big v2 patch anyway, I allowed
> myself to include some additional changes: some variable renames and
> other minor tweaks.
>
> Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
A few minor nit-picks in the gpiod.h documentation below...
Cheers,
Kent.
> ---
> include/gpiod.h | 189 +++++++++++++++++++++++-
> lib/line-config.c | 340 ++++++++++++++++++++++++++++++++++---------
> lib/request-config.c | 42 +++++-
> 3 files changed, 487 insertions(+), 84 deletions(-)
>
> diff --git a/include/gpiod.h b/include/gpiod.h
> index 885b472..d186df7 100644
> --- a/include/gpiod.h
> +++ b/include/gpiod.h
> @@ -451,11 +451,11 @@ gpiod_info_event_get_line_info(struct gpiod_info_event *event);
> * The line-config object stores the configuration for lines that can be used
> * in two cases: when making a line request and when reconfiguring a set of
> * already requested lines. The mutators for the line request don't return
> - * errors. If the configuration is invalid - the set of options is too complex
> - * to be translated into kernel uAPI structures or invalid values have been
> - * passed to any of the functions - the error will be returned at the time of
> - * the request or reconfiguration. Each option can be set globally, for
> - * a single line offset or for multiple line offsets.
> + * errors. If the set of options is too complex to be translated into kernel
> + * uAPI structures - the error will be returned at the time of the request or
> + * reconfiguration. If an invalid value was passed to any of the getters - the
> + * default value will be silently used instead. Each option can be set
> + * globally, for a single line offset or for multiple line offsets.
> */
>
> /**
> @@ -470,6 +470,15 @@ struct gpiod_line_config *gpiod_line_config_new(void);
> */
> void gpiod_line_config_free(struct gpiod_line_config *config);
>
> +/**
> + * @brief Reset the line config object.
> + * @param config Line config object to free.
> + *
> + * Resets the entire configuration stored in this object. This is useful if
> + * the user wants to reuse the object without reallocating it.
> + */
> +void gpiod_line_config_reset(struct gpiod_line_config *config);
> +
> /**
> * @brief Set the direction of all lines.
> * @param config Line config object.
> @@ -499,6 +508,18 @@ void gpiod_line_config_set_direction_subset(struct gpiod_line_config *config,
> unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the direction setting for the line at given offset.
"for a given line" reads better for me, especially when combined with a
minor tweak to the offset description below.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the direction setting.
"Offset of the line from which to read". Throughout.
> + * @return Direction setting that would have been used for given offset if the
> + * config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
No comma necessary - "global default value" is fine. Throughout.
> +int gpiod_line_config_get_direction(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set the edge event detection for all lines.
> * @param config Line config object.
> @@ -529,6 +550,19 @@ gpiod_line_config_set_edge_detection_subset(struct gpiod_line_config *config,
> int edge, unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the edge event detection setting for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the edge event detection setting.
> + * @return Edge event detection setting that would have been used for given
> + * offset if the config object was used in a request at the time of
> + * the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +int gpiod_line_config_get_edge_detection(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set the bias of all lines.
> * @param config Line config object.
> @@ -556,6 +590,18 @@ void gpiod_line_config_set_bias_subset(struct gpiod_line_config *config,
> int bias, unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the bias setting for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the bias setting.
> + * @return Bias setting that would have been used for given offset if the
> + * config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +int gpiod_line_config_get_bias(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set the drive of all lines.
> * @param config Line config object.
> @@ -583,6 +629,18 @@ void gpiod_line_config_set_drive_subset(struct gpiod_line_config *config,
> int drive, unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the drive setting for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the drive setting.
> + * @return Drive setting that would have been used for given offset if the
> + * config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +int gpiod_line_config_get_drive(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set all lines as active-low.
> * @param config Line config object.
> @@ -607,6 +665,18 @@ void gpiod_line_config_set_active_low_subset(struct gpiod_line_config *config,
> unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Check if the line at given offset was configured as active-low.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the active-low setting.
> + * @return Active-low setting that would have been used for given offset if the
> + * config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +bool gpiod_line_config_is_active_low(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set all lines as active-high.
> * @param config Line config object.
> @@ -663,6 +733,19 @@ gpiod_line_config_set_debounce_period_subset(struct gpiod_line_config *config,
> unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the debounce period for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the debounce period.
> + * @return Debounce period that would have been used for given offset if the
> + * config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +unsigned long
> +gpiod_line_config_get_debounce_period(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set the event timestamp clock for all lines.
> * @param config Line config object.
> @@ -692,6 +775,18 @@ void gpiod_line_config_set_event_clock_subset(struct gpiod_line_config *config,
> unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the event clock setting for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the event clock setting.
> + * @return Event clock setting that would have been used for given offset if
> + * the config object was used in a request at the time of the call.
> + * @note If an offset is used for which no config was provided, the function
> + * will return the global, default value.
> + */
> +int gpiod_line_config_get_event_clock(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> /**
> * @brief Set the output value for a single offset.
> * @param config Line config object.
> @@ -704,16 +799,63 @@ void gpiod_line_config_set_output_value(struct gpiod_line_config *config,
> /**
> * @brief Set the output values for a set of offsets.
> * @param config Line config object.
> - * @param num_offsets Number of offsets for which to set values.
> + * @param num_values Number of offsets for which to set values.
> * @param offsets Array of line offsets to set values for.
> * @param values Array of output values associated with the offsets passed in
> * the previous argument.
> */
> void gpiod_line_config_set_output_values(struct gpiod_line_config *config,
> - unsigned int num_offsets,
> + unsigned int num_values,
> const unsigned int *offsets,
> const int *values);
>
> +/**
> + * @brief Get the number of line offsets for which this config object stores
> + * output values.
> + * @param config Line config object.
> + * @return Number of output values currently configured for this object.
> + */
> +unsigned int
> +gpiod_line_config_num_output_values(struct gpiod_line_config *config);
> +
> +/**
> + * @brief Get the output value configured for the line at given offset.
> + * @param config Line config object.
> + * @param offset Line offset for which to read the value.
> + * @return 1 or 0 if the value was configured for this line, -1 otherwise.
> + */
> +int gpiod_line_config_get_output_value(struct gpiod_line_config *config,
> + unsigned int offset);
> +
> +/**
> + * @brief Get the output value mapping (offset -> value) at given index.
> + * @param config Line config object.
> + * @param index Position of the mapping in the internal array.
> + * @param offset Buffer for storing the offset of the line.
> + * @param value Buffer for storing the value mapped for the offset.
"value corresponding to the offset"
> + * @return Returns 0 on success, -1 if the index is out of range.
> + *
> + * This function together with ::gpiod_line_config_num_output_values allows to
> + * iterate over all output value mappings currently held by this object.
> + */
> +int gpiod_line_config_get_output_value_index(struct gpiod_line_config *config,
> + unsigned int index,
> + unsigned int *offset, int *value);
> +
> +/**
> + * @brief Get all output value mappings stored in this config object.
> + * @param config Line config object.
> + * @param offsets Buffer in which offsets will be stored.
> + * @param values Buffer in which values will be stored.
> + * @note Both the offsets and values buffers must be able to hold at least the
> + * number of elements returned by ::gpiod_line_config_num_output_values.
> + *
> + * Each offset in the offsets array corresponds with the value in the values
> + * array at the same index.
> + */
"corresponds to", not with.
> +void gpiod_line_config_get_output_values(struct gpiod_line_config *config,
> + unsigned int *offsets, int *values);
> +
> /**
> * @}
> *
> @@ -750,6 +892,14 @@ void gpiod_request_config_free(struct gpiod_request_config *config);
> void gpiod_request_config_set_consumer(struct gpiod_request_config *config,
> const char *consumer);
>
> +/**
> + * @brief Get the consumer string.
> + * @param config Request config object.
> + * @return Current consumer string stored in this request config.
> + */
> +const char *
> +gpiod_request_config_get_consumer(struct gpiod_request_config *config);
> +
> /**
> * @brief Set line offsets for this request.
> * @param config Request config object.
> @@ -762,6 +912,23 @@ void gpiod_request_config_set_offsets(struct gpiod_request_config *config,
> unsigned int num_offsets,
> const unsigned int *offsets);
>
> +/**
> + * @brief Get the number of offsets configured in this request config.
> + * @param config Request config object.
> + * @return Number of line offsets in this request config.
> + */
> +unsigned int
> +gpiod_request_config_get_num_offsets(struct gpiod_request_config *config);
> +
> +/**
> + * @brief Get the hardware offsets of lines in this request config.
> + * @param config Request config object.
> + * @param offsets Array to store offsets in. Must hold at least the number of
> + * lines returned by ::gpiod_request_config_get_num_offsets.
> + */
"Array to store offsets."
> +void gpiod_request_config_get_offsets(struct gpiod_request_config *config,
> + unsigned int *offsets);
> +
> /**
> * @brief Set the size of the kernel event buffer.
> * @param config Request config object.
> @@ -773,6 +940,14 @@ void
> gpiod_request_config_set_event_buffer_size(struct gpiod_request_config *config,
> unsigned int event_buffer_size);
>
> +/**
> + * @brief Get the edge event buffer size from this request config.
> + * @param config Request config object.
> + * @return Current edge event buffer size setting.
> + */
> +unsigned int
> +gpiod_request_config_get_event_buffer_size(struct gpiod_request_config *config);
> +
> /**
> * @}
> *
next prev parent reply other threads:[~2021-08-07 8:48 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-06 13:28 [libgpiod v2.0][PATCH] core: extend config objects Bartosz Golaszewski
2021-08-07 8:48 ` Kent Gibson [this message]
2021-08-08 19:11 ` Bartosz Golaszewski
2021-08-08 23:10 ` Kent Gibson
2021-08-10 7:52 ` Bartosz Golaszewski
2021-08-10 10:31 ` Kent Gibson
2021-08-11 1:16 ` Kent Gibson
2021-08-12 7:24 ` Bartosz Golaszewski
2021-08-12 10:29 ` Kent Gibson
2021-08-12 12:51 ` Bartosz Golaszewski
2021-08-12 13:03 ` Andy Shevchenko
2021-08-12 14:02 ` Bartosz Golaszewski
2021-08-12 13:52 ` Kent Gibson
2021-08-12 14:01 ` Bartosz Golaszewski
2021-08-12 14:23 ` Kent Gibson
2021-08-12 14:43 ` Bartosz Golaszewski
2021-08-12 15:02 ` Kent Gibson
2021-08-13 12:59 ` Bartosz Golaszewski
2021-08-13 13:03 ` 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=20210807084809.GA17852@sol \
--to=warthog618@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=ben.hutchings@essensium.com \
--cc=brgl@bgdev.pl \
--cc=helmut.grohne@intenta.de \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=sunt.un.morcov@gmail.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 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).