Lines Matching +full:hog +full:-
1 // SPDX-License-Identifier: GPL-2.0-or-later
39 #include "dev-sync-probe.h"
75 guard(mutex)(&chip->lock); in gpio_sim_apply_pull()
77 if (test_bit(offset, chip->request_map) && in gpio_sim_apply_pull()
78 test_bit(offset, chip->direction_map)) { in gpio_sim_apply_pull()
79 if (value == !!test_bit(offset, chip->value_map)) in gpio_sim_apply_pull()
83 * This is fine - it just means, nobody is listening in gpio_sim_apply_pull()
88 irq = irq_find_mapping(chip->irq_sim, offset); in gpio_sim_apply_pull()
105 if (!test_bit(offset, chip->request_map) || in gpio_sim_apply_pull()
106 test_bit(offset, chip->direction_map)) in gpio_sim_apply_pull()
107 __assign_bit(offset, chip->value_map, value); in gpio_sim_apply_pull()
110 __assign_bit(offset, chip->pull_map, value); in gpio_sim_apply_pull()
118 guard(mutex)(&chip->lock); in gpio_sim_get()
120 return !!test_bit(offset, chip->value_map); in gpio_sim_get()
127 scoped_guard(mutex, &chip->lock) in gpio_sim_set()
128 __assign_bit(offset, chip->value_map, value); in gpio_sim_set()
138 scoped_guard(mutex, &chip->lock) in gpio_sim_get_multiple()
139 bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); in gpio_sim_get_multiple()
149 scoped_guard(mutex, &chip->lock) in gpio_sim_set_multiple()
150 bitmap_replace(chip->value_map, chip->value_map, bits, mask, in gpio_sim_set_multiple()
151 gc->ngpio); in gpio_sim_set_multiple()
161 scoped_guard(mutex, &chip->lock) { in gpio_sim_direction_output()
162 __clear_bit(offset, chip->direction_map); in gpio_sim_direction_output()
163 __assign_bit(offset, chip->value_map, value); in gpio_sim_direction_output()
173 scoped_guard(mutex, &chip->lock) in gpio_sim_direction_input()
174 __set_bit(offset, chip->direction_map); in gpio_sim_direction_input()
184 scoped_guard(mutex, &chip->lock) in gpio_sim_get_direction()
185 direction = !!test_bit(offset, chip->direction_map); in gpio_sim_get_direction()
204 return -ENOTSUPP; in gpio_sim_set_config()
211 return irq_create_mapping(chip->irq_sim, offset); in gpio_sim_to_irq()
218 scoped_guard(mutex, &chip->lock) in gpio_sim_request()
219 __set_bit(offset, chip->request_map); in gpio_sim_request()
228 scoped_guard(mutex, &chip->lock) { in gpio_sim_free()
229 __assign_bit(offset, chip->value_map, in gpio_sim_free()
230 !!test_bit(offset, chip->pull_map)); in gpio_sim_free()
231 __clear_bit(offset, chip->request_map); in gpio_sim_free()
240 return gpiochip_lock_as_irq(&chip->gc, hwirq); in gpio_sim_irq_requested()
248 gpiochip_unlock_as_irq(&chip->gc, hwirq); in gpio_sim_irq_released()
262 guard(mutex)(&chip->lock); in gpio_sim_dbg_show()
265 seq_printf(seq, " gpio-%-3d (%s) %s,%s\n", in gpio_sim_dbg_show()
266 gc->base + i, in gpio_sim_dbg_show()
268 test_bit(i, chip->direction_map) ? "input" : in gpio_sim_dbg_show()
269 test_bit(i, chip->value_map) ? "output-high" : in gpio_sim_dbg_show()
270 "output-low", in gpio_sim_dbg_show()
271 test_bit(i, chip->pull_map) ? "pull-up" : in gpio_sim_dbg_show()
272 "pull-down"); in gpio_sim_dbg_show()
282 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_val_show()
283 val = !!test_bit(line_attr->offset, chip->value_map); in gpio_sim_sysfs_val_show()
293 * Not assigning this function will result in write() returning -EIO in gpio_sim_sysfs_val_store()
294 * which is confusing. Return -EPERM explicitly. in gpio_sim_sysfs_val_store()
296 return -EPERM; in gpio_sim_sysfs_val_store()
300 [0] = "pull-down",
301 [1] = "pull-up",
312 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_pull_show()
313 pull = !!test_bit(line_attr->offset, chip->pull_map); in gpio_sim_sysfs_pull_show()
330 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull); in gpio_sim_sysfs_pull_store()
349 for (i = 0; i < chip->gc.ngpio; i++) in gpio_sim_dispose_mappings()
350 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i)); in gpio_sim_dispose_mappings()
357 sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_sysfs_remove()
364 unsigned int num_lines = chip->gc.ngpio; in gpio_sim_setup_sysfs()
365 struct device *dev = chip->gc.parent; in gpio_sim_setup_sysfs()
370 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), in gpio_sim_setup_sysfs()
372 if (!chip->attr_groups) in gpio_sim_setup_sysfs()
373 return -ENOMEM; in gpio_sim_setup_sysfs()
382 return -ENOMEM; in gpio_sim_setup_sysfs()
384 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, in gpio_sim_setup_sysfs()
386 if (!attr_group->name) in gpio_sim_setup_sysfs()
387 return -ENOMEM; in gpio_sim_setup_sysfs()
389 val_attr->offset = pull_attr->offset = i; in gpio_sim_setup_sysfs()
391 val_dev_attr = &val_attr->dev_attr; in gpio_sim_setup_sysfs()
392 pull_dev_attr = &pull_attr->dev_attr; in gpio_sim_setup_sysfs()
394 sysfs_attr_init(&val_dev_attr->attr); in gpio_sim_setup_sysfs()
395 sysfs_attr_init(&pull_dev_attr->attr); in gpio_sim_setup_sysfs()
397 val_dev_attr->attr.name = "value"; in gpio_sim_setup_sysfs()
398 pull_dev_attr->attr.name = "pull"; in gpio_sim_setup_sysfs()
400 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644; in gpio_sim_setup_sysfs()
402 val_dev_attr->show = gpio_sim_sysfs_val_show; in gpio_sim_setup_sysfs()
403 val_dev_attr->store = gpio_sim_sysfs_val_store; in gpio_sim_setup_sysfs()
404 pull_dev_attr->show = gpio_sim_sysfs_pull_show; in gpio_sim_setup_sysfs()
405 pull_dev_attr->store = gpio_sim_sysfs_pull_store; in gpio_sim_setup_sysfs()
407 attrs[0] = &val_dev_attr->attr; in gpio_sim_setup_sysfs()
408 attrs[1] = &pull_dev_attr->attr; in gpio_sim_setup_sysfs()
410 attr_group->attrs = attrs; in gpio_sim_setup_sysfs()
411 chip->attr_groups[i] = attr_group; in gpio_sim_setup_sysfs()
414 ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_setup_sysfs()
434 return -ERANGE; in gpio_sim_add_bank()
436 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label); in gpio_sim_add_bank()
441 return -ENOMEM; in gpio_sim_add_bank()
446 return -ENOMEM; in gpio_sim_add_bank()
448 chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
449 if (!chip->request_map) in gpio_sim_add_bank()
450 return -ENOMEM; in gpio_sim_add_bank()
452 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
453 if (!chip->direction_map) in gpio_sim_add_bank()
454 return -ENOMEM; in gpio_sim_add_bank()
457 bitmap_fill(chip->direction_map, num_lines); in gpio_sim_add_bank()
459 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
460 if (!chip->value_map) in gpio_sim_add_bank()
461 return -ENOMEM; in gpio_sim_add_bank()
463 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
464 if (!chip->pull_map) in gpio_sim_add_bank()
465 return -ENOMEM; in gpio_sim_add_bank()
467 chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines, in gpio_sim_add_bank()
470 if (IS_ERR(chip->irq_sim)) in gpio_sim_add_bank()
471 return PTR_ERR(chip->irq_sim); in gpio_sim_add_bank()
477 ret = devm_mutex_init(dev, &chip->lock); in gpio_sim_add_bank()
481 gc = &chip->gc; in gpio_sim_add_bank()
482 gc->base = -1; in gpio_sim_add_bank()
483 gc->ngpio = num_lines; in gpio_sim_add_bank()
484 gc->label = label; in gpio_sim_add_bank()
485 gc->owner = THIS_MODULE; in gpio_sim_add_bank()
486 gc->parent = dev; in gpio_sim_add_bank()
487 gc->fwnode = swnode; in gpio_sim_add_bank()
488 gc->get = gpio_sim_get; in gpio_sim_add_bank()
489 gc->set_rv = gpio_sim_set; in gpio_sim_add_bank()
490 gc->get_multiple = gpio_sim_get_multiple; in gpio_sim_add_bank()
491 gc->set_multiple_rv = gpio_sim_set_multiple; in gpio_sim_add_bank()
492 gc->direction_output = gpio_sim_direction_output; in gpio_sim_add_bank()
493 gc->direction_input = gpio_sim_direction_input; in gpio_sim_add_bank()
494 gc->get_direction = gpio_sim_get_direction; in gpio_sim_add_bank()
495 gc->set_config = gpio_sim_set_config; in gpio_sim_add_bank()
496 gc->to_irq = gpio_sim_to_irq; in gpio_sim_add_bank()
497 gc->request = gpio_sim_request; in gpio_sim_add_bank()
498 gc->free = gpio_sim_free; in gpio_sim_add_bank()
499 gc->dbg_show = PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS), gpio_sim_dbg_show); in gpio_sim_add_bank()
500 gc->can_sleep = true; in gpio_sim_add_bank()
506 chip->dev = device_find_child(dev, swnode, device_match_fwnode); in gpio_sim_add_bank()
507 if (!chip->dev) in gpio_sim_add_bank()
508 return -ENODEV; in gpio_sim_add_bank()
510 ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev); in gpio_sim_add_bank()
515 dev_set_drvdata(chip->dev, chip); in gpio_sim_add_bank()
522 struct device *dev = &pdev->dev; in gpio_sim_probe()
535 { .compatible = "gpio-simulator" },
542 .name = "gpio-sim",
613 return bank->label && *bank->label; in gpio_sim_bank_has_label()
619 return bank->parent; in gpio_sim_bank_get_device()
633 /* There can only be one hog per line. */
634 struct gpio_sim_hog *hog; member
647 struct gpio_sim_bank *bank = line->parent; in gpio_sim_line_get_device()
665 static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog) in gpio_sim_hog_get_device() argument
667 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_get_device()
674 lockdep_assert_held(&dev->lock); in gpio_sim_device_is_live()
676 return !!dev->probe_data.pdev; in gpio_sim_device_is_live()
696 guard(mutex)(&dev->lock); in gpio_sim_device_config_dev_name_show()
698 pdev = dev->probe_data.pdev; in gpio_sim_device_config_dev_name_show()
700 return sprintf(page, "%s\n", dev_name(&pdev->dev)); in gpio_sim_device_config_dev_name_show()
702 return sprintf(page, "gpio-sim.%d\n", dev->id); in gpio_sim_device_config_dev_name_show()
713 scoped_guard(mutex, &dev->lock) in gpio_sim_device_config_live_show()
724 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_get_line_names_size()
725 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_get_line_names_size()
728 size = max(size, line->offset + 1); in gpio_sim_get_line_names_size()
739 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_set_line_names()
740 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_set_line_names()
743 line_names[line->offset] = line->name; in gpio_sim_set_line_names()
749 struct gpiod_hog *hog; in gpio_sim_remove_hogs() local
751 if (!dev->hogs) in gpio_sim_remove_hogs()
754 gpiod_remove_hogs(dev->hogs); in gpio_sim_remove_hogs()
756 for (hog = dev->hogs; hog->chip_label; hog++) { in gpio_sim_remove_hogs()
757 kfree(hog->chip_label); in gpio_sim_remove_hogs()
758 kfree(hog->line_name); in gpio_sim_remove_hogs()
761 kfree(dev->hogs); in gpio_sim_remove_hogs()
762 dev->hogs = NULL; in gpio_sim_remove_hogs()
770 struct gpiod_hog *hog; in gpio_sim_add_hogs() local
772 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
773 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
774 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
777 if (line->hog) in gpio_sim_add_hogs()
786 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL); in gpio_sim_add_hogs()
787 if (!dev->hogs) in gpio_sim_add_hogs()
788 return -ENOMEM; in gpio_sim_add_hogs()
790 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
791 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
792 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
795 if (!line->hog) in gpio_sim_add_hogs()
798 hog = &dev->hogs[idx++]; in gpio_sim_add_hogs()
806 hog->chip_label = kstrdup(bank->label, in gpio_sim_add_hogs()
809 hog->chip_label = kasprintf(GFP_KERNEL, in gpio_sim_add_hogs()
810 "gpio-sim.%u:%pfwP", in gpio_sim_add_hogs()
811 dev->id, in gpio_sim_add_hogs()
812 bank->swnode); in gpio_sim_add_hogs()
813 if (!hog->chip_label) { in gpio_sim_add_hogs()
815 return -ENOMEM; in gpio_sim_add_hogs()
819 * We need to duplicate this because the hog config in gpio_sim_add_hogs()
821 * it) and gpiolib doesn't make a deep copy of the hog in gpio_sim_add_hogs()
824 if (line->hog->name) { in gpio_sim_add_hogs()
825 hog->line_name = kstrdup(line->hog->name, in gpio_sim_add_hogs()
827 if (!hog->line_name) { in gpio_sim_add_hogs()
829 return -ENOMEM; in gpio_sim_add_hogs()
833 hog->chip_hwnum = line->offset; in gpio_sim_add_hogs()
834 hog->dflags = line->hog->dir; in gpio_sim_add_hogs()
838 gpiod_add_hogs(dev->hogs); in gpio_sim_add_hogs()
853 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines); in gpio_sim_make_bank_swnode()
856 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label", in gpio_sim_make_bank_swnode()
857 bank->label); in gpio_sim_make_bank_swnode()
864 return ERR_PTR(-ENOMEM); in gpio_sim_make_bank_swnode()
869 "gpio-line-names", in gpio_sim_make_bank_swnode()
890 list_for_each_entry(this, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
891 list_for_each_entry(pos, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
892 if (this == pos || (!this->label || !pos->label)) in gpio_sim_bank_labels_non_unique()
895 if (strcmp(this->label, pos->label) == 0) in gpio_sim_bank_labels_non_unique()
910 lockdep_assert_held(&dev->lock); in gpio_sim_device_activate()
912 if (list_empty(&dev->bank_list)) in gpio_sim_device_activate()
913 return -ENODATA; in gpio_sim_device_activate()
916 * Non-unique GPIO device labels are a corner-case we don't support in gpio_sim_device_activate()
921 return -EINVAL; in gpio_sim_device_activate()
929 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_activate()
930 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); in gpio_sim_device_activate()
931 if (IS_ERR(bank->swnode)) { in gpio_sim_device_activate()
932 ret = PTR_ERR(bank->swnode); in gpio_sim_device_activate()
944 pdevinfo.name = "gpio-sim"; in gpio_sim_device_activate()
946 pdevinfo.id = dev->id; in gpio_sim_device_activate()
948 ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo); in gpio_sim_device_activate()
962 lockdep_assert_held(&dev->lock); in gpio_sim_device_deactivate()
964 swnode = dev_fwnode(&dev->probe_data.pdev->dev); in gpio_sim_device_deactivate()
965 dev_sync_probe_unregister(&dev->probe_data); in gpio_sim_device_deactivate()
973 struct configfs_subsystem *subsys = dev->group.cg_subsys; in gpio_sim_device_lockup_configfs()
983 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_lockup_configfs()
984 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_device_lockup_configfs()
985 item = line->hog ? &line->hog->item in gpio_sim_device_lockup_configfs()
986 : &line->group.cg_item; in gpio_sim_device_lockup_configfs()
1012 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_live_store()
1014 ret = -EPERM; in gpio_sim_device_config_live_store()
1049 if (dev->class) in gpio_sim_emit_chip_name()
1052 if (device_match_fwnode(dev, ctx->swnode)) in gpio_sim_emit_chip_name()
1053 return sprintf(ctx->page, "%s\n", dev_name(dev)); in gpio_sim_emit_chip_name()
1063 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; in gpio_sim_bank_config_chip_name_show()
1065 guard(mutex)(&dev->lock); in gpio_sim_bank_config_chip_name_show()
1068 return device_for_each_child(&dev->probe_data.pdev->dev, &ctx, in gpio_sim_bank_config_chip_name_show()
1082 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_show()
1084 return sprintf(page, "%s\n", bank->label ?: ""); in gpio_sim_bank_config_label_show()
1094 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_store()
1097 return -EBUSY; in gpio_sim_bank_config_label_store()
1101 return -ENOMEM; in gpio_sim_bank_config_label_store()
1103 kfree(bank->label); in gpio_sim_bank_config_label_store()
1104 bank->label = trimmed; in gpio_sim_bank_config_label_store()
1117 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_show()
1119 return sprintf(page, "%u\n", bank->num_lines); in gpio_sim_bank_config_num_lines_show()
1136 return -EINVAL; in gpio_sim_bank_config_num_lines_store()
1138 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_store()
1141 return -EBUSY; in gpio_sim_bank_config_num_lines_store()
1143 bank->num_lines = num_lines; in gpio_sim_bank_config_num_lines_store()
1163 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_show()
1165 return sprintf(page, "%s\n", line->name ?: ""); in gpio_sim_line_config_name_show()
1175 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_store()
1178 return -EBUSY; in gpio_sim_line_config_name_store()
1182 return -ENOMEM; in gpio_sim_line_config_name_store()
1184 kfree(line->name); in gpio_sim_line_config_name_store()
1185 line->name = trimmed; in gpio_sim_line_config_name_store()
1200 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_show() local
1201 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_show()
1203 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_show()
1205 return sprintf(page, "%s\n", hog->name ?: ""); in gpio_sim_hog_config_name_show()
1211 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_store() local
1212 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_store()
1215 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_store()
1218 return -EBUSY; in gpio_sim_hog_config_name_store()
1222 return -ENOMEM; in gpio_sim_hog_config_name_store()
1224 kfree(hog->name); in gpio_sim_hog_config_name_store()
1225 hog->name = trimmed; in gpio_sim_hog_config_name_store()
1235 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_show() local
1236 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_show()
1240 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_direction_show()
1241 dir = hog->dir; in gpio_sim_hog_config_direction_show()
1248 repr = "output-high"; in gpio_sim_hog_config_direction_show()
1251 repr = "output-low"; in gpio_sim_hog_config_direction_show()
1255 WARN(1, "Unexpected hog direction value: %d", dir); in gpio_sim_hog_config_direction_show()
1256 return -EINVAL; in gpio_sim_hog_config_direction_show()
1266 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_store() local
1267 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_store()
1270 guard(mutex)(&dev->lock); in gpio_sim_hog_config_direction_store()
1273 return -EBUSY; in gpio_sim_hog_config_direction_store()
1277 else if (sysfs_streq(page, "output-high")) in gpio_sim_hog_config_direction_store()
1279 else if (sysfs_streq(page, "output-low")) in gpio_sim_hog_config_direction_store()
1282 return -EINVAL; in gpio_sim_hog_config_direction_store()
1284 hog->dir = dir; in gpio_sim_hog_config_direction_store()
1299 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_item_release() local
1300 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_config_item_release()
1301 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_item_release()
1303 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_item_release()
1304 line->hog = NULL; in gpio_sim_hog_config_item_release()
1306 kfree(hog->name); in gpio_sim_hog_config_item_release()
1307 kfree(hog); in gpio_sim_hog_config_item_release()
1323 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item); in gpio_sim_line_config_make_hog_item()
1325 struct gpio_sim_hog *hog; in gpio_sim_line_config_make_hog_item() local
1327 if (strcmp(name, "hog") != 0) in gpio_sim_line_config_make_hog_item()
1328 return ERR_PTR(-EINVAL); in gpio_sim_line_config_make_hog_item()
1330 guard(mutex)(&dev->lock); in gpio_sim_line_config_make_hog_item()
1332 hog = kzalloc(sizeof(*hog), GFP_KERNEL); in gpio_sim_line_config_make_hog_item()
1333 if (!hog) in gpio_sim_line_config_make_hog_item()
1334 return ERR_PTR(-ENOMEM); in gpio_sim_line_config_make_hog_item()
1336 config_item_init_type_name(&hog->item, name, in gpio_sim_line_config_make_hog_item()
1339 hog->dir = GPIOD_IN; in gpio_sim_line_config_make_hog_item()
1340 hog->name = NULL; in gpio_sim_line_config_make_hog_item()
1341 hog->parent = line; in gpio_sim_line_config_make_hog_item()
1342 line->hog = hog; in gpio_sim_line_config_make_hog_item()
1344 return &hog->item; in gpio_sim_line_config_make_hog_item()
1352 scoped_guard(mutex, &dev->lock) in gpio_sim_line_config_group_release()
1353 list_del(&line->siblings); in gpio_sim_line_config_group_release()
1355 kfree(line->name); in gpio_sim_line_config_group_release()
1378 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item); in gpio_sim_bank_config_make_line_group()
1386 return ERR_PTR(-EINVAL); in gpio_sim_bank_config_make_line_group()
1388 guard(mutex)(&dev->lock); in gpio_sim_bank_config_make_line_group()
1391 return ERR_PTR(-EBUSY); in gpio_sim_bank_config_make_line_group()
1395 return ERR_PTR(-ENOMEM); in gpio_sim_bank_config_make_line_group()
1397 config_group_init_type_name(&line->group, name, in gpio_sim_bank_config_make_line_group()
1400 line->parent = bank; in gpio_sim_bank_config_make_line_group()
1401 line->offset = offset; in gpio_sim_bank_config_make_line_group()
1402 list_add_tail(&line->siblings, &bank->line_list); in gpio_sim_bank_config_make_line_group()
1404 return &line->group; in gpio_sim_bank_config_make_line_group()
1412 scoped_guard(mutex, &dev->lock) in gpio_sim_bank_config_group_release()
1413 list_del(&bank->siblings); in gpio_sim_bank_config_group_release()
1415 kfree(bank->label); in gpio_sim_bank_config_group_release()
1438 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); in gpio_sim_device_config_make_bank_group()
1441 guard(mutex)(&dev->lock); in gpio_sim_device_config_make_bank_group()
1444 return ERR_PTR(-EBUSY); in gpio_sim_device_config_make_bank_group()
1448 return ERR_PTR(-ENOMEM); in gpio_sim_device_config_make_bank_group()
1450 config_group_init_type_name(&bank->group, name, in gpio_sim_device_config_make_bank_group()
1452 bank->num_lines = 1; in gpio_sim_device_config_make_bank_group()
1453 bank->parent = dev; in gpio_sim_device_config_make_bank_group()
1454 INIT_LIST_HEAD(&bank->line_list); in gpio_sim_device_config_make_bank_group()
1455 list_add_tail(&bank->siblings, &dev->bank_list); in gpio_sim_device_config_make_bank_group()
1457 return &bank->group; in gpio_sim_device_config_make_bank_group()
1464 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_group_release()
1469 mutex_destroy(&dev->lock); in gpio_sim_device_config_group_release()
1470 ida_free(&gpio_sim_ida, dev->id); in gpio_sim_device_config_group_release()
1497 return ERR_PTR(-ENOMEM); in gpio_sim_config_make_device_group()
1503 config_group_init_type_name(&dev->group, name, in gpio_sim_config_make_device_group()
1505 dev->id = id; in gpio_sim_config_make_device_group()
1506 mutex_init(&dev->lock); in gpio_sim_config_make_device_group()
1507 INIT_LIST_HEAD(&dev->bank_list); in gpio_sim_config_make_device_group()
1509 dev_sync_probe_init(&dev->probe_data); in gpio_sim_config_make_device_group()
1511 return &no_free_ptr(dev)->group; in gpio_sim_config_make_device_group()
1526 .ci_namebuf = "gpio-sim",