Lines Matching +full:irq +full:- +full:push +full:- +full:pull
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2023-2024 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
39 #include "dev-sync-probe.h"
63 atomic_t irq; member
99 init_completion(&ctx->work_completion); in gpio_virtuser_init_irq_work_context()
105 irq_work_queue(&ctx->work); in gpio_virtuser_irq_work_queue_sync()
106 wait_for_completion(&ctx->work_completion); in gpio_virtuser_irq_work_queue_sync()
125 struct gpio_descs *descs = ctx->descs; in gpio_virtuser_get_value_array_atomic()
127 ctx->ret = gpiod_get_array_value(descs->ndescs, descs->desc, in gpio_virtuser_get_value_array_atomic()
128 descs->info, ctx->values); in gpio_virtuser_get_value_array_atomic()
129 complete(&ctx->work_completion); in gpio_virtuser_get_value_array_atomic()
138 return gpiod_get_array_value_cansleep(descs->ndescs, in gpio_virtuser_get_array_value()
139 descs->desc, in gpio_virtuser_get_array_value()
140 descs->info, values); in gpio_virtuser_get_array_value()
157 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_value_array_do_read()
158 struct gpio_descs *descs = data->ad.descs; in gpio_virtuser_value_array_do_read()
162 unsigned long *values __free(bitmap) = bitmap_zalloc(descs->ndescs, in gpio_virtuser_value_array_do_read()
165 return -ENOMEM; in gpio_virtuser_value_array_do_read()
171 bufsize = descs->ndescs + 2; in gpio_virtuser_value_array_do_read()
175 return -ENOMEM; in gpio_virtuser_value_array_do_read()
177 gpio_virtuser_dbgfs_emit_value_array(buf, values, descs->ndescs); in gpio_virtuser_value_array_do_read()
180 descs->ndescs + 1); in gpio_virtuser_value_array_do_read()
195 return -EINVAL; in gpio_virtuser_dbgfs_parse_value_array()
205 struct gpio_descs *descs = ctx->descs; in gpio_virtuser_set_value_array_atomic()
207 ctx->ret = gpiod_set_array_value(descs->ndescs, descs->desc, in gpio_virtuser_set_value_array_atomic()
208 descs->info, ctx->values); in gpio_virtuser_set_value_array_atomic()
209 complete(&ctx->work_completion); in gpio_virtuser_set_value_array_atomic()
218 return gpiod_set_array_value_cansleep(descs->ndescs, in gpio_virtuser_set_array_value()
219 descs->desc, in gpio_virtuser_set_array_value()
220 descs->info, values); in gpio_virtuser_set_array_value()
237 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_value_array_do_write()
238 struct gpio_descs *descs = data->ad.descs; in gpio_virtuser_value_array_do_write()
241 if (count - 1 != descs->ndescs) in gpio_virtuser_value_array_do_write()
242 return -EINVAL; in gpio_virtuser_value_array_do_write()
246 return -ENOMEM; in gpio_virtuser_value_array_do_write()
252 unsigned long *values __free(bitmap) = bitmap_zalloc(descs->ndescs, in gpio_virtuser_value_array_do_write()
255 return -ENOMEM; in gpio_virtuser_value_array_do_write()
257 ret = gpio_virtuser_dbgfs_parse_value_array(buf, count - 1, values); in gpio_virtuser_value_array_do_write()
322 ctx->ret = gpiod_get_direction(ctx->desc); in gpio_virtuser_do_get_direction_atomic()
323 complete(&ctx->work_completion); in gpio_virtuser_do_get_direction_atomic()
344 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_direction_do_read()
345 struct gpio_desc *desc = data->ad.desc; in gpio_virtuser_direction_do_read()
374 ctx->ret = gpio_virtuser_set_direction(ctx->desc, ctx->dir, ctx->val); in gpio_virtuser_do_set_direction_atomic()
375 complete(&ctx->work_completion); in gpio_virtuser_do_set_direction_atomic()
399 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_direction_do_write()
400 struct gpio_desc *desc = data->ad.desc; in gpio_virtuser_direction_do_write()
405 return -EINVAL; in gpio_virtuser_direction_do_write()
407 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count); in gpio_virtuser_direction_do_write()
417 } else if (strcmp(trimmed, "output-high") == 0) { in gpio_virtuser_direction_do_write()
420 } else if (strcmp(trimmed, "output-low") == 0) { in gpio_virtuser_direction_do_write()
423 return -EINVAL; in gpio_virtuser_direction_do_write()
489 ret = gpiod_get_value_cansleep(ld->ad.desc); in gpio_virtuser_value_get()
503 return -EINVAL; in gpio_virtuser_value_set()
505 gpiod_set_value_cansleep(ld->ad.desc, (int)val); in gpio_virtuser_value_set()
520 ctx->val = gpiod_get_value(ctx->desc); in gpio_virtuser_get_value_atomic()
521 complete(&ctx->work_completion); in gpio_virtuser_get_value_atomic()
531 ctx.desc = ld->ad.desc; in gpio_virtuser_value_atomic_get()
548 gpiod_set_value(ctx->desc, ctx->val); in gpio_virtuser_set_value_atomic()
549 complete(&ctx->work_completion); in gpio_virtuser_set_value_atomic()
558 return -EINVAL; in gpio_virtuser_value_atomic_set()
562 ctx.desc = ld->ad.desc; in gpio_virtuser_value_atomic_set()
579 *val = READ_ONCE(ld->debounce); in gpio_virtuser_debounce_get()
590 return -E2BIG; in gpio_virtuser_debounce_set()
592 ret = gpiod_set_debounce(ld->ad.desc, (unsigned int)val); in gpio_virtuser_debounce_set()
594 /* Don't propagate errno unknown to user-space. */ in gpio_virtuser_debounce_set()
595 return ret == -ENOTSUPP ? -EOPNOTSUPP : ret; in gpio_virtuser_debounce_set()
597 WRITE_ONCE(ld->debounce, (unsigned int)val); in gpio_virtuser_debounce_set()
611 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_consumer_read()
617 scoped_guard(mutex, &data->consumer_lock) in gpio_virtuser_consumer_read()
618 ret = snprintf(buf, sizeof(buf), "%s\n", data->consumer); in gpio_virtuser_consumer_read()
627 struct gpio_virtuser_line_data *data = file->private_data; in gpio_virtuser_consumer_write()
632 return -EINVAL; in gpio_virtuser_consumer_write()
641 ret = gpiod_set_consumer_name(data->ad.desc, buf); in gpio_virtuser_consumer_write()
645 scoped_guard(mutex, &data->consumer_lock) in gpio_virtuser_consumer_write()
646 strscpy(data->consumer, buf, sizeof(data->consumer)); in gpio_virtuser_consumer_write()
663 *val = atomic_read(&ld->irq_count); in gpio_virtuser_interrupts_get()
668 static irqreturn_t gpio_virtuser_irq_handler(int irq, void *data) in gpio_virtuser_irq_handler() argument
672 atomic_inc(&ld->irq_count); in gpio_virtuser_irq_handler()
680 int irq, ret; in gpio_virtuser_interrupts_set() local
683 return -EINVAL; in gpio_virtuser_interrupts_set()
686 irq = gpiod_to_irq(ld->ad.desc); in gpio_virtuser_interrupts_set()
687 if (irq < 0) in gpio_virtuser_interrupts_set()
688 return irq; in gpio_virtuser_interrupts_set()
690 ret = request_threaded_irq(irq, NULL, in gpio_virtuser_interrupts_set()
695 ld->consumer, data); in gpio_virtuser_interrupts_set()
699 atomic_set(&ld->irq, irq); in gpio_virtuser_interrupts_set()
701 irq = atomic_xchg(&ld->irq, 0); in gpio_virtuser_interrupts_set()
702 free_irq(irq, ld); in gpio_virtuser_interrupts_set()
765 ret = debugfs_create_file(attr->name, 0644, parent, data, in gpio_virtuser_create_debugfs_attrs()
766 attr->fops); in gpio_virtuser_create_debugfs_attrs()
784 return -ENOMEM; in gpio_virtuser_dbgfs_init_line_array_attrs()
786 data->ad.descs = descs; in gpio_virtuser_dbgfs_init_line_array_attrs()
790 return -ENOMEM; in gpio_virtuser_dbgfs_init_line_array_attrs()
792 data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry); in gpio_virtuser_dbgfs_init_line_array_attrs()
793 if (IS_ERR(data->ad.dbgfs_dir)) in gpio_virtuser_dbgfs_init_line_array_attrs()
794 return PTR_ERR(data->ad.dbgfs_dir); in gpio_virtuser_dbgfs_init_line_array_attrs()
799 data->ad.dbgfs_dir, data); in gpio_virtuser_dbgfs_init_line_array_attrs()
814 return -ENOMEM; in gpio_virtuser_dbgfs_init_line_attrs()
816 data->ad.desc = desc; in gpio_virtuser_dbgfs_init_line_attrs()
817 strscpy(data->consumer, id); in gpio_virtuser_dbgfs_init_line_attrs()
818 atomic_set(&data->irq, 0); in gpio_virtuser_dbgfs_init_line_attrs()
819 atomic_set(&data->irq_count, 0); in gpio_virtuser_dbgfs_init_line_attrs()
823 return -ENOMEM; in gpio_virtuser_dbgfs_init_line_attrs()
825 ret = devm_mutex_init(dev, &data->consumer_lock); in gpio_virtuser_dbgfs_init_line_attrs()
829 data->ad.dbgfs_dir = debugfs_create_dir(name, dbgfs_entry); in gpio_virtuser_dbgfs_init_line_attrs()
830 if (IS_ERR(data->ad.dbgfs_dir)) in gpio_virtuser_dbgfs_init_line_attrs()
831 return PTR_ERR(data->ad.dbgfs_dir); in gpio_virtuser_dbgfs_init_line_attrs()
836 data->ad.dbgfs_dir, data); in gpio_virtuser_dbgfs_init_line_attrs()
848 char *dash = strrchr(prop->name, '-'); in gpio_virtuser_prop_is_gpio()
850 return dash && strcmp(dash, "-gpios") == 0; in gpio_virtuser_prop_is_gpio()
854 * If this is an OF-based system, then we iterate over properties and consider
855 * all whose names end in "-gpios". For configfs we expect an additional string
856 * array property - "gpio-virtuser,ids" - containing the list of all GPIO IDs
867 "gpio-virtuser,ids"); in gpio_virtuser_count_ids()
887 "gpio-virtuser,ids", in gpio_virtuser_get_ids()
894 dash = strrchr(prop->name, '-'); in gpio_virtuser_get_ids()
895 diff = dash - prop->name; in gpio_virtuser_get_ids()
897 tmp = devm_kmemdup(dev, prop->name, diff + 1, in gpio_virtuser_get_ids()
900 return -ENOMEM; in gpio_virtuser_get_ids()
911 struct device *dev = &pdev->dev; in gpio_virtuser_probe()
924 return dev_err_probe(dev, -EINVAL, "No GPIO IDs specified\n"); in gpio_virtuser_probe()
928 return -ENOMEM; in gpio_virtuser_probe()
956 for (j = 0; j < descs->ndescs; j++) { in gpio_virtuser_probe()
958 descs->desc[j], ids[i], in gpio_virtuser_probe()
971 { .compatible = "gpio-virtuser" },
978 .name = "gpio-virtuser",
1007 lockdep_assert_held(&dev->lock); in gpio_virtuser_device_is_live()
1009 return !!dev->probe_data.pdev; in gpio_virtuser_device_is_live()
1056 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_key_show()
1058 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_key_show()
1060 return sprintf(page, "%s\n", entry->key ?: ""); in gpio_virtuser_lookup_entry_config_key_show()
1069 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_key_store()
1074 return -ENOMEM; in gpio_virtuser_lookup_entry_config_key_store()
1078 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_key_store()
1081 return -EBUSY; in gpio_virtuser_lookup_entry_config_key_store()
1083 kfree(entry->key); in gpio_virtuser_lookup_entry_config_key_store()
1084 entry->key = no_free_ptr(key); in gpio_virtuser_lookup_entry_config_key_store()
1097 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_offset_show()
1100 scoped_guard(mutex, &dev->lock) in gpio_virtuser_lookup_entry_config_offset_show()
1101 offset = entry->offset; in gpio_virtuser_lookup_entry_config_offset_show()
1112 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_offset_store()
1121 * Non-negative means: 'key' represents the label of the chip with in gpio_virtuser_lookup_entry_config_offset_store()
1125 * the greatest offset we can accept is (U16_MAX - 1). in gpio_virtuser_lookup_entry_config_offset_store()
1127 if (offset > (U16_MAX - 1)) in gpio_virtuser_lookup_entry_config_offset_store()
1128 return -EINVAL; in gpio_virtuser_lookup_entry_config_offset_store()
1130 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_offset_store()
1133 return -EBUSY; in gpio_virtuser_lookup_entry_config_offset_store()
1135 entry->offset = offset; in gpio_virtuser_lookup_entry_config_offset_store()
1147 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_get_flags()
1149 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_get_flags()
1151 return entry->flags; in gpio_virtuser_lookup_get_flags()
1161 repr = "open-drain"; in gpio_virtuser_lookup_entry_config_drive_show()
1163 repr = "open-source"; in gpio_virtuser_lookup_entry_config_drive_show()
1165 repr = "push-pull"; in gpio_virtuser_lookup_entry_config_drive_show()
1176 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_drive_store()
1178 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_drive_store()
1181 return -EBUSY; in gpio_virtuser_lookup_entry_config_drive_store()
1183 if (sysfs_streq(page, "push-pull")) { in gpio_virtuser_lookup_entry_config_drive_store()
1184 entry->flags &= ~(GPIO_OPEN_DRAIN | GPIO_OPEN_SOURCE); in gpio_virtuser_lookup_entry_config_drive_store()
1185 } else if (sysfs_streq(page, "open-drain")) { in gpio_virtuser_lookup_entry_config_drive_store()
1186 entry->flags &= ~GPIO_OPEN_SOURCE; in gpio_virtuser_lookup_entry_config_drive_store()
1187 entry->flags |= GPIO_OPEN_DRAIN; in gpio_virtuser_lookup_entry_config_drive_store()
1188 } else if (sysfs_streq(page, "open-source")) { in gpio_virtuser_lookup_entry_config_drive_store()
1189 entry->flags &= ~GPIO_OPEN_DRAIN; in gpio_virtuser_lookup_entry_config_drive_store()
1190 entry->flags |= GPIO_OPEN_SOURCE; in gpio_virtuser_lookup_entry_config_drive_store()
1192 count = -EINVAL; in gpio_virtuser_lookup_entry_config_drive_store()
1207 repr = "pull-up"; in gpio_virtuser_lookup_entry_config_pull_show()
1209 repr = "pull-down"; in gpio_virtuser_lookup_entry_config_pull_show()
1211 repr = "pull-disabled"; in gpio_virtuser_lookup_entry_config_pull_show()
1213 repr = "as-is"; in gpio_virtuser_lookup_entry_config_pull_show()
1224 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_pull_store()
1226 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_pull_store()
1229 return -EBUSY; in gpio_virtuser_lookup_entry_config_pull_store()
1231 if (sysfs_streq(page, "pull-up")) { in gpio_virtuser_lookup_entry_config_pull_store()
1232 entry->flags &= ~(GPIO_PULL_DOWN | GPIO_PULL_DISABLE); in gpio_virtuser_lookup_entry_config_pull_store()
1233 entry->flags |= GPIO_PULL_UP; in gpio_virtuser_lookup_entry_config_pull_store()
1234 } else if (sysfs_streq(page, "pull-down")) { in gpio_virtuser_lookup_entry_config_pull_store()
1235 entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DISABLE); in gpio_virtuser_lookup_entry_config_pull_store()
1236 entry->flags |= GPIO_PULL_DOWN; in gpio_virtuser_lookup_entry_config_pull_store()
1237 } else if (sysfs_streq(page, "pull-disabled")) { in gpio_virtuser_lookup_entry_config_pull_store()
1238 entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN); in gpio_virtuser_lookup_entry_config_pull_store()
1239 entry->flags |= GPIO_PULL_DISABLE; in gpio_virtuser_lookup_entry_config_pull_store()
1240 } else if (sysfs_streq(page, "as-is")) { in gpio_virtuser_lookup_entry_config_pull_store()
1241 entry->flags &= ~(GPIO_PULL_UP | GPIO_PULL_DOWN | in gpio_virtuser_lookup_entry_config_pull_store()
1244 count = -EINVAL; in gpio_virtuser_lookup_entry_config_pull_store()
1250 CONFIGFS_ATTR(gpio_virtuser_lookup_entry_config_, pull);
1268 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_active_low_store()
1276 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_active_low_store()
1279 return -EBUSY; in gpio_virtuser_lookup_entry_config_active_low_store()
1282 entry->flags |= GPIO_ACTIVE_LOW; in gpio_virtuser_lookup_entry_config_active_low_store()
1284 entry->flags &= ~GPIO_ACTIVE_LOW; in gpio_virtuser_lookup_entry_config_active_low_store()
1307 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_transitory_store()
1315 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_transitory_store()
1318 return -EBUSY; in gpio_virtuser_lookup_entry_config_transitory_store()
1321 entry->flags |= GPIO_TRANSITORY; in gpio_virtuser_lookup_entry_config_transitory_store()
1323 entry->flags &= ~GPIO_TRANSITORY; in gpio_virtuser_lookup_entry_config_transitory_store()
1347 guard(mutex)(&dev->lock); in gpio_virtuser_device_config_dev_name_show()
1349 pdev = dev->probe_data.pdev; in gpio_virtuser_device_config_dev_name_show()
1351 return sprintf(page, "%s\n", dev_name(&pdev->dev)); in gpio_virtuser_device_config_dev_name_show()
1353 return sprintf(page, "gpio-sim.%d\n", dev->id); in gpio_virtuser_device_config_dev_name_show()
1364 scoped_guard(mutex, &dev->lock) in gpio_virtuser_device_config_live_show()
1376 lockdep_assert_held(&dev->lock); in gpio_virtuser_get_lookup_count()
1378 list_for_each_entry(lookup, &dev->lookup_list, siblings) in gpio_virtuser_get_lookup_count()
1379 count += list_count_nodes(&lookup->entry_list); in gpio_virtuser_get_lookup_count()
1392 lockdep_assert_held(&dev->lock); in gpio_virtuser_make_lookup_table()
1397 return -ENOMEM; in gpio_virtuser_make_lookup_table()
1399 table->dev_id = kasprintf(GFP_KERNEL, "gpio-virtuser.%d", dev->id); in gpio_virtuser_make_lookup_table()
1400 if (!table->dev_id) in gpio_virtuser_make_lookup_table()
1401 return -ENOMEM; in gpio_virtuser_make_lookup_table()
1403 list_for_each_entry(lookup, &dev->lookup_list, siblings) { in gpio_virtuser_make_lookup_table()
1405 list_for_each_entry(entry, &lookup->entry_list, siblings) { in gpio_virtuser_make_lookup_table()
1406 table->table[i++] = in gpio_virtuser_make_lookup_table()
1407 GPIO_LOOKUP_IDX(entry->key, in gpio_virtuser_make_lookup_table()
1408 entry->offset < 0 ? U16_MAX : entry->offset, in gpio_virtuser_make_lookup_table()
1409 lookup->con_id, idx++, entry->flags); in gpio_virtuser_make_lookup_table()
1414 dev->lookup_table = no_free_ptr(table); in gpio_virtuser_make_lookup_table()
1422 gpiod_remove_lookup_table(dev->lookup_table); in gpio_virtuser_remove_lookup_table()
1423 kfree(dev->lookup_table->dev_id); in gpio_virtuser_remove_lookup_table()
1424 kfree(dev->lookup_table); in gpio_virtuser_remove_lookup_table()
1425 dev->lookup_table = NULL; in gpio_virtuser_remove_lookup_table()
1438 num_ids = list_count_nodes(&dev->lookup_list); in gpio_virtuser_make_device_swnode()
1442 return ERR_PTR(-ENOMEM); in gpio_virtuser_make_device_swnode()
1444 list_for_each_entry(lookup, &dev->lookup_list, siblings) in gpio_virtuser_make_device_swnode()
1445 ids[i++] = lookup->con_id; in gpio_virtuser_make_device_swnode()
1447 properties[0] = PROPERTY_ENTRY_STRING_ARRAY_LEN("gpio-virtuser,ids", in gpio_virtuser_make_device_swnode()
1460 lockdep_assert_held(&dev->lock); in gpio_virtuser_device_activate()
1462 if (list_empty(&dev->lookup_list)) in gpio_virtuser_device_activate()
1463 return -ENODATA; in gpio_virtuser_device_activate()
1470 pdevinfo.name = "gpio-virtuser"; in gpio_virtuser_device_activate()
1471 pdevinfo.id = dev->id; in gpio_virtuser_device_activate()
1478 ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo); in gpio_virtuser_device_activate()
1497 lockdep_assert_held(&dev->lock); in gpio_virtuser_device_deactivate()
1499 swnode = dev_fwnode(&dev->probe_data.pdev->dev); in gpio_virtuser_device_deactivate()
1500 dev_sync_probe_unregister(&dev->probe_data); in gpio_virtuser_device_deactivate()
1508 struct configfs_subsystem *subsys = dev->group.cg_subsys; in gpio_virtuser_device_lockup_configfs()
1517 list_for_each_entry(lookup, &dev->lookup_list, siblings) { in gpio_virtuser_device_lockup_configfs()
1518 list_for_each_entry(entry, &lookup->entry_list, siblings) { in gpio_virtuser_device_lockup_configfs()
1521 subsys, &entry->group.cg_item)); in gpio_virtuser_device_lockup_configfs()
1524 &entry->group.cg_item); in gpio_virtuser_device_lockup_configfs()
1544 scoped_guard(mutex, &dev->lock) { in gpio_virtuser_device_config_live_store()
1546 ret = -EPERM; in gpio_virtuser_device_config_live_store()
1576 struct gpio_virtuser_device *dev = entry->parent->parent; in gpio_virtuser_lookup_entry_config_group_release()
1578 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_entry_config_group_release()
1580 list_del(&entry->siblings); in gpio_virtuser_lookup_entry_config_group_release()
1582 kfree(entry->key); in gpio_virtuser_lookup_entry_config_group_release()
1603 to_gpio_virtuser_lookup(&group->cg_item); in gpio_virtuser_make_lookup_entry_group()
1604 struct gpio_virtuser_device *dev = lookup->parent; in gpio_virtuser_make_lookup_entry_group()
1606 guard(mutex)(&dev->lock); in gpio_virtuser_make_lookup_entry_group()
1609 return ERR_PTR(-EBUSY); in gpio_virtuser_make_lookup_entry_group()
1614 return ERR_PTR(-ENOMEM); in gpio_virtuser_make_lookup_entry_group()
1616 config_group_init_type_name(&entry->group, name, in gpio_virtuser_make_lookup_entry_group()
1618 entry->flags = GPIO_LOOKUP_FLAGS_DEFAULT; in gpio_virtuser_make_lookup_entry_group()
1619 entry->parent = lookup; in gpio_virtuser_make_lookup_entry_group()
1620 list_add_tail(&entry->siblings, &lookup->entry_list); in gpio_virtuser_make_lookup_entry_group()
1622 return &no_free_ptr(entry)->group; in gpio_virtuser_make_lookup_entry_group()
1628 struct gpio_virtuser_device *dev = lookup->parent; in gpio_virtuser_lookup_config_group_release()
1630 guard(mutex)(&dev->lock); in gpio_virtuser_lookup_config_group_release()
1632 list_del(&lookup->siblings); in gpio_virtuser_lookup_config_group_release()
1634 kfree(lookup->con_id); in gpio_virtuser_lookup_config_group_release()
1657 to_gpio_virtuser_device(&group->cg_item); in gpio_virtuser_make_lookup_group()
1659 if (strlen(name) > (GPIO_VIRTUSER_NAME_BUF_LEN - 1)) in gpio_virtuser_make_lookup_group()
1660 return ERR_PTR(-E2BIG); in gpio_virtuser_make_lookup_group()
1662 guard(mutex)(&dev->lock); in gpio_virtuser_make_lookup_group()
1665 return ERR_PTR(-EBUSY); in gpio_virtuser_make_lookup_group()
1670 return ERR_PTR(-ENOMEM); in gpio_virtuser_make_lookup_group()
1672 lookup->con_id = kstrdup(name, GFP_KERNEL); in gpio_virtuser_make_lookup_group()
1673 if (!lookup->con_id) in gpio_virtuser_make_lookup_group()
1674 return ERR_PTR(-ENOMEM); in gpio_virtuser_make_lookup_group()
1676 config_group_init_type_name(&lookup->group, name, in gpio_virtuser_make_lookup_group()
1678 INIT_LIST_HEAD(&lookup->entry_list); in gpio_virtuser_make_lookup_group()
1679 lookup->parent = dev; in gpio_virtuser_make_lookup_group()
1680 list_add_tail(&lookup->siblings, &dev->lookup_list); in gpio_virtuser_make_lookup_group()
1682 return &no_free_ptr(lookup)->group; in gpio_virtuser_make_lookup_group()
1689 guard(mutex)(&dev->lock); in gpio_virtuser_device_config_group_release()
1694 mutex_destroy(&dev->lock); in gpio_virtuser_device_config_group_release()
1695 ida_free(&gpio_virtuser_ida, dev->id); in gpio_virtuser_device_config_group_release()
1721 return ERR_PTR(-ENOMEM); in gpio_virtuser_config_make_device_group()
1723 dev->id = ida_alloc(&gpio_virtuser_ida, GFP_KERNEL); in gpio_virtuser_config_make_device_group()
1724 if (dev->id < 0) in gpio_virtuser_config_make_device_group()
1725 return ERR_PTR(dev->id); in gpio_virtuser_config_make_device_group()
1727 config_group_init_type_name(&dev->group, name, in gpio_virtuser_config_make_device_group()
1729 mutex_init(&dev->lock); in gpio_virtuser_config_make_device_group()
1730 INIT_LIST_HEAD(&dev->lookup_list); in gpio_virtuser_config_make_device_group()
1731 dev_sync_probe_init(&dev->probe_data); in gpio_virtuser_config_make_device_group()
1733 return &no_free_ptr(dev)->group; in gpio_virtuser_config_make_device_group()
1748 .ci_namebuf = "gpio-virtuser",
1774 gpio_virtuser_dbg_root = debugfs_create_dir("gpio-virtuser", NULL); in gpio_virtuser_init()