@@ -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);
@@ -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)
{
@@ -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);