Lines Matching +full:lock +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0-or-later
54 struct mutex lock; member
60 unsigned int offset; member
70 unsigned int offset, int value) in gpio_sim_apply_pull() argument
74 guard(mutex)(&chip->lock); in gpio_sim_apply_pull()
76 if (test_bit(offset, chip->request_map) && in gpio_sim_apply_pull()
77 test_bit(offset, chip->direction_map)) { in gpio_sim_apply_pull()
78 if (value == !!test_bit(offset, chip->value_map)) in gpio_sim_apply_pull()
82 * This is fine - it just means, nobody is listening in gpio_sim_apply_pull()
87 irq = irq_find_mapping(chip->irq_sim, offset); in gpio_sim_apply_pull()
104 if (!test_bit(offset, chip->request_map) || in gpio_sim_apply_pull()
105 test_bit(offset, chip->direction_map)) in gpio_sim_apply_pull()
106 __assign_bit(offset, chip->value_map, value); in gpio_sim_apply_pull()
109 __assign_bit(offset, chip->pull_map, value); in gpio_sim_apply_pull()
113 static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset) in gpio_sim_get() argument
117 guard(mutex)(&chip->lock); in gpio_sim_get()
119 return !!test_bit(offset, chip->value_map); in gpio_sim_get()
122 static void gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value) in gpio_sim_set() argument
126 scoped_guard(mutex, &chip->lock) in gpio_sim_set()
127 __assign_bit(offset, chip->value_map, value); in gpio_sim_set()
135 scoped_guard(mutex, &chip->lock) in gpio_sim_get_multiple()
136 bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); in gpio_sim_get_multiple()
146 scoped_guard(mutex, &chip->lock) in gpio_sim_set_multiple()
147 bitmap_replace(chip->value_map, chip->value_map, bits, mask, in gpio_sim_set_multiple()
148 gc->ngpio); in gpio_sim_set_multiple()
152 unsigned int offset, int value) in gpio_sim_direction_output() argument
156 scoped_guard(mutex, &chip->lock) { in gpio_sim_direction_output()
157 __clear_bit(offset, chip->direction_map); in gpio_sim_direction_output()
158 __assign_bit(offset, chip->value_map, value); in gpio_sim_direction_output()
164 static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset) in gpio_sim_direction_input() argument
168 scoped_guard(mutex, &chip->lock) in gpio_sim_direction_input()
169 __set_bit(offset, chip->direction_map); in gpio_sim_direction_input()
174 static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset) in gpio_sim_get_direction() argument
179 scoped_guard(mutex, &chip->lock) in gpio_sim_get_direction()
180 direction = !!test_bit(offset, chip->direction_map); in gpio_sim_get_direction()
185 static int gpio_sim_set_config(struct gpio_chip *gc, unsigned int offset, in gpio_sim_set_config() argument
192 return gpio_sim_apply_pull(chip, offset, 1); in gpio_sim_set_config()
194 return gpio_sim_apply_pull(chip, offset, 0); in gpio_sim_set_config()
199 return -ENOTSUPP; in gpio_sim_set_config()
202 static int gpio_sim_to_irq(struct gpio_chip *gc, unsigned int offset) in gpio_sim_to_irq() argument
206 return irq_create_mapping(chip->irq_sim, offset); in gpio_sim_to_irq()
209 static int gpio_sim_request(struct gpio_chip *gc, unsigned int offset) in gpio_sim_request() argument
213 scoped_guard(mutex, &chip->lock) in gpio_sim_request()
214 __set_bit(offset, chip->request_map); in gpio_sim_request()
219 static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset) in gpio_sim_free() argument
223 scoped_guard(mutex, &chip->lock) { in gpio_sim_free()
224 __assign_bit(offset, chip->value_map, in gpio_sim_free()
225 !!test_bit(offset, chip->pull_map)); in gpio_sim_free()
226 __clear_bit(offset, chip->request_map); in gpio_sim_free()
235 return gpiochip_lock_as_irq(&chip->gc, hwirq); in gpio_sim_irq_requested()
243 gpiochip_unlock_as_irq(&chip->gc, hwirq); in gpio_sim_irq_released()
257 guard(mutex)(&chip->lock); in gpio_sim_dbg_show()
260 seq_printf(seq, " gpio-%-3d (%s) %s,%s\n", in gpio_sim_dbg_show()
261 gc->base + i, in gpio_sim_dbg_show()
263 test_bit(i, chip->direction_map) ? "input" : in gpio_sim_dbg_show()
264 test_bit(i, chip->value_map) ? "output-high" : in gpio_sim_dbg_show()
265 "output-low", in gpio_sim_dbg_show()
266 test_bit(i, chip->pull_map) ? "pull-up" : in gpio_sim_dbg_show()
267 "pull-down"); in gpio_sim_dbg_show()
277 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_val_show()
278 val = !!test_bit(line_attr->offset, chip->value_map); in gpio_sim_sysfs_val_show()
288 * Not assigning this function will result in write() returning -EIO in gpio_sim_sysfs_val_store()
289 * which is confusing. Return -EPERM explicitly. in gpio_sim_sysfs_val_store()
291 return -EPERM; in gpio_sim_sysfs_val_store()
295 [0] = "pull-down",
296 [1] = "pull-up",
307 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_pull_show()
308 pull = !!test_bit(line_attr->offset, chip->pull_map); in gpio_sim_sysfs_pull_show()
325 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull); in gpio_sim_sysfs_pull_store()
344 for (i = 0; i < chip->gc.ngpio; i++) in gpio_sim_dispose_mappings()
345 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i)); in gpio_sim_dispose_mappings()
352 sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_sysfs_remove()
359 unsigned int num_lines = chip->gc.ngpio; in gpio_sim_setup_sysfs()
360 struct device *dev = chip->gc.parent; in gpio_sim_setup_sysfs()
365 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), in gpio_sim_setup_sysfs()
367 if (!chip->attr_groups) in gpio_sim_setup_sysfs()
368 return -ENOMEM; in gpio_sim_setup_sysfs()
377 return -ENOMEM; in gpio_sim_setup_sysfs()
379 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, in gpio_sim_setup_sysfs()
381 if (!attr_group->name) in gpio_sim_setup_sysfs()
382 return -ENOMEM; in gpio_sim_setup_sysfs()
384 val_attr->offset = pull_attr->offset = i; in gpio_sim_setup_sysfs()
386 val_dev_attr = &val_attr->dev_attr; in gpio_sim_setup_sysfs()
387 pull_dev_attr = &pull_attr->dev_attr; in gpio_sim_setup_sysfs()
389 sysfs_attr_init(&val_dev_attr->attr); in gpio_sim_setup_sysfs()
390 sysfs_attr_init(&pull_dev_attr->attr); in gpio_sim_setup_sysfs()
392 val_dev_attr->attr.name = "value"; in gpio_sim_setup_sysfs()
393 pull_dev_attr->attr.name = "pull"; in gpio_sim_setup_sysfs()
395 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644; in gpio_sim_setup_sysfs()
397 val_dev_attr->show = gpio_sim_sysfs_val_show; in gpio_sim_setup_sysfs()
398 val_dev_attr->store = gpio_sim_sysfs_val_store; in gpio_sim_setup_sysfs()
399 pull_dev_attr->show = gpio_sim_sysfs_pull_show; in gpio_sim_setup_sysfs()
400 pull_dev_attr->store = gpio_sim_sysfs_pull_store; in gpio_sim_setup_sysfs()
402 attrs[0] = &val_dev_attr->attr; in gpio_sim_setup_sysfs()
403 attrs[1] = &pull_dev_attr->attr; in gpio_sim_setup_sysfs()
405 attr_group->attrs = attrs; in gpio_sim_setup_sysfs()
406 chip->attr_groups[i] = attr_group; in gpio_sim_setup_sysfs()
409 ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_setup_sysfs()
429 return -ERANGE; in gpio_sim_add_bank()
431 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label); in gpio_sim_add_bank()
436 return -ENOMEM; in gpio_sim_add_bank()
441 return -ENOMEM; in gpio_sim_add_bank()
443 chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
444 if (!chip->request_map) in gpio_sim_add_bank()
445 return -ENOMEM; in gpio_sim_add_bank()
447 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
448 if (!chip->direction_map) in gpio_sim_add_bank()
449 return -ENOMEM; in gpio_sim_add_bank()
452 bitmap_fill(chip->direction_map, num_lines); in gpio_sim_add_bank()
454 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
455 if (!chip->value_map) in gpio_sim_add_bank()
456 return -ENOMEM; in gpio_sim_add_bank()
458 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
459 if (!chip->pull_map) in gpio_sim_add_bank()
460 return -ENOMEM; in gpio_sim_add_bank()
462 chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines, in gpio_sim_add_bank()
465 if (IS_ERR(chip->irq_sim)) in gpio_sim_add_bank()
466 return PTR_ERR(chip->irq_sim); in gpio_sim_add_bank()
472 ret = devm_mutex_init(dev, &chip->lock); in gpio_sim_add_bank()
476 gc = &chip->gc; in gpio_sim_add_bank()
477 gc->base = -1; in gpio_sim_add_bank()
478 gc->ngpio = num_lines; in gpio_sim_add_bank()
479 gc->label = label; in gpio_sim_add_bank()
480 gc->owner = THIS_MODULE; in gpio_sim_add_bank()
481 gc->parent = dev; in gpio_sim_add_bank()
482 gc->fwnode = swnode; in gpio_sim_add_bank()
483 gc->get = gpio_sim_get; in gpio_sim_add_bank()
484 gc->set = gpio_sim_set; in gpio_sim_add_bank()
485 gc->get_multiple = gpio_sim_get_multiple; in gpio_sim_add_bank()
486 gc->set_multiple = gpio_sim_set_multiple; in gpio_sim_add_bank()
487 gc->direction_output = gpio_sim_direction_output; in gpio_sim_add_bank()
488 gc->direction_input = gpio_sim_direction_input; in gpio_sim_add_bank()
489 gc->get_direction = gpio_sim_get_direction; in gpio_sim_add_bank()
490 gc->set_config = gpio_sim_set_config; in gpio_sim_add_bank()
491 gc->to_irq = gpio_sim_to_irq; in gpio_sim_add_bank()
492 gc->request = gpio_sim_request; in gpio_sim_add_bank()
493 gc->free = gpio_sim_free; in gpio_sim_add_bank()
494 gc->dbg_show = PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS), gpio_sim_dbg_show); in gpio_sim_add_bank()
495 gc->can_sleep = true; in gpio_sim_add_bank()
501 chip->dev = device_find_child(dev, swnode, device_match_fwnode); in gpio_sim_add_bank()
502 if (!chip->dev) in gpio_sim_add_bank()
503 return -ENODEV; in gpio_sim_add_bank()
505 ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev); in gpio_sim_add_bank()
510 dev_set_drvdata(chip->dev, chip); in gpio_sim_add_bank()
517 struct device *dev = &pdev->dev; in gpio_sim_probe()
530 { .compatible = "gpio-simulator" },
537 .name = "gpio-sim",
558 * attributes so we need another lock.
560 * We use this lock for protecting all data structures owned by this
563 struct mutex lock; member
567 * and notify the user-space about any errors.
578 /* This is called with dev->lock already taken. */
588 snprintf(devname, sizeof(devname), "gpio-sim.%u", simdev->id); in gpio_sim_bus_notifier_call()
594 simdev->driver_bound = true; in gpio_sim_bus_notifier_call()
596 simdev->driver_bound = false; in gpio_sim_bus_notifier_call()
600 complete(&simdev->probe_completion); in gpio_sim_bus_notifier_call()
648 return bank->label && *bank->label; in gpio_sim_bank_has_label()
654 return bank->parent; in gpio_sim_bank_get_device()
665 unsigned int offset; member
682 struct gpio_sim_bank *bank = line->parent; in gpio_sim_line_get_device()
702 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_get_device()
709 lockdep_assert_held(&dev->lock); in gpio_sim_device_is_live()
711 return !!dev->pdev; in gpio_sim_device_is_live()
731 guard(mutex)(&dev->lock); in gpio_sim_device_config_dev_name_show()
733 pdev = dev->pdev; in gpio_sim_device_config_dev_name_show()
735 return sprintf(page, "%s\n", dev_name(&pdev->dev)); in gpio_sim_device_config_dev_name_show()
737 return sprintf(page, "gpio-sim.%d\n", dev->id); in gpio_sim_device_config_dev_name_show()
748 scoped_guard(mutex, &dev->lock) in gpio_sim_device_config_live_show()
759 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_get_line_names_size()
760 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_get_line_names_size()
763 size = max(size, line->offset + 1); in gpio_sim_get_line_names_size()
774 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_set_line_names()
775 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_set_line_names()
778 line_names[line->offset] = line->name; in gpio_sim_set_line_names()
786 if (!dev->hogs) in gpio_sim_remove_hogs()
789 gpiod_remove_hogs(dev->hogs); in gpio_sim_remove_hogs()
791 for (hog = dev->hogs; hog->chip_label; hog++) { in gpio_sim_remove_hogs()
792 kfree(hog->chip_label); in gpio_sim_remove_hogs()
793 kfree(hog->line_name); in gpio_sim_remove_hogs()
796 kfree(dev->hogs); in gpio_sim_remove_hogs()
797 dev->hogs = NULL; in gpio_sim_remove_hogs()
807 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
808 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
809 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
812 if (line->hog) in gpio_sim_add_hogs()
821 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL); in gpio_sim_add_hogs()
822 if (!dev->hogs) in gpio_sim_add_hogs()
823 return -ENOMEM; in gpio_sim_add_hogs()
825 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
826 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
827 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
830 if (!line->hog) in gpio_sim_add_hogs()
833 hog = &dev->hogs[idx++]; in gpio_sim_add_hogs()
841 hog->chip_label = kstrdup(bank->label, in gpio_sim_add_hogs()
844 hog->chip_label = kasprintf(GFP_KERNEL, in gpio_sim_add_hogs()
845 "gpio-sim.%u:%pfwP", in gpio_sim_add_hogs()
846 dev->id, in gpio_sim_add_hogs()
847 bank->swnode); in gpio_sim_add_hogs()
848 if (!hog->chip_label) { in gpio_sim_add_hogs()
850 return -ENOMEM; in gpio_sim_add_hogs()
859 if (line->hog->name) { in gpio_sim_add_hogs()
860 hog->line_name = kstrdup(line->hog->name, in gpio_sim_add_hogs()
862 if (!hog->line_name) { in gpio_sim_add_hogs()
864 return -ENOMEM; in gpio_sim_add_hogs()
868 hog->chip_hwnum = line->offset; in gpio_sim_add_hogs()
869 hog->dflags = line->hog->dir; in gpio_sim_add_hogs()
873 gpiod_add_hogs(dev->hogs); in gpio_sim_add_hogs()
888 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines); in gpio_sim_make_bank_swnode()
891 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label", in gpio_sim_make_bank_swnode()
892 bank->label); in gpio_sim_make_bank_swnode()
899 return ERR_PTR(-ENOMEM); in gpio_sim_make_bank_swnode()
904 "gpio-line-names", in gpio_sim_make_bank_swnode()
925 list_for_each_entry(this, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
926 list_for_each_entry(pos, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
927 if (this == pos || (!this->label || !pos->label)) in gpio_sim_bank_labels_non_unique()
930 if (strcmp(this->label, pos->label) == 0) in gpio_sim_bank_labels_non_unique()
946 lockdep_assert_held(&dev->lock); in gpio_sim_device_activate()
948 if (list_empty(&dev->bank_list)) in gpio_sim_device_activate()
949 return -ENODATA; in gpio_sim_device_activate()
952 * Non-unique GPIO device labels are a corner-case we don't support in gpio_sim_device_activate()
957 return -EINVAL; in gpio_sim_device_activate()
965 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_activate()
966 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); in gpio_sim_device_activate()
967 if (IS_ERR(bank->swnode)) { in gpio_sim_device_activate()
968 ret = PTR_ERR(bank->swnode); in gpio_sim_device_activate()
980 pdevinfo.name = "gpio-sim"; in gpio_sim_device_activate()
982 pdevinfo.id = dev->id; in gpio_sim_device_activate()
984 reinit_completion(&dev->probe_completion); in gpio_sim_device_activate()
985 dev->driver_bound = false; in gpio_sim_device_activate()
986 bus_register_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate()
990 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate()
996 wait_for_completion(&dev->probe_completion); in gpio_sim_device_activate()
997 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate()
999 if (!dev->driver_bound) { in gpio_sim_device_activate()
1004 return -ENXIO; in gpio_sim_device_activate()
1007 dev->pdev = pdev; in gpio_sim_device_activate()
1016 lockdep_assert_held(&dev->lock); in gpio_sim_device_deactivate()
1018 swnode = dev_fwnode(&dev->pdev->dev); in gpio_sim_device_deactivate()
1019 platform_device_unregister(dev->pdev); in gpio_sim_device_deactivate()
1022 dev->pdev = NULL; in gpio_sim_device_deactivate()
1026 gpio_sim_device_lockup_configfs(struct gpio_sim_device *dev, bool lock) in gpio_sim_device_lockup_configfs() argument
1028 struct configfs_subsystem *subsys = dev->group.cg_subsys; in gpio_sim_device_lockup_configfs()
1035 * sufficient to lock up all the configfs entries that the in gpio_sim_device_lockup_configfs()
1038 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_lockup_configfs()
1039 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_device_lockup_configfs()
1040 item = line->hog ? &line->hog->item in gpio_sim_device_lockup_configfs()
1041 : &line->group.cg_item; in gpio_sim_device_lockup_configfs()
1043 if (lock) in gpio_sim_device_lockup_configfs()
1067 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_live_store()
1069 ret = -EPERM; in gpio_sim_device_config_live_store()
1104 if (dev->class) in gpio_sim_emit_chip_name()
1107 if (device_match_fwnode(dev, ctx->swnode)) in gpio_sim_emit_chip_name()
1108 return sprintf(ctx->page, "%s\n", dev_name(dev)); in gpio_sim_emit_chip_name()
1118 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; in gpio_sim_bank_config_chip_name_show()
1120 guard(mutex)(&dev->lock); in gpio_sim_bank_config_chip_name_show()
1123 return device_for_each_child(&dev->pdev->dev, &ctx, in gpio_sim_bank_config_chip_name_show()
1137 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_show()
1139 return sprintf(page, "%s\n", bank->label ?: ""); in gpio_sim_bank_config_label_show()
1149 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_store()
1152 return -EBUSY; in gpio_sim_bank_config_label_store()
1156 return -ENOMEM; in gpio_sim_bank_config_label_store()
1158 kfree(bank->label); in gpio_sim_bank_config_label_store()
1159 bank->label = trimmed; in gpio_sim_bank_config_label_store()
1172 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_show()
1174 return sprintf(page, "%u\n", bank->num_lines); in gpio_sim_bank_config_num_lines_show()
1191 return -EINVAL; in gpio_sim_bank_config_num_lines_store()
1193 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_store()
1196 return -EBUSY; in gpio_sim_bank_config_num_lines_store()
1198 bank->num_lines = num_lines; in gpio_sim_bank_config_num_lines_store()
1218 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_show()
1220 return sprintf(page, "%s\n", line->name ?: ""); in gpio_sim_line_config_name_show()
1230 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_store()
1233 return -EBUSY; in gpio_sim_line_config_name_store()
1237 return -ENOMEM; in gpio_sim_line_config_name_store()
1239 kfree(line->name); in gpio_sim_line_config_name_store()
1240 line->name = trimmed; in gpio_sim_line_config_name_store()
1258 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_show()
1260 return sprintf(page, "%s\n", hog->name ?: ""); in gpio_sim_hog_config_name_show()
1270 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_store()
1273 return -EBUSY; in gpio_sim_hog_config_name_store()
1277 return -ENOMEM; in gpio_sim_hog_config_name_store()
1279 kfree(hog->name); in gpio_sim_hog_config_name_store()
1280 hog->name = trimmed; in gpio_sim_hog_config_name_store()
1295 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_direction_show()
1296 dir = hog->dir; in gpio_sim_hog_config_direction_show()
1303 repr = "output-high"; in gpio_sim_hog_config_direction_show()
1306 repr = "output-low"; in gpio_sim_hog_config_direction_show()
1311 return -EINVAL; in gpio_sim_hog_config_direction_show()
1325 guard(mutex)(&dev->lock); in gpio_sim_hog_config_direction_store()
1328 return -EBUSY; in gpio_sim_hog_config_direction_store()
1332 else if (sysfs_streq(page, "output-high")) in gpio_sim_hog_config_direction_store()
1334 else if (sysfs_streq(page, "output-low")) in gpio_sim_hog_config_direction_store()
1337 return -EINVAL; in gpio_sim_hog_config_direction_store()
1339 hog->dir = dir; in gpio_sim_hog_config_direction_store()
1355 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_config_item_release()
1358 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_item_release()
1359 line->hog = NULL; in gpio_sim_hog_config_item_release()
1361 kfree(hog->name); in gpio_sim_hog_config_item_release()
1378 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item); in gpio_sim_line_config_make_hog_item()
1383 return ERR_PTR(-EINVAL); in gpio_sim_line_config_make_hog_item()
1385 guard(mutex)(&dev->lock); in gpio_sim_line_config_make_hog_item()
1389 return ERR_PTR(-ENOMEM); in gpio_sim_line_config_make_hog_item()
1391 config_item_init_type_name(&hog->item, name, in gpio_sim_line_config_make_hog_item()
1394 hog->dir = GPIOD_IN; in gpio_sim_line_config_make_hog_item()
1395 hog->name = NULL; in gpio_sim_line_config_make_hog_item()
1396 hog->parent = line; in gpio_sim_line_config_make_hog_item()
1397 line->hog = hog; in gpio_sim_line_config_make_hog_item()
1399 return &hog->item; in gpio_sim_line_config_make_hog_item()
1407 scoped_guard(mutex, &dev->lock) in gpio_sim_line_config_group_release()
1408 list_del(&line->siblings); in gpio_sim_line_config_group_release()
1410 kfree(line->name); in gpio_sim_line_config_group_release()
1433 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item); in gpio_sim_bank_config_make_line_group()
1436 unsigned int offset; in gpio_sim_bank_config_make_line_group() local
1439 ret = sscanf(name, "line%u%n", &offset, &nchar); in gpio_sim_bank_config_make_line_group()
1441 return ERR_PTR(-EINVAL); in gpio_sim_bank_config_make_line_group()
1443 guard(mutex)(&dev->lock); in gpio_sim_bank_config_make_line_group()
1446 return ERR_PTR(-EBUSY); in gpio_sim_bank_config_make_line_group()
1450 return ERR_PTR(-ENOMEM); in gpio_sim_bank_config_make_line_group()
1452 config_group_init_type_name(&line->group, name, in gpio_sim_bank_config_make_line_group()
1455 line->parent = bank; in gpio_sim_bank_config_make_line_group()
1456 line->offset = offset; in gpio_sim_bank_config_make_line_group()
1457 list_add_tail(&line->siblings, &bank->line_list); in gpio_sim_bank_config_make_line_group()
1459 return &line->group; in gpio_sim_bank_config_make_line_group()
1467 scoped_guard(mutex, &dev->lock) in gpio_sim_bank_config_group_release()
1468 list_del(&bank->siblings); in gpio_sim_bank_config_group_release()
1470 kfree(bank->label); in gpio_sim_bank_config_group_release()
1493 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); in gpio_sim_device_config_make_bank_group()
1496 guard(mutex)(&dev->lock); in gpio_sim_device_config_make_bank_group()
1499 return ERR_PTR(-EBUSY); in gpio_sim_device_config_make_bank_group()
1503 return ERR_PTR(-ENOMEM); in gpio_sim_device_config_make_bank_group()
1505 config_group_init_type_name(&bank->group, name, in gpio_sim_device_config_make_bank_group()
1507 bank->num_lines = 1; in gpio_sim_device_config_make_bank_group()
1508 bank->parent = dev; in gpio_sim_device_config_make_bank_group()
1509 INIT_LIST_HEAD(&bank->line_list); in gpio_sim_device_config_make_bank_group()
1510 list_add_tail(&bank->siblings, &dev->bank_list); in gpio_sim_device_config_make_bank_group()
1512 return &bank->group; in gpio_sim_device_config_make_bank_group()
1519 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_group_release()
1524 mutex_destroy(&dev->lock); in gpio_sim_device_config_group_release()
1525 ida_free(&gpio_sim_ida, dev->id); in gpio_sim_device_config_group_release()
1552 return ERR_PTR(-ENOMEM); in gpio_sim_config_make_device_group()
1558 config_group_init_type_name(&dev->group, name, in gpio_sim_config_make_device_group()
1560 dev->id = id; in gpio_sim_config_make_device_group()
1561 mutex_init(&dev->lock); in gpio_sim_config_make_device_group()
1562 INIT_LIST_HEAD(&dev->bank_list); in gpio_sim_config_make_device_group()
1564 dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call; in gpio_sim_config_make_device_group()
1565 init_completion(&dev->probe_completion); in gpio_sim_config_make_device_group()
1567 return &no_free_ptr(dev)->group; in gpio_sim_config_make_device_group()
1582 .ci_namebuf = "gpio-sim",