Lines Matching +full:- +full:hog
1 // SPDX-License-Identifier: GPL-2.0-or-later
70 gc = &chip->gc; in gpio_sim_apply_pull()
71 desc = &gc->gpiodev->descs[offset]; in gpio_sim_apply_pull()
73 guard(mutex)(&chip->lock); in gpio_sim_apply_pull()
75 if (test_bit(FLAG_REQUESTED, &desc->flags) && in gpio_sim_apply_pull()
76 !test_bit(FLAG_IS_OUT, &desc->flags)) { in gpio_sim_apply_pull()
77 if (value == !!test_bit(offset, chip->value_map)) in gpio_sim_apply_pull()
81 * This is fine - it just means, nobody is listening in gpio_sim_apply_pull()
86 irq = irq_find_mapping(chip->irq_sim, offset); in gpio_sim_apply_pull()
103 if (!test_bit(FLAG_REQUESTED, &desc->flags) || in gpio_sim_apply_pull()
104 !test_bit(FLAG_IS_OUT, &desc->flags)) in gpio_sim_apply_pull()
105 __assign_bit(offset, chip->value_map, value); in gpio_sim_apply_pull()
108 __assign_bit(offset, chip->pull_map, value); in gpio_sim_apply_pull()
116 guard(mutex)(&chip->lock); in gpio_sim_get()
118 return !!test_bit(offset, chip->value_map); in gpio_sim_get()
125 scoped_guard(mutex, &chip->lock) in gpio_sim_set()
126 __assign_bit(offset, chip->value_map, value); in gpio_sim_set()
134 scoped_guard(mutex, &chip->lock) in gpio_sim_get_multiple()
135 bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); in gpio_sim_get_multiple()
145 scoped_guard(mutex, &chip->lock) in gpio_sim_set_multiple()
146 bitmap_replace(chip->value_map, chip->value_map, bits, mask, in gpio_sim_set_multiple()
147 gc->ngpio); in gpio_sim_set_multiple()
155 scoped_guard(mutex, &chip->lock) { in gpio_sim_direction_output()
156 __clear_bit(offset, chip->direction_map); in gpio_sim_direction_output()
157 __assign_bit(offset, chip->value_map, value); in gpio_sim_direction_output()
167 scoped_guard(mutex, &chip->lock) in gpio_sim_direction_input()
168 __set_bit(offset, chip->direction_map); in gpio_sim_direction_input()
178 scoped_guard(mutex, &chip->lock) in gpio_sim_get_direction()
179 direction = !!test_bit(offset, chip->direction_map); in gpio_sim_get_direction()
198 return -ENOTSUPP; in gpio_sim_set_config()
205 return irq_create_mapping(chip->irq_sim, offset); in gpio_sim_to_irq()
212 scoped_guard(mutex, &chip->lock) in gpio_sim_free()
213 __assign_bit(offset, chip->value_map, in gpio_sim_free()
214 !!test_bit(offset, chip->pull_map)); in gpio_sim_free()
224 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_val_show()
225 val = !!test_bit(line_attr->offset, chip->value_map); in gpio_sim_sysfs_val_show()
235 * Not assigning this function will result in write() returning -EIO in gpio_sim_sysfs_val_store()
236 * which is confusing. Return -EPERM explicitly. in gpio_sim_sysfs_val_store()
238 return -EPERM; in gpio_sim_sysfs_val_store()
242 [0] = "pull-down",
243 [1] = "pull-up",
254 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_pull_show()
255 pull = !!test_bit(line_attr->offset, chip->pull_map); in gpio_sim_sysfs_pull_show()
272 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull); in gpio_sim_sysfs_pull_store()
291 for (i = 0; i < chip->gc.ngpio; i++) in gpio_sim_dispose_mappings()
292 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i)); in gpio_sim_dispose_mappings()
299 sysfs_remove_groups(&chip->gc.gpiodev->dev.kobj, chip->attr_groups); in gpio_sim_sysfs_remove()
306 unsigned int num_lines = chip->gc.ngpio; in gpio_sim_setup_sysfs()
307 struct device *dev = chip->gc.parent; in gpio_sim_setup_sysfs()
312 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), in gpio_sim_setup_sysfs()
314 if (!chip->attr_groups) in gpio_sim_setup_sysfs()
315 return -ENOMEM; in gpio_sim_setup_sysfs()
324 return -ENOMEM; in gpio_sim_setup_sysfs()
326 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, in gpio_sim_setup_sysfs()
328 if (!attr_group->name) in gpio_sim_setup_sysfs()
329 return -ENOMEM; in gpio_sim_setup_sysfs()
331 val_attr->offset = pull_attr->offset = i; in gpio_sim_setup_sysfs()
333 val_dev_attr = &val_attr->dev_attr; in gpio_sim_setup_sysfs()
334 pull_dev_attr = &pull_attr->dev_attr; in gpio_sim_setup_sysfs()
336 sysfs_attr_init(&val_dev_attr->attr); in gpio_sim_setup_sysfs()
337 sysfs_attr_init(&pull_dev_attr->attr); in gpio_sim_setup_sysfs()
339 val_dev_attr->attr.name = "value"; in gpio_sim_setup_sysfs()
340 pull_dev_attr->attr.name = "pull"; in gpio_sim_setup_sysfs()
342 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644; in gpio_sim_setup_sysfs()
344 val_dev_attr->show = gpio_sim_sysfs_val_show; in gpio_sim_setup_sysfs()
345 val_dev_attr->store = gpio_sim_sysfs_val_store; in gpio_sim_setup_sysfs()
346 pull_dev_attr->show = gpio_sim_sysfs_pull_show; in gpio_sim_setup_sysfs()
347 pull_dev_attr->store = gpio_sim_sysfs_pull_store; in gpio_sim_setup_sysfs()
349 attrs[0] = &val_dev_attr->attr; in gpio_sim_setup_sysfs()
350 attrs[1] = &pull_dev_attr->attr; in gpio_sim_setup_sysfs()
352 attr_group->attrs = attrs; in gpio_sim_setup_sysfs()
353 chip->attr_groups[i] = attr_group; in gpio_sim_setup_sysfs()
356 ret = sysfs_create_groups(&chip->gc.gpiodev->dev.kobj, in gpio_sim_setup_sysfs()
357 chip->attr_groups); in gpio_sim_setup_sysfs()
377 return -ERANGE; in gpio_sim_add_bank()
379 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label); in gpio_sim_add_bank()
381 label = devm_kasprintf(dev, GFP_KERNEL, "%s-%pfwP", in gpio_sim_add_bank()
384 return -ENOMEM; in gpio_sim_add_bank()
389 return -ENOMEM; in gpio_sim_add_bank()
391 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
392 if (!chip->direction_map) in gpio_sim_add_bank()
393 return -ENOMEM; in gpio_sim_add_bank()
396 bitmap_fill(chip->direction_map, num_lines); in gpio_sim_add_bank()
398 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
399 if (!chip->value_map) in gpio_sim_add_bank()
400 return -ENOMEM; in gpio_sim_add_bank()
402 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
403 if (!chip->pull_map) in gpio_sim_add_bank()
404 return -ENOMEM; in gpio_sim_add_bank()
406 chip->irq_sim = devm_irq_domain_create_sim(dev, swnode, num_lines); in gpio_sim_add_bank()
407 if (IS_ERR(chip->irq_sim)) in gpio_sim_add_bank()
408 return PTR_ERR(chip->irq_sim); in gpio_sim_add_bank()
414 mutex_init(&chip->lock); in gpio_sim_add_bank()
416 &chip->lock); in gpio_sim_add_bank()
420 gc = &chip->gc; in gpio_sim_add_bank()
421 gc->base = -1; in gpio_sim_add_bank()
422 gc->ngpio = num_lines; in gpio_sim_add_bank()
423 gc->label = label; in gpio_sim_add_bank()
424 gc->owner = THIS_MODULE; in gpio_sim_add_bank()
425 gc->parent = dev; in gpio_sim_add_bank()
426 gc->fwnode = swnode; in gpio_sim_add_bank()
427 gc->get = gpio_sim_get; in gpio_sim_add_bank()
428 gc->set = gpio_sim_set; in gpio_sim_add_bank()
429 gc->get_multiple = gpio_sim_get_multiple; in gpio_sim_add_bank()
430 gc->set_multiple = gpio_sim_set_multiple; in gpio_sim_add_bank()
431 gc->direction_output = gpio_sim_direction_output; in gpio_sim_add_bank()
432 gc->direction_input = gpio_sim_direction_input; in gpio_sim_add_bank()
433 gc->get_direction = gpio_sim_get_direction; in gpio_sim_add_bank()
434 gc->set_config = gpio_sim_set_config; in gpio_sim_add_bank()
435 gc->to_irq = gpio_sim_to_irq; in gpio_sim_add_bank()
436 gc->free = gpio_sim_free; in gpio_sim_add_bank()
437 gc->can_sleep = true; in gpio_sim_add_bank()
444 dev_set_drvdata(&gc->gpiodev->dev, chip); in gpio_sim_add_bank()
451 struct device *dev = &pdev->dev; in gpio_sim_probe()
467 { .compatible = "gpio-simulator" },
474 .name = "gpio-sim",
504 * and notify the user-space about any errors.
515 /* This is called with dev->lock already taken. */
525 snprintf(devname, sizeof(devname), "gpio-sim.%u", simdev->id); in gpio_sim_bus_notifier_call()
529 simdev->driver_bound = true; in gpio_sim_bus_notifier_call()
531 simdev->driver_bound = false; in gpio_sim_bus_notifier_call()
535 complete(&simdev->probe_completion); in gpio_sim_bus_notifier_call()
585 return bank->label && *bank->label; in gpio_sim_bank_has_label()
591 return bank->parent; in gpio_sim_bank_get_device()
605 /* There can only be one hog per line. */
606 struct gpio_sim_hog *hog; member
619 struct gpio_sim_bank *bank = line->parent; in gpio_sim_line_get_device()
637 static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog) in gpio_sim_hog_get_device() argument
639 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_get_device()
646 return !!dev->pdev; in gpio_sim_device_is_live_unlocked()
666 guard(mutex)(&dev->lock); in gpio_sim_device_config_dev_name_show()
668 pdev = dev->pdev; in gpio_sim_device_config_dev_name_show()
670 return sprintf(page, "%s\n", dev_name(&pdev->dev)); in gpio_sim_device_config_dev_name_show()
672 return sprintf(page, "gpio-sim.%d\n", dev->id); in gpio_sim_device_config_dev_name_show()
683 scoped_guard(mutex, &dev->lock) in gpio_sim_device_config_live_show()
694 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_get_line_names_size()
695 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_get_line_names_size()
698 size = max(size, line->offset + 1); in gpio_sim_get_line_names_size()
709 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_set_line_names()
710 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_set_line_names()
713 line_names[line->offset] = line->name; in gpio_sim_set_line_names()
719 struct gpiod_hog *hog; in gpio_sim_remove_hogs() local
721 if (!dev->hogs) in gpio_sim_remove_hogs()
724 gpiod_remove_hogs(dev->hogs); in gpio_sim_remove_hogs()
726 for (hog = dev->hogs; hog->chip_label; hog++) { in gpio_sim_remove_hogs()
727 kfree(hog->chip_label); in gpio_sim_remove_hogs()
728 kfree(hog->line_name); in gpio_sim_remove_hogs()
731 kfree(dev->hogs); in gpio_sim_remove_hogs()
732 dev->hogs = NULL; in gpio_sim_remove_hogs()
740 struct gpiod_hog *hog; in gpio_sim_add_hogs() local
742 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
743 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
744 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
747 if (line->hog) in gpio_sim_add_hogs()
756 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL); in gpio_sim_add_hogs()
757 if (!dev->hogs) in gpio_sim_add_hogs()
758 return -ENOMEM; in gpio_sim_add_hogs()
760 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
761 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
762 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
765 if (!line->hog) in gpio_sim_add_hogs()
768 hog = &dev->hogs[idx++]; in gpio_sim_add_hogs()
776 hog->chip_label = kstrdup(bank->label, in gpio_sim_add_hogs()
779 hog->chip_label = kasprintf(GFP_KERNEL, in gpio_sim_add_hogs()
780 "gpio-sim.%u-%pfwP", in gpio_sim_add_hogs()
781 dev->id, in gpio_sim_add_hogs()
782 bank->swnode); in gpio_sim_add_hogs()
783 if (!hog->chip_label) { in gpio_sim_add_hogs()
785 return -ENOMEM; in gpio_sim_add_hogs()
789 * We need to duplicate this because the hog config in gpio_sim_add_hogs()
791 * it) and gpiolib doesn't make a deep copy of the hog in gpio_sim_add_hogs()
794 if (line->hog->name) { in gpio_sim_add_hogs()
795 hog->line_name = kstrdup(line->hog->name, in gpio_sim_add_hogs()
797 if (!hog->line_name) { in gpio_sim_add_hogs()
799 return -ENOMEM; in gpio_sim_add_hogs()
803 hog->chip_hwnum = line->offset; in gpio_sim_add_hogs()
804 hog->dflags = line->hog->dir; in gpio_sim_add_hogs()
808 gpiod_add_hogs(dev->hogs); in gpio_sim_add_hogs()
823 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines); in gpio_sim_make_bank_swnode()
826 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label", in gpio_sim_make_bank_swnode()
827 bank->label); in gpio_sim_make_bank_swnode()
834 return ERR_PTR(-ENOMEM); in gpio_sim_make_bank_swnode()
839 "gpio-line-names", in gpio_sim_make_bank_swnode()
860 list_for_each_entry(this, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
861 list_for_each_entry(pos, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
862 if (this == pos || (!this->label || !pos->label)) in gpio_sim_bank_labels_non_unique()
865 if (strcmp(this->label, pos->label) == 0) in gpio_sim_bank_labels_non_unique()
881 if (list_empty(&dev->bank_list)) in gpio_sim_device_activate_unlocked()
882 return -ENODATA; in gpio_sim_device_activate_unlocked()
885 * Non-unique GPIO device labels are a corner-case we don't support in gpio_sim_device_activate_unlocked()
890 return -EINVAL; in gpio_sim_device_activate_unlocked()
898 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_activate_unlocked()
899 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); in gpio_sim_device_activate_unlocked()
900 if (IS_ERR(bank->swnode)) { in gpio_sim_device_activate_unlocked()
901 ret = PTR_ERR(bank->swnode); in gpio_sim_device_activate_unlocked()
913 pdevinfo.name = "gpio-sim"; in gpio_sim_device_activate_unlocked()
915 pdevinfo.id = dev->id; in gpio_sim_device_activate_unlocked()
917 reinit_completion(&dev->probe_completion); in gpio_sim_device_activate_unlocked()
918 dev->driver_bound = false; in gpio_sim_device_activate_unlocked()
919 bus_register_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
923 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
929 wait_for_completion(&dev->probe_completion); in gpio_sim_device_activate_unlocked()
930 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
932 if (!dev->driver_bound) { in gpio_sim_device_activate_unlocked()
937 return -ENXIO; in gpio_sim_device_activate_unlocked()
940 dev->pdev = pdev; in gpio_sim_device_activate_unlocked()
949 swnode = dev_fwnode(&dev->pdev->dev); in gpio_sim_device_deactivate_unlocked()
950 platform_device_unregister(dev->pdev); in gpio_sim_device_deactivate_unlocked()
953 dev->pdev = NULL; in gpio_sim_device_deactivate_unlocked()
968 guard(mutex)(&dev->lock); in gpio_sim_device_config_live_store()
971 ret = -EPERM; in gpio_sim_device_config_live_store()
998 if (dev->class) in gpio_sim_emit_chip_name()
1001 if (device_match_fwnode(dev, ctx->swnode)) in gpio_sim_emit_chip_name()
1002 return sprintf(ctx->page, "%s\n", dev_name(dev)); in gpio_sim_emit_chip_name()
1012 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; in gpio_sim_bank_config_chip_name_show()
1014 guard(mutex)(&dev->lock); in gpio_sim_bank_config_chip_name_show()
1017 return device_for_each_child(&dev->pdev->dev, &ctx, in gpio_sim_bank_config_chip_name_show()
1031 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_show()
1033 return sprintf(page, "%s\n", bank->label ?: ""); in gpio_sim_bank_config_label_show()
1043 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_store()
1046 return -EBUSY; in gpio_sim_bank_config_label_store()
1050 return -ENOMEM; in gpio_sim_bank_config_label_store()
1052 kfree(bank->label); in gpio_sim_bank_config_label_store()
1053 bank->label = trimmed; in gpio_sim_bank_config_label_store()
1066 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_show()
1068 return sprintf(page, "%u\n", bank->num_lines); in gpio_sim_bank_config_num_lines_show()
1085 return -EINVAL; in gpio_sim_bank_config_num_lines_store()
1087 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_store()
1090 return -EBUSY; in gpio_sim_bank_config_num_lines_store()
1092 bank->num_lines = num_lines; in gpio_sim_bank_config_num_lines_store()
1112 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_show()
1114 return sprintf(page, "%s\n", line->name ?: ""); in gpio_sim_line_config_name_show()
1124 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_store()
1127 return -EBUSY; in gpio_sim_line_config_name_store()
1131 return -ENOMEM; in gpio_sim_line_config_name_store()
1133 kfree(line->name); in gpio_sim_line_config_name_store()
1134 line->name = trimmed; in gpio_sim_line_config_name_store()
1149 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_show() local
1150 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_show()
1152 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_show()
1154 return sprintf(page, "%s\n", hog->name ?: ""); in gpio_sim_hog_config_name_show()
1160 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_store() local
1161 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_store()
1164 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_store()
1167 return -EBUSY; in gpio_sim_hog_config_name_store()
1171 return -ENOMEM; in gpio_sim_hog_config_name_store()
1173 kfree(hog->name); in gpio_sim_hog_config_name_store()
1174 hog->name = trimmed; in gpio_sim_hog_config_name_store()
1184 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_show() local
1185 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_show()
1189 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_direction_show()
1190 dir = hog->dir; in gpio_sim_hog_config_direction_show()
1197 repr = "output-high"; in gpio_sim_hog_config_direction_show()
1200 repr = "output-low"; in gpio_sim_hog_config_direction_show()
1204 WARN(1, "Unexpected hog direction value: %d", dir); in gpio_sim_hog_config_direction_show()
1205 return -EINVAL; in gpio_sim_hog_config_direction_show()
1215 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_store() local
1216 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_store()
1219 guard(mutex)(&dev->lock); in gpio_sim_hog_config_direction_store()
1222 return -EBUSY; in gpio_sim_hog_config_direction_store()
1226 else if (sysfs_streq(page, "output-high")) in gpio_sim_hog_config_direction_store()
1228 else if (sysfs_streq(page, "output-low")) in gpio_sim_hog_config_direction_store()
1231 return -EINVAL; in gpio_sim_hog_config_direction_store()
1233 hog->dir = dir; in gpio_sim_hog_config_direction_store()
1248 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_item_release() local
1249 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_config_item_release()
1250 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_item_release()
1252 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_item_release()
1253 line->hog = NULL; in gpio_sim_hog_config_item_release()
1255 kfree(hog->name); in gpio_sim_hog_config_item_release()
1256 kfree(hog); in gpio_sim_hog_config_item_release()
1272 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item); in gpio_sim_line_config_make_hog_item()
1274 struct gpio_sim_hog *hog; in gpio_sim_line_config_make_hog_item() local
1276 if (strcmp(name, "hog") != 0) in gpio_sim_line_config_make_hog_item()
1277 return ERR_PTR(-EINVAL); in gpio_sim_line_config_make_hog_item()
1279 guard(mutex)(&dev->lock); in gpio_sim_line_config_make_hog_item()
1281 hog = kzalloc(sizeof(*hog), GFP_KERNEL); in gpio_sim_line_config_make_hog_item()
1282 if (!hog) in gpio_sim_line_config_make_hog_item()
1283 return ERR_PTR(-ENOMEM); in gpio_sim_line_config_make_hog_item()
1285 config_item_init_type_name(&hog->item, name, in gpio_sim_line_config_make_hog_item()
1288 hog->dir = GPIOD_IN; in gpio_sim_line_config_make_hog_item()
1289 hog->name = NULL; in gpio_sim_line_config_make_hog_item()
1290 hog->parent = line; in gpio_sim_line_config_make_hog_item()
1291 line->hog = hog; in gpio_sim_line_config_make_hog_item()
1293 return &hog->item; in gpio_sim_line_config_make_hog_item()
1301 scoped_guard(mutex, &dev->lock) in gpio_sim_line_config_group_release()
1302 list_del(&line->siblings); in gpio_sim_line_config_group_release()
1304 kfree(line->name); in gpio_sim_line_config_group_release()
1327 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item); in gpio_sim_bank_config_make_line_group()
1335 return ERR_PTR(-EINVAL); in gpio_sim_bank_config_make_line_group()
1337 guard(mutex)(&dev->lock); in gpio_sim_bank_config_make_line_group()
1340 return ERR_PTR(-EBUSY); in gpio_sim_bank_config_make_line_group()
1344 return ERR_PTR(-ENOMEM); in gpio_sim_bank_config_make_line_group()
1346 config_group_init_type_name(&line->group, name, in gpio_sim_bank_config_make_line_group()
1349 line->parent = bank; in gpio_sim_bank_config_make_line_group()
1350 line->offset = offset; in gpio_sim_bank_config_make_line_group()
1351 list_add_tail(&line->siblings, &bank->line_list); in gpio_sim_bank_config_make_line_group()
1353 return &line->group; in gpio_sim_bank_config_make_line_group()
1361 scoped_guard(mutex, &dev->lock) in gpio_sim_bank_config_group_release()
1362 list_del(&bank->siblings); in gpio_sim_bank_config_group_release()
1364 kfree(bank->label); in gpio_sim_bank_config_group_release()
1387 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); in gpio_sim_device_config_make_bank_group()
1390 guard(mutex)(&dev->lock); in gpio_sim_device_config_make_bank_group()
1393 return ERR_PTR(-EBUSY); in gpio_sim_device_config_make_bank_group()
1397 return ERR_PTR(-ENOMEM); in gpio_sim_device_config_make_bank_group()
1399 config_group_init_type_name(&bank->group, name, in gpio_sim_device_config_make_bank_group()
1401 bank->num_lines = 1; in gpio_sim_device_config_make_bank_group()
1402 bank->parent = dev; in gpio_sim_device_config_make_bank_group()
1403 INIT_LIST_HEAD(&bank->line_list); in gpio_sim_device_config_make_bank_group()
1404 list_add_tail(&bank->siblings, &dev->bank_list); in gpio_sim_device_config_make_bank_group()
1406 return &bank->group; in gpio_sim_device_config_make_bank_group()
1413 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_group_release()
1418 mutex_destroy(&dev->lock); in gpio_sim_device_config_group_release()
1419 ida_free(&gpio_sim_ida, dev->id); in gpio_sim_device_config_group_release()
1446 return ERR_PTR(-ENOMEM); in gpio_sim_config_make_device_group()
1452 config_group_init_type_name(&dev->group, name, in gpio_sim_config_make_device_group()
1454 dev->id = id; in gpio_sim_config_make_device_group()
1455 mutex_init(&dev->lock); in gpio_sim_config_make_device_group()
1456 INIT_LIST_HEAD(&dev->bank_list); in gpio_sim_config_make_device_group()
1458 dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call; in gpio_sim_config_make_device_group()
1459 init_completion(&dev->probe_completion); in gpio_sim_config_make_device_group()
1461 return &no_free_ptr(dev)->group; in gpio_sim_config_make_device_group()
1476 .ci_namebuf = "gpio-sim",