int gpiod_line_set_value_bulk(struct gpiod_line_bulk *bulk,
int *values) GPIOD_API;
+/**
+ * @brief Get a GPIO line handle by GPIO chip description and offset.
+ * @param device String describing the gpiochip.
+ * @param offset The offset of the GPIO line.
+ * @return GPIO line handle or NULL if an error occurred.
+ *
+ * This routine provides a shorter alternative to calling
+ * ::gpiod_chip_open_lookup and ::gpiod_chip_get_line.
+ *
+ * If this function succeeds, the caller is responsible for closing the
+ * associated GPIO chip.
+ */
+struct gpiod_line *
+gpiod_line_get(const char *device, unsigned int offset) GPIOD_API;
+
/**
* @brief Find a GPIO line by its name.
* @param name Name of the GPIO line.
return 0;
}
+struct gpiod_line * gpiod_line_get(const char *device, unsigned int offset)
+{
+ struct gpiod_chip *chip;
+ struct gpiod_line *line;
+
+ chip = gpiod_chip_open_lookup(device);
+ if (!chip)
+ return NULL;
+
+ line = gpiod_chip_get_line(chip, offset);
+ if (!line) {
+ gpiod_chip_close(chip);
+ return NULL;
+ }
+
+ return line;
+}
+
struct gpiod_line * gpiod_line_find(const char *name)
{
struct gpiod_chip_iter *iter;
"gpiod_line_set_value() - good",
0, { 8 });
+static void line_get_good(void)
+{
+ TEST_CLEANUP(test_line_close_chip) struct gpiod_line *line = NULL;
+
+ line = gpiod_line_get(test_chip_name(2), 18);
+ TEST_ASSERT_NOT_NULL(line);
+ TEST_ASSERT_EQ(gpiod_line_offset(line), 18);
+}
+TEST_DEFINE(line_get_good,
+ "gpiod_line_get() - good",
+ TEST_FLAG_NAMED_LINES, { 16, 16, 32, 16 });
+
+static void line_get_invalid_offset(void)
+{
+ TEST_CLEANUP(test_line_close_chip) struct gpiod_line *line = NULL;
+
+ line = gpiod_line_get(test_chip_name(3), 18);
+ TEST_ASSERT_NULL(line);
+ TEST_ASSERT_ERRNO_IS(EINVAL);
+}
+TEST_DEFINE(line_get_invalid_offset,
+ "gpiod_line_get() - invalid offset",
+ TEST_FLAG_NAMED_LINES, { 16, 16, 32, 16 });
+
static void line_find_good(void)
{
TEST_CLEANUP(test_line_close_chip) struct gpiod_line *line = NULL;