diff options
author | Bartosz Golaszewski <bartosz.golaszewski@linaro.org> | 2023-07-20 16:47:43 +0200 |
---|---|---|
committer | Bartosz Golaszewski <bartosz.golaszewski@linaro.org> | 2023-07-21 20:28:40 +0200 |
commit | 8336bae7bd1c2527f4b5afd8c17fdcdee43247a4 (patch) | |
tree | d868242f2a7a3a2bf95805551c68770c7dc2d59d | |
parent | 2e6ee87072a2d0039a3eae3561dfa9929b80abb4 (diff) | |
download | libgpiod-8336bae7bd1c2527f4b5afd8c17fdcdee43247a4.tar.gz |
core: provide gpiod_line_request_get_chip_name()
While we can get the list of requested offsets from a line-request object,
this information lacks context if we don't provide any data about the GPIO
chip the request was made on. Add a helper allowing users to get the name
of the parent chip.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
-rw-r--r-- | include/gpiod.h | 9 | ||||
-rw-r--r-- | lib/chip.c | 7 | ||||
-rw-r--r-- | lib/internal.h | 3 | ||||
-rw-r--r-- | lib/line-request.c | 20 |
4 files changed, 36 insertions, 3 deletions
diff --git a/include/gpiod.h b/include/gpiod.h index 3c137831..71ae7989 100644 --- a/include/gpiod.h +++ b/include/gpiod.h @@ -1008,6 +1008,15 @@ gpiod_request_config_get_event_buffer_size(struct gpiod_request_config *config); void gpiod_line_request_release(struct gpiod_line_request *request); /** + * @brief Get the name of the chip this request was made on. + * @param request Line request object. + * @return Name the GPIO chip device. The returned pointer is valid for the + * lifetime of the request object and must not be freed by the caller. + */ +const char * +gpiod_line_request_get_chip_name(struct gpiod_line_request *request); + +/** * @brief Get the number of lines in the request. * @param request Line request object. * @return Number of requested lines. @@ -215,6 +215,7 @@ gpiod_chip_request_lines(struct gpiod_chip *chip, { struct gpio_v2_line_request uapi_req; struct gpiod_line_request *request; + struct gpiochip_info info; int ret; assert(chip); @@ -233,11 +234,15 @@ gpiod_chip_request_lines(struct gpiod_chip *chip, if (ret) return NULL; + ret = read_chip_info(chip->fd, &info); + if (ret < 0) + return NULL; + ret = ioctl(chip->fd, GPIO_V2_GET_LINE_IOCTL, &uapi_req); if (ret < 0) return NULL; - request = gpiod_line_request_from_uapi(&uapi_req); + request = gpiod_line_request_from_uapi(&uapi_req, info.name); if (!request) { close(uapi_req.fd); return NULL; diff --git a/lib/internal.h b/lib/internal.h index ef9b17e0..61d7aecd 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -26,7 +26,8 @@ void gpiod_request_config_to_uapi(struct gpiod_request_config *config, int gpiod_line_config_to_uapi(struct gpiod_line_config *config, struct gpio_v2_line_request *uapi_cfg); struct gpiod_line_request * -gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req); +gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req, + const char *chip_name); int gpiod_edge_event_buffer_read_fd(int fd, struct gpiod_edge_event_buffer *buffer, size_t max_events); diff --git a/lib/line-request.c b/lib/line-request.c index e536355b..e867d91b 100644 --- a/lib/line-request.c +++ b/lib/line-request.c @@ -13,13 +13,15 @@ #include "internal.h" struct gpiod_line_request { + char *chip_name; unsigned int offsets[GPIO_V2_LINES_MAX]; size_t num_lines; int fd; }; struct gpiod_line_request * -gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req) +gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req, + const char *chip_name) { struct gpiod_line_request *request; @@ -28,6 +30,13 @@ gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req) return NULL; memset(request, 0, sizeof(*request)); + + request->chip_name = strdup(chip_name); + if (!request->chip_name) { + free(request); + return NULL; + } + request->fd = uapi_req->fd; request->num_lines = uapi_req->num_lines; memcpy(request->offsets, uapi_req->offsets, @@ -42,9 +51,18 @@ GPIOD_API void gpiod_line_request_release(struct gpiod_line_request *request) return; close(request->fd); + free(request->chip_name); free(request); } +GPIOD_API const char * +gpiod_line_request_get_chip_name(struct gpiod_line_request *request) +{ + assert(request); + + return request->chip_name; +} + GPIOD_API size_t gpiod_line_request_get_num_requested_lines(struct gpiod_line_request *request) { |