[RESEND 3/4 v7] power: supply: Add charger driver for Rockchip RK817
Chris Morgan
macroalpha82 at gmail.com
Fri Jul 29 09:28:28 PDT 2022
On Sun, Jul 24, 2022 at 10:58:00PM +0800, kernel test robot wrote:
> Hi Chris,
>
> Thank you for the patch! Perhaps something to improve:
I'm afraid I'm not sure the best way to fix this. The only thing I can
think of is for now the driver should only be for systems with a
Rockchip RK817 PMIC (to my knowledge only ARM based systems from
Rockchip), but it looks like the arch was set as parisc. Even still,
as long as some of the functions ahead of it don't error out each
of those variables should be used. Is there a way to confirm these
warnings?
Thank you.
>
> [auto build test WARNING on lee-mfd/for-mfd-next]
> [also build test WARNING on sre-power-supply/for-next rockchip/for-next linus/master v5.19-rc7 next-20220722]
> [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/Chris-Morgan/power-supply-Add-Support-for-RK817-Charger/20220722-002431
> base: https://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git for-mfd-next
> config: parisc-allmodconfig (https://download.01.org/0day-ci/archive/20220724/202207242227.mttUkfTB-lkp@intel.com/config)
> compiler: hppa-linux-gcc (GCC) 12.1.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/intel-lab-lkp/linux/commit/008e6f0d590e275cbb56d4506b5638156506dd40
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Chris-Morgan/power-supply-Add-Support-for-RK817-Charger/20220722-002431
> git checkout 008e6f0d590e275cbb56d4506b5638156506dd40
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=parisc SHELL=/bin/bash drivers/power/supply/
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <lkp at intel.com>
>
> All warnings (new ones prefixed by >>):
>
> drivers/power/supply/rk817_charger.c: In function 'rk817_read_or_set_full_charge_on_boot':
> >> drivers/power/supply/rk817_charger.c:701:33: warning: variable 'soc_tmp3' set but not used [-Wunused-but-set-variable]
> 701 | int soc_tmp1, soc_tmp2, soc_tmp3;
> | ^~~~~~~~
> >> drivers/power/supply/rk817_charger.c:701:23: warning: variable 'soc_tmp2' set but not used [-Wunused-but-set-variable]
> 701 | int soc_tmp1, soc_tmp2, soc_tmp3;
> | ^~~~~~~~
> >> drivers/power/supply/rk817_charger.c:701:13: warning: variable 'soc_tmp1' set but not used [-Wunused-but-set-variable]
> 701 | int soc_tmp1, soc_tmp2, soc_tmp3;
> | ^~~~~~~~
>
>
> vim +/soc_tmp3 +701 drivers/power/supply/rk817_charger.c
>
> 692
> 693 static int
> 694 rk817_read_or_set_full_charge_on_boot(struct rk817_charger *charger,
> 695 struct power_supply_battery_info *bat_info)
> 696 {
> 697 struct rk808 *rk808 = charger->rk808;
> 698 u8 bulk_reg[4];
> 699 u32 boot_voltage, boot_charge_mah, tmp;
> 700 int ret, reg, off_time;
> > 701 int soc_tmp1, soc_tmp2, soc_tmp3;
> 702 bool first_boot;
> 703
> 704 /* Check if the battery is uninitalized. If it is, the columb counter
> 705 * needs to be set up.
> 706 */
> 707 ret = regmap_read(rk808->regmap, RK817_GAS_GAUGE_GG_STS, ®);
> 708 if (ret < 0)
> 709 return ret;
> 710 first_boot = reg & RK817_BAT_CON;
> 711 /* If the battery is uninitialized, use the poweron voltage and an ocv
> 712 * lookup to guess our charge. The number won't be very accurate until
> 713 * we hit either our minimum voltage (0%) or full charge (100%).
> 714 */
> 715 if (first_boot) {
> 716 regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_PWRON_VOL_H,
> 717 bulk_reg, 2);
> 718 tmp = get_unaligned_be16(bulk_reg);
> 719 boot_voltage = (charger->voltage_k * tmp) +
> 720 1000 * charger->voltage_b;
> 721 /* Since only implementation has no working thermistor, assume
> 722 * 20C for OCV lookup. If lookup fails, report error with OCV
> 723 * table.
> 724 */
> 725 charger->soc = power_supply_batinfo_ocv2cap(bat_info,
> 726 boot_voltage,
> 727 20) * 1000;
> 728 if (charger->soc < 0)
> 729 charger->soc = 0;
> 730
> 731 /* Guess that full charge capacity is the design capacity */
> 732 charger->fcc_mah = charger->bat_charge_full_design_uah / 1000;
> 733 /* Set battery as "set up". BSP driver uses this value even
> 734 * though datasheet claims it's a read-only value.
> 735 */
> 736 regmap_write_bits(rk808->regmap, RK817_GAS_GAUGE_GG_STS,
> 737 RK817_BAT_CON, 0);
> 738 /* Save nvram values */
> 739 ret = rk817_record_battery_nvram_values(charger);
> 740 if (ret < 0)
> 741 return ret;
> 742 } else {
> 743 ret = rk817_read_battery_nvram_values(charger);
> 744 if (ret < 0)
> 745 return ret;
> 746
> 747 regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
> 748 bulk_reg, 4);
> 749 tmp = get_unaligned_be32(bulk_reg);
> 750 if (tmp < 0)
> 751 tmp = 0;
> 752 boot_charge_mah = ADC_TO_CHARGE_UAH(tmp,
> 753 charger->res_div) / 1000;
> 754 /* Check if the columb counter has been off for more than 300
> 755 * minutes as it tends to drift downward. If so, re-init soc
> 756 * with the boot voltage instead. Note the unit values for the
> 757 * OFF_CNT register appear to be in decaminutes and stops
> 758 * counting at 2550 (0xFF) minutes. BSP kernel used OCV, but
> 759 * for me occasionally that would show invalid values. Boot
> 760 * voltage is only accurate for me on first poweron (not
> 761 * reboots), but we shouldn't ever encounter an OFF_CNT more
> 762 * than 0 on a reboot anyway.
> 763 */
> 764 regmap_read(rk808->regmap, RK817_GAS_GAUGE_OFF_CNT, &off_time);
> 765 if (off_time >= 30) {
> 766 regmap_bulk_read(rk808->regmap,
> 767 RK817_GAS_GAUGE_PWRON_VOL_H,
> 768 bulk_reg, 2);
> 769 tmp = get_unaligned_be16(bulk_reg);
> 770 boot_voltage = (charger->voltage_k * tmp) +
> 771 1000 * charger->voltage_b;
> 772 charger->soc =
> 773 power_supply_batinfo_ocv2cap(bat_info,
> 774 boot_voltage,
> 775 20) * 1000;
> 776 } else {
> 777 charger->soc = (boot_charge_mah * 1000 * 100 /
> 778 charger->fcc_mah);
> 779 }
> 780 }
> 781
> 782 regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_PWRON_VOL_H,
> 783 bulk_reg, 2);
> 784 tmp = get_unaligned_be16(bulk_reg);
> 785 boot_voltage = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
> 786 soc_tmp1 = power_supply_batinfo_ocv2cap(bat_info,
> 787 boot_voltage, 20) * 1000;
> 788 regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
> 789 bulk_reg, 4);
> 790 tmp = get_unaligned_be32(bulk_reg);
> 791 if (tmp < 0)
> 792 tmp = 0;
> 793 boot_charge_mah = ADC_TO_CHARGE_UAH(tmp, charger->res_div) / 1000;
> 794 soc_tmp2 = (boot_charge_mah * 1000 * 100 / charger->fcc_mah);
> 795 regmap_bulk_read(rk808->regmap, RK817_GAS_GAUGE_OCV_VOL_H,
> 796 bulk_reg, 2);
> 797 tmp = get_unaligned_be16(bulk_reg);
> 798 boot_voltage = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
> 799 soc_tmp3 = power_supply_batinfo_ocv2cap(bat_info,
> 800 boot_voltage, 20) * 1000;
> 801
> 802 /* Now we have our full charge capacity and soc, init the columb
> 803 * counter.
> 804 */
> 805 boot_charge_mah = charger->soc * charger->fcc_mah / 100 / 1000;
> 806 if (boot_charge_mah > charger->fcc_mah)
> 807 boot_charge_mah = charger->fcc_mah;
> 808 tmp = CHARGE_TO_ADC(boot_charge_mah, charger->res_div);
> 809 put_unaligned_be32(tmp, bulk_reg);
> 810 ret = regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_Q_INIT_H3,
> 811 bulk_reg, 4);
> 812 if (ret < 0)
> 813 return ret;
> 814
> 815 /* Set QMAX value to max design capacity. */
> 816 tmp = CHARGE_TO_ADC((charger->bat_charge_full_design_uah / 1000),
> 817 charger->res_div);
> 818 put_unaligned_be32(tmp, bulk_reg);
> 819 ret = regmap_bulk_write(rk808->regmap, RK817_GAS_GAUGE_Q_MAX_H3,
> 820 bulk_reg, 4);
> 821 if (ret < 0)
> 822 return ret;
> 823
> 824 return 0;
> 825 }
> 826
>
> --
> 0-DAY CI Kernel Test Service
> https://01.org/lkp
More information about the Linux-rockchip
mailing list