core: provide gpiod_line_request_get_chip_name()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 20 Jul 2023 14:47:43 +0000 (16:47 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 21 Jul 2023 18:28:40 +0000 (20:28 +0200)
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>
include/gpiod.h
lib/chip.c
lib/internal.h
lib/line-request.c

index 3c13783178f1536cc40a5485ca1e470cbcf338a6..71ae7989ec7d354670a5362885834d2e23a88ddf 100644 (file)
@@ -1007,6 +1007,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.
index 7d4d21e3a19451d5cc886ae81eabb5722749f069..7c05e532773b05bd71459382ac0c4393e58068f7 100644 (file)
@@ -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;
index ef9b17e0d2947e8c4d6cb4b18b0fa386eb10e433..61d7aecd2f2953b3c113723ec6aaab3c5c3e5736 100644 (file)
@@ -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);
index e536355b59a79aaf2ef5ea5a13543fdf74f7c0b9..e867d91bf22dd3d965874282d5aff903afe57713 100644 (file)
 #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)
 {