:::::: :::::: Manual check reason: "low confidence bisect report" :::::: Manual check reason: "low confidence static check warning: drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference]" ::::::
CC: [email protected] BCC: [email protected] CC: [email protected] TO: Bartosz Golaszewski <[email protected]> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 018ab4fabddd94f1c96f3b59e180691b9e88d5d8 commit: cb8c474e79be458f58e9df073f51ca159f3a2aa0 gpio: sim: new testing module date: 6 months ago :::::: branch date: 4 hours ago :::::: commit date: 6 months ago config: arm-randconfig-c002-20220611 (https://download.01.org/0day-ci/archive/20220615/[email protected]/config) compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb8c474e79be458f58e9df073f51ca159f3a2aa0 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout cb8c474e79be458f58e9df073f51ca159f3a2aa0 # save the config file ARCH=arm KBUILD_USERCFLAGS='-fanalyzer -Wno-error' If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> gcc-analyzer warnings: (new ones prefixed by >>) drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_group_release': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_group_release': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_group_release': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_group_release': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_num_lines_show': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_num_lines_show': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_num_lines_show': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_num_lines_show': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_chip_name_show': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_chip_name_show': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_chip_name_show': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_chip_name_show': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_label_show': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_label_show': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_label_show': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_label_show': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_label_store': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_label_store': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_label_store': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_label_store': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_bank_config_num_lines_store': >> drivers/gpio/gpio-sim.c:574:20: warning: dereference of NULL '0' [CWE-476] >> [-Wanalyzer-null-dereference] 574 | return bank->parent; | ~~~~^~~~~~~~ 'gpio_sim_bank_config_num_lines_store': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_bank_config_num_lines_store': event 2 | |cc1: | (2): ...to here | 'gpio_sim_bank_config_num_lines_store': event 3 | |drivers/gpio/gpio-sim.c:574:20: | 574 | return bank->parent; | | ~~~~^~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_line_config_name_show': drivers/gpio/gpio-sim.c:602:31: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 602 | struct gpio_sim_bank *bank = line->parent; | ^~~~ 'gpio_sim_line_config_name_show': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_line_config_name_show': event 2 | |cc1: | (2): ...to here | 'gpio_sim_line_config_name_show': event 3 | |drivers/gpio/gpio-sim.c:602:31: | 602 | struct gpio_sim_bank *bank = line->parent; | | ^~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_line_config_group_release': drivers/gpio/gpio-sim.c:602:31: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 602 | struct gpio_sim_bank *bank = line->parent; | ^~~~ 'gpio_sim_line_config_group_release': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_line_config_group_release': event 2 | |cc1: | (2): ...to here | 'gpio_sim_line_config_group_release': event 3 | |drivers/gpio/gpio-sim.c:602:31: | 602 | struct gpio_sim_bank *bank = line->parent; | | ^~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_line_config_name_store': drivers/gpio/gpio-sim.c:602:31: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 602 | struct gpio_sim_bank *bank = line->parent; | ^~~~ 'gpio_sim_line_config_name_store': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_line_config_name_store': event 2 | |cc1: | (2): ...to here | 'gpio_sim_line_config_name_store': event 3 | |drivers/gpio/gpio-sim.c:602:31: | 602 | struct gpio_sim_bank *bank = line->parent; | | ^~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_device_config_group_release': drivers/gpio/gpio-sim.c:629:21: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 629 | return !!dev->pdev; | ~~~^~~~~~ 'gpio_sim_device_config_group_release': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_group_release': event 2 | |cc1: | (2): ...to here | -- | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_device_config_live_store': drivers/gpio/gpio-sim.c:629:21: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 629 | return !!dev->pdev; | ~~~^~~~~~ 'gpio_sim_device_config_live_store': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_live_store': event 2 | |cc1: | (2): ...to here | 'gpio_sim_device_config_live_store': events 3-7 | |drivers/gpio/gpio-sim.c:953:12: | 629 | return !!dev->pdev; | | ~~~~~~~~~ | | | | | (6) ...to here | | (7) dereference of NULL '<unknown>' |...... | 953 | if (ret) | | ^ | | | | | (3) following 'false' branch (when 'ret == 0')... |...... | 956 | mutex_lock(&dev->lock); | | ~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) ...to here | 957 | | 958 | if ((!live && !gpio_sim_device_is_live_unlocked(dev)) || | | ~ | | | | | (5) following 'false' branch... | drivers/gpio/gpio-sim.c:629:21: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 629 | return !!dev->pdev; | ~~~^~~~~~ 'gpio_sim_device_config_live_store': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_live_store': event 2 | |cc1: | (2): ...to here | 'gpio_sim_device_config_live_store': events 3-7 | |drivers/gpio/gpio-sim.c:953:12: | 629 | return !!dev->pdev; | | ~~~~~~~~~ | | | | | (6) ...to here | | (7) dereference of NULL '<unknown>' |...... | 953 | if (ret) | | ^ | | | | | (3) following 'false' branch (when 'ret == 0')... |...... | 956 | mutex_lock(&dev->lock); | | ~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) ...to here | 957 | | 958 | if ((!live && !gpio_sim_device_is_live_unlocked(dev)) || | | ~ | | | | | (5) following 'true' branch... | drivers/gpio/gpio-sim.c: In function 'gpio_sim_device_config_dev_name_show': drivers/gpio/gpio-sim.c:654:14: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 654 | pdev = dev->pdev; | ~~~~~^~~~~~~~~~~ 'gpio_sim_device_config_dev_name_show': event 1 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_dev_name_show': event 2 | |cc1: | (2): ...to here | 'gpio_sim_device_config_dev_name_show': event 3 | |drivers/gpio/gpio-sim.c:654:14: | 654 | pdev = dev->pdev; | | ~~~~~^~~~~~~~~~~ | | | | | (3) dereference of NULL '<unknown>' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_remove_hogs': >> drivers/gpio/gpio-sim.c:723:17: warning: dereference of NULL 'dev' [CWE-476] >> [-Wanalyzer-null-dereference] 723 | if (!dev->hogs) | ~~~^~~~~~ 'gpio_sim_device_config_group_release': event 1 | | 1479 | static void gpio_sim_device_config_group_release(struct config_item *item) | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (1) entry to 'gpio_sim_device_config_group_release' | 'gpio_sim_device_config_group_release': event 2 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_group_release': event 3 | |cc1: | (3): ...to here | 'gpio_sim_device_config_group_release': events 4-6 | |drivers/gpio/gpio-sim.c:1484:12: | 1484 | if (gpio_sim_device_is_live_unlocked(dev)) | | ^ | | | | | (4) following 'true' branch... | 1485 | gpio_sim_device_deactivate_unlocked(dev); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (5) ...to here | | (6) calling 'gpio_sim_device_deactivate_unlocked' from 'gpio_sim_device_config_group_release' | +--> 'gpio_sim_device_deactivate_unlocked': events 7-8 | | 933 | static void gpio_sim_device_deactivate_unlocked(struct gpio_sim_device *dev) | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (7) entry to 'gpio_sim_device_deactivate_unlocked' |...... | 941 | gpio_sim_remove_hogs(dev); | | ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (8) calling 'gpio_sim_remove_hogs' from 'gpio_sim_device_deactivate_unlocked' | +--> 'gpio_sim_remove_hogs': events 9-10 | | 719 | static void gpio_sim_remove_hogs(struct gpio_sim_device *dev) | | ^~~~~~~~~~~~~~~~~~~~ | | | | | (9) entry to 'gpio_sim_remove_hogs' |...... | 723 | if (!dev->hogs) | | ~~~~~~~~~ | | | | | (10) dereference of NULL 'dev' | drivers/gpio/gpio-sim.c: In function 'gpio_sim_device_config_group_release': drivers/gpio/gpio-sim.c:1489:36: warning: dereference of NULL '0' [CWE-476] [-Wanalyzer-null-dereference] 1489 | ida_free(&gpio_sim_ida, dev->id); | ~~~^~~~ 'gpio_sim_device_config_group_release': event 1 | | 1479 | static void gpio_sim_device_config_group_release(struct config_item *item) | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (1) entry to 'gpio_sim_device_config_group_release' | 'gpio_sim_device_config_group_release': event 2 | |include/linux/configfs.h:92:70: | 92 | return item ? container_of(item,struct config_group,cg_item) : NULL; | 'gpio_sim_device_config_group_release': event 3 | |cc1: | (3): ...to here | 'gpio_sim_device_config_group_release': events 4-6 | |drivers/gpio/gpio-sim.c:1484:12: | 1484 | if (gpio_sim_device_is_live_unlocked(dev)) | | ^ | | | | | (4) following 'true' branch... | 1485 | gpio_sim_device_deactivate_unlocked(dev); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (5) ...to here | | (6) calling 'gpio_sim_device_deactivate_unlocked' from 'gpio_sim_device_config_group_release' | +--> 'gpio_sim_device_deactivate_unlocked': events 7-8 | | 933 | static void gpio_sim_device_deactivate_unlocked(struct gpio_sim_device *dev) | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (7) entry to 'gpio_sim_device_deactivate_unlocked' |...... | 941 | gpio_sim_remove_hogs(dev); | | ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | vim +/0 +574 drivers/gpio/gpio-sim.c cb8c474e79be45 Bartosz Golaszewski 2021-12-07 570 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 571 static struct gpio_sim_device * cb8c474e79be45 Bartosz Golaszewski 2021-12-07 572 gpio_sim_bank_get_device(struct gpio_sim_bank *bank) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 573 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 @574 return bank->parent; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 575 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 576 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 577 struct gpio_sim_hog; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 578 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 579 struct gpio_sim_line { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 580 struct config_group group; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 581 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 582 struct gpio_sim_bank *parent; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 583 struct list_head siblings; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 584 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 585 unsigned int offset; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 586 char *name; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 587 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 588 /* There can only be one hog per line. */ cb8c474e79be45 Bartosz Golaszewski 2021-12-07 589 struct gpio_sim_hog *hog; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 590 }; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 591 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 592 static struct gpio_sim_line *to_gpio_sim_line(struct config_item *item) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 593 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 594 struct config_group *group = to_config_group(item); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 595 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 596 return container_of(group, struct gpio_sim_line, group); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 597 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 598 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 599 static struct gpio_sim_device * cb8c474e79be45 Bartosz Golaszewski 2021-12-07 600 gpio_sim_line_get_device(struct gpio_sim_line *line) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 601 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 602 struct gpio_sim_bank *bank = line->parent; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 603 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 604 return gpio_sim_bank_get_device(bank); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 605 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 606 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 607 struct gpio_sim_hog { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 608 struct config_item item; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 609 struct gpio_sim_line *parent; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 610 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 611 char *name; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 612 int dir; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 613 }; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 614 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 615 static struct gpio_sim_hog *to_gpio_sim_hog(struct config_item *item) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 616 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 617 return container_of(item, struct gpio_sim_hog, item); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 618 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 619 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 620 static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 621 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 622 struct gpio_sim_line *line = hog->parent; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 623 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 624 return gpio_sim_line_get_device(line); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 625 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 626 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 627 static bool gpio_sim_device_is_live_unlocked(struct gpio_sim_device *dev) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 628 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 629 return !!dev->pdev; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 630 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 631 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 632 static char *gpio_sim_strdup_trimmed(const char *str, size_t count) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 633 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 634 char *dup, *trimmed; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 635 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 636 dup = kstrndup(str, count, GFP_KERNEL); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 637 if (!dup) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 638 return NULL; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 639 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 640 trimmed = strstrip(dup); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 641 memmove(dup, trimmed, strlen(trimmed) + 1); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 642 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 643 return dup; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 644 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 645 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 646 static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item, cb8c474e79be45 Bartosz Golaszewski 2021-12-07 647 char *page) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 648 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 649 struct gpio_sim_device *dev = to_gpio_sim_device(item); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 650 struct platform_device *pdev; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 651 int ret; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 652 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 653 mutex_lock(&dev->lock); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 @654 pdev = dev->pdev; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 655 if (pdev) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 656 ret = sprintf(page, "%s\n", dev_name(&pdev->dev)); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 657 else cb8c474e79be45 Bartosz Golaszewski 2021-12-07 658 ret = sprintf(page, "gpio-sim.%d\n", dev->id); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 659 mutex_unlock(&dev->lock); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 660 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 661 return ret; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 662 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 663 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 664 CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 665 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 666 static ssize_t cb8c474e79be45 Bartosz Golaszewski 2021-12-07 667 gpio_sim_device_config_live_show(struct config_item *item, char *page) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 668 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 669 struct gpio_sim_device *dev = to_gpio_sim_device(item); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 670 bool live; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 671 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 672 mutex_lock(&dev->lock); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 673 live = gpio_sim_device_is_live_unlocked(dev); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 674 mutex_unlock(&dev->lock); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 675 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 676 return sprintf(page, "%c\n", live ? '1' : '0'); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 677 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 678 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 679 static char **gpio_sim_make_line_names(struct gpio_sim_bank *bank, cb8c474e79be45 Bartosz Golaszewski 2021-12-07 680 unsigned int *line_names_size) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 681 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 682 unsigned int max_offset = 0; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 683 bool has_line_names = false; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 684 struct gpio_sim_line *line; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 685 char **line_names; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 686 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 687 list_for_each_entry(line, &bank->line_list, siblings) { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 688 if (line->name) { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 689 if (line->offset > max_offset) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 690 max_offset = line->offset; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 691 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 692 /* cb8c474e79be45 Bartosz Golaszewski 2021-12-07 693 * max_offset can stay at 0 so it's not an indicator cb8c474e79be45 Bartosz Golaszewski 2021-12-07 694 * of whether line names were configured at all. cb8c474e79be45 Bartosz Golaszewski 2021-12-07 695 */ cb8c474e79be45 Bartosz Golaszewski 2021-12-07 696 has_line_names = true; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 697 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 698 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 699 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 700 if (!has_line_names) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 701 /* cb8c474e79be45 Bartosz Golaszewski 2021-12-07 702 * This is not an error - NULL means, there are no line cb8c474e79be45 Bartosz Golaszewski 2021-12-07 703 * names configured. cb8c474e79be45 Bartosz Golaszewski 2021-12-07 704 */ cb8c474e79be45 Bartosz Golaszewski 2021-12-07 705 return NULL; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 706 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 707 *line_names_size = max_offset + 1; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 708 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 709 line_names = kcalloc(*line_names_size, sizeof(*line_names), GFP_KERNEL); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 710 if (!line_names) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 711 return ERR_PTR(-ENOMEM); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 712 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 713 list_for_each_entry(line, &bank->line_list, siblings) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 714 line_names[line->offset] = line->name; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 715 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 716 return line_names; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 717 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 718 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 719 static void gpio_sim_remove_hogs(struct gpio_sim_device *dev) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 720 { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 721 struct gpiod_hog *hog; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 722 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 @723 if (!dev->hogs) cb8c474e79be45 Bartosz Golaszewski 2021-12-07 724 return; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 725 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 726 gpiod_remove_hogs(dev->hogs); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 727 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 728 for (hog = dev->hogs; !hog->chip_label; hog++) { cb8c474e79be45 Bartosz Golaszewski 2021-12-07 729 kfree(hog->chip_label); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 730 kfree(hog->line_name); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 731 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 732 cb8c474e79be45 Bartosz Golaszewski 2021-12-07 733 kfree(dev->hogs); cb8c474e79be45 Bartosz Golaszewski 2021-12-07 734 dev->hogs = NULL; cb8c474e79be45 Bartosz Golaszewski 2021-12-07 735 } cb8c474e79be45 Bartosz Golaszewski 2021-12-07 736 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
