Message ID | 20210627234515.3057935-2-linus.walleij@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | [1/2] dt-bindings: power: Extend battery bindings with type | expand |
Hi Linus, I love your patch! Perhaps something to improve: [auto build test WARNING on power-supply/for-next] [also build test WARNING on v5.13 next-20210625] [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] url: https://github.com/0day-ci/linux/commits/Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 base: https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git for-next config: mips-randconfig-r011-20210628 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 4c92e31dd0f1bd152eda883af20ff7fbcaa14945) 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 # install mips cross compiling tool for clang build # apt-get install binutils-mips-linux-gnu # https://github.com/0day-ci/linux/commit/2bf6622db1c3b0d7e5cad624e16c0a448d37547b git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 git checkout 2bf6622db1c3b0d7e5cad624e16c0a448d37547b # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=mips If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/power/supply/power_supply_core.c:622:12: warning: multiple unsequenced modifications to 'err' [-Wunsequenced] err = err = of_property_read_string(battery_np, "battery-type", &value); ~ ^ 1 warning generated. vim +/err +622 drivers/power/supply/power_supply_core.c 564 565 int power_supply_get_battery_info(struct power_supply *psy, 566 struct power_supply_battery_info *info) 567 { 568 struct power_supply_resistance_temp_table *resist_table; 569 struct device_node *battery_np; 570 const char *value; 571 int err, len, index; 572 const __be32 *list; 573 574 info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 575 info->energy_full_design_uwh = -EINVAL; 576 info->charge_full_design_uah = -EINVAL; 577 info->voltage_min_design_uv = -EINVAL; 578 info->voltage_max_design_uv = -EINVAL; 579 info->precharge_current_ua = -EINVAL; 580 info->charge_term_current_ua = -EINVAL; 581 info->constant_charge_current_max_ua = -EINVAL; 582 info->constant_charge_voltage_max_uv = -EINVAL; 583 info->temp_ambient_alert_min = INT_MIN; 584 info->temp_ambient_alert_max = INT_MAX; 585 info->temp_alert_min = INT_MIN; 586 info->temp_alert_max = INT_MAX; 587 info->temp_min = INT_MIN; 588 info->temp_max = INT_MAX; 589 info->factory_internal_resistance_uohm = -EINVAL; 590 info->resist_table = NULL; 591 592 for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { 593 info->ocv_table[index] = NULL; 594 info->ocv_temp[index] = -EINVAL; 595 info->ocv_table_size[index] = -EINVAL; 596 } 597 598 if (!psy->of_node) { 599 dev_warn(&psy->dev, "%s currently only supports devicetree\n", 600 __func__); 601 return -ENXIO; 602 } 603 604 battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 605 if (!battery_np) 606 return -ENODEV; 607 608 err = of_property_read_string(battery_np, "compatible", &value); 609 if (err) 610 goto out_put_node; 611 612 if (strcmp("simple-battery", value)) { 613 err = -ENODEV; 614 goto out_put_node; 615 } 616 617 /* The property and field names below must correspond to elements 618 * in enum power_supply_property. For reasoning, see 619 * Documentation/power/power_supply_class.rst. 620 */ 621 > 622 err = err = of_property_read_string(battery_np, "battery-type", &value); 623 if (!err) { 624 if (!strcmp("nickel-cadmium", value)) 625 info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; 626 else if (!strcmp("nickel-metal-hydride", value)) 627 info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; 628 else if (!strcmp("lithium-ion", value)) 629 /* Imprecise lithium-ion type */ 630 info->technology = POWER_SUPPLY_TECHNOLOGY_LION; 631 else if (!strcmp("lithium-ion-polymer", value)) 632 info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; 633 else if (!strcmp("lithium-ion-iron-phosphate", value)) 634 info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; 635 else if (!strcmp("lithium-ion-manganese-oxide", value)) 636 info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; 637 else 638 dev_warn(&psy->dev, "%s unknown battery type\n", value); 639 } 640 641 of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", 642 &info->energy_full_design_uwh); 643 of_property_read_u32(battery_np, "charge-full-design-microamp-hours", 644 &info->charge_full_design_uah); 645 of_property_read_u32(battery_np, "voltage-min-design-microvolt", 646 &info->voltage_min_design_uv); 647 of_property_read_u32(battery_np, "voltage-max-design-microvolt", 648 &info->voltage_max_design_uv); 649 of_property_read_u32(battery_np, "trickle-charge-current-microamp", 650 &info->tricklecharge_current_ua); 651 of_property_read_u32(battery_np, "precharge-current-microamp", 652 &info->precharge_current_ua); 653 of_property_read_u32(battery_np, "precharge-upper-limit-microvolt", 654 &info->precharge_voltage_max_uv); 655 of_property_read_u32(battery_np, "charge-term-current-microamp", 656 &info->charge_term_current_ua); 657 of_property_read_u32(battery_np, "re-charge-voltage-microvolt", 658 &info->charge_restart_voltage_uv); 659 of_property_read_u32(battery_np, "over-voltage-threshold-microvolt", 660 &info->overvoltage_limit_uv); 661 of_property_read_u32(battery_np, "constant-charge-current-max-microamp", 662 &info->constant_charge_current_max_ua); 663 of_property_read_u32(battery_np, "constant-charge-voltage-max-microvolt", 664 &info->constant_charge_voltage_max_uv); 665 of_property_read_u32(battery_np, "factory-internal-resistance-micro-ohms", 666 &info->factory_internal_resistance_uohm); 667 668 of_property_read_u32_index(battery_np, "ambient-celsius", 669 0, &info->temp_ambient_alert_min); 670 of_property_read_u32_index(battery_np, "ambient-celsius", 671 1, &info->temp_ambient_alert_max); 672 of_property_read_u32_index(battery_np, "alert-celsius", 673 0, &info->temp_alert_min); 674 of_property_read_u32_index(battery_np, "alert-celsius", 675 1, &info->temp_alert_max); 676 of_property_read_u32_index(battery_np, "operating-range-celsius", 677 0, &info->temp_min); 678 of_property_read_u32_index(battery_np, "operating-range-celsius", 679 1, &info->temp_max); 680 681 len = of_property_count_u32_elems(battery_np, "ocv-capacity-celsius"); 682 if (len < 0 && len != -EINVAL) { 683 err = len; 684 goto out_put_node; 685 } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { 686 dev_err(&psy->dev, "Too many temperature values\n"); 687 err = -EINVAL; 688 goto out_put_node; 689 } else if (len > 0) { 690 of_property_read_u32_array(battery_np, "ocv-capacity-celsius", 691 info->ocv_temp, len); 692 } 693 694 for (index = 0; index < len; index++) { 695 struct power_supply_battery_ocv_table *table; 696 char *propname; 697 int i, tab_len, size; 698 699 propname = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d", index); 700 list = of_get_property(battery_np, propname, &size); 701 if (!list || !size) { 702 dev_err(&psy->dev, "failed to get %s\n", propname); 703 kfree(propname); 704 power_supply_put_battery_info(psy, info); 705 err = -EINVAL; 706 goto out_put_node; 707 } 708 709 kfree(propname); 710 tab_len = size / (2 * sizeof(__be32)); 711 info->ocv_table_size[index] = tab_len; 712 713 table = info->ocv_table[index] = 714 devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 715 if (!info->ocv_table[index]) { 716 power_supply_put_battery_info(psy, info); 717 err = -ENOMEM; 718 goto out_put_node; 719 } 720 721 for (i = 0; i < tab_len; i++) { 722 table[i].ocv = be32_to_cpu(*list); 723 list++; 724 table[i].capacity = be32_to_cpu(*list); 725 list++; 726 } 727 } 728 729 list = of_get_property(battery_np, "resistance-temp-table", &len); 730 if (!list || !len) 731 goto out_put_node; 732 733 info->resist_table_size = len / (2 * sizeof(__be32)); 734 resist_table = info->resist_table = devm_kcalloc(&psy->dev, 735 info->resist_table_size, 736 sizeof(*resist_table), 737 GFP_KERNEL); 738 if (!info->resist_table) { 739 power_supply_put_battery_info(psy, info); 740 err = -ENOMEM; 741 goto out_put_node; 742 } 743 744 for (index = 0; index < info->resist_table_size; index++) { 745 resist_table[index].temp = be32_to_cpu(*list++); 746 resist_table[index].resistance = be32_to_cpu(*list++); 747 } 748 749 out_put_node: 750 of_node_put(battery_np); 751 return err; 752 } 753 EXPORT_SYMBOL_GPL(power_supply_get_battery_info); 754 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Linus, I love your patch! Perhaps something to improve: [auto build test WARNING on power-supply/for-next] [also build test WARNING on v5.13 next-20210625] [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] url: https://github.com/0day-ci/linux/commits/Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 base: https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git for-next config: alpha-randconfig-r003-20210628 (attached as .config) compiler: alpha-linux-gcc (GCC) 9.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://github.com/0day-ci/linux/commit/2bf6622db1c3b0d7e5cad624e16c0a448d37547b git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 git checkout 2bf6622db1c3b0d7e5cad624e16c0a448d37547b # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=alpha If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): drivers/power/supply/power_supply_core.c: In function 'power_supply_get_battery_info': >> drivers/power/supply/power_supply_core.c:622:6: warning: operation on 'err' may be undefined [-Wsequence-point] 622 | err = err = of_property_read_string(battery_np, "battery-type", &value); | ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vim +/err +622 drivers/power/supply/power_supply_core.c 564 565 int power_supply_get_battery_info(struct power_supply *psy, 566 struct power_supply_battery_info *info) 567 { 568 struct power_supply_resistance_temp_table *resist_table; 569 struct device_node *battery_np; 570 const char *value; 571 int err, len, index; 572 const __be32 *list; 573 574 info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 575 info->energy_full_design_uwh = -EINVAL; 576 info->charge_full_design_uah = -EINVAL; 577 info->voltage_min_design_uv = -EINVAL; 578 info->voltage_max_design_uv = -EINVAL; 579 info->precharge_current_ua = -EINVAL; 580 info->charge_term_current_ua = -EINVAL; 581 info->constant_charge_current_max_ua = -EINVAL; 582 info->constant_charge_voltage_max_uv = -EINVAL; 583 info->temp_ambient_alert_min = INT_MIN; 584 info->temp_ambient_alert_max = INT_MAX; 585 info->temp_alert_min = INT_MIN; 586 info->temp_alert_max = INT_MAX; 587 info->temp_min = INT_MIN; 588 info->temp_max = INT_MAX; 589 info->factory_internal_resistance_uohm = -EINVAL; 590 info->resist_table = NULL; 591 592 for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { 593 info->ocv_table[index] = NULL; 594 info->ocv_temp[index] = -EINVAL; 595 info->ocv_table_size[index] = -EINVAL; 596 } 597 598 if (!psy->of_node) { 599 dev_warn(&psy->dev, "%s currently only supports devicetree\n", 600 __func__); 601 return -ENXIO; 602 } 603 604 battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 605 if (!battery_np) 606 return -ENODEV; 607 608 err = of_property_read_string(battery_np, "compatible", &value); 609 if (err) 610 goto out_put_node; 611 612 if (strcmp("simple-battery", value)) { 613 err = -ENODEV; 614 goto out_put_node; 615 } 616 617 /* The property and field names below must correspond to elements 618 * in enum power_supply_property. For reasoning, see 619 * Documentation/power/power_supply_class.rst. 620 */ 621 > 622 err = err = of_property_read_string(battery_np, "battery-type", &value); 623 if (!err) { 624 if (!strcmp("nickel-cadmium", value)) 625 info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; 626 else if (!strcmp("nickel-metal-hydride", value)) 627 info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; 628 else if (!strcmp("lithium-ion", value)) 629 /* Imprecise lithium-ion type */ 630 info->technology = POWER_SUPPLY_TECHNOLOGY_LION; 631 else if (!strcmp("lithium-ion-polymer", value)) 632 info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; 633 else if (!strcmp("lithium-ion-iron-phosphate", value)) 634 info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; 635 else if (!strcmp("lithium-ion-manganese-oxide", value)) 636 info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; 637 else 638 dev_warn(&psy->dev, "%s unknown battery type\n", value); 639 } 640 641 of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", 642 &info->energy_full_design_uwh); 643 of_property_read_u32(battery_np, "charge-full-design-microamp-hours", 644 &info->charge_full_design_uah); 645 of_property_read_u32(battery_np, "voltage-min-design-microvolt", 646 &info->voltage_min_design_uv); 647 of_property_read_u32(battery_np, "voltage-max-design-microvolt", 648 &info->voltage_max_design_uv); 649 of_property_read_u32(battery_np, "trickle-charge-current-microamp", 650 &info->tricklecharge_current_ua); 651 of_property_read_u32(battery_np, "precharge-current-microamp", 652 &info->precharge_current_ua); 653 of_property_read_u32(battery_np, "precharge-upper-limit-microvolt", 654 &info->precharge_voltage_max_uv); 655 of_property_read_u32(battery_np, "charge-term-current-microamp", 656 &info->charge_term_current_ua); 657 of_property_read_u32(battery_np, "re-charge-voltage-microvolt", 658 &info->charge_restart_voltage_uv); 659 of_property_read_u32(battery_np, "over-voltage-threshold-microvolt", 660 &info->overvoltage_limit_uv); 661 of_property_read_u32(battery_np, "constant-charge-current-max-microamp", 662 &info->constant_charge_current_max_ua); 663 of_property_read_u32(battery_np, "constant-charge-voltage-max-microvolt", 664 &info->constant_charge_voltage_max_uv); 665 of_property_read_u32(battery_np, "factory-internal-resistance-micro-ohms", 666 &info->factory_internal_resistance_uohm); 667 668 of_property_read_u32_index(battery_np, "ambient-celsius", 669 0, &info->temp_ambient_alert_min); 670 of_property_read_u32_index(battery_np, "ambient-celsius", 671 1, &info->temp_ambient_alert_max); 672 of_property_read_u32_index(battery_np, "alert-celsius", 673 0, &info->temp_alert_min); 674 of_property_read_u32_index(battery_np, "alert-celsius", 675 1, &info->temp_alert_max); 676 of_property_read_u32_index(battery_np, "operating-range-celsius", 677 0, &info->temp_min); 678 of_property_read_u32_index(battery_np, "operating-range-celsius", 679 1, &info->temp_max); 680 681 len = of_property_count_u32_elems(battery_np, "ocv-capacity-celsius"); 682 if (len < 0 && len != -EINVAL) { 683 err = len; 684 goto out_put_node; 685 } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { 686 dev_err(&psy->dev, "Too many temperature values\n"); 687 err = -EINVAL; 688 goto out_put_node; 689 } else if (len > 0) { 690 of_property_read_u32_array(battery_np, "ocv-capacity-celsius", 691 info->ocv_temp, len); 692 } 693 694 for (index = 0; index < len; index++) { 695 struct power_supply_battery_ocv_table *table; 696 char *propname; 697 int i, tab_len, size; 698 699 propname = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d", index); 700 list = of_get_property(battery_np, propname, &size); 701 if (!list || !size) { 702 dev_err(&psy->dev, "failed to get %s\n", propname); 703 kfree(propname); 704 power_supply_put_battery_info(psy, info); 705 err = -EINVAL; 706 goto out_put_node; 707 } 708 709 kfree(propname); 710 tab_len = size / (2 * sizeof(__be32)); 711 info->ocv_table_size[index] = tab_len; 712 713 table = info->ocv_table[index] = 714 devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 715 if (!info->ocv_table[index]) { 716 power_supply_put_battery_info(psy, info); 717 err = -ENOMEM; 718 goto out_put_node; 719 } 720 721 for (i = 0; i < tab_len; i++) { 722 table[i].ocv = be32_to_cpu(*list); 723 list++; 724 table[i].capacity = be32_to_cpu(*list); 725 list++; 726 } 727 } 728 729 list = of_get_property(battery_np, "resistance-temp-table", &len); 730 if (!list || !len) 731 goto out_put_node; 732 733 info->resist_table_size = len / (2 * sizeof(__be32)); 734 resist_table = info->resist_table = devm_kcalloc(&psy->dev, 735 info->resist_table_size, 736 sizeof(*resist_table), 737 GFP_KERNEL); 738 if (!info->resist_table) { 739 power_supply_put_battery_info(psy, info); 740 err = -ENOMEM; 741 goto out_put_node; 742 } 743 744 for (index = 0; index < info->resist_table_size; index++) { 745 resist_table[index].temp = be32_to_cpu(*list++); 746 resist_table[index].resistance = be32_to_cpu(*list++); 747 } 748 749 out_put_node: 750 of_node_put(battery_np); 751 return err; 752 } 753 EXPORT_SYMBOL_GPL(power_supply_get_battery_info); 754 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Linus, I love your patch! Perhaps something to improve: [auto build test WARNING on power-supply/for-next] [also build test WARNING on v5.13 next-20210625] [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] url: https://github.com/0day-ci/linux/commits/Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 base: https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git for-next config: arm64-randconfig-r033-20210628 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 4c92e31dd0f1bd152eda883af20ff7fbcaa14945) 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 # install arm64 cross compiling tool for clang build # apt-get install binutils-aarch64-linux-gnu # https://github.com/0day-ci/linux/commit/2bf6622db1c3b0d7e5cad624e16c0a448d37547b git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 git checkout 2bf6622db1c3b0d7e5cad624e16c0a448d37547b # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/power/supply/power_supply_core.c:622:12: warning: multiple unsequenced modifications to 'err' [-Wunsequenced] err = err = of_property_read_string(battery_np, "battery-type", &value); ~ ^ 1 warning generated. vim +/err +622 drivers/power/supply/power_supply_core.c 564 565 int power_supply_get_battery_info(struct power_supply *psy, 566 struct power_supply_battery_info *info) 567 { 568 struct power_supply_resistance_temp_table *resist_table; 569 struct device_node *battery_np; 570 const char *value; 571 int err, len, index; 572 const __be32 *list; 573 574 info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 575 info->energy_full_design_uwh = -EINVAL; 576 info->charge_full_design_uah = -EINVAL; 577 info->voltage_min_design_uv = -EINVAL; 578 info->voltage_max_design_uv = -EINVAL; 579 info->precharge_current_ua = -EINVAL; 580 info->charge_term_current_ua = -EINVAL; 581 info->constant_charge_current_max_ua = -EINVAL; 582 info->constant_charge_voltage_max_uv = -EINVAL; 583 info->temp_ambient_alert_min = INT_MIN; 584 info->temp_ambient_alert_max = INT_MAX; 585 info->temp_alert_min = INT_MIN; 586 info->temp_alert_max = INT_MAX; 587 info->temp_min = INT_MIN; 588 info->temp_max = INT_MAX; 589 info->factory_internal_resistance_uohm = -EINVAL; 590 info->resist_table = NULL; 591 592 for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { 593 info->ocv_table[index] = NULL; 594 info->ocv_temp[index] = -EINVAL; 595 info->ocv_table_size[index] = -EINVAL; 596 } 597 598 if (!psy->of_node) { 599 dev_warn(&psy->dev, "%s currently only supports devicetree\n", 600 __func__); 601 return -ENXIO; 602 } 603 604 battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 605 if (!battery_np) 606 return -ENODEV; 607 608 err = of_property_read_string(battery_np, "compatible", &value); 609 if (err) 610 goto out_put_node; 611 612 if (strcmp("simple-battery", value)) { 613 err = -ENODEV; 614 goto out_put_node; 615 } 616 617 /* The property and field names below must correspond to elements 618 * in enum power_supply_property. For reasoning, see 619 * Documentation/power/power_supply_class.rst. 620 */ 621 > 622 err = err = of_property_read_string(battery_np, "battery-type", &value); 623 if (!err) { 624 if (!strcmp("nickel-cadmium", value)) 625 info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; 626 else if (!strcmp("nickel-metal-hydride", value)) 627 info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; 628 else if (!strcmp("lithium-ion", value)) 629 /* Imprecise lithium-ion type */ 630 info->technology = POWER_SUPPLY_TECHNOLOGY_LION; 631 else if (!strcmp("lithium-ion-polymer", value)) 632 info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; 633 else if (!strcmp("lithium-ion-iron-phosphate", value)) 634 info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; 635 else if (!strcmp("lithium-ion-manganese-oxide", value)) 636 info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; 637 else 638 dev_warn(&psy->dev, "%s unknown battery type\n", value); 639 } 640 641 of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", 642 &info->energy_full_design_uwh); 643 of_property_read_u32(battery_np, "charge-full-design-microamp-hours", 644 &info->charge_full_design_uah); 645 of_property_read_u32(battery_np, "voltage-min-design-microvolt", 646 &info->voltage_min_design_uv); 647 of_property_read_u32(battery_np, "voltage-max-design-microvolt", 648 &info->voltage_max_design_uv); 649 of_property_read_u32(battery_np, "trickle-charge-current-microamp", 650 &info->tricklecharge_current_ua); 651 of_property_read_u32(battery_np, "precharge-current-microamp", 652 &info->precharge_current_ua); 653 of_property_read_u32(battery_np, "precharge-upper-limit-microvolt", 654 &info->precharge_voltage_max_uv); 655 of_property_read_u32(battery_np, "charge-term-current-microamp", 656 &info->charge_term_current_ua); 657 of_property_read_u32(battery_np, "re-charge-voltage-microvolt", 658 &info->charge_restart_voltage_uv); 659 of_property_read_u32(battery_np, "over-voltage-threshold-microvolt", 660 &info->overvoltage_limit_uv); 661 of_property_read_u32(battery_np, "constant-charge-current-max-microamp", 662 &info->constant_charge_current_max_ua); 663 of_property_read_u32(battery_np, "constant-charge-voltage-max-microvolt", 664 &info->constant_charge_voltage_max_uv); 665 of_property_read_u32(battery_np, "factory-internal-resistance-micro-ohms", 666 &info->factory_internal_resistance_uohm); 667 668 of_property_read_u32_index(battery_np, "ambient-celsius", 669 0, &info->temp_ambient_alert_min); 670 of_property_read_u32_index(battery_np, "ambient-celsius", 671 1, &info->temp_ambient_alert_max); 672 of_property_read_u32_index(battery_np, "alert-celsius", 673 0, &info->temp_alert_min); 674 of_property_read_u32_index(battery_np, "alert-celsius", 675 1, &info->temp_alert_max); 676 of_property_read_u32_index(battery_np, "operating-range-celsius", 677 0, &info->temp_min); 678 of_property_read_u32_index(battery_np, "operating-range-celsius", 679 1, &info->temp_max); 680 681 len = of_property_count_u32_elems(battery_np, "ocv-capacity-celsius"); 682 if (len < 0 && len != -EINVAL) { 683 err = len; 684 goto out_put_node; 685 } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { 686 dev_err(&psy->dev, "Too many temperature values\n"); 687 err = -EINVAL; 688 goto out_put_node; 689 } else if (len > 0) { 690 of_property_read_u32_array(battery_np, "ocv-capacity-celsius", 691 info->ocv_temp, len); 692 } 693 694 for (index = 0; index < len; index++) { 695 struct power_supply_battery_ocv_table *table; 696 char *propname; 697 int i, tab_len, size; 698 699 propname = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d", index); 700 list = of_get_property(battery_np, propname, &size); 701 if (!list || !size) { 702 dev_err(&psy->dev, "failed to get %s\n", propname); 703 kfree(propname); 704 power_supply_put_battery_info(psy, info); 705 err = -EINVAL; 706 goto out_put_node; 707 } 708 709 kfree(propname); 710 tab_len = size / (2 * sizeof(__be32)); 711 info->ocv_table_size[index] = tab_len; 712 713 table = info->ocv_table[index] = 714 devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 715 if (!info->ocv_table[index]) { 716 power_supply_put_battery_info(psy, info); 717 err = -ENOMEM; 718 goto out_put_node; 719 } 720 721 for (i = 0; i < tab_len; i++) { 722 table[i].ocv = be32_to_cpu(*list); 723 list++; 724 table[i].capacity = be32_to_cpu(*list); 725 list++; 726 } 727 } 728 729 list = of_get_property(battery_np, "resistance-temp-table", &len); 730 if (!list || !len) 731 goto out_put_node; 732 733 info->resist_table_size = len / (2 * sizeof(__be32)); 734 resist_table = info->resist_table = devm_kcalloc(&psy->dev, 735 info->resist_table_size, 736 sizeof(*resist_table), 737 GFP_KERNEL); 738 if (!info->resist_table) { 739 power_supply_put_battery_info(psy, info); 740 err = -ENOMEM; 741 goto out_put_node; 742 } 743 744 for (index = 0; index < info->resist_table_size; index++) { 745 resist_table[index].temp = be32_to_cpu(*list++); 746 resist_table[index].resistance = be32_to_cpu(*list++); 747 } 748 749 out_put_node: 750 of_node_put(battery_np); 751 return err; 752 } 753 EXPORT_SYMBOL_GPL(power_supply_get_battery_info); 754 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Linus, I love your patch! Perhaps something to improve: [auto build test WARNING on power-supply/for-next] [also build test WARNING on v5.13 next-20210625] [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] url: https://github.com/0day-ci/linux/commits/Linus-Walleij/dt-bindings-power-Extend-battery-bindings-with-type/20210628-074842 base: https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git for-next compiler: nios2-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> cppcheck warnings: (new ones prefixed by >>) >> drivers/power/supply/power_supply_core.c:622:6: warning: Redundant assignment of 'err' to itself. [selfAssignment] err = err = of_property_read_string(battery_np, "battery-type", &value); ^ vim +/err +622 drivers/power/supply/power_supply_core.c 564 565 int power_supply_get_battery_info(struct power_supply *psy, 566 struct power_supply_battery_info *info) 567 { 568 struct power_supply_resistance_temp_table *resist_table; 569 struct device_node *battery_np; 570 const char *value; 571 int err, len, index; 572 const __be32 *list; 573 574 info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; 575 info->energy_full_design_uwh = -EINVAL; 576 info->charge_full_design_uah = -EINVAL; 577 info->voltage_min_design_uv = -EINVAL; 578 info->voltage_max_design_uv = -EINVAL; 579 info->precharge_current_ua = -EINVAL; 580 info->charge_term_current_ua = -EINVAL; 581 info->constant_charge_current_max_ua = -EINVAL; 582 info->constant_charge_voltage_max_uv = -EINVAL; 583 info->temp_ambient_alert_min = INT_MIN; 584 info->temp_ambient_alert_max = INT_MAX; 585 info->temp_alert_min = INT_MIN; 586 info->temp_alert_max = INT_MAX; 587 info->temp_min = INT_MIN; 588 info->temp_max = INT_MAX; 589 info->factory_internal_resistance_uohm = -EINVAL; 590 info->resist_table = NULL; 591 592 for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) { 593 info->ocv_table[index] = NULL; 594 info->ocv_temp[index] = -EINVAL; 595 info->ocv_table_size[index] = -EINVAL; 596 } 597 598 if (!psy->of_node) { 599 dev_warn(&psy->dev, "%s currently only supports devicetree\n", 600 __func__); 601 return -ENXIO; 602 } 603 604 battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0); 605 if (!battery_np) 606 return -ENODEV; 607 608 err = of_property_read_string(battery_np, "compatible", &value); 609 if (err) 610 goto out_put_node; 611 612 if (strcmp("simple-battery", value)) { 613 err = -ENODEV; 614 goto out_put_node; 615 } 616 617 /* The property and field names below must correspond to elements 618 * in enum power_supply_property. For reasoning, see 619 * Documentation/power/power_supply_class.rst. 620 */ 621 > 622 err = err = of_property_read_string(battery_np, "battery-type", &value); 623 if (!err) { 624 if (!strcmp("nickel-cadmium", value)) 625 info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; 626 else if (!strcmp("nickel-metal-hydride", value)) 627 info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; 628 else if (!strcmp("lithium-ion", value)) 629 /* Imprecise lithium-ion type */ 630 info->technology = POWER_SUPPLY_TECHNOLOGY_LION; 631 else if (!strcmp("lithium-ion-polymer", value)) 632 info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; 633 else if (!strcmp("lithium-ion-iron-phosphate", value)) 634 info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; 635 else if (!strcmp("lithium-ion-manganese-oxide", value)) 636 info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; 637 else 638 dev_warn(&psy->dev, "%s unknown battery type\n", value); 639 } 640 641 of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", 642 &info->energy_full_design_uwh); 643 of_property_read_u32(battery_np, "charge-full-design-microamp-hours", 644 &info->charge_full_design_uah); 645 of_property_read_u32(battery_np, "voltage-min-design-microvolt", 646 &info->voltage_min_design_uv); 647 of_property_read_u32(battery_np, "voltage-max-design-microvolt", 648 &info->voltage_max_design_uv); 649 of_property_read_u32(battery_np, "trickle-charge-current-microamp", 650 &info->tricklecharge_current_ua); 651 of_property_read_u32(battery_np, "precharge-current-microamp", 652 &info->precharge_current_ua); 653 of_property_read_u32(battery_np, "precharge-upper-limit-microvolt", 654 &info->precharge_voltage_max_uv); 655 of_property_read_u32(battery_np, "charge-term-current-microamp", 656 &info->charge_term_current_ua); 657 of_property_read_u32(battery_np, "re-charge-voltage-microvolt", 658 &info->charge_restart_voltage_uv); 659 of_property_read_u32(battery_np, "over-voltage-threshold-microvolt", 660 &info->overvoltage_limit_uv); 661 of_property_read_u32(battery_np, "constant-charge-current-max-microamp", 662 &info->constant_charge_current_max_ua); 663 of_property_read_u32(battery_np, "constant-charge-voltage-max-microvolt", 664 &info->constant_charge_voltage_max_uv); 665 of_property_read_u32(battery_np, "factory-internal-resistance-micro-ohms", 666 &info->factory_internal_resistance_uohm); 667 668 of_property_read_u32_index(battery_np, "ambient-celsius", 669 0, &info->temp_ambient_alert_min); 670 of_property_read_u32_index(battery_np, "ambient-celsius", 671 1, &info->temp_ambient_alert_max); 672 of_property_read_u32_index(battery_np, "alert-celsius", 673 0, &info->temp_alert_min); 674 of_property_read_u32_index(battery_np, "alert-celsius", 675 1, &info->temp_alert_max); 676 of_property_read_u32_index(battery_np, "operating-range-celsius", 677 0, &info->temp_min); 678 of_property_read_u32_index(battery_np, "operating-range-celsius", 679 1, &info->temp_max); 680 681 len = of_property_count_u32_elems(battery_np, "ocv-capacity-celsius"); 682 if (len < 0 && len != -EINVAL) { 683 err = len; 684 goto out_put_node; 685 } else if (len > POWER_SUPPLY_OCV_TEMP_MAX) { 686 dev_err(&psy->dev, "Too many temperature values\n"); 687 err = -EINVAL; 688 goto out_put_node; 689 } else if (len > 0) { 690 of_property_read_u32_array(battery_np, "ocv-capacity-celsius", 691 info->ocv_temp, len); 692 } 693 694 for (index = 0; index < len; index++) { 695 struct power_supply_battery_ocv_table *table; 696 char *propname; 697 int i, tab_len, size; 698 699 propname = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d", index); 700 list = of_get_property(battery_np, propname, &size); 701 if (!list || !size) { 702 dev_err(&psy->dev, "failed to get %s\n", propname); 703 kfree(propname); 704 power_supply_put_battery_info(psy, info); 705 err = -EINVAL; 706 goto out_put_node; 707 } 708 709 kfree(propname); 710 tab_len = size / (2 * sizeof(__be32)); 711 info->ocv_table_size[index] = tab_len; 712 713 table = info->ocv_table[index] = 714 devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL); 715 if (!info->ocv_table[index]) { 716 power_supply_put_battery_info(psy, info); 717 err = -ENOMEM; 718 goto out_put_node; 719 } 720 721 for (i = 0; i < tab_len; i++) { 722 table[i].ocv = be32_to_cpu(*list); 723 list++; 724 table[i].capacity = be32_to_cpu(*list); 725 list++; 726 } 727 } 728 729 list = of_get_property(battery_np, "resistance-temp-table", &len); 730 if (!list || !len) 731 goto out_put_node; 732 733 info->resist_table_size = len / (2 * sizeof(__be32)); 734 resist_table = info->resist_table = devm_kcalloc(&psy->dev, 735 info->resist_table_size, 736 sizeof(*resist_table), 737 GFP_KERNEL); 738 if (!info->resist_table) { 739 power_supply_put_battery_info(psy, info); 740 err = -ENOMEM; 741 goto out_put_node; 742 } 743 744 for (index = 0; index < info->resist_table_size; index++) { 745 resist_table[index].temp = be32_to_cpu(*list++); 746 resist_table[index].resistance = be32_to_cpu(*list++); 747 } 748 749 out_put_node: 750 of_node_put(battery_np); 751 return err; 752 } 753 EXPORT_SYMBOL_GPL(power_supply_get_battery_info); 754 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index d99e2f11c183..9771a3236932 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -571,6 +571,7 @@ int power_supply_get_battery_info(struct power_supply *psy, int err, len, index; const __be32 *list; + info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; info->energy_full_design_uwh = -EINVAL; info->charge_full_design_uah = -EINVAL; info->voltage_min_design_uv = -EINVAL; @@ -618,6 +619,25 @@ int power_supply_get_battery_info(struct power_supply *psy, * Documentation/power/power_supply_class.rst. */ + err = err = of_property_read_string(battery_np, "battery-type", &value); + if (!err) { + if (!strcmp("nickel-cadmium", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_NiCd; + else if (!strcmp("nickel-metal-hydride", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_NiMH; + else if (!strcmp("lithium-ion", value)) + /* Imprecise lithium-ion type */ + info->technology = POWER_SUPPLY_TECHNOLOGY_LION; + else if (!strcmp("lithium-ion-polymer", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LIPO; + else if (!strcmp("lithium-ion-iron-phosphate", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; + else if (!strcmp("lithium-ion-manganese-oxide", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; + else + dev_warn(&psy->dev, "%s unknown battery type\n", value); + } + of_property_read_u32(battery_np, "energy-full-design-microwatt-hours", &info->energy_full_design_uwh); of_property_read_u32(battery_np, "charge-full-design-microamp-hours", diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index be203985ecdd..9ca1f120a211 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -352,6 +352,7 @@ struct power_supply_resistance_temp_table { */ struct power_supply_battery_info { + unsigned int technology; /* from the enum above */ int energy_full_design_uwh; /* microWatt-hours */ int charge_full_design_uah; /* microAmp-hours */ int voltage_min_design_uv; /* microVolts */
This extends the struct power_supply_battery_info with a "technology" field makes the core DT parser optionally obtain this from the device tree. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- This is needed to migrate the STE AB8500 custom battery bindings and parser to the generic parser. --- drivers/power/supply/power_supply_core.c | 20 ++++++++++++++++++++ include/linux/power_supply.h | 1 + 2 files changed, 21 insertions(+) -- 2.31.1