diff mbox series

[libgpiod,5/7] tests: gpiosim: provide gpiosim_bank_set_line_valid()

Message ID 20251006-gpiosim-valid-lines-v1-5-b399373e90a9@linaro.org
State New
Headers show
Series tests: update libgpiosim tests and add a uAPI test case for valid lines | expand

Commit Message

Bartosz Golaszewski Oct. 6, 2025, 11:27 a.m. UTC
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

Provide a function allowing to mark a GPIO at given offset as valid or
invalid (all lines are valid by default). This will make it impossible
for any user to request it once the simulator is up.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
 tests/gpiosim/gpiosim-selftest.c |  5 +++++
 tests/gpiosim/gpiosim.c          | 20 +++++++++++++++++++-
 tests/gpiosim/gpiosim.h          |  2 ++
 3 files changed, 26 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/tests/gpiosim/gpiosim-selftest.c b/tests/gpiosim/gpiosim-selftest.c
index 6ce63b4cceaa08f7b61741de310a8de5c26ebe47..7b005f7666e14899d058dbc04b8de7ef6df91d1a 100644
--- a/tests/gpiosim/gpiosim-selftest.c
+++ b/tests/gpiosim/gpiosim-selftest.c
@@ -130,6 +130,11 @@  int main(int argc UNUSED, char **argv UNUSED)
 	ret = gpiosim_bank_clear_hog(bank1, 3);
 	expect_or_die(ret == 0, "Error while clearing the hog");
 
+	printf("Mark one line as invalid\n");
+
+	ret = gpiosim_bank_set_line_valid(bank0, 1, false);
+	expect_or_die(ret == 0, "Unable to mark line as invalid");
+
 	printf("Re-enabling the GPIO device\n");
 
 	ret = gpiosim_dev_enable(dev);
diff --git a/tests/gpiosim/gpiosim.c b/tests/gpiosim/gpiosim.c
index d48257534b887c8e9694afce80894a895379e1f1..0d7859f1e02bd716580b34a9d514120c8c849f26 100644
--- a/tests/gpiosim/gpiosim.c
+++ b/tests/gpiosim/gpiosim.c
@@ -24,7 +24,7 @@ 
 
 #define GPIOSIM_API		__attribute__((visibility("default")))
 #define UNUSED			__attribute__((unused))
-#define MIN_KERNEL_VERSION	KERNEL_VERSION(5, 17, 4)
+#define MIN_KERNEL_VERSION	KERNEL_VERSION(6, 17, 0)
 
 static pthread_mutex_t id_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_once_t id_init_once = PTHREAD_ONCE_INIT;
@@ -1125,6 +1125,24 @@  GPIOSIM_API int gpiosim_bank_clear_hog(struct gpiosim_bank *bank,
 	return unlinkat(bank->cfs_dir_fd, buf, AT_REMOVEDIR);
 }
 
+GPIOSIM_API int gpiosim_bank_set_line_valid(struct gpiosim_bank *bank,
+					    unsigned int offset, bool valid)
+{
+	char buf[32];
+	int ret;
+
+	if (!dev_check_pending(bank->dev))
+		return -1;
+
+	ret = bank_make_line_dir(bank, offset);
+	if (ret)
+		return -1;
+
+	snprintf(buf, sizeof(buf), "line%u/valid", offset);
+
+	return open_write_close(bank->cfs_dir_fd, buf, valid ? "1" : "0");
+}
+
 static int sysfs_read_bank_attr(struct gpiosim_bank *bank, unsigned int offset,
 				const char *attr, char *buf, size_t bufsize)
 {
diff --git a/tests/gpiosim/gpiosim.h b/tests/gpiosim/gpiosim.h
index 7d75852ada1a6affa907e9a99b66621ebfb24b50..6b7ac8e0afbfae75f57f95d8b6f09b668bd88f1b 100644
--- a/tests/gpiosim/gpiosim.h
+++ b/tests/gpiosim/gpiosim.h
@@ -61,6 +61,8 @@  int gpiosim_bank_set_line_name(struct gpiosim_bank *bank,
 int gpiosim_bank_hog_line(struct gpiosim_bank *bank, unsigned int offset,
 			  const char *name, enum gpiosim_direction direction);
 int gpiosim_bank_clear_hog(struct gpiosim_bank *bank, unsigned int offset);
+int gpiosim_bank_set_line_valid(struct gpiosim_bank *bank, unsigned int offset,
+				bool valid);
 
 enum gpiosim_value
 gpiosim_bank_get_value(struct gpiosim_bank *bank, unsigned int offset);