Lines Matching +full:hog +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
73 guard(mutex)(&chip->lock); in gpio_sim_apply_pull()
75 if (test_bit(offset, chip->request_map) && in gpio_sim_apply_pull()
76 test_bit(offset, chip->direction_map)) { 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(offset, chip->request_map) || in gpio_sim_apply_pull()
104 test_bit(offset, chip->direction_map)) 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_request()
213 __set_bit(offset, chip->request_map); in gpio_sim_request()
222 scoped_guard(mutex, &chip->lock) { in gpio_sim_free()
223 __assign_bit(offset, chip->value_map, in gpio_sim_free()
224 !!test_bit(offset, chip->pull_map)); in gpio_sim_free()
225 __clear_bit(offset, chip->request_map); in gpio_sim_free()
235 guard(mutex)(&chip->lock); in gpio_sim_dbg_show()
238 seq_printf(seq, " gpio-%-3d (%s) %s,%s\n", in gpio_sim_dbg_show()
239 gc->base + i, in gpio_sim_dbg_show()
241 test_bit(i, chip->direction_map) ? "input" : in gpio_sim_dbg_show()
242 test_bit(i, chip->value_map) ? "output-high" : in gpio_sim_dbg_show()
243 "output-low", in gpio_sim_dbg_show()
244 test_bit(i, chip->pull_map) ? "pull-up" : in gpio_sim_dbg_show()
245 "pull-down"); in gpio_sim_dbg_show()
255 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_val_show()
256 val = !!test_bit(line_attr->offset, chip->value_map); in gpio_sim_sysfs_val_show()
266 * Not assigning this function will result in write() returning -EIO in gpio_sim_sysfs_val_store()
267 * which is confusing. Return -EPERM explicitly. in gpio_sim_sysfs_val_store()
269 return -EPERM; in gpio_sim_sysfs_val_store()
273 [0] = "pull-down",
274 [1] = "pull-up",
285 scoped_guard(mutex, &chip->lock) in gpio_sim_sysfs_pull_show()
286 pull = !!test_bit(line_attr->offset, chip->pull_map); in gpio_sim_sysfs_pull_show()
303 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull); in gpio_sim_sysfs_pull_store()
329 for (i = 0; i < chip->gc.ngpio; i++) in gpio_sim_dispose_mappings()
330 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i)); in gpio_sim_dispose_mappings()
337 sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_sysfs_remove()
344 unsigned int num_lines = chip->gc.ngpio; in gpio_sim_setup_sysfs()
345 struct device *dev = chip->gc.parent; in gpio_sim_setup_sysfs()
350 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), in gpio_sim_setup_sysfs()
352 if (!chip->attr_groups) in gpio_sim_setup_sysfs()
353 return -ENOMEM; in gpio_sim_setup_sysfs()
362 return -ENOMEM; in gpio_sim_setup_sysfs()
364 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, in gpio_sim_setup_sysfs()
366 if (!attr_group->name) in gpio_sim_setup_sysfs()
367 return -ENOMEM; in gpio_sim_setup_sysfs()
369 val_attr->offset = pull_attr->offset = i; in gpio_sim_setup_sysfs()
371 val_dev_attr = &val_attr->dev_attr; in gpio_sim_setup_sysfs()
372 pull_dev_attr = &pull_attr->dev_attr; in gpio_sim_setup_sysfs()
374 sysfs_attr_init(&val_dev_attr->attr); in gpio_sim_setup_sysfs()
375 sysfs_attr_init(&pull_dev_attr->attr); in gpio_sim_setup_sysfs()
377 val_dev_attr->attr.name = "value"; in gpio_sim_setup_sysfs()
378 pull_dev_attr->attr.name = "pull"; in gpio_sim_setup_sysfs()
380 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644; in gpio_sim_setup_sysfs()
382 val_dev_attr->show = gpio_sim_sysfs_val_show; in gpio_sim_setup_sysfs()
383 val_dev_attr->store = gpio_sim_sysfs_val_store; in gpio_sim_setup_sysfs()
384 pull_dev_attr->show = gpio_sim_sysfs_pull_show; in gpio_sim_setup_sysfs()
385 pull_dev_attr->store = gpio_sim_sysfs_pull_store; in gpio_sim_setup_sysfs()
387 attrs[0] = &val_dev_attr->attr; in gpio_sim_setup_sysfs()
388 attrs[1] = &pull_dev_attr->attr; in gpio_sim_setup_sysfs()
390 attr_group->attrs = attrs; in gpio_sim_setup_sysfs()
391 chip->attr_groups[i] = attr_group; in gpio_sim_setup_sysfs()
394 ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups); in gpio_sim_setup_sysfs()
419 return -ERANGE; in gpio_sim_add_bank()
421 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label); in gpio_sim_add_bank()
423 label = devm_kasprintf(dev, GFP_KERNEL, "%s-%pfwP", in gpio_sim_add_bank()
426 return -ENOMEM; in gpio_sim_add_bank()
431 return -ENOMEM; in gpio_sim_add_bank()
433 chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
434 if (!chip->request_map) in gpio_sim_add_bank()
435 return -ENOMEM; in gpio_sim_add_bank()
437 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
438 if (!chip->direction_map) in gpio_sim_add_bank()
439 return -ENOMEM; in gpio_sim_add_bank()
442 bitmap_fill(chip->direction_map, num_lines); in gpio_sim_add_bank()
444 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
445 if (!chip->value_map) in gpio_sim_add_bank()
446 return -ENOMEM; in gpio_sim_add_bank()
448 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); in gpio_sim_add_bank()
449 if (!chip->pull_map) in gpio_sim_add_bank()
450 return -ENOMEM; in gpio_sim_add_bank()
452 chip->irq_sim = devm_irq_domain_create_sim(dev, swnode, num_lines); in gpio_sim_add_bank()
453 if (IS_ERR(chip->irq_sim)) in gpio_sim_add_bank()
454 return PTR_ERR(chip->irq_sim); in gpio_sim_add_bank()
460 mutex_init(&chip->lock); in gpio_sim_add_bank()
462 &chip->lock); in gpio_sim_add_bank()
466 gc = &chip->gc; in gpio_sim_add_bank()
467 gc->base = -1; in gpio_sim_add_bank()
468 gc->ngpio = num_lines; in gpio_sim_add_bank()
469 gc->label = label; in gpio_sim_add_bank()
470 gc->owner = THIS_MODULE; in gpio_sim_add_bank()
471 gc->parent = dev; in gpio_sim_add_bank()
472 gc->fwnode = swnode; in gpio_sim_add_bank()
473 gc->get = gpio_sim_get; in gpio_sim_add_bank()
474 gc->set = gpio_sim_set; in gpio_sim_add_bank()
475 gc->get_multiple = gpio_sim_get_multiple; in gpio_sim_add_bank()
476 gc->set_multiple = gpio_sim_set_multiple; in gpio_sim_add_bank()
477 gc->direction_output = gpio_sim_direction_output; in gpio_sim_add_bank()
478 gc->direction_input = gpio_sim_direction_input; in gpio_sim_add_bank()
479 gc->get_direction = gpio_sim_get_direction; in gpio_sim_add_bank()
480 gc->set_config = gpio_sim_set_config; in gpio_sim_add_bank()
481 gc->to_irq = gpio_sim_to_irq; in gpio_sim_add_bank()
482 gc->request = gpio_sim_request; in gpio_sim_add_bank()
483 gc->free = gpio_sim_free; in gpio_sim_add_bank()
484 gc->dbg_show = PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS), gpio_sim_dbg_show); in gpio_sim_add_bank()
485 gc->can_sleep = true; in gpio_sim_add_bank()
491 chip->dev = device_find_child(dev, swnode, gpio_sim_dev_match_fwnode); in gpio_sim_add_bank()
492 if (!chip->dev) in gpio_sim_add_bank()
493 return -ENODEV; in gpio_sim_add_bank()
495 ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev); in gpio_sim_add_bank()
500 dev_set_drvdata(chip->dev, chip); in gpio_sim_add_bank()
507 struct device *dev = &pdev->dev; in gpio_sim_probe()
523 { .compatible = "gpio-simulator" },
530 .name = "gpio-sim",
560 * and notify the user-space about any errors.
571 /* This is called with dev->lock already taken. */
581 snprintf(devname, sizeof(devname), "gpio-sim.%u", simdev->id); in gpio_sim_bus_notifier_call()
585 simdev->driver_bound = true; in gpio_sim_bus_notifier_call()
587 simdev->driver_bound = false; in gpio_sim_bus_notifier_call()
591 complete(&simdev->probe_completion); in gpio_sim_bus_notifier_call()
641 return bank->label && *bank->label; in gpio_sim_bank_has_label()
647 return bank->parent; in gpio_sim_bank_get_device()
661 /* There can only be one hog per line. */
662 struct gpio_sim_hog *hog; member
675 struct gpio_sim_bank *bank = line->parent; in gpio_sim_line_get_device()
693 static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog) in gpio_sim_hog_get_device() argument
695 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_get_device()
702 return !!dev->pdev; in gpio_sim_device_is_live_unlocked()
722 guard(mutex)(&dev->lock); in gpio_sim_device_config_dev_name_show()
724 pdev = dev->pdev; in gpio_sim_device_config_dev_name_show()
726 return sprintf(page, "%s\n", dev_name(&pdev->dev)); in gpio_sim_device_config_dev_name_show()
728 return sprintf(page, "gpio-sim.%d\n", dev->id); in gpio_sim_device_config_dev_name_show()
739 scoped_guard(mutex, &dev->lock) in gpio_sim_device_config_live_show()
750 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_get_line_names_size()
751 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_get_line_names_size()
754 size = max(size, line->offset + 1); in gpio_sim_get_line_names_size()
765 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_set_line_names()
766 if (!line->name || (line->offset >= bank->num_lines)) in gpio_sim_set_line_names()
769 line_names[line->offset] = line->name; in gpio_sim_set_line_names()
775 struct gpiod_hog *hog; in gpio_sim_remove_hogs() local
777 if (!dev->hogs) in gpio_sim_remove_hogs()
780 gpiod_remove_hogs(dev->hogs); in gpio_sim_remove_hogs()
782 for (hog = dev->hogs; hog->chip_label; hog++) { in gpio_sim_remove_hogs()
783 kfree(hog->chip_label); in gpio_sim_remove_hogs()
784 kfree(hog->line_name); in gpio_sim_remove_hogs()
787 kfree(dev->hogs); in gpio_sim_remove_hogs()
788 dev->hogs = NULL; in gpio_sim_remove_hogs()
796 struct gpiod_hog *hog; in gpio_sim_add_hogs() local
798 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
799 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
800 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
803 if (line->hog) in gpio_sim_add_hogs()
812 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL); in gpio_sim_add_hogs()
813 if (!dev->hogs) in gpio_sim_add_hogs()
814 return -ENOMEM; in gpio_sim_add_hogs()
816 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_add_hogs()
817 list_for_each_entry(line, &bank->line_list, siblings) { in gpio_sim_add_hogs()
818 if (line->offset >= bank->num_lines) in gpio_sim_add_hogs()
821 if (!line->hog) in gpio_sim_add_hogs()
824 hog = &dev->hogs[idx++]; in gpio_sim_add_hogs()
832 hog->chip_label = kstrdup(bank->label, in gpio_sim_add_hogs()
835 hog->chip_label = kasprintf(GFP_KERNEL, in gpio_sim_add_hogs()
836 "gpio-sim.%u-%pfwP", in gpio_sim_add_hogs()
837 dev->id, in gpio_sim_add_hogs()
838 bank->swnode); in gpio_sim_add_hogs()
839 if (!hog->chip_label) { in gpio_sim_add_hogs()
841 return -ENOMEM; in gpio_sim_add_hogs()
845 * We need to duplicate this because the hog config in gpio_sim_add_hogs()
847 * it) and gpiolib doesn't make a deep copy of the hog in gpio_sim_add_hogs()
850 if (line->hog->name) { in gpio_sim_add_hogs()
851 hog->line_name = kstrdup(line->hog->name, in gpio_sim_add_hogs()
853 if (!hog->line_name) { in gpio_sim_add_hogs()
855 return -ENOMEM; in gpio_sim_add_hogs()
859 hog->chip_hwnum = line->offset; in gpio_sim_add_hogs()
860 hog->dflags = line->hog->dir; in gpio_sim_add_hogs()
864 gpiod_add_hogs(dev->hogs); in gpio_sim_add_hogs()
879 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines); in gpio_sim_make_bank_swnode()
882 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label", in gpio_sim_make_bank_swnode()
883 bank->label); in gpio_sim_make_bank_swnode()
890 return ERR_PTR(-ENOMEM); in gpio_sim_make_bank_swnode()
895 "gpio-line-names", in gpio_sim_make_bank_swnode()
916 list_for_each_entry(this, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
917 list_for_each_entry(pos, &dev->bank_list, siblings) { in gpio_sim_bank_labels_non_unique()
918 if (this == pos || (!this->label || !pos->label)) in gpio_sim_bank_labels_non_unique()
921 if (strcmp(this->label, pos->label) == 0) in gpio_sim_bank_labels_non_unique()
937 if (list_empty(&dev->bank_list)) in gpio_sim_device_activate_unlocked()
938 return -ENODATA; in gpio_sim_device_activate_unlocked()
941 * Non-unique GPIO device labels are a corner-case we don't support in gpio_sim_device_activate_unlocked()
946 return -EINVAL; in gpio_sim_device_activate_unlocked()
954 list_for_each_entry(bank, &dev->bank_list, siblings) { in gpio_sim_device_activate_unlocked()
955 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); in gpio_sim_device_activate_unlocked()
956 if (IS_ERR(bank->swnode)) { in gpio_sim_device_activate_unlocked()
957 ret = PTR_ERR(bank->swnode); in gpio_sim_device_activate_unlocked()
969 pdevinfo.name = "gpio-sim"; in gpio_sim_device_activate_unlocked()
971 pdevinfo.id = dev->id; in gpio_sim_device_activate_unlocked()
973 reinit_completion(&dev->probe_completion); in gpio_sim_device_activate_unlocked()
974 dev->driver_bound = false; in gpio_sim_device_activate_unlocked()
975 bus_register_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
979 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
985 wait_for_completion(&dev->probe_completion); in gpio_sim_device_activate_unlocked()
986 bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); in gpio_sim_device_activate_unlocked()
988 if (!dev->driver_bound) { in gpio_sim_device_activate_unlocked()
993 return -ENXIO; in gpio_sim_device_activate_unlocked()
996 dev->pdev = pdev; in gpio_sim_device_activate_unlocked()
1005 swnode = dev_fwnode(&dev->pdev->dev); in gpio_sim_device_deactivate_unlocked()
1006 platform_device_unregister(dev->pdev); in gpio_sim_device_deactivate_unlocked()
1009 dev->pdev = NULL; in gpio_sim_device_deactivate_unlocked()
1024 guard(mutex)(&dev->lock); in gpio_sim_device_config_live_store()
1027 ret = -EPERM; in gpio_sim_device_config_live_store()
1054 if (dev->class) in gpio_sim_emit_chip_name()
1057 if (device_match_fwnode(dev, ctx->swnode)) in gpio_sim_emit_chip_name()
1058 return sprintf(ctx->page, "%s\n", dev_name(dev)); in gpio_sim_emit_chip_name()
1068 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; in gpio_sim_bank_config_chip_name_show()
1070 guard(mutex)(&dev->lock); in gpio_sim_bank_config_chip_name_show()
1073 return device_for_each_child(&dev->pdev->dev, &ctx, in gpio_sim_bank_config_chip_name_show()
1087 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_show()
1089 return sprintf(page, "%s\n", bank->label ?: ""); in gpio_sim_bank_config_label_show()
1099 guard(mutex)(&dev->lock); in gpio_sim_bank_config_label_store()
1102 return -EBUSY; in gpio_sim_bank_config_label_store()
1106 return -ENOMEM; in gpio_sim_bank_config_label_store()
1108 kfree(bank->label); in gpio_sim_bank_config_label_store()
1109 bank->label = trimmed; in gpio_sim_bank_config_label_store()
1122 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_show()
1124 return sprintf(page, "%u\n", bank->num_lines); in gpio_sim_bank_config_num_lines_show()
1141 return -EINVAL; in gpio_sim_bank_config_num_lines_store()
1143 guard(mutex)(&dev->lock); in gpio_sim_bank_config_num_lines_store()
1146 return -EBUSY; in gpio_sim_bank_config_num_lines_store()
1148 bank->num_lines = num_lines; in gpio_sim_bank_config_num_lines_store()
1168 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_show()
1170 return sprintf(page, "%s\n", line->name ?: ""); in gpio_sim_line_config_name_show()
1180 guard(mutex)(&dev->lock); in gpio_sim_line_config_name_store()
1183 return -EBUSY; in gpio_sim_line_config_name_store()
1187 return -ENOMEM; in gpio_sim_line_config_name_store()
1189 kfree(line->name); in gpio_sim_line_config_name_store()
1190 line->name = trimmed; in gpio_sim_line_config_name_store()
1205 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_show() local
1206 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_show()
1208 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_show()
1210 return sprintf(page, "%s\n", hog->name ?: ""); in gpio_sim_hog_config_name_show()
1216 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_name_store() local
1217 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_name_store()
1220 guard(mutex)(&dev->lock); in gpio_sim_hog_config_name_store()
1223 return -EBUSY; in gpio_sim_hog_config_name_store()
1227 return -ENOMEM; in gpio_sim_hog_config_name_store()
1229 kfree(hog->name); in gpio_sim_hog_config_name_store()
1230 hog->name = trimmed; in gpio_sim_hog_config_name_store()
1240 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_show() local
1241 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_show()
1245 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_direction_show()
1246 dir = hog->dir; in gpio_sim_hog_config_direction_show()
1253 repr = "output-high"; in gpio_sim_hog_config_direction_show()
1256 repr = "output-low"; in gpio_sim_hog_config_direction_show()
1260 WARN(1, "Unexpected hog direction value: %d", dir); in gpio_sim_hog_config_direction_show()
1261 return -EINVAL; in gpio_sim_hog_config_direction_show()
1271 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_direction_store() local
1272 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_direction_store()
1275 guard(mutex)(&dev->lock); in gpio_sim_hog_config_direction_store()
1278 return -EBUSY; in gpio_sim_hog_config_direction_store()
1282 else if (sysfs_streq(page, "output-high")) in gpio_sim_hog_config_direction_store()
1284 else if (sysfs_streq(page, "output-low")) in gpio_sim_hog_config_direction_store()
1287 return -EINVAL; in gpio_sim_hog_config_direction_store()
1289 hog->dir = dir; in gpio_sim_hog_config_direction_store()
1304 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); in gpio_sim_hog_config_item_release() local
1305 struct gpio_sim_line *line = hog->parent; in gpio_sim_hog_config_item_release()
1306 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); in gpio_sim_hog_config_item_release()
1308 scoped_guard(mutex, &dev->lock) in gpio_sim_hog_config_item_release()
1309 line->hog = NULL; in gpio_sim_hog_config_item_release()
1311 kfree(hog->name); in gpio_sim_hog_config_item_release()
1312 kfree(hog); in gpio_sim_hog_config_item_release()
1328 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item); in gpio_sim_line_config_make_hog_item()
1330 struct gpio_sim_hog *hog; in gpio_sim_line_config_make_hog_item() local
1332 if (strcmp(name, "hog") != 0) in gpio_sim_line_config_make_hog_item()
1333 return ERR_PTR(-EINVAL); in gpio_sim_line_config_make_hog_item()
1335 guard(mutex)(&dev->lock); in gpio_sim_line_config_make_hog_item()
1337 hog = kzalloc(sizeof(*hog), GFP_KERNEL); in gpio_sim_line_config_make_hog_item()
1338 if (!hog) in gpio_sim_line_config_make_hog_item()
1339 return ERR_PTR(-ENOMEM); in gpio_sim_line_config_make_hog_item()
1341 config_item_init_type_name(&hog->item, name, in gpio_sim_line_config_make_hog_item()
1344 hog->dir = GPIOD_IN; in gpio_sim_line_config_make_hog_item()
1345 hog->name = NULL; in gpio_sim_line_config_make_hog_item()
1346 hog->parent = line; in gpio_sim_line_config_make_hog_item()
1347 line->hog = hog; in gpio_sim_line_config_make_hog_item()
1349 return &hog->item; in gpio_sim_line_config_make_hog_item()
1357 scoped_guard(mutex, &dev->lock) in gpio_sim_line_config_group_release()
1358 list_del(&line->siblings); in gpio_sim_line_config_group_release()
1360 kfree(line->name); in gpio_sim_line_config_group_release()
1383 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item); in gpio_sim_bank_config_make_line_group()
1391 return ERR_PTR(-EINVAL); in gpio_sim_bank_config_make_line_group()
1393 guard(mutex)(&dev->lock); in gpio_sim_bank_config_make_line_group()
1396 return ERR_PTR(-EBUSY); in gpio_sim_bank_config_make_line_group()
1400 return ERR_PTR(-ENOMEM); in gpio_sim_bank_config_make_line_group()
1402 config_group_init_type_name(&line->group, name, in gpio_sim_bank_config_make_line_group()
1405 line->parent = bank; in gpio_sim_bank_config_make_line_group()
1406 line->offset = offset; in gpio_sim_bank_config_make_line_group()
1407 list_add_tail(&line->siblings, &bank->line_list); in gpio_sim_bank_config_make_line_group()
1409 return &line->group; in gpio_sim_bank_config_make_line_group()
1417 scoped_guard(mutex, &dev->lock) in gpio_sim_bank_config_group_release()
1418 list_del(&bank->siblings); in gpio_sim_bank_config_group_release()
1420 kfree(bank->label); in gpio_sim_bank_config_group_release()
1443 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); in gpio_sim_device_config_make_bank_group()
1446 guard(mutex)(&dev->lock); in gpio_sim_device_config_make_bank_group()
1449 return ERR_PTR(-EBUSY); in gpio_sim_device_config_make_bank_group()
1453 return ERR_PTR(-ENOMEM); in gpio_sim_device_config_make_bank_group()
1455 config_group_init_type_name(&bank->group, name, in gpio_sim_device_config_make_bank_group()
1457 bank->num_lines = 1; in gpio_sim_device_config_make_bank_group()
1458 bank->parent = dev; in gpio_sim_device_config_make_bank_group()
1459 INIT_LIST_HEAD(&bank->line_list); in gpio_sim_device_config_make_bank_group()
1460 list_add_tail(&bank->siblings, &dev->bank_list); in gpio_sim_device_config_make_bank_group()
1462 return &bank->group; in gpio_sim_device_config_make_bank_group()
1469 scoped_guard(mutex, &dev->lock) { in gpio_sim_device_config_group_release()
1474 mutex_destroy(&dev->lock); in gpio_sim_device_config_group_release()
1475 ida_free(&gpio_sim_ida, dev->id); in gpio_sim_device_config_group_release()
1502 return ERR_PTR(-ENOMEM); in gpio_sim_config_make_device_group()
1508 config_group_init_type_name(&dev->group, name, in gpio_sim_config_make_device_group()
1510 dev->id = id; in gpio_sim_config_make_device_group()
1511 mutex_init(&dev->lock); in gpio_sim_config_make_device_group()
1512 INIT_LIST_HEAD(&dev->bank_list); in gpio_sim_config_make_device_group()
1514 dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call; in gpio_sim_config_make_device_group()
1515 init_completion(&dev->probe_completion); in gpio_sim_config_make_device_group()
1517 return &no_free_ptr(dev)->group; in gpio_sim_config_make_device_group()
1532 .ci_namebuf = "gpio-sim",