Re: [PATCH v4] Add multicolor support to BlinkM LED driver

From: kernel test robot
Date: Mon Jan 08 2024 - 07:24:37 EST


Hi Joseph,

kernel test robot noticed the following build warnings:

[auto build test WARNING on pavel-leds/for-next]
[cannot apply to lee-leds/for-leds-next linus/master v6.7 next-20240108]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Joseph-Strauss/Add-multicolor-support-to-BlinkM-LED-driver/20240107-013235
base: git://git.kernel.org/pub/scm/linux/kernel/git/pavel/linux-leds.git for-next
patch link: https://lore.kernel.org/r/20240106172944.7593-1-jstrauss%40mailbox.org
patch subject: [PATCH v4] Add multicolor support to BlinkM LED driver
config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20240108/202401082043.w97LLdJn-lkp@xxxxxxxxx/config)
compiler: s390-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240108/202401082043.w97LLdJn-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401082043.w97LLdJn-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

drivers/leds/leds-blinkm.c: In function 'blinkm_probe':
>> drivers/leds/leds-blinkm.c:721:53: warning: 'snprintf' output may be truncated before the last format character [-Wformat-truncation=]
721 | "blinkm-%d-%d:rgb:indicator",
| ^
drivers/leds/leds-blinkm.c:720:17: note: 'snprintf' output between 25 and 39 bytes into a destination of size 28
720 | snprintf(blinkm_led_name, sizeof(blinkm_led_name),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
721 | "blinkm-%d-%d:rgb:indicator",
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
722 | client->adapter->nr,
| ~~~~~~~~~~~~~~~~~~~~
723 | client->addr);
| ~~~~~~~~~~~~~


vim +/snprintf +721 drivers/leds/leds-blinkm.c

595
596 static int blinkm_probe(struct i2c_client *client,
597 const struct i2c_device_id *id)
598 {
599 struct blinkm_data *data;
600 /* For multicolor support */
601 struct blinkm_led *mc_led;
602 struct mc_subled *mc_led_info;
603 /* 3 seperate classes for red, green, and blue respectively */
604 struct blinkm_led *leds[NUM_LEDS];
605 int err, i;
606 char blinkm_led_name[28];
607
608 data = devm_kzalloc(&client->dev,
609 sizeof(struct blinkm_data), GFP_KERNEL);
610 if (!data) {
611 err = -ENOMEM;
612 goto exit;
613 }
614
615 mc_led_info = devm_kcalloc(&client->dev, NUM_LEDS, sizeof(*mc_led_info),
616 GFP_KERNEL);
617 if (!mc_led_info) {
618 err = -ENOMEM;
619 goto exit;
620 }
621 data->i2c_addr = 0x08;
622 /* i2c addr - use fake addr of 0x08 initially (real is 0x09) */
623 data->fw_ver = 0xfe;
624 /* firmware version - use fake until we read real value
625 * (currently broken - BlinkM confused!) */
626 data->script_id = 0x01;
627 data->i2c_client = client;
628
629 i2c_set_clientdata(client, data);
630 mutex_init(&data->update_lock);
631
632 /* Register sysfs hooks */
633 err = sysfs_create_group(&client->dev.kobj, &blinkm_group);
634 if (err < 0) {
635 dev_err(&client->dev, "couldn't register sysfs group\n");
636 goto exit;
637 }
638
639 if (!IS_ENABLED(CONFIG_LEDS_BLINKM_MULTICOLOR)) {
640 /* Register red, green, and blue sysfs classes */
641 for (i = 0; i < NUM_LEDS; i++) {
642 /* RED = 0, GREEN = 1, BLUE = 2 */
643 leds[i] = &data->blinkm_leds[i];
644 leds[i]->i2c_client = client;
645 leds[i]->id = i;
646 leds[i]->led_cdev.max_brightness = 255;
647 leds[i]->led_cdev.flags = LED_CORE_SUSPENDRESUME;
648 switch (i) {
649 case RED:
650 snprintf(blinkm_led_name, sizeof(blinkm_led_name),
651 "blinkm-%d-%d-red",
652 client->adapter->nr,
653 client->addr);
654 leds[i]->led_cdev.name = blinkm_led_name;
655 leds[i]->led_cdev.brightness_set_blocking =
656 blinkm_led_red_set;
657 err = led_classdev_register(&client->dev,
658 &leds[i]->led_cdev);
659 if (err < 0) {
660 dev_err(&client->dev,
661 "couldn't register LED %s\n",
662 leds[i]->led_cdev.name);
663 goto failred;
664 }
665 break;
666 case GREEN:
667 snprintf(blinkm_led_name, sizeof(blinkm_led_name),
668 "blinkm-%d-%d-green",
669 client->adapter->nr,
670 client->addr);
671 leds[i]->led_cdev.name = blinkm_led_name;
672 leds[i]->led_cdev.brightness_set_blocking =
673 blinkm_led_green_set;
674 err = led_classdev_register(&client->dev,
675 &leds[i]->led_cdev);
676 if (err < 0) {
677 dev_err(&client->dev,
678 "couldn't register LED %s\n",
679 leds[i]->led_cdev.name);
680 goto failgreen;
681 }
682 break;
683 case BLUE:
684 snprintf(blinkm_led_name, sizeof(blinkm_led_name),
685 "blinkm-%d-%d-blue",
686 client->adapter->nr,
687 client->addr);
688 leds[i]->led_cdev.name = blinkm_led_name;
689 leds[i]->led_cdev.brightness_set_blocking =
690 blinkm_led_blue_set;
691 err = led_classdev_register(&client->dev,
692 &leds[i]->led_cdev);
693 if (err < 0) {
694 dev_err(&client->dev,
695 "couldn't register LED %s\n",
696 leds[i]->led_cdev.name);
697 goto failblue;
698 }
699 break;
700 default:
701 break;
702 } /* end switch */
703 } /* end for */
704 } else {
705 /* Register multicolor sysfs class */
706 /* The first element of leds is used for multicolor facilities */
707 mc_led = &data->blinkm_leds[RED];
708 mc_led->i2c_client = client;
709
710 mc_led_info[RED].color_index = LED_COLOR_ID_RED;
711 mc_led_info[GREEN].color_index = LED_COLOR_ID_GREEN;
712 mc_led_info[BLUE].color_index = LED_COLOR_ID_BLUE;
713
714 mc_led->mcled_cdev.subled_info = mc_led_info;
715 mc_led->mcled_cdev.num_colors = NUM_LEDS;
716 mc_led->mcled_cdev.led_cdev.brightness = 255;
717 mc_led->mcled_cdev.led_cdev.max_brightness = 255;
718 mc_led->mcled_cdev.led_cdev.flags = LED_CORE_SUSPENDRESUME;
719
720 snprintf(blinkm_led_name, sizeof(blinkm_led_name),
> 721 "blinkm-%d-%d:rgb:indicator",
722 client->adapter->nr,
723 client->addr);
724 mc_led->mcled_cdev.led_cdev.name = blinkm_led_name;
725 mc_led->mcled_cdev.led_cdev.brightness_set_blocking = blinkm_set_mc_brightness;
726
727 err = led_classdev_multicolor_register(&client->dev, &mc_led->mcled_cdev);
728 if (err < 0) {
729 dev_err(&client->dev, "couldn't register LED %s\n",
730 mc_led->led_cdev.name);
731 goto failmulti;
732 }
733 }
734
735 blinkm_init_hw(client);
736
737 return 0;
738
739 failmulti:
740 led_classdev_unregister(&leds[BLUE]->led_cdev);
741
742 failblue:
743 led_classdev_unregister(&leds[GREEN]->led_cdev);
744
745 failgreen:
746 led_classdev_unregister(&leds[RED]->led_cdev);
747
748 failred:
749 sysfs_remove_group(&client->dev.kobj, &blinkm_group);
750
751 exit:
752 return err;
753 }
754

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki