at master 40 kB view raw
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * GPIO testing driver based on configfs. 4 * 5 * Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl> 6 */ 7 8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10#include <linux/array_size.h> 11#include <linux/bitmap.h> 12#include <linux/cleanup.h> 13#include <linux/configfs.h> 14#include <linux/device.h> 15#include <linux/err.h> 16#include <linux/gpio/consumer.h> 17#include <linux/gpio/driver.h> 18#include <linux/gpio/machine.h> 19#include <linux/idr.h> 20#include <linux/interrupt.h> 21#include <linux/irq.h> 22#include <linux/irq_sim.h> 23#include <linux/list.h> 24#include <linux/lockdep.h> 25#include <linux/minmax.h> 26#include <linux/mod_devicetable.h> 27#include <linux/module.h> 28#include <linux/mutex.h> 29#include <linux/notifier.h> 30#include <linux/platform_device.h> 31#include <linux/property.h> 32#include <linux/seq_file.h> 33#include <linux/slab.h> 34#include <linux/string.h> 35#include <linux/string_helpers.h> 36#include <linux/sysfs.h> 37#include <linux/types.h> 38 39#include "dev-sync-probe.h" 40 41#define GPIO_SIM_NGPIO_MAX 1024 42#define GPIO_SIM_PROP_MAX 5 /* Max 4 properties + sentinel. */ 43#define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */ 44 45static DEFINE_IDA(gpio_sim_ida); 46 47struct gpio_sim_chip { 48 struct gpio_chip gc; 49 struct device *dev; 50 unsigned long *request_map; 51 unsigned long *direction_map; 52 unsigned long *value_map; 53 unsigned long *pull_map; 54 struct irq_domain *irq_sim; 55 struct mutex lock; 56 const struct attribute_group **attr_groups; 57}; 58 59struct gpio_sim_attribute { 60 struct device_attribute dev_attr; 61 unsigned int offset; 62}; 63 64static struct gpio_sim_attribute * 65to_gpio_sim_attr(struct device_attribute *dev_attr) 66{ 67 return container_of(dev_attr, struct gpio_sim_attribute, dev_attr); 68} 69 70static int gpio_sim_apply_pull(struct gpio_sim_chip *chip, 71 unsigned int offset, int value) 72{ 73 int irq, irq_type, ret; 74 75 guard(mutex)(&chip->lock); 76 77 if (test_bit(offset, chip->request_map) && 78 test_bit(offset, chip->direction_map)) { 79 if (value == !!test_bit(offset, chip->value_map)) 80 goto set_pull; 81 82 /* 83 * This is fine - it just means, nobody is listening 84 * for interrupts on this line, otherwise 85 * irq_create_mapping() would have been called from 86 * the to_irq() callback. 87 */ 88 irq = irq_find_mapping(chip->irq_sim, offset); 89 if (!irq) 90 goto set_value; 91 92 irq_type = irq_get_trigger_type(irq); 93 94 if ((value && (irq_type & IRQ_TYPE_EDGE_RISING)) || 95 (!value && (irq_type & IRQ_TYPE_EDGE_FALLING))) { 96 ret = irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, 97 true); 98 if (ret) 99 goto set_pull; 100 } 101 } 102 103set_value: 104 /* Change the value unless we're actively driving the line. */ 105 if (!test_bit(offset, chip->request_map) || 106 test_bit(offset, chip->direction_map)) 107 __assign_bit(offset, chip->value_map, value); 108 109set_pull: 110 __assign_bit(offset, chip->pull_map, value); 111 return 0; 112} 113 114static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset) 115{ 116 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 117 118 guard(mutex)(&chip->lock); 119 120 return !!test_bit(offset, chip->value_map); 121} 122 123static int gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value) 124{ 125 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 126 127 scoped_guard(mutex, &chip->lock) 128 __assign_bit(offset, chip->value_map, value); 129 130 return 0; 131} 132 133static int gpio_sim_get_multiple(struct gpio_chip *gc, 134 unsigned long *mask, unsigned long *bits) 135{ 136 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 137 138 scoped_guard(mutex, &chip->lock) 139 bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio); 140 141 return 0; 142} 143 144static int gpio_sim_set_multiple(struct gpio_chip *gc, 145 unsigned long *mask, unsigned long *bits) 146{ 147 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 148 149 scoped_guard(mutex, &chip->lock) 150 bitmap_replace(chip->value_map, chip->value_map, bits, mask, 151 gc->ngpio); 152 153 return 0; 154} 155 156static int gpio_sim_direction_output(struct gpio_chip *gc, 157 unsigned int offset, int value) 158{ 159 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 160 161 scoped_guard(mutex, &chip->lock) { 162 __clear_bit(offset, chip->direction_map); 163 __assign_bit(offset, chip->value_map, value); 164 } 165 166 return 0; 167} 168 169static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset) 170{ 171 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 172 173 scoped_guard(mutex, &chip->lock) 174 __set_bit(offset, chip->direction_map); 175 176 return 0; 177} 178 179static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset) 180{ 181 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 182 int direction; 183 184 scoped_guard(mutex, &chip->lock) 185 direction = !!test_bit(offset, chip->direction_map); 186 187 return direction ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; 188} 189 190static int gpio_sim_set_config(struct gpio_chip *gc, unsigned int offset, 191 unsigned long config) 192{ 193 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 194 195 switch (pinconf_to_config_param(config)) { 196 case PIN_CONFIG_BIAS_PULL_UP: 197 return gpio_sim_apply_pull(chip, offset, 1); 198 case PIN_CONFIG_BIAS_PULL_DOWN: 199 return gpio_sim_apply_pull(chip, offset, 0); 200 default: 201 break; 202 } 203 204 return -ENOTSUPP; 205} 206 207static int gpio_sim_to_irq(struct gpio_chip *gc, unsigned int offset) 208{ 209 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 210 211 return irq_create_mapping(chip->irq_sim, offset); 212} 213 214static int gpio_sim_request(struct gpio_chip *gc, unsigned int offset) 215{ 216 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 217 218 scoped_guard(mutex, &chip->lock) 219 __set_bit(offset, chip->request_map); 220 221 return 0; 222} 223 224static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset) 225{ 226 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 227 228 scoped_guard(mutex, &chip->lock) { 229 __assign_bit(offset, chip->value_map, 230 !!test_bit(offset, chip->pull_map)); 231 __clear_bit(offset, chip->request_map); 232 } 233} 234 235static int gpio_sim_irq_requested(struct irq_domain *domain, 236 irq_hw_number_t hwirq, void *data) 237{ 238 struct gpio_sim_chip *chip = data; 239 240 return gpiochip_lock_as_irq(&chip->gc, hwirq); 241} 242 243static void gpio_sim_irq_released(struct irq_domain *domain, 244 irq_hw_number_t hwirq, void *data) 245{ 246 struct gpio_sim_chip *chip = data; 247 248 gpiochip_unlock_as_irq(&chip->gc, hwirq); 249} 250 251static const struct irq_sim_ops gpio_sim_irq_sim_ops = { 252 .irq_sim_irq_requested = gpio_sim_irq_requested, 253 .irq_sim_irq_released = gpio_sim_irq_released, 254}; 255 256static void gpio_sim_dbg_show(struct seq_file *seq, struct gpio_chip *gc) 257{ 258 struct gpio_sim_chip *chip = gpiochip_get_data(gc); 259 const char *label; 260 int i; 261 262 guard(mutex)(&chip->lock); 263 264 for_each_hwgpio(gc, i, label) 265 seq_printf(seq, " gpio-%-3d (%s) %s,%s\n", i, 266 label ?: "<unused>", 267 test_bit(i, chip->direction_map) ? "input" : 268 test_bit(i, chip->value_map) ? "output-high" : 269 "output-low", 270 test_bit(i, chip->pull_map) ? "pull-up" : 271 "pull-down"); 272} 273 274static ssize_t gpio_sim_sysfs_val_show(struct device *dev, 275 struct device_attribute *attr, char *buf) 276{ 277 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr); 278 struct gpio_sim_chip *chip = dev_get_drvdata(dev); 279 int val; 280 281 scoped_guard(mutex, &chip->lock) 282 val = !!test_bit(line_attr->offset, chip->value_map); 283 284 return sysfs_emit(buf, "%d\n", val); 285} 286 287static ssize_t gpio_sim_sysfs_val_store(struct device *dev, 288 struct device_attribute *attr, 289 const char *buf, size_t count) 290{ 291 /* 292 * Not assigning this function will result in write() returning -EIO 293 * which is confusing. Return -EPERM explicitly. 294 */ 295 return -EPERM; 296} 297 298static const char *const gpio_sim_sysfs_pull_strings[] = { 299 [0] = "pull-down", 300 [1] = "pull-up", 301}; 302 303static ssize_t gpio_sim_sysfs_pull_show(struct device *dev, 304 struct device_attribute *attr, 305 char *buf) 306{ 307 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr); 308 struct gpio_sim_chip *chip = dev_get_drvdata(dev); 309 int pull; 310 311 scoped_guard(mutex, &chip->lock) 312 pull = !!test_bit(line_attr->offset, chip->pull_map); 313 314 return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]); 315} 316 317static ssize_t gpio_sim_sysfs_pull_store(struct device *dev, 318 struct device_attribute *attr, 319 const char *buf, size_t len) 320{ 321 struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr); 322 struct gpio_sim_chip *chip = dev_get_drvdata(dev); 323 int ret, pull; 324 325 pull = sysfs_match_string(gpio_sim_sysfs_pull_strings, buf); 326 if (pull < 0) 327 return pull; 328 329 ret = gpio_sim_apply_pull(chip, line_attr->offset, pull); 330 if (ret) 331 return ret; 332 333 return len; 334} 335 336static void gpio_sim_put_device(void *data) 337{ 338 struct device *dev = data; 339 340 put_device(dev); 341} 342 343static void gpio_sim_dispose_mappings(void *data) 344{ 345 struct gpio_sim_chip *chip = data; 346 unsigned int i; 347 348 for (i = 0; i < chip->gc.ngpio; i++) 349 irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i)); 350} 351 352static void gpio_sim_sysfs_remove(void *data) 353{ 354 struct gpio_sim_chip *chip = data; 355 356 sysfs_remove_groups(&chip->dev->kobj, chip->attr_groups); 357} 358 359static int gpio_sim_setup_sysfs(struct gpio_sim_chip *chip) 360{ 361 struct device_attribute *val_dev_attr, *pull_dev_attr; 362 struct gpio_sim_attribute *val_attr, *pull_attr; 363 unsigned int num_lines = chip->gc.ngpio; 364 struct device *dev = chip->gc.parent; 365 struct attribute_group *attr_group; 366 struct attribute **attrs; 367 int i, ret; 368 369 chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups), 370 num_lines + 1, GFP_KERNEL); 371 if (!chip->attr_groups) 372 return -ENOMEM; 373 374 for (i = 0; i < num_lines; i++) { 375 attr_group = devm_kzalloc(dev, sizeof(*attr_group), GFP_KERNEL); 376 attrs = devm_kcalloc(dev, GPIO_SIM_NUM_ATTRS, sizeof(*attrs), 377 GFP_KERNEL); 378 val_attr = devm_kzalloc(dev, sizeof(*val_attr), GFP_KERNEL); 379 pull_attr = devm_kzalloc(dev, sizeof(*pull_attr), GFP_KERNEL); 380 if (!attr_group || !attrs || !val_attr || !pull_attr) 381 return -ENOMEM; 382 383 attr_group->name = devm_kasprintf(dev, GFP_KERNEL, 384 "sim_gpio%u", i); 385 if (!attr_group->name) 386 return -ENOMEM; 387 388 val_attr->offset = pull_attr->offset = i; 389 390 val_dev_attr = &val_attr->dev_attr; 391 pull_dev_attr = &pull_attr->dev_attr; 392 393 sysfs_attr_init(&val_dev_attr->attr); 394 sysfs_attr_init(&pull_dev_attr->attr); 395 396 val_dev_attr->attr.name = "value"; 397 pull_dev_attr->attr.name = "pull"; 398 399 val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644; 400 401 val_dev_attr->show = gpio_sim_sysfs_val_show; 402 val_dev_attr->store = gpio_sim_sysfs_val_store; 403 pull_dev_attr->show = gpio_sim_sysfs_pull_show; 404 pull_dev_attr->store = gpio_sim_sysfs_pull_store; 405 406 attrs[0] = &val_dev_attr->attr; 407 attrs[1] = &pull_dev_attr->attr; 408 409 attr_group->attrs = attrs; 410 chip->attr_groups[i] = attr_group; 411 } 412 413 ret = sysfs_create_groups(&chip->dev->kobj, chip->attr_groups); 414 if (ret) 415 return ret; 416 417 return devm_add_action_or_reset(dev, gpio_sim_sysfs_remove, chip); 418} 419 420static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev) 421{ 422 struct gpio_sim_chip *chip; 423 struct gpio_chip *gc; 424 const char *label; 425 u32 num_lines; 426 int ret; 427 428 ret = fwnode_property_read_u32(swnode, "ngpios", &num_lines); 429 if (ret) 430 return ret; 431 432 if (num_lines > GPIO_SIM_NGPIO_MAX) 433 return -ERANGE; 434 435 ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label); 436 if (ret) { 437 label = devm_kasprintf(dev, GFP_KERNEL, "%s:%pfwP", 438 dev_name(dev), swnode); 439 if (!label) 440 return -ENOMEM; 441 } 442 443 chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); 444 if (!chip) 445 return -ENOMEM; 446 447 chip->request_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); 448 if (!chip->request_map) 449 return -ENOMEM; 450 451 chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL); 452 if (!chip->direction_map) 453 return -ENOMEM; 454 455 /* Default to input mode. */ 456 bitmap_fill(chip->direction_map, num_lines); 457 458 chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); 459 if (!chip->value_map) 460 return -ENOMEM; 461 462 chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL); 463 if (!chip->pull_map) 464 return -ENOMEM; 465 466 chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines, 467 &gpio_sim_irq_sim_ops, 468 chip); 469 if (IS_ERR(chip->irq_sim)) 470 return PTR_ERR(chip->irq_sim); 471 472 ret = devm_add_action_or_reset(dev, gpio_sim_dispose_mappings, chip); 473 if (ret) 474 return ret; 475 476 ret = devm_mutex_init(dev, &chip->lock); 477 if (ret) 478 return ret; 479 480 gc = &chip->gc; 481 gc->base = -1; 482 gc->ngpio = num_lines; 483 gc->label = label; 484 gc->owner = THIS_MODULE; 485 gc->parent = dev; 486 gc->fwnode = swnode; 487 gc->get = gpio_sim_get; 488 gc->set = gpio_sim_set; 489 gc->get_multiple = gpio_sim_get_multiple; 490 gc->set_multiple = gpio_sim_set_multiple; 491 gc->direction_output = gpio_sim_direction_output; 492 gc->direction_input = gpio_sim_direction_input; 493 gc->get_direction = gpio_sim_get_direction; 494 gc->set_config = gpio_sim_set_config; 495 gc->to_irq = gpio_sim_to_irq; 496 gc->request = gpio_sim_request; 497 gc->free = gpio_sim_free; 498 gc->dbg_show = PTR_IF(IS_ENABLED(CONFIG_DEBUG_FS), gpio_sim_dbg_show); 499 gc->can_sleep = true; 500 501 ret = devm_gpiochip_add_data(dev, gc, chip); 502 if (ret) 503 return ret; 504 505 chip->dev = device_find_child(dev, swnode, device_match_fwnode); 506 if (!chip->dev) 507 return -ENODEV; 508 509 ret = devm_add_action_or_reset(dev, gpio_sim_put_device, chip->dev); 510 if (ret) 511 return ret; 512 513 /* Used by sysfs callbacks. */ 514 dev_set_drvdata(chip->dev, chip); 515 516 return gpio_sim_setup_sysfs(chip); 517} 518 519static int gpio_sim_probe(struct platform_device *pdev) 520{ 521 struct device *dev = &pdev->dev; 522 int ret; 523 524 device_for_each_child_node_scoped(dev, swnode) { 525 ret = gpio_sim_add_bank(swnode, dev); 526 if (ret) 527 return ret; 528 } 529 530 return 0; 531} 532 533static const struct of_device_id gpio_sim_of_match[] = { 534 { .compatible = "gpio-simulator" }, 535 { } 536}; 537MODULE_DEVICE_TABLE(of, gpio_sim_of_match); 538 539static struct platform_driver gpio_sim_driver = { 540 .driver = { 541 .name = "gpio-sim", 542 .of_match_table = gpio_sim_of_match, 543 }, 544 .probe = gpio_sim_probe, 545}; 546 547struct gpio_sim_device { 548 struct dev_sync_probe_data probe_data; 549 struct config_group group; 550 551 int id; 552 553 /* 554 * Each configfs filesystem operation is protected with the subsystem 555 * mutex. Each separate attribute is protected with the buffer mutex. 556 * This structure however can be modified by callbacks of different 557 * attributes so we need another lock. 558 * 559 * We use this lock for protecting all data structures owned by this 560 * object too. 561 */ 562 struct mutex lock; 563 564 struct gpiod_hog *hogs; 565 566 struct list_head bank_list; 567}; 568 569static struct gpio_sim_device *to_gpio_sim_device(struct config_item *item) 570{ 571 struct config_group *group = to_config_group(item); 572 573 return container_of(group, struct gpio_sim_device, group); 574} 575 576struct gpio_sim_bank { 577 struct config_group group; 578 579 /* 580 * We could have used the ci_parent field of the config_item but 581 * configfs is stupid and calls the item's release callback after 582 * already having cleared the parent pointer even though the parent 583 * is guaranteed to survive the child... 584 * 585 * So we need to store the pointer to the parent struct here. We can 586 * dereference it anywhere we need with no checks and no locking as 587 * it's guaranteed to survive the children and protected by configfs 588 * locks. 589 * 590 * Same for other structures. 591 */ 592 struct gpio_sim_device *parent; 593 struct list_head siblings; 594 595 char *label; 596 unsigned int num_lines; 597 598 struct list_head line_list; 599 600 struct fwnode_handle *swnode; 601}; 602 603static struct gpio_sim_bank *to_gpio_sim_bank(struct config_item *item) 604{ 605 struct config_group *group = to_config_group(item); 606 607 return container_of(group, struct gpio_sim_bank, group); 608} 609 610static bool gpio_sim_bank_has_label(struct gpio_sim_bank *bank) 611{ 612 return bank->label && *bank->label; 613} 614 615static struct gpio_sim_device * 616gpio_sim_bank_get_device(struct gpio_sim_bank *bank) 617{ 618 return bank->parent; 619} 620 621struct gpio_sim_hog; 622 623struct gpio_sim_line { 624 struct config_group group; 625 626 struct gpio_sim_bank *parent; 627 struct list_head siblings; 628 629 unsigned int offset; 630 char *name; 631 bool valid; 632 633 /* There can only be one hog per line. */ 634 struct gpio_sim_hog *hog; 635}; 636 637static struct gpio_sim_line *to_gpio_sim_line(struct config_item *item) 638{ 639 struct config_group *group = to_config_group(item); 640 641 return container_of(group, struct gpio_sim_line, group); 642} 643 644static struct gpio_sim_device * 645gpio_sim_line_get_device(struct gpio_sim_line *line) 646{ 647 struct gpio_sim_bank *bank = line->parent; 648 649 return gpio_sim_bank_get_device(bank); 650} 651 652struct gpio_sim_hog { 653 struct config_item item; 654 struct gpio_sim_line *parent; 655 656 char *name; 657 int dir; 658}; 659 660static struct gpio_sim_hog *to_gpio_sim_hog(struct config_item *item) 661{ 662 return container_of(item, struct gpio_sim_hog, item); 663} 664 665static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog) 666{ 667 struct gpio_sim_line *line = hog->parent; 668 669 return gpio_sim_line_get_device(line); 670} 671 672static bool gpio_sim_device_is_live(struct gpio_sim_device *dev) 673{ 674 lockdep_assert_held(&dev->lock); 675 676 return !!dev->probe_data.pdev; 677} 678 679static char *gpio_sim_strdup_trimmed(const char *str, size_t count) 680{ 681 char *trimmed; 682 683 trimmed = kstrndup(skip_spaces(str), count, GFP_KERNEL); 684 if (!trimmed) 685 return NULL; 686 687 return strim(trimmed); 688} 689 690static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item, 691 char *page) 692{ 693 struct gpio_sim_device *dev = to_gpio_sim_device(item); 694 struct platform_device *pdev; 695 696 guard(mutex)(&dev->lock); 697 698 pdev = dev->probe_data.pdev; 699 if (pdev) 700 return sprintf(page, "%s\n", dev_name(&pdev->dev)); 701 702 return sprintf(page, "gpio-sim.%d\n", dev->id); 703} 704 705CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name); 706 707static ssize_t 708gpio_sim_device_config_live_show(struct config_item *item, char *page) 709{ 710 struct gpio_sim_device *dev = to_gpio_sim_device(item); 711 bool live; 712 713 scoped_guard(mutex, &dev->lock) 714 live = gpio_sim_device_is_live(dev); 715 716 return sprintf(page, "%c\n", live ? '1' : '0'); 717} 718 719static unsigned int gpio_sim_get_line_names_size(struct gpio_sim_bank *bank) 720{ 721 struct gpio_sim_line *line; 722 unsigned int size = 0; 723 724 list_for_each_entry(line, &bank->line_list, siblings) { 725 if (!line->name || (line->offset >= bank->num_lines)) 726 continue; 727 728 size = max(size, line->offset + 1); 729 } 730 731 return size; 732} 733 734static void 735gpio_sim_set_line_names(struct gpio_sim_bank *bank, char **line_names) 736{ 737 struct gpio_sim_line *line; 738 739 list_for_each_entry(line, &bank->line_list, siblings) { 740 if (!line->name || (line->offset >= bank->num_lines)) 741 continue; 742 743 line_names[line->offset] = line->name; 744 } 745} 746 747static unsigned int gpio_sim_get_reserved_ranges_size(struct gpio_sim_bank *bank) 748{ 749 struct gpio_sim_line *line; 750 unsigned int size = 0; 751 752 list_for_each_entry(line, &bank->line_list, siblings) { 753 if (line->valid) 754 continue; 755 756 size += 2; 757 } 758 759 return size; 760} 761 762static void gpio_sim_set_reserved_ranges(struct gpio_sim_bank *bank, 763 u32 *ranges) 764{ 765 struct gpio_sim_line *line; 766 int i = 0; 767 768 list_for_each_entry(line, &bank->line_list, siblings) { 769 if (line->valid) 770 continue; 771 772 ranges[i++] = line->offset; 773 ranges[i++] = 1; 774 } 775} 776 777static void gpio_sim_remove_hogs(struct gpio_sim_device *dev) 778{ 779 struct gpiod_hog *hog; 780 781 if (!dev->hogs) 782 return; 783 784 gpiod_remove_hogs(dev->hogs); 785 786 for (hog = dev->hogs; hog->chip_label; hog++) { 787 kfree(hog->chip_label); 788 kfree(hog->line_name); 789 } 790 791 kfree(dev->hogs); 792 dev->hogs = NULL; 793} 794 795static int gpio_sim_add_hogs(struct gpio_sim_device *dev) 796{ 797 unsigned int num_hogs = 0, idx = 0; 798 struct gpio_sim_bank *bank; 799 struct gpio_sim_line *line; 800 struct gpiod_hog *hog; 801 802 list_for_each_entry(bank, &dev->bank_list, siblings) { 803 list_for_each_entry(line, &bank->line_list, siblings) { 804 if (line->offset >= bank->num_lines) 805 continue; 806 807 if (line->hog) 808 num_hogs++; 809 } 810 } 811 812 if (!num_hogs) 813 return 0; 814 815 /* Allocate one more for the sentinel. */ 816 dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL); 817 if (!dev->hogs) 818 return -ENOMEM; 819 820 list_for_each_entry(bank, &dev->bank_list, siblings) { 821 list_for_each_entry(line, &bank->line_list, siblings) { 822 if (line->offset >= bank->num_lines) 823 continue; 824 825 if (!line->hog) 826 continue; 827 828 hog = &dev->hogs[idx++]; 829 830 /* 831 * We need to make this string manually because at this 832 * point the device doesn't exist yet and so dev_name() 833 * is not available. 834 */ 835 if (gpio_sim_bank_has_label(bank)) 836 hog->chip_label = kstrdup(bank->label, 837 GFP_KERNEL); 838 else 839 hog->chip_label = kasprintf(GFP_KERNEL, 840 "gpio-sim.%u:%pfwP", 841 dev->id, 842 bank->swnode); 843 if (!hog->chip_label) { 844 gpio_sim_remove_hogs(dev); 845 return -ENOMEM; 846 } 847 848 /* 849 * We need to duplicate this because the hog config 850 * item can be removed at any time (and we can't block 851 * it) and gpiolib doesn't make a deep copy of the hog 852 * data. 853 */ 854 if (line->hog->name) { 855 hog->line_name = kstrdup(line->hog->name, 856 GFP_KERNEL); 857 if (!hog->line_name) { 858 gpio_sim_remove_hogs(dev); 859 return -ENOMEM; 860 } 861 } 862 863 hog->chip_hwnum = line->offset; 864 hog->dflags = line->hog->dir; 865 } 866 } 867 868 gpiod_add_hogs(dev->hogs); 869 870 return 0; 871} 872 873static struct fwnode_handle * 874gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank, 875 struct fwnode_handle *parent) 876{ 877 unsigned int prop_idx = 0, line_names_size, ranges_size; 878 struct property_entry properties[GPIO_SIM_PROP_MAX]; 879 char **line_names __free(kfree) = NULL; 880 u32 *ranges __free(kfree) = NULL; 881 882 memset(properties, 0, sizeof(properties)); 883 884 properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines); 885 886 if (gpio_sim_bank_has_label(bank)) 887 properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label", 888 bank->label); 889 890 line_names_size = gpio_sim_get_line_names_size(bank); 891 if (line_names_size) { 892 line_names = kcalloc(line_names_size, sizeof(*line_names), 893 GFP_KERNEL); 894 if (!line_names) 895 return ERR_PTR(-ENOMEM); 896 897 gpio_sim_set_line_names(bank, line_names); 898 899 properties[prop_idx++] = PROPERTY_ENTRY_STRING_ARRAY_LEN( 900 "gpio-line-names", 901 line_names, line_names_size); 902 } 903 904 ranges_size = gpio_sim_get_reserved_ranges_size(bank); 905 if (ranges_size) { 906 ranges = kcalloc(ranges_size, sizeof(u32), GFP_KERNEL); 907 if (!ranges) 908 return ERR_PTR(-ENOMEM); 909 910 gpio_sim_set_reserved_ranges(bank, ranges); 911 912 properties[prop_idx++] = PROPERTY_ENTRY_U32_ARRAY_LEN( 913 "gpio-reserved-ranges", 914 ranges, ranges_size); 915 } 916 917 return fwnode_create_software_node(properties, parent); 918} 919 920static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode) 921{ 922 struct fwnode_handle *child; 923 924 fwnode_for_each_child_node(swnode, child) 925 fwnode_remove_software_node(child); 926 927 fwnode_remove_software_node(swnode); 928} 929 930static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev) 931{ 932 struct gpio_sim_bank *this, *pos; 933 934 list_for_each_entry(this, &dev->bank_list, siblings) { 935 list_for_each_entry(pos, &dev->bank_list, siblings) { 936 if (this == pos || (!this->label || !pos->label)) 937 continue; 938 939 if (strcmp(this->label, pos->label) == 0) 940 return true; 941 } 942 } 943 944 return false; 945} 946 947static int gpio_sim_device_activate(struct gpio_sim_device *dev) 948{ 949 struct platform_device_info pdevinfo; 950 struct fwnode_handle *swnode; 951 struct gpio_sim_bank *bank; 952 int ret; 953 954 lockdep_assert_held(&dev->lock); 955 956 if (list_empty(&dev->bank_list)) 957 return -ENODATA; 958 959 /* 960 * Non-unique GPIO device labels are a corner-case we don't support 961 * as it would interfere with machine hogging mechanism and has little 962 * use in real life. 963 */ 964 if (gpio_sim_bank_labels_non_unique(dev)) 965 return -EINVAL; 966 967 memset(&pdevinfo, 0, sizeof(pdevinfo)); 968 969 swnode = fwnode_create_software_node(NULL, NULL); 970 if (IS_ERR(swnode)) 971 return PTR_ERR(swnode); 972 973 list_for_each_entry(bank, &dev->bank_list, siblings) { 974 bank->swnode = gpio_sim_make_bank_swnode(bank, swnode); 975 if (IS_ERR(bank->swnode)) { 976 ret = PTR_ERR(bank->swnode); 977 gpio_sim_remove_swnode_recursive(swnode); 978 return ret; 979 } 980 } 981 982 ret = gpio_sim_add_hogs(dev); 983 if (ret) { 984 gpio_sim_remove_swnode_recursive(swnode); 985 return ret; 986 } 987 988 pdevinfo.name = "gpio-sim"; 989 pdevinfo.fwnode = swnode; 990 pdevinfo.id = dev->id; 991 992 ret = dev_sync_probe_register(&dev->probe_data, &pdevinfo); 993 if (ret) { 994 gpio_sim_remove_hogs(dev); 995 gpio_sim_remove_swnode_recursive(swnode); 996 return ret; 997 } 998 999 return 0; 1000} 1001 1002static void gpio_sim_device_deactivate(struct gpio_sim_device *dev) 1003{ 1004 struct fwnode_handle *swnode; 1005 1006 lockdep_assert_held(&dev->lock); 1007 1008 swnode = dev_fwnode(&dev->probe_data.pdev->dev); 1009 dev_sync_probe_unregister(&dev->probe_data); 1010 gpio_sim_remove_hogs(dev); 1011 gpio_sim_remove_swnode_recursive(swnode); 1012} 1013 1014static void 1015gpio_sim_device_lockup_configfs(struct gpio_sim_device *dev, bool lock) 1016{ 1017 struct configfs_subsystem *subsys = dev->group.cg_subsys; 1018 struct gpio_sim_bank *bank; 1019 struct gpio_sim_line *line; 1020 struct config_item *item; 1021 1022 /* 1023 * The device only needs to depend on leaf entries. This is 1024 * sufficient to lock up all the configfs entries that the 1025 * instantiated, alive device depends on. 1026 */ 1027 list_for_each_entry(bank, &dev->bank_list, siblings) { 1028 list_for_each_entry(line, &bank->line_list, siblings) { 1029 item = line->hog ? &line->hog->item 1030 : &line->group.cg_item; 1031 1032 if (lock) 1033 WARN_ON(configfs_depend_item_unlocked(subsys, 1034 item)); 1035 else 1036 configfs_undepend_item_unlocked(item); 1037 } 1038 } 1039} 1040 1041static ssize_t 1042gpio_sim_device_config_live_store(struct config_item *item, 1043 const char *page, size_t count) 1044{ 1045 struct gpio_sim_device *dev = to_gpio_sim_device(item); 1046 bool live; 1047 int ret; 1048 1049 ret = kstrtobool(page, &live); 1050 if (ret) 1051 return ret; 1052 1053 if (live) 1054 gpio_sim_device_lockup_configfs(dev, true); 1055 1056 scoped_guard(mutex, &dev->lock) { 1057 if (live == gpio_sim_device_is_live(dev)) 1058 ret = -EPERM; 1059 else if (live) 1060 ret = gpio_sim_device_activate(dev); 1061 else 1062 gpio_sim_device_deactivate(dev); 1063 } 1064 1065 /* 1066 * Undepend is required only if device disablement (live == 0) 1067 * succeeds or if device enablement (live == 1) fails. 1068 */ 1069 if (live == !!ret) 1070 gpio_sim_device_lockup_configfs(dev, false); 1071 1072 return ret ?: count; 1073} 1074 1075CONFIGFS_ATTR(gpio_sim_device_config_, live); 1076 1077static struct configfs_attribute *gpio_sim_device_config_attrs[] = { 1078 &gpio_sim_device_config_attr_dev_name, 1079 &gpio_sim_device_config_attr_live, 1080 NULL 1081}; 1082 1083struct gpio_sim_chip_name_ctx { 1084 struct fwnode_handle *swnode; 1085 char *page; 1086}; 1087 1088static int gpio_sim_emit_chip_name(struct device *dev, void *data) 1089{ 1090 struct gpio_sim_chip_name_ctx *ctx = data; 1091 1092 /* This would be the sysfs device exported in /sys/class/gpio. */ 1093 if (dev->class) 1094 return 0; 1095 1096 if (device_match_fwnode(dev, ctx->swnode)) 1097 return sprintf(ctx->page, "%s\n", dev_name(dev)); 1098 1099 return 0; 1100} 1101 1102static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item, 1103 char *page) 1104{ 1105 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1106 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1107 struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page }; 1108 1109 guard(mutex)(&dev->lock); 1110 1111 if (gpio_sim_device_is_live(dev)) 1112 return device_for_each_child(&dev->probe_data.pdev->dev, &ctx, 1113 gpio_sim_emit_chip_name); 1114 1115 return sprintf(page, "none\n"); 1116} 1117 1118CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name); 1119 1120static ssize_t 1121gpio_sim_bank_config_label_show(struct config_item *item, char *page) 1122{ 1123 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1124 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1125 1126 guard(mutex)(&dev->lock); 1127 1128 return sprintf(page, "%s\n", bank->label ?: ""); 1129} 1130 1131static ssize_t gpio_sim_bank_config_label_store(struct config_item *item, 1132 const char *page, size_t count) 1133{ 1134 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1135 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1136 char *trimmed; 1137 1138 guard(mutex)(&dev->lock); 1139 1140 if (gpio_sim_device_is_live(dev)) 1141 return -EBUSY; 1142 1143 trimmed = gpio_sim_strdup_trimmed(page, count); 1144 if (!trimmed) 1145 return -ENOMEM; 1146 1147 kfree(bank->label); 1148 bank->label = trimmed; 1149 1150 return count; 1151} 1152 1153CONFIGFS_ATTR(gpio_sim_bank_config_, label); 1154 1155static ssize_t 1156gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page) 1157{ 1158 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1159 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1160 1161 guard(mutex)(&dev->lock); 1162 1163 return sprintf(page, "%u\n", bank->num_lines); 1164} 1165 1166static ssize_t 1167gpio_sim_bank_config_num_lines_store(struct config_item *item, 1168 const char *page, size_t count) 1169{ 1170 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1171 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1172 unsigned int num_lines; 1173 int ret; 1174 1175 ret = kstrtouint(page, 0, &num_lines); 1176 if (ret) 1177 return ret; 1178 1179 if (num_lines == 0) 1180 return -EINVAL; 1181 1182 guard(mutex)(&dev->lock); 1183 1184 if (gpio_sim_device_is_live(dev)) 1185 return -EBUSY; 1186 1187 bank->num_lines = num_lines; 1188 1189 return count; 1190} 1191 1192CONFIGFS_ATTR(gpio_sim_bank_config_, num_lines); 1193 1194static struct configfs_attribute *gpio_sim_bank_config_attrs[] = { 1195 &gpio_sim_bank_config_attr_chip_name, 1196 &gpio_sim_bank_config_attr_label, 1197 &gpio_sim_bank_config_attr_num_lines, 1198 NULL 1199}; 1200 1201static ssize_t 1202gpio_sim_line_config_name_show(struct config_item *item, char *page) 1203{ 1204 struct gpio_sim_line *line = to_gpio_sim_line(item); 1205 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1206 1207 guard(mutex)(&dev->lock); 1208 1209 return sprintf(page, "%s\n", line->name ?: ""); 1210} 1211 1212static ssize_t gpio_sim_line_config_name_store(struct config_item *item, 1213 const char *page, size_t count) 1214{ 1215 struct gpio_sim_line *line = to_gpio_sim_line(item); 1216 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1217 char *trimmed; 1218 1219 guard(mutex)(&dev->lock); 1220 1221 if (gpio_sim_device_is_live(dev)) 1222 return -EBUSY; 1223 1224 trimmed = gpio_sim_strdup_trimmed(page, count); 1225 if (!trimmed) 1226 return -ENOMEM; 1227 1228 kfree(line->name); 1229 line->name = trimmed; 1230 1231 return count; 1232} 1233 1234CONFIGFS_ATTR(gpio_sim_line_config_, name); 1235 1236static ssize_t 1237gpio_sim_line_config_valid_show(struct config_item *item, char *page) 1238{ 1239 struct gpio_sim_line *line = to_gpio_sim_line(item); 1240 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1241 1242 guard(mutex)(&dev->lock); 1243 1244 return sprintf(page, "%c\n", line->valid ? '1' : '0'); 1245} 1246 1247static ssize_t gpio_sim_line_config_valid_store(struct config_item *item, 1248 const char *page, size_t count) 1249{ 1250 struct gpio_sim_line *line = to_gpio_sim_line(item); 1251 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1252 bool valid; 1253 int ret; 1254 1255 ret = kstrtobool(page, &valid); 1256 if (ret) 1257 return ret; 1258 1259 guard(mutex)(&dev->lock); 1260 1261 line->valid = valid; 1262 1263 return count; 1264} 1265 1266CONFIGFS_ATTR(gpio_sim_line_config_, valid); 1267 1268static struct configfs_attribute *gpio_sim_line_config_attrs[] = { 1269 &gpio_sim_line_config_attr_name, 1270 &gpio_sim_line_config_attr_valid, 1271 NULL 1272}; 1273 1274static ssize_t gpio_sim_hog_config_name_show(struct config_item *item, 1275 char *page) 1276{ 1277 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); 1278 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); 1279 1280 guard(mutex)(&dev->lock); 1281 1282 return sprintf(page, "%s\n", hog->name ?: ""); 1283} 1284 1285static ssize_t gpio_sim_hog_config_name_store(struct config_item *item, 1286 const char *page, size_t count) 1287{ 1288 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); 1289 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); 1290 char *trimmed; 1291 1292 guard(mutex)(&dev->lock); 1293 1294 if (gpio_sim_device_is_live(dev)) 1295 return -EBUSY; 1296 1297 trimmed = gpio_sim_strdup_trimmed(page, count); 1298 if (!trimmed) 1299 return -ENOMEM; 1300 1301 kfree(hog->name); 1302 hog->name = trimmed; 1303 1304 return count; 1305} 1306 1307CONFIGFS_ATTR(gpio_sim_hog_config_, name); 1308 1309static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item, 1310 char *page) 1311{ 1312 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); 1313 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); 1314 char *repr; 1315 int dir; 1316 1317 scoped_guard(mutex, &dev->lock) 1318 dir = hog->dir; 1319 1320 switch (dir) { 1321 case GPIOD_IN: 1322 repr = "input"; 1323 break; 1324 case GPIOD_OUT_HIGH: 1325 repr = "output-high"; 1326 break; 1327 case GPIOD_OUT_LOW: 1328 repr = "output-low"; 1329 break; 1330 default: 1331 /* This would be a programmer bug. */ 1332 WARN(1, "Unexpected hog direction value: %d", dir); 1333 return -EINVAL; 1334 } 1335 1336 return sprintf(page, "%s\n", repr); 1337} 1338 1339static ssize_t 1340gpio_sim_hog_config_direction_store(struct config_item *item, 1341 const char *page, size_t count) 1342{ 1343 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); 1344 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); 1345 int dir; 1346 1347 guard(mutex)(&dev->lock); 1348 1349 if (gpio_sim_device_is_live(dev)) 1350 return -EBUSY; 1351 1352 if (sysfs_streq(page, "input")) 1353 dir = GPIOD_IN; 1354 else if (sysfs_streq(page, "output-high")) 1355 dir = GPIOD_OUT_HIGH; 1356 else if (sysfs_streq(page, "output-low")) 1357 dir = GPIOD_OUT_LOW; 1358 else 1359 return -EINVAL; 1360 1361 hog->dir = dir; 1362 1363 return count; 1364} 1365 1366CONFIGFS_ATTR(gpio_sim_hog_config_, direction); 1367 1368static struct configfs_attribute *gpio_sim_hog_config_attrs[] = { 1369 &gpio_sim_hog_config_attr_name, 1370 &gpio_sim_hog_config_attr_direction, 1371 NULL 1372}; 1373 1374static void gpio_sim_hog_config_item_release(struct config_item *item) 1375{ 1376 struct gpio_sim_hog *hog = to_gpio_sim_hog(item); 1377 struct gpio_sim_line *line = hog->parent; 1378 struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog); 1379 1380 scoped_guard(mutex, &dev->lock) 1381 line->hog = NULL; 1382 1383 kfree(hog->name); 1384 kfree(hog); 1385} 1386 1387static struct configfs_item_operations gpio_sim_hog_config_item_ops = { 1388 .release = gpio_sim_hog_config_item_release, 1389}; 1390 1391static const struct config_item_type gpio_sim_hog_config_type = { 1392 .ct_item_ops = &gpio_sim_hog_config_item_ops, 1393 .ct_attrs = gpio_sim_hog_config_attrs, 1394 .ct_owner = THIS_MODULE, 1395}; 1396 1397static struct config_item * 1398gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name) 1399{ 1400 struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item); 1401 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1402 struct gpio_sim_hog *hog; 1403 1404 if (strcmp(name, "hog") != 0) 1405 return ERR_PTR(-EINVAL); 1406 1407 guard(mutex)(&dev->lock); 1408 1409 hog = kzalloc(sizeof(*hog), GFP_KERNEL); 1410 if (!hog) 1411 return ERR_PTR(-ENOMEM); 1412 1413 config_item_init_type_name(&hog->item, name, 1414 &gpio_sim_hog_config_type); 1415 1416 hog->dir = GPIOD_IN; 1417 hog->name = NULL; 1418 hog->parent = line; 1419 line->hog = hog; 1420 1421 return &hog->item; 1422} 1423 1424static void gpio_sim_line_config_group_release(struct config_item *item) 1425{ 1426 struct gpio_sim_line *line = to_gpio_sim_line(item); 1427 struct gpio_sim_device *dev = gpio_sim_line_get_device(line); 1428 1429 scoped_guard(mutex, &dev->lock) 1430 list_del(&line->siblings); 1431 1432 kfree(line->name); 1433 kfree(line); 1434} 1435 1436static struct configfs_item_operations gpio_sim_line_config_item_ops = { 1437 .release = gpio_sim_line_config_group_release, 1438}; 1439 1440static struct configfs_group_operations gpio_sim_line_config_group_ops = { 1441 .make_item = gpio_sim_line_config_make_hog_item, 1442}; 1443 1444static const struct config_item_type gpio_sim_line_config_type = { 1445 .ct_item_ops = &gpio_sim_line_config_item_ops, 1446 .ct_group_ops = &gpio_sim_line_config_group_ops, 1447 .ct_attrs = gpio_sim_line_config_attrs, 1448 .ct_owner = THIS_MODULE, 1449}; 1450 1451static struct config_group * 1452gpio_sim_bank_config_make_line_group(struct config_group *group, 1453 const char *name) 1454{ 1455 struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item); 1456 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1457 struct gpio_sim_line *line; 1458 unsigned int offset; 1459 int ret, nchar; 1460 1461 ret = sscanf(name, "line%u%n", &offset, &nchar); 1462 if (ret != 1 || nchar != strlen(name)) 1463 return ERR_PTR(-EINVAL); 1464 1465 guard(mutex)(&dev->lock); 1466 1467 if (gpio_sim_device_is_live(dev)) 1468 return ERR_PTR(-EBUSY); 1469 1470 line = kzalloc(sizeof(*line), GFP_KERNEL); 1471 if (!line) 1472 return ERR_PTR(-ENOMEM); 1473 1474 config_group_init_type_name(&line->group, name, 1475 &gpio_sim_line_config_type); 1476 1477 line->parent = bank; 1478 line->offset = offset; 1479 line->valid = true; 1480 list_add_tail(&line->siblings, &bank->line_list); 1481 1482 return &line->group; 1483} 1484 1485static void gpio_sim_bank_config_group_release(struct config_item *item) 1486{ 1487 struct gpio_sim_bank *bank = to_gpio_sim_bank(item); 1488 struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank); 1489 1490 scoped_guard(mutex, &dev->lock) 1491 list_del(&bank->siblings); 1492 1493 kfree(bank->label); 1494 kfree(bank); 1495} 1496 1497static struct configfs_item_operations gpio_sim_bank_config_item_ops = { 1498 .release = gpio_sim_bank_config_group_release, 1499}; 1500 1501static struct configfs_group_operations gpio_sim_bank_config_group_ops = { 1502 .make_group = gpio_sim_bank_config_make_line_group, 1503}; 1504 1505static const struct config_item_type gpio_sim_bank_config_group_type = { 1506 .ct_item_ops = &gpio_sim_bank_config_item_ops, 1507 .ct_group_ops = &gpio_sim_bank_config_group_ops, 1508 .ct_attrs = gpio_sim_bank_config_attrs, 1509 .ct_owner = THIS_MODULE, 1510}; 1511 1512static struct config_group * 1513gpio_sim_device_config_make_bank_group(struct config_group *group, 1514 const char *name) 1515{ 1516 struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item); 1517 struct gpio_sim_bank *bank; 1518 1519 guard(mutex)(&dev->lock); 1520 1521 if (gpio_sim_device_is_live(dev)) 1522 return ERR_PTR(-EBUSY); 1523 1524 bank = kzalloc(sizeof(*bank), GFP_KERNEL); 1525 if (!bank) 1526 return ERR_PTR(-ENOMEM); 1527 1528 config_group_init_type_name(&bank->group, name, 1529 &gpio_sim_bank_config_group_type); 1530 bank->num_lines = 1; 1531 bank->parent = dev; 1532 INIT_LIST_HEAD(&bank->line_list); 1533 list_add_tail(&bank->siblings, &dev->bank_list); 1534 1535 return &bank->group; 1536} 1537 1538static void gpio_sim_device_config_group_release(struct config_item *item) 1539{ 1540 struct gpio_sim_device *dev = to_gpio_sim_device(item); 1541 1542 scoped_guard(mutex, &dev->lock) { 1543 if (gpio_sim_device_is_live(dev)) 1544 gpio_sim_device_deactivate(dev); 1545 } 1546 1547 mutex_destroy(&dev->lock); 1548 ida_free(&gpio_sim_ida, dev->id); 1549 kfree(dev); 1550} 1551 1552static struct configfs_item_operations gpio_sim_device_config_item_ops = { 1553 .release = gpio_sim_device_config_group_release, 1554}; 1555 1556static struct configfs_group_operations gpio_sim_device_config_group_ops = { 1557 .make_group = gpio_sim_device_config_make_bank_group, 1558}; 1559 1560static const struct config_item_type gpio_sim_device_config_group_type = { 1561 .ct_item_ops = &gpio_sim_device_config_item_ops, 1562 .ct_group_ops = &gpio_sim_device_config_group_ops, 1563 .ct_attrs = gpio_sim_device_config_attrs, 1564 .ct_owner = THIS_MODULE, 1565}; 1566 1567static struct config_group * 1568gpio_sim_config_make_device_group(struct config_group *group, const char *name) 1569{ 1570 int id; 1571 1572 struct gpio_sim_device *dev __free(kfree) = kzalloc(sizeof(*dev), 1573 GFP_KERNEL); 1574 if (!dev) 1575 return ERR_PTR(-ENOMEM); 1576 1577 id = ida_alloc(&gpio_sim_ida, GFP_KERNEL); 1578 if (id < 0) 1579 return ERR_PTR(id); 1580 1581 config_group_init_type_name(&dev->group, name, 1582 &gpio_sim_device_config_group_type); 1583 dev->id = id; 1584 mutex_init(&dev->lock); 1585 INIT_LIST_HEAD(&dev->bank_list); 1586 1587 dev_sync_probe_init(&dev->probe_data); 1588 1589 return &no_free_ptr(dev)->group; 1590} 1591 1592static struct configfs_group_operations gpio_sim_config_group_ops = { 1593 .make_group = gpio_sim_config_make_device_group, 1594}; 1595 1596static const struct config_item_type gpio_sim_config_type = { 1597 .ct_group_ops = &gpio_sim_config_group_ops, 1598 .ct_owner = THIS_MODULE, 1599}; 1600 1601static struct configfs_subsystem gpio_sim_config_subsys = { 1602 .su_group = { 1603 .cg_item = { 1604 .ci_namebuf = "gpio-sim", 1605 .ci_type = &gpio_sim_config_type, 1606 }, 1607 }, 1608}; 1609 1610static int __init gpio_sim_init(void) 1611{ 1612 int ret; 1613 1614 ret = platform_driver_register(&gpio_sim_driver); 1615 if (ret) { 1616 pr_err("Error %d while registering the platform driver\n", ret); 1617 return ret; 1618 } 1619 1620 config_group_init(&gpio_sim_config_subsys.su_group); 1621 mutex_init(&gpio_sim_config_subsys.su_mutex); 1622 ret = configfs_register_subsystem(&gpio_sim_config_subsys); 1623 if (ret) { 1624 pr_err("Error %d while registering the configfs subsystem %s\n", 1625 ret, gpio_sim_config_subsys.su_group.cg_item.ci_namebuf); 1626 mutex_destroy(&gpio_sim_config_subsys.su_mutex); 1627 platform_driver_unregister(&gpio_sim_driver); 1628 return ret; 1629 } 1630 1631 return 0; 1632} 1633module_init(gpio_sim_init); 1634 1635static void __exit gpio_sim_exit(void) 1636{ 1637 configfs_unregister_subsystem(&gpio_sim_config_subsys); 1638 mutex_destroy(&gpio_sim_config_subsys.su_mutex); 1639 platform_driver_unregister(&gpio_sim_driver); 1640} 1641module_exit(gpio_sim_exit); 1642 1643MODULE_AUTHOR("Bartosz Golaszewski <brgl@bgdev.pl>"); 1644MODULE_DESCRIPTION("GPIO Simulator Module"); 1645MODULE_LICENSE("GPL");