Loading drivers/gpio/gpio-sim.c +85 −169 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/bitmap.h> #include <linux/cleanup.h> #include <linux/completion.h> #include <linux/configfs.h> #include <linux/device.h> Loading Loading @@ -68,7 +69,7 @@ static int gpio_sim_apply_pull(struct gpio_sim_chip *chip, gc = &chip->gc; desc = &gc->gpiodev->descs[offset]; mutex_lock(&chip->lock); guard(mutex)(&chip->lock); if (test_bit(FLAG_REQUESTED, &desc->flags) && !test_bit(FLAG_IS_OUT, &desc->flags)) { Loading Loading @@ -104,29 +105,24 @@ static int gpio_sim_apply_pull(struct gpio_sim_chip *chip, set_pull: __assign_bit(offset, chip->pull_map, value); mutex_unlock(&chip->lock); return 0; } static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); int ret; mutex_lock(&chip->lock); ret = !!test_bit(offset, chip->value_map); mutex_unlock(&chip->lock); guard(mutex)(&chip->lock); return ret; return !!test_bit(offset, chip->value_map); } static void gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) __assign_bit(offset, chip->value_map, value); mutex_unlock(&chip->lock); } static int gpio_sim_get_multiple(struct gpio_chip *gc, Loading @@ -134,9 +130,8 @@ static int gpio_sim_get_multiple(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); mutex_unlock(&chip->lock); return 0; } Loading @@ -146,9 +141,9 @@ static void gpio_sim_set_multiple(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); bitmap_replace(chip->value_map, chip->value_map, bits, mask, gc->ngpio); mutex_unlock(&chip->lock); scoped_guard(mutex, &chip->lock) bitmap_replace(chip->value_map, chip->value_map, bits, mask, gc->ngpio); } static int gpio_sim_direction_output(struct gpio_chip *gc, Loading @@ -156,10 +151,10 @@ static int gpio_sim_direction_output(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) { __clear_bit(offset, chip->direction_map); __assign_bit(offset, chip->value_map, value); mutex_unlock(&chip->lock); } return 0; } Loading @@ -168,9 +163,8 @@ static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) __set_bit(offset, chip->direction_map); mutex_unlock(&chip->lock); return 0; } Loading @@ -180,9 +174,8 @@ static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset) struct gpio_sim_chip *chip = gpiochip_get_data(gc); int direction; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) direction = !!test_bit(offset, chip->direction_map); mutex_unlock(&chip->lock); return direction ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; } Loading Loading @@ -215,9 +208,9 @@ static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); __assign_bit(offset, chip->value_map, !!test_bit(offset, chip->pull_map)); mutex_unlock(&chip->lock); scoped_guard(mutex, &chip->lock) __assign_bit(offset, chip->value_map, !!test_bit(offset, chip->pull_map)); } static ssize_t gpio_sim_sysfs_val_show(struct device *dev, Loading @@ -227,9 +220,8 @@ static ssize_t gpio_sim_sysfs_val_show(struct device *dev, struct gpio_sim_chip *chip = dev_get_drvdata(dev); int val; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) val = !!test_bit(line_attr->offset, chip->value_map); mutex_unlock(&chip->lock); return sysfs_emit(buf, "%d\n", val); } Loading Loading @@ -258,9 +250,8 @@ static ssize_t gpio_sim_sysfs_pull_show(struct device *dev, struct gpio_sim_chip *chip = dev_get_drvdata(dev); int pull; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) pull = !!test_bit(line_attr->offset, chip->pull_map); mutex_unlock(&chip->lock); return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]); } Loading Loading @@ -656,17 +647,14 @@ static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item, { struct gpio_sim_device *dev = to_gpio_sim_device(item); struct platform_device *pdev; int ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); pdev = dev->pdev; if (pdev) ret = sprintf(page, "%s\n", dev_name(&pdev->dev)); else ret = sprintf(page, "gpio-sim.%d\n", dev->id); mutex_unlock(&dev->lock); return sprintf(page, "%s\n", dev_name(&pdev->dev)); return ret; return sprintf(page, "gpio-sim.%d\n", dev->id); } CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name); Loading @@ -677,9 +665,8 @@ gpio_sim_device_config_live_show(struct config_item *item, char *page) struct gpio_sim_device *dev = to_gpio_sim_device(item); bool live; mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) live = gpio_sim_device_is_live_unlocked(dev); mutex_unlock(&dev->lock); return sprintf(page, "%c\n", live ? '1' : '0'); } Loading Loading @@ -834,8 +821,7 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, { struct property_entry properties[GPIO_SIM_PROP_MAX]; unsigned int prop_idx = 0, line_names_size = 0; struct fwnode_handle *swnode; char **line_names; char **line_names __free(kfree) = NULL; memset(properties, 0, sizeof(properties)); Loading @@ -854,9 +840,7 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, "gpio-line-names", line_names, line_names_size); swnode = fwnode_create_software_node(properties, parent); kfree(line_names); return swnode; return fwnode_create_software_node(properties, parent); } static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode) Loading Loading @@ -981,7 +965,7 @@ gpio_sim_device_config_live_store(struct config_item *item, if (ret) return ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (live == gpio_sim_device_is_live_unlocked(dev)) ret = -EPERM; Loading @@ -990,8 +974,6 @@ gpio_sim_device_config_live_store(struct config_item *item, else gpio_sim_device_deactivate_unlocked(dev); mutex_unlock(&dev->lock); return ret ?: count; } Loading Loading @@ -1028,17 +1010,14 @@ static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item, struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; int ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) ret = device_for_each_child(&dev->pdev->dev, &ctx, return device_for_each_child(&dev->pdev->dev, &ctx, gpio_sim_emit_chip_name); else ret = sprintf(page, "none\n"); mutex_unlock(&dev->lock); return ret; return sprintf(page, "none\n"); } CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name); Loading @@ -1048,13 +1027,10 @@ gpio_sim_bank_config_label_show(struct config_item *item, char *page) { struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", bank->label ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", bank->label ?: ""); } static ssize_t gpio_sim_bank_config_label_store(struct config_item *item, Loading @@ -1064,23 +1040,18 @@ static ssize_t gpio_sim_bank_config_label_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(bank->label); bank->label = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1091,13 +1062,10 @@ gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page) { struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%u\n", bank->num_lines); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%u\n", bank->num_lines); } static ssize_t Loading @@ -1116,16 +1084,13 @@ gpio_sim_bank_config_num_lines_store(struct config_item *item, if (num_lines == 0) return -EINVAL; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } bank->num_lines = num_lines; mutex_unlock(&dev->lock); return count; } Loading @@ -1143,13 +1108,10 @@ gpio_sim_line_config_name_show(struct config_item *item, char *page) { struct gpio_sim_line *line = to_gpio_sim_line(item); struct gpio_sim_device *dev = gpio_sim_line_get_device(line); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", line->name ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", line->name ?: ""); } static ssize_t gpio_sim_line_config_name_store(struct config_item *item, Loading @@ -1159,24 +1121,18 @@ static ssize_t gpio_sim_line_config_name_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_line_get_device(line); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(line->name); line->name = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1192,13 +1148,10 @@ static ssize_t gpio_sim_hog_config_name_show(struct config_item *item, { struct gpio_sim_hog *hog = to_gpio_sim_hog(item); struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", hog->name ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", hog->name ?: ""); } static ssize_t gpio_sim_hog_config_name_store(struct config_item *item, Loading @@ -1208,24 +1161,18 @@ static ssize_t gpio_sim_hog_config_name_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(hog->name); hog->name = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1239,9 +1186,8 @@ static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item, char *repr; int dir; mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) dir = hog->dir; mutex_unlock(&dev->lock); switch (dir) { case GPIOD_IN: Loading Loading @@ -1270,12 +1216,10 @@ gpio_sim_hog_config_direction_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); int dir; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } if (sysfs_streq(page, "input")) dir = GPIOD_IN; Loading @@ -1284,17 +1228,10 @@ gpio_sim_hog_config_direction_store(struct config_item *item, else if (sysfs_streq(page, "output-low")) dir = GPIOD_OUT_LOW; else dir = -EINVAL; if (dir < 0) { mutex_unlock(&dev->lock); return dir; } return -EINVAL; hog->dir = dir; mutex_unlock(&dev->lock); return count; } Loading @@ -1312,9 +1249,8 @@ static void gpio_sim_hog_config_item_release(struct config_item *item) struct gpio_sim_line *line = hog->parent; struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) line->hog = NULL; mutex_unlock(&dev->lock); kfree(hog->name); kfree(hog); Loading @@ -1340,13 +1276,11 @@ gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name) if (strcmp(name, "hog") != 0) return ERR_PTR(-EINVAL); mutex_lock(&dev->lock); guard(mutex)(&dev->lock); hog = kzalloc(sizeof(*hog), GFP_KERNEL); if (!hog) { mutex_unlock(&dev->lock); if (!hog) return ERR_PTR(-ENOMEM); } config_item_init_type_name(&hog->item, name, &gpio_sim_hog_config_type); Loading @@ -1356,8 +1290,6 @@ gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name) hog->parent = line; line->hog = hog; mutex_unlock(&dev->lock); return &hog->item; } Loading @@ -1366,9 +1298,8 @@ static void gpio_sim_line_config_group_release(struct config_item *item) struct gpio_sim_line *line = to_gpio_sim_line(item); struct gpio_sim_device *dev = gpio_sim_line_get_device(line); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) list_del(&line->siblings); mutex_unlock(&dev->lock); kfree(line->name); kfree(line); Loading Loading @@ -1403,18 +1334,14 @@ gpio_sim_bank_config_make_line_group(struct config_group *group, if (ret != 1 || nchar != strlen(name)) return ERR_PTR(-EINVAL); mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return ERR_PTR(-EBUSY); } line = kzalloc(sizeof(*line), GFP_KERNEL); if (!line) { mutex_unlock(&dev->lock); if (!line) return ERR_PTR(-ENOMEM); } config_group_init_type_name(&line->group, name, &gpio_sim_line_config_type); Loading @@ -1423,8 +1350,6 @@ gpio_sim_bank_config_make_line_group(struct config_group *group, line->offset = offset; list_add_tail(&line->siblings, &bank->line_list); mutex_unlock(&dev->lock); return &line->group; } Loading @@ -1433,9 +1358,8 @@ static void gpio_sim_bank_config_group_release(struct config_item *item) struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) list_del(&bank->siblings); mutex_unlock(&dev->lock); kfree(bank->label); kfree(bank); Loading Loading @@ -1463,18 +1387,14 @@ gpio_sim_device_config_make_bank_group(struct config_group *group, struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); struct gpio_sim_bank *bank; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return ERR_PTR(-EBUSY); } bank = kzalloc(sizeof(*bank), GFP_KERNEL); if (!bank) { mutex_unlock(&dev->lock); if (!bank) return ERR_PTR(-ENOMEM); } config_group_init_type_name(&bank->group, name, &gpio_sim_bank_config_group_type); Loading @@ -1483,8 +1403,6 @@ gpio_sim_device_config_make_bank_group(struct config_group *group, INIT_LIST_HEAD(&bank->line_list); list_add_tail(&bank->siblings, &dev->bank_list); mutex_unlock(&dev->lock); return &bank->group; } Loading @@ -1492,10 +1410,10 @@ static void gpio_sim_device_config_group_release(struct config_item *item) { struct gpio_sim_device *dev = to_gpio_sim_device(item); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) { if (gpio_sim_device_is_live_unlocked(dev)) gpio_sim_device_deactivate_unlocked(dev); mutex_unlock(&dev->lock); } mutex_destroy(&dev->lock); ida_free(&gpio_sim_ida, dev->id); Loading @@ -1520,7 +1438,7 @@ static const struct config_item_type gpio_sim_device_config_group_type = { static struct config_group * gpio_sim_config_make_device_group(struct config_group *group, const char *name) { struct gpio_sim_device *dev; struct gpio_sim_device *dev __free(kfree) = NULL; int id; dev = kzalloc(sizeof(*dev), GFP_KERNEL); Loading @@ -1528,10 +1446,8 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name) return ERR_PTR(-ENOMEM); id = ida_alloc(&gpio_sim_ida, GFP_KERNEL); if (id < 0) { kfree(dev); if (id < 0) return ERR_PTR(id); } config_group_init_type_name(&dev->group, name, &gpio_sim_device_config_group_type); Loading @@ -1542,7 +1458,7 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name) dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call; init_completion(&dev->probe_completion); return &dev->group; return &no_free_ptr(dev)->group; } static struct configfs_group_operations gpio_sim_config_group_ops = { Loading Loading
drivers/gpio/gpio-sim.c +85 −169 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/bitmap.h> #include <linux/cleanup.h> #include <linux/completion.h> #include <linux/configfs.h> #include <linux/device.h> Loading Loading @@ -68,7 +69,7 @@ static int gpio_sim_apply_pull(struct gpio_sim_chip *chip, gc = &chip->gc; desc = &gc->gpiodev->descs[offset]; mutex_lock(&chip->lock); guard(mutex)(&chip->lock); if (test_bit(FLAG_REQUESTED, &desc->flags) && !test_bit(FLAG_IS_OUT, &desc->flags)) { Loading Loading @@ -104,29 +105,24 @@ static int gpio_sim_apply_pull(struct gpio_sim_chip *chip, set_pull: __assign_bit(offset, chip->pull_map, value); mutex_unlock(&chip->lock); return 0; } static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); int ret; mutex_lock(&chip->lock); ret = !!test_bit(offset, chip->value_map); mutex_unlock(&chip->lock); guard(mutex)(&chip->lock); return ret; return !!test_bit(offset, chip->value_map); } static void gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) __assign_bit(offset, chip->value_map, value); mutex_unlock(&chip->lock); } static int gpio_sim_get_multiple(struct gpio_chip *gc, Loading @@ -134,9 +130,8 @@ static int gpio_sim_get_multiple(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); mutex_unlock(&chip->lock); return 0; } Loading @@ -146,9 +141,9 @@ static void gpio_sim_set_multiple(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); bitmap_replace(chip->value_map, chip->value_map, bits, mask, gc->ngpio); mutex_unlock(&chip->lock); scoped_guard(mutex, &chip->lock) bitmap_replace(chip->value_map, chip->value_map, bits, mask, gc->ngpio); } static int gpio_sim_direction_output(struct gpio_chip *gc, Loading @@ -156,10 +151,10 @@ static int gpio_sim_direction_output(struct gpio_chip *gc, { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) { __clear_bit(offset, chip->direction_map); __assign_bit(offset, chip->value_map, value); mutex_unlock(&chip->lock); } return 0; } Loading @@ -168,9 +163,8 @@ static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) __set_bit(offset, chip->direction_map); mutex_unlock(&chip->lock); return 0; } Loading @@ -180,9 +174,8 @@ static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset) struct gpio_sim_chip *chip = gpiochip_get_data(gc); int direction; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) direction = !!test_bit(offset, chip->direction_map); mutex_unlock(&chip->lock); return direction ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; } Loading Loading @@ -215,9 +208,9 @@ static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset) { struct gpio_sim_chip *chip = gpiochip_get_data(gc); mutex_lock(&chip->lock); __assign_bit(offset, chip->value_map, !!test_bit(offset, chip->pull_map)); mutex_unlock(&chip->lock); scoped_guard(mutex, &chip->lock) __assign_bit(offset, chip->value_map, !!test_bit(offset, chip->pull_map)); } static ssize_t gpio_sim_sysfs_val_show(struct device *dev, Loading @@ -227,9 +220,8 @@ static ssize_t gpio_sim_sysfs_val_show(struct device *dev, struct gpio_sim_chip *chip = dev_get_drvdata(dev); int val; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) val = !!test_bit(line_attr->offset, chip->value_map); mutex_unlock(&chip->lock); return sysfs_emit(buf, "%d\n", val); } Loading Loading @@ -258,9 +250,8 @@ static ssize_t gpio_sim_sysfs_pull_show(struct device *dev, struct gpio_sim_chip *chip = dev_get_drvdata(dev); int pull; mutex_lock(&chip->lock); scoped_guard(mutex, &chip->lock) pull = !!test_bit(line_attr->offset, chip->pull_map); mutex_unlock(&chip->lock); return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]); } Loading Loading @@ -656,17 +647,14 @@ static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item, { struct gpio_sim_device *dev = to_gpio_sim_device(item); struct platform_device *pdev; int ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); pdev = dev->pdev; if (pdev) ret = sprintf(page, "%s\n", dev_name(&pdev->dev)); else ret = sprintf(page, "gpio-sim.%d\n", dev->id); mutex_unlock(&dev->lock); return sprintf(page, "%s\n", dev_name(&pdev->dev)); return ret; return sprintf(page, "gpio-sim.%d\n", dev->id); } CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name); Loading @@ -677,9 +665,8 @@ gpio_sim_device_config_live_show(struct config_item *item, char *page) struct gpio_sim_device *dev = to_gpio_sim_device(item); bool live; mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) live = gpio_sim_device_is_live_unlocked(dev); mutex_unlock(&dev->lock); return sprintf(page, "%c\n", live ? '1' : '0'); } Loading Loading @@ -834,8 +821,7 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, { struct property_entry properties[GPIO_SIM_PROP_MAX]; unsigned int prop_idx = 0, line_names_size = 0; struct fwnode_handle *swnode; char **line_names; char **line_names __free(kfree) = NULL; memset(properties, 0, sizeof(properties)); Loading @@ -854,9 +840,7 @@ gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, "gpio-line-names", line_names, line_names_size); swnode = fwnode_create_software_node(properties, parent); kfree(line_names); return swnode; return fwnode_create_software_node(properties, parent); } static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode) Loading Loading @@ -981,7 +965,7 @@ gpio_sim_device_config_live_store(struct config_item *item, if (ret) return ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (live == gpio_sim_device_is_live_unlocked(dev)) ret = -EPERM; Loading @@ -990,8 +974,6 @@ gpio_sim_device_config_live_store(struct config_item *item, else gpio_sim_device_deactivate_unlocked(dev); mutex_unlock(&dev->lock); return ret ?: count; } Loading Loading @@ -1028,17 +1010,14 @@ static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item, struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; int ret; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) ret = device_for_each_child(&dev->pdev->dev, &ctx, return device_for_each_child(&dev->pdev->dev, &ctx, gpio_sim_emit_chip_name); else ret = sprintf(page, "none\n"); mutex_unlock(&dev->lock); return ret; return sprintf(page, "none\n"); } CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name); Loading @@ -1048,13 +1027,10 @@ gpio_sim_bank_config_label_show(struct config_item *item, char *page) { struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", bank->label ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", bank->label ?: ""); } static ssize_t gpio_sim_bank_config_label_store(struct config_item *item, Loading @@ -1064,23 +1040,18 @@ static ssize_t gpio_sim_bank_config_label_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(bank->label); bank->label = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1091,13 +1062,10 @@ gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page) { struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%u\n", bank->num_lines); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%u\n", bank->num_lines); } static ssize_t Loading @@ -1116,16 +1084,13 @@ gpio_sim_bank_config_num_lines_store(struct config_item *item, if (num_lines == 0) return -EINVAL; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } bank->num_lines = num_lines; mutex_unlock(&dev->lock); return count; } Loading @@ -1143,13 +1108,10 @@ gpio_sim_line_config_name_show(struct config_item *item, char *page) { struct gpio_sim_line *line = to_gpio_sim_line(item); struct gpio_sim_device *dev = gpio_sim_line_get_device(line); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", line->name ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", line->name ?: ""); } static ssize_t gpio_sim_line_config_name_store(struct config_item *item, Loading @@ -1159,24 +1121,18 @@ static ssize_t gpio_sim_line_config_name_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_line_get_device(line); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(line->name); line->name = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1192,13 +1148,10 @@ static ssize_t gpio_sim_hog_config_name_show(struct config_item *item, { struct gpio_sim_hog *hog = to_gpio_sim_hog(item); struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); int ret; mutex_lock(&dev->lock); ret = sprintf(page, "%s\n", hog->name ?: ""); mutex_unlock(&dev->lock); guard(mutex)(&dev->lock); return ret; return sprintf(page, "%s\n", hog->name ?: ""); } static ssize_t gpio_sim_hog_config_name_store(struct config_item *item, Loading @@ -1208,24 +1161,18 @@ static ssize_t gpio_sim_hog_config_name_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); char *trimmed; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } trimmed = gpio_sim_strdup_trimmed(page, count); if (!trimmed) { mutex_unlock(&dev->lock); if (!trimmed) return -ENOMEM; } kfree(hog->name); hog->name = trimmed; mutex_unlock(&dev->lock); return count; } Loading @@ -1239,9 +1186,8 @@ static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item, char *repr; int dir; mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) dir = hog->dir; mutex_unlock(&dev->lock); switch (dir) { case GPIOD_IN: Loading Loading @@ -1270,12 +1216,10 @@ gpio_sim_hog_config_direction_store(struct config_item *item, struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); int dir; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return -EBUSY; } if (sysfs_streq(page, "input")) dir = GPIOD_IN; Loading @@ -1284,17 +1228,10 @@ gpio_sim_hog_config_direction_store(struct config_item *item, else if (sysfs_streq(page, "output-low")) dir = GPIOD_OUT_LOW; else dir = -EINVAL; if (dir < 0) { mutex_unlock(&dev->lock); return dir; } return -EINVAL; hog->dir = dir; mutex_unlock(&dev->lock); return count; } Loading @@ -1312,9 +1249,8 @@ static void gpio_sim_hog_config_item_release(struct config_item *item) struct gpio_sim_line *line = hog->parent; struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) line->hog = NULL; mutex_unlock(&dev->lock); kfree(hog->name); kfree(hog); Loading @@ -1340,13 +1276,11 @@ gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name) if (strcmp(name, "hog") != 0) return ERR_PTR(-EINVAL); mutex_lock(&dev->lock); guard(mutex)(&dev->lock); hog = kzalloc(sizeof(*hog), GFP_KERNEL); if (!hog) { mutex_unlock(&dev->lock); if (!hog) return ERR_PTR(-ENOMEM); } config_item_init_type_name(&hog->item, name, &gpio_sim_hog_config_type); Loading @@ -1356,8 +1290,6 @@ gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name) hog->parent = line; line->hog = hog; mutex_unlock(&dev->lock); return &hog->item; } Loading @@ -1366,9 +1298,8 @@ static void gpio_sim_line_config_group_release(struct config_item *item) struct gpio_sim_line *line = to_gpio_sim_line(item); struct gpio_sim_device *dev = gpio_sim_line_get_device(line); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) list_del(&line->siblings); mutex_unlock(&dev->lock); kfree(line->name); kfree(line); Loading Loading @@ -1403,18 +1334,14 @@ gpio_sim_bank_config_make_line_group(struct config_group *group, if (ret != 1 || nchar != strlen(name)) return ERR_PTR(-EINVAL); mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return ERR_PTR(-EBUSY); } line = kzalloc(sizeof(*line), GFP_KERNEL); if (!line) { mutex_unlock(&dev->lock); if (!line) return ERR_PTR(-ENOMEM); } config_group_init_type_name(&line->group, name, &gpio_sim_line_config_type); Loading @@ -1423,8 +1350,6 @@ gpio_sim_bank_config_make_line_group(struct config_group *group, line->offset = offset; list_add_tail(&line->siblings, &bank->line_list); mutex_unlock(&dev->lock); return &line->group; } Loading @@ -1433,9 +1358,8 @@ static void gpio_sim_bank_config_group_release(struct config_item *item) struct gpio_sim_bank *bank = to_gpio_sim_bank(item); struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) list_del(&bank->siblings); mutex_unlock(&dev->lock); kfree(bank->label); kfree(bank); Loading Loading @@ -1463,18 +1387,14 @@ gpio_sim_device_config_make_bank_group(struct config_group *group, struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); struct gpio_sim_bank *bank; mutex_lock(&dev->lock); guard(mutex)(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) { mutex_unlock(&dev->lock); if (gpio_sim_device_is_live_unlocked(dev)) return ERR_PTR(-EBUSY); } bank = kzalloc(sizeof(*bank), GFP_KERNEL); if (!bank) { mutex_unlock(&dev->lock); if (!bank) return ERR_PTR(-ENOMEM); } config_group_init_type_name(&bank->group, name, &gpio_sim_bank_config_group_type); Loading @@ -1483,8 +1403,6 @@ gpio_sim_device_config_make_bank_group(struct config_group *group, INIT_LIST_HEAD(&bank->line_list); list_add_tail(&bank->siblings, &dev->bank_list); mutex_unlock(&dev->lock); return &bank->group; } Loading @@ -1492,10 +1410,10 @@ static void gpio_sim_device_config_group_release(struct config_item *item) { struct gpio_sim_device *dev = to_gpio_sim_device(item); mutex_lock(&dev->lock); scoped_guard(mutex, &dev->lock) { if (gpio_sim_device_is_live_unlocked(dev)) gpio_sim_device_deactivate_unlocked(dev); mutex_unlock(&dev->lock); } mutex_destroy(&dev->lock); ida_free(&gpio_sim_ida, dev->id); Loading @@ -1520,7 +1438,7 @@ static const struct config_item_type gpio_sim_device_config_group_type = { static struct config_group * gpio_sim_config_make_device_group(struct config_group *group, const char *name) { struct gpio_sim_device *dev; struct gpio_sim_device *dev __free(kfree) = NULL; int id; dev = kzalloc(sizeof(*dev), GFP_KERNEL); Loading @@ -1528,10 +1446,8 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name) return ERR_PTR(-ENOMEM); id = ida_alloc(&gpio_sim_ida, GFP_KERNEL); if (id < 0) { kfree(dev); if (id < 0) return ERR_PTR(id); } config_group_init_type_name(&dev->group, name, &gpio_sim_device_config_group_type); Loading @@ -1542,7 +1458,7 @@ gpio_sim_config_make_device_group(struct config_group *group, const char *name) dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call; init_completion(&dev->probe_completion); return &dev->group; return &no_free_ptr(dev)->group; } static struct configfs_group_operations gpio_sim_config_group_ops = { Loading