BQ25792: Driver to integrate with imx8

Part Number: BQ25792
Other Parts Discussed in Thread: BQ25790, BQSTUDIO, BQ25798

Tool/software:

HI,
I am looking for latest driver for BQ25792 to integrate with imx8. 

  • Hi Jeff
    Thankyou for the link,

    we are facing issue while integrating the driver with the bellow log,  Failed to set termination current: -22

    root@imx8mp-lpddr4-evk:~# uname -r
    6.1.55+g770c5fe2c1d1

    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq25790*"
    [ 8.989524] bq25790-charger 0-006b: Line 1009: Watchdog timer: 2000
    [ 8.989541] bq25790-charger 0-006b: Line 1021: Input voltage limit: 4500000
    [ 8.989547] bq25790-charger 0-006b: Line 1032: Input current limit: 1500000
    [ 9.008999] bq25790-charger 0-006b: Line 915: Starting hardware initialization
    [ 9.009015] bq25790-charger 0-006b: Line 931: Watchdog timer value: 0
    [ 9.019667] bq25790-charger 0-006b: Line 951: Setting charge current: 2000000
    [ 9.033920] bq25790-charger 0-006b: Line 958: Setting precharge current: 160000
    [ 9.034339] bq25790-charger 0-006b: Line 966: Setting charge voltage: 4200000
    [ 9.039966] bq25790-charger 0-006b: Line 973: Setting termination current: 160000
    [ 9.039983] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 160000
    [ 9.039989] bq25790-charger 0-006b: Line 976: Failed to set termination current: -22
    [ 9.039993] bq25790-charger 0-006b: Cannot initialize the chip.
    [ 9.183724] bq25790-charger: probe of 0-006b failed with error -22
    root@imx8mp-lpddr4-evk:~#


    I am attaching the driver code which i am using with imx8mp board with bellow dts configuration

    479 bat: battery {
    480 compatible = "simple-battery";
    481 constant-charge-current-max-microamp = <2000000>;
    482 constant-charge-voltage-max-microvolt = <4200000>;
    483 precharge-current-microamp = <160000>;
    484 charge-term-current-microamp = <160000>;
    485 /* charge-term-current-microamp = <200000>;*/  even with 200000 same error.
    486 };
    487
    488 bq25790: charger@6b {
    489 compatible = "ti,bq25790";
    490 reg = <0x6b>;
    491 interrupt-parent = <&gpio1>;
    492 interrupts = <8 IRQ_TYPE_EDGE_FALLING>;
    493 ti,watchdog-timeout-ms = <2000>;
    494 input-current-limit-microamp = <1500000>;
    495 input-voltage-limit-microvolt = <4500000>;
    496 monitored-battery = <&bat>;
    497 };



    #include <linux/module.h>
    #include <linux/i2c.h>
    #include <linux/power_supply.h>
    #include <linux/regmap.h>
    #include <linux/types.h>
    #include <linux/gpio/consumer.h>
    #include <linux/interrupt.h>
    #include <linux/delay.h>
    #include <linux/usb/phy.h>
    
    #include <linux/acpi.h>
    #include <linux/of.h>
    
    #include "bq25790_charger.h"
    
    #define BQ25790_NUM_WD_VAL	8
    
    struct bq25790_init_data {
    	u32 ichg;
    	u32 ilim;
    	u32 vreg;
    	u32 iterm;
    	u32 iprechg;
    	u32 vlim;
    	u32 ichg_max;
    	u32 vreg_max;
    };
    
    struct bq25790_state {
    	bool online;
    	u8 chrg_status;
    	u8 chrg_type;
    	u8 health;
    	u8 chrg_fault;
    	u8 vsys_status;
    	u8 vbus_status;
    	u8 fault_0;
    	u8 fault_1;
    	u32 vbat_adc;
    	u32 vbus_adc;
    	u32 ibat_adc;
    };
    
    struct bq25790_device {
    	struct i2c_client *client;
    	struct device *dev;
    	struct power_supply *charger;
    	struct power_supply *battery;
    	struct mutex lock;
    
    	struct usb_phy *usb2_phy;
    	struct usb_phy *usb3_phy;
    	struct notifier_block usb_nb;
    	struct work_struct usb_work;
    	unsigned long usb_event;
    	struct regmap *regmap;
    
    	char model_name[I2C_NAME_SIZE];
    	int device_id;
    
    	struct bq25790_init_data init_data;
    	struct bq25790_state state;
    	int watchdog_timer;
    };
    
    static struct reg_default bq25790_reg_defs[] = {
    	{BQ25790_INPUT_V_LIM, 0x24},
    	{BQ25790_INPUT_I_LIM_MSB, 0x01},
    	{BQ25790_INPUT_I_LIM_LSB, 0x2c},
    	{BQ25790_PRECHRG_CTRL, 0xc3},
    	{BQ25790_TERM_CTRL, 0x5},
    	{BQ25790_VOTG_REG, 0xdc},
    	{BQ25790_IOTG_REG, 0x4b},
    	{BQ25790_TIMER_CTRL, 0x3d},
    	{BQ25790_CHRG_CTRL_0, 0xa2},
    	{BQ25790_CHRG_CTRL_1, 0x85},
    	{BQ25790_CHRG_CTRL_2, 0x40},
    	{BQ25790_CHRG_CTRL_3, 0x12},
    	{BQ25790_CHRG_CTRL_5, 0x16},
    	{BQ25790_MPPT_CTRL, 0xaa},
    	{BQ25790_TEMP_CTRL, 0xc0},
    	{BQ25790_NTC_CTRL_0, 0x7a},
    	{BQ25790_NTC_CTRL_1, 0x54},
    	{BQ25790_ICO_I_LIM, 0x0},
    	{BQ25790_CHRG_STAT_0, 0x0},
    	{BQ25790_CHRG_STAT_1, 0x0},
    	{BQ25790_CHRG_STAT_2, 0x0},
    	{BQ25790_CHRG_STAT_3, 0x0},
    	{BQ25790_CHRG_STAT_4, 0x0},
    	{BQ25790_FAULT_STAT_0, 0x0},
    	{BQ25790_FAULT_STAT_1, 0x0},
    	{BQ25790_CHRG_FLAG_0, 0x0},
    	{BQ25790_CHRG_FLAG_1, 0x0},
    	{BQ25790_CHRG_FLAG_2, 0x0},
    	{BQ25790_CHRG_FLAG_3, 0x0},
    	{BQ25790_FAULT_FLAG_0, 0x0},
    	{BQ25790_FAULT_FLAG_1, 0x0},
    	{BQ25790_CHRG_MSK_0, 0x0},
    	{BQ25790_CHRG_MSK_1, 0x0},
    	{BQ25790_CHRG_MSK_2, 0x0},
    	{BQ25790_CHRG_MSK_3, 0x0},
    	{BQ25790_FAULT_MSK_0, 0x0},
    	{BQ25790_FAULT_MSK_1, 0x0},
    	{BQ25790_ADC_CTRL, 0x30},
    	{BQ25790_FN_DISABE_0, 0x0},
    	{BQ25790_FN_DISABE_1, 0x0},
    	{BQ25790_ADC_IBUS, 0x0},
    	{BQ25790_ADC_IBAT_MSB, 0x0},
    	{BQ25790_ADC_IBAT_LSB, 0x0},
    	{BQ25790_ADC_VBUS_MSB, 0x0},
    	{BQ25790_ADC_VBUS_LSB, 0x0},
    	{BQ25790_ADC_VAC1, 0x0},
    	{BQ25790_ADC_VAC2, 0x0},
    	{BQ25790_ADC_VBAT_MSB, 0x0},
    	{BQ25790_ADC_VBAT_LSB, 0x0},
    	{BQ25790_ADC_VBUS_MSB, 0x0},
    	{BQ25790_ADC_VBUS_LSB, 0x0},
    	{BQ25790_ADC_TS, 0x0},
    	{BQ25790_ADC_TDIE, 0x0},
    	{BQ25790_ADC_DP, 0x0},
    	{BQ25790_ADC_DM, 0x0},
    	{BQ25790_DPDM_DRV, 0x0},
    	{BQ25790_PART_INFO, 0x0},
    };
    
    static int bq25790_watchdog_time[BQ25790_NUM_WD_VAL] = {0, 500, 1000, 2000,
    							20000, 40000, 80000,
    							160000};
    
    static enum power_supply_usb_type bq25790_usb_type[] = {
    	POWER_SUPPLY_USB_TYPE_PD_DRP,
    	POWER_SUPPLY_USB_TYPE_SDP,
    	POWER_SUPPLY_USB_TYPE_CDP,
    	POWER_SUPPLY_USB_TYPE_DCP,
    	POWER_SUPPLY_USB_TYPE_UNKNOWN,
    };
    
    static int bq25790_usb_notifier(struct notifier_block *nb, unsigned long val,
    				void *priv)
    {
    	struct bq25790_device *bq =
    			container_of(nb, struct bq25790_device, usb_nb);
    
    	bq->usb_event = val;
    	queue_work(system_power_efficient_wq, &bq->usb_work);
    
    	return NOTIFY_OK;
    }
    
    static void bq25790_usb_work(struct work_struct *data)
    {
    	struct bq25790_device *bq =
    			container_of(data, struct bq25790_device, usb_work);
    
    	switch (bq->usb_event) {
    	case USB_EVENT_ID:
    		break;
    
    	case USB_EVENT_NONE:
    		power_supply_changed(bq->charger);
    		break;
    	}
    
    	return;
    
    	dev_err(bq->dev, "Error switching to charger mode.\n");
    }
    
    static int bq25790_get_vbat_adc(struct bq25790_device *bq)
    {
    	int ret;
    	int vbat_adc_lsb, vbat_adc_msb;
    	u16 vbat_adc;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_VBAT_MSB, &vbat_adc_msb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_VBAT_LSB, &vbat_adc_lsb);
    	if (ret)
    		return ret;
    
    	vbat_adc = (vbat_adc_msb << 8) | vbat_adc_lsb;
    
    	return vbat_adc * BQ25790_ADC_VOLT_STEP_uV;
    }
    
    static int bq25790_get_vbus_adc(struct bq25790_device *bq)
    {
    	int ret;
    	int vbus_adc_lsb, vbus_adc_msb;
    	u16 vbus_adc;
    
    	ret = regmap_update_bits(bq->regmap, BQ25790_ADC_CTRL,
    				 BQ25790_ADC_EN, BQ25790_ADC_EN);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_VBUS_MSB, &vbus_adc_msb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_VBUS_LSB, &vbus_adc_lsb);
    	if (ret)
    		return ret;
    
    	vbus_adc = (vbus_adc_msb << 8) | vbus_adc_lsb;
    
    	return vbus_adc * BQ25790_ADC_VOLT_STEP_uV;
    }
    
    static int bq25790_get_ibat_adc(struct bq25790_device *bq)
    {
    	int ret;
    	int ibat_adc_lsb, ibat_adc_msb;
    	u16 ibat_adc;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_IBAT_MSB, &ibat_adc_msb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_ADC_IBAT_LSB, &ibat_adc_lsb);
    	if (ret)
    		return ret;
    
    	ibat_adc = (ibat_adc_msb << 8) | ibat_adc_lsb;
    
    	return ibat_adc * BQ25790_ADC_CURR_STEP_uA;
    }
    
    static int bq25790_get_term_curr(struct bq25790_device *bq)
    {
    	int ret;
    	int reg_val;
    
    	ret = regmap_read(bq->regmap, BQ25790_TERM_CTRL, &reg_val);
    	if (ret)
    		return ret;
    
    	reg_val &= BQ25790_TERMCHRG_CUR_MASK;
    
    	return reg_val * BQ25790_TERMCHRG_CURRENT_STEP_uA;
    }
    
    static int bq25790_get_prechrg_curr(struct bq25790_device *bq)
    {
    	int ret;
    	int reg_val;
    
    	ret = regmap_read(bq->regmap, BQ25790_PRECHRG_CTRL, &reg_val);
    	if (ret)
    		return ret;
    
    	reg_val &= BQ25790_PRECHRG_CUR_MASK;
    
    	return reg_val * BQ25790_PRECHRG_CURRENT_STEP_uA;
    }
    
    static int bq25790_get_ichg_curr(struct bq25790_device *bq)
    {
    	int ret;
    	int ichg, ichg_lsb, ichg_msb;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_I_LIM_LSB, &ichg_lsb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_I_LIM_MSB, &ichg_msb);
    	if (ret)
    		return ret;
    
    	ichg = (ichg_msb << 8) | ichg_lsb;
    
    	return ichg * BQ25790_ICHRG_CURRENT_STEP_uA;
    }
    
    static int bq25790_set_term_curr(struct bq25790_device *bq, int term_current)
    {
    	int reg_val;
    
    	dev_info(bq->dev, "Line %d: bq25790_set_term_curr: term_current = %d\n", __LINE__, term_current);
    
    	if (term_current < BQ25790_TERMCHRG_I_MIN_uA ||
    	    term_current > BQ25790_TERMCHRG_I_MAX_uA)
    
    		dev_err(bq->dev, "Line %d: Termination current out of range: %d\n", __LINE__, term_current);
    		return -EINVAL;
    
    	reg_val = term_current / BQ25790_TERMCHRG_CURRENT_STEP_uA;
    
    	 dev_info(bq->dev, "Line %d: bq25790_set_term_curr: reg_val = %d\n", __LINE__, reg_val);
    
    	return regmap_update_bits(bq->regmap, BQ25790_TERM_CTRL,
    				  BQ25790_TERMCHRG_CUR_MASK, reg_val);
    }
    
    static int bq25790_set_prechrg_curr(struct bq25790_device *bq, int pre_current)
    {
    	int reg_val;
    
    	if (pre_current < BQ25790_PRECHRG_I_MIN_uA ||
    	    pre_current > BQ25790_PRECHRG_I_MAX_uA)
    		return -EINVAL;
    
    	reg_val = pre_current / BQ25790_PRECHRG_CURRENT_STEP_uA;
    
    	return regmap_update_bits(bq->regmap, BQ25790_PRECHRG_CTRL,
    				  BQ25790_PRECHRG_CUR_MASK, reg_val);
    }
    
    static int bq25790_set_ichrg_curr(struct bq25790_device *bq, int chrg_curr)
    {
    	int ret;
    	int ichg, ichg_msb, ichg_lsb;
    
    	if (chrg_curr < BQ25790_ICHRG_I_MIN_uA ||
    	    chrg_curr > BQ25790_ICHRG_I_MAX_uA)
    		return -EINVAL;
    
    	ichg = chrg_curr / BQ25790_ICHRG_CURRENT_STEP_uA;
    	ichg_msb = (ichg >> 8) & 0xff;
    	ret = regmap_write(bq->regmap, BQ25790_CHRG_I_LIM_MSB, ichg_msb);
    	if (ret)
    		return ret;
    
    	ichg_lsb = ichg & 0xff;
    
    	return regmap_write(bq->regmap, BQ25790_CHRG_I_LIM_LSB, ichg_lsb);
    }
    
    static int bq25790_set_chrg_volt(struct bq25790_device *bq, int chrg_volt)
    {
    	int vlim_lsb, vlim_msb, vlim;
    	int ret;
    
    	if (chrg_volt < BQ25790_VREG_V_MIN_uV ||
    	    chrg_volt > BQ25790_VREG_V_MAX_uV)
    		return -EINVAL;
    
    	vlim = chrg_volt / BQ25790_VREG_V_STEP_uV;
    	vlim_msb = (vlim >> 8) & 0xff;
    	ret = regmap_write(bq->regmap, BQ25790_CHRG_V_LIM_MSB, vlim_msb);
    	if (ret)
    		return ret;
    
    	vlim_lsb = vlim & 0xff;
    
    	return regmap_write(bq->regmap, BQ25790_CHRG_V_LIM_LSB, vlim_lsb);
    }
    
    static int bq25790_get_chrg_volt(struct bq25790_device *bq)
    {
    	int ret;
    	int vlim_lsb, vlim_msb, chrg_volt;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_V_LIM_MSB, &vlim_msb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_V_LIM_LSB, &vlim_lsb);
    	if (ret)
    		return ret;
    
    	chrg_volt = (vlim_msb << 8) | vlim_lsb;
    
    	return chrg_volt * BQ25790_VREG_V_STEP_uV;
    }
    
    static int bq25790_set_input_volt_lim(struct bq25790_device *bq, int vindpm)
    {
    	int ret;
    	int vlim_lsb, vlim_msb;
    	int vlim;
    
    	if (vindpm < BQ25790_VINDPM_V_MIN_uV ||
    	    vindpm > BQ25790_VINDPM_V_MAX_uV)
    		return -EINVAL;
    
    	vlim = vindpm / BQ25790_VINDPM_STEP_uV;
    
    	vlim_msb = (vlim >> 8) & 0xff;
    
    	ret = regmap_write(bq->regmap, BQ25790_CHRG_V_LIM_MSB, vlim_msb);
    	if (ret)
    		return ret;
    
    	vlim_lsb = vlim & 0xff;
    
    	return regmap_write(bq->regmap, BQ25790_CHRG_V_LIM_LSB, vlim_lsb);
    }
    
    static int bq25790_get_input_volt_lim(struct bq25790_device *bq)
    {
    	int ret;
    	int vlim;
    
    	ret = regmap_read(bq->regmap, BQ25790_INPUT_V_LIM, &vlim);
    	if (ret)
    		return ret;
    
    	return vlim * BQ25790_VINDPM_STEP_uV;
    }
    
    static int bq25790_set_input_curr_lim(struct bq25790_device *bq, int iindpm)
    {
    	int ret;
    	int ilim, ilim_lsb, ilim_msb;
    
    	if (iindpm < BQ25790_IINDPM_I_MIN_uA ||
    	    iindpm > BQ25790_IINDPM_I_MAX_uA)
    		return -EINVAL;
    
    	ilim = iindpm / BQ25790_IINDPM_STEP_uA;
    	ilim_msb = (ilim >> 8) & 0xff;
    
    	ret = regmap_write(bq->regmap, BQ25790_INPUT_I_LIM_MSB, ilim_msb);
    	if (ret)
    		return ret;
    
    	ilim_lsb = ilim & 0xff;
    
    	return regmap_write(bq->regmap, BQ25790_INPUT_I_LIM_LSB, ilim_lsb);
    }
    
    static int bq25790_get_input_curr_lim(struct bq25790_device *bq)
    {
    	int ret;
    	int ilim_msb, ilim_lsb;
    	u16 ilim;
    
    	ret = regmap_read(bq->regmap, BQ25790_INPUT_I_LIM_MSB, &ilim_msb);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_INPUT_I_LIM_LSB, &ilim_lsb);
    	if (ret)
    		return ret;
    
    	ilim = (ilim_msb << 8) | ilim_lsb;
    
    	return ilim * BQ25790_IINDPM_STEP_uA;
    }
    
    static int bq25790_get_state(struct bq25790_device *bq,
    			     struct bq25790_state *state)
    {
    	int chrg_stat_0, chrg_stat_1, chrg_stat_3, chrg_stat_4;
    	int chrg_ctrl_0, fault_0, fault_1;
    	int ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_STAT_0, &chrg_stat_0);
    	if (ret)
    		return ret;
    
    	state->vbus_status = chrg_stat_0 & BQ25790_VBUS_PRESENT;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_STAT_1, &chrg_stat_1);
    	if (ret)
    		return ret;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_CTRL_0, &chrg_ctrl_0);
    	if (ret)
    		return ret;
    
    	if (chrg_ctrl_0 & BQ25790_CHRG_EN)
    		state->chrg_status = chrg_stat_1 & BQ25790_CHG_STAT_MSK;
    	else
    		state->chrg_status = BQ25790_NOT_CHRGING;
    
    	state->chrg_type = chrg_stat_1 & BQ25790_VBUS_STAT_MSK;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_STAT_4, &chrg_stat_4);
    	if (ret)
    		return ret;
    
    	state->health = chrg_stat_4 & BQ25790_TEMP_MASK;
    
    	ret = regmap_read(bq->regmap, BQ25790_FAULT_STAT_0, &fault_0);
    	if (ret)
    		return ret;
    
    	state->fault_0 = fault_0;
    
    	ret = regmap_read(bq->regmap, BQ25790_FAULT_STAT_1, &fault_1);
    	if (ret)
    		return ret;
    
    	state->fault_1 = fault_1;
    
    	ret = regmap_read(bq->regmap, BQ25790_CHRG_STAT_3, &chrg_stat_3);
    	if (ret)
    		return ret;
    
    	state->online = chrg_stat_3 & BQ25790_VSYS_STAT;
    
    	state->vbat_adc = bq25790_get_vbat_adc(bq);
    
    	state->vbus_adc = bq25790_get_vbus_adc(bq);
    
    	state->ibat_adc = bq25790_get_ibat_adc(bq);
    
    	return 0;
    }
    
    static int bq25790_set_property(struct power_supply *psy,
    		enum power_supply_property prop,
    		const union power_supply_propval *val)
    {
    	struct bq25790_device *bq = power_supply_get_drvdata(psy);
    	int ret = -EINVAL;
    
    	switch (prop) {
    	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
    		ret = bq25790_set_input_curr_lim(bq, val->intval);
    		break;
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
    		ret = bq25790_set_chrg_volt(bq, val->intval);
    		break;
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
    		ret = bq25790_set_ichrg_curr(bq, val->intval);
    		break;
    	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
    		ret = bq25790_set_prechrg_curr(bq, val->intval);
    		break;
    	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
    		ret = bq25790_set_term_curr(bq, val->intval);
    		break;
    	case POWER_SUPPLY_PROP_STATUS:
    		break;
    	case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
    		ret = bq25790_set_input_volt_lim(bq, val->intval);
    		break;
    	default:
    		return -EINVAL;
    	}
    
    	return ret;
    }
    
    static int bq25790_get_property(struct power_supply *psy,
    				enum power_supply_property psp,
    				union power_supply_propval *val)
    {
    	struct bq25790_device *bq = power_supply_get_drvdata(psy);
    	struct bq25790_state state;
    	int ret = 0;
    
    	mutex_lock(&bq->lock);
    	ret = bq25790_get_state(bq, &state);
    	mutex_unlock(&bq->lock);
    	if (ret)
    		return ret;
    
    	switch (psp) {
    	case POWER_SUPPLY_PROP_STATUS:
    		if (!state.chrg_type || (state.chrg_type == BQ25790_OTG_MODE))
    			val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
    		else if (!state.chrg_status)
    			val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
    		else if (state.chrg_status == BQ25790_TERM_CHRG)
    			val->intval = POWER_SUPPLY_STATUS_FULL;
    		else
    			val->intval = POWER_SUPPLY_STATUS_CHARGING;
    		break;
    	case POWER_SUPPLY_PROP_CHARGE_TYPE:
    		switch (state.chrg_status) {
    		case BQ25790_TRICKLE_CHRG:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
    			break;
    		case BQ25790_PRECHRG:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
    			break;
    		case BQ25790_FAST_CHRG:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
    			break;
    		case BQ25790_TAPER_CHRG:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD;
    			break;
    		case BQ25790_TOP_OFF_CHRG:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
    			break;
    		case BQ25790_NOT_CHRGING:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
    			break;
    		default:
    			val->intval = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN;
    		}
    		break;
    	case POWER_SUPPLY_PROP_MANUFACTURER:
    		val->strval = BQ25790_MANUFACTURER;
    		break;
    
    	case POWER_SUPPLY_PROP_MODEL_NAME:
    		val->strval = BQ25790_NAME;
    		break;
    
    	case POWER_SUPPLY_PROP_ONLINE:
    		val->intval = state.online;
    		break;
    	case POWER_SUPPLY_PROP_USB_TYPE:
    		if (!state.chrg_type) {
    			val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
    			break;
    		}
    		switch (state.chrg_type) {
    		case BQ25790_USB_SDP:
    			val->intval = POWER_SUPPLY_USB_TYPE_SDP;
    			break;
    		case BQ25790_USB_CDP:
    			val->intval = POWER_SUPPLY_USB_TYPE_CDP;
    			break;
    		case BQ25790_USB_DCP:
    			val->intval = POWER_SUPPLY_USB_TYPE_DCP;
    			break;
    		case BQ25790_OTG_MODE:
    			val->intval = POWER_SUPPLY_USB_TYPE_PD_DRP;
    			break;
    
    		default:
    			val->intval = POWER_SUPPLY_USB_TYPE_UNKNOWN;
    			break;
    		}
    		break;
    
    	case POWER_SUPPLY_PROP_HEALTH:
    		if (state.fault_1 && (BQ25790_OTG_OVP | BQ25790_VSYS_OVP))
    			val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
    		else
    			val->intval = POWER_SUPPLY_HEALTH_GOOD;
    
    		switch (state.health) {
    		case BQ25790_TEMP_HOT:
    			val->intval = POWER_SUPPLY_HEALTH_HOT;
    			break;
    		case BQ25790_TEMP_WARM:
    			val->intval = POWER_SUPPLY_HEALTH_WARM;
    			break;
    		case BQ25790_TEMP_COOL:
    			val->intval = POWER_SUPPLY_HEALTH_COOL;
    			break;
    		case BQ25790_TEMP_COLD:
    			val->intval = POWER_SUPPLY_HEALTH_COLD;
    			break;
    		}
    		break;
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
    		ret = bq25790_get_ichg_curr(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
    		ret = bq25790_get_chrg_volt(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    
    	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
    		ret = bq25790_get_prechrg_curr(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
    		ret = bq25790_get_term_curr(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
    		val->intval = state.vbus_adc;
    		break;
    	case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
    		ret = bq25790_get_input_volt_lim(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
    		ret = bq25790_get_input_curr_lim(bq);
    		if (ret < 0)
    			return ret;
    
    		val->intval = ret;
    		break;
    	default:
    		return -EINVAL;
    	}
    
    	return ret;
    }
    
    static int bq25790_battery_get_property(struct power_supply *psy,
    				       enum power_supply_property psp,
    				       union power_supply_propval *val)
    {
    	struct bq25790_device *bq = power_supply_get_drvdata(psy);
    	struct bq25790_state state;
    	int ret = 0;
    
    	mutex_lock(&bq->lock);
    	ret = bq25790_get_state(bq, &state);
    	mutex_unlock(&bq->lock);
    	if (ret)
    		return ret;
    
    	ret = regmap_update_bits(bq->regmap, BQ25790_ADC_CTRL,
    				 BQ25790_ADC_EN, BQ25790_ADC_EN);
    	if (ret)
    		return ret;
    
    	switch (psp) {
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
    		val->intval = bq->init_data.ichg_max;
    		break;
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
    		val->intval = bq->init_data.vreg_max;
    		break;
    
    	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
    		val->intval = state.vbat_adc;
    		break;
    	case POWER_SUPPLY_PROP_CURRENT_NOW:
    		val->intval = state.ibat_adc;
    		break;
    	default:
    		return -EINVAL;
    	}
    
    	return ret;
    }
    
    static bool bq25790_state_changed(struct bq25790_device *bq,
    				  struct bq25790_state *new_state)
    {
    	struct bq25790_state old_state;
    
    	mutex_lock(&bq->lock);
    	old_state = bq->state;
    	mutex_unlock(&bq->lock);
    
    	return (old_state.chrg_status != new_state->chrg_status ||
    		old_state.chrg_fault != new_state->chrg_fault	||
    		old_state.online != new_state->online		||
    		old_state.health != new_state->health	||
    		old_state.fault_0 != new_state->fault_0 ||
    		old_state.fault_1 != new_state->fault_1 ||
    		old_state.chrg_type != new_state->chrg_type ||
    		old_state.vsys_status != new_state->vsys_status ||
    		old_state.vbat_adc != new_state->vbat_adc ||
    		old_state.vbus_adc != new_state->vbus_adc ||
    		old_state.ibat_adc != new_state->ibat_adc);
    }
    
    static irqreturn_t bq25790_irq_handler_thread(int irq, void *private)
    {
    	struct bq25790_device *bq = private;
    	struct bq25790_state state;
    	int ret;
    
    	ret = bq25790_get_state(bq, &state);
    	if (ret < 0)
    		goto irq_out;
    
    	if (!bq25790_state_changed(bq, &state))
    		goto irq_out;
    
    	mutex_lock(&bq->lock);
    	bq->state = state;
    	mutex_unlock(&bq->lock);
    
    	power_supply_changed(bq->charger);
    
    irq_out:
    	return IRQ_HANDLED;
    }
    
    static enum power_supply_property bq25790_power_supply_props[] = {
    	POWER_SUPPLY_PROP_MANUFACTURER,
    	POWER_SUPPLY_PROP_MODEL_NAME,
    	POWER_SUPPLY_PROP_STATUS,
    	POWER_SUPPLY_PROP_ONLINE,
    	POWER_SUPPLY_PROP_HEALTH,
    	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
    	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
    	POWER_SUPPLY_PROP_PRECHARGE_CURRENT,
    	POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT,
    	POWER_SUPPLY_PROP_VOLTAGE_NOW,
    	POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT,
    	POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
    	POWER_SUPPLY_PROP_CHARGE_TYPE,
    	POWER_SUPPLY_PROP_USB_TYPE,
    };
    
    static enum power_supply_property bq25790_battery_props[] = {
    	POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
    	POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
    	POWER_SUPPLY_PROP_VOLTAGE_NOW,
    	POWER_SUPPLY_PROP_CURRENT_NOW,
    };
    
    static char *bq25790_charger_supplied_to[] = {
    	"main-battery",
    };
    
    static int bq25790_property_is_writeable(struct power_supply *psy,
    					 enum power_supply_property prop)
    {
    	switch (prop) {
    	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
    	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
    	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
    	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
    	case POWER_SUPPLY_PROP_STATUS:
    	case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT:
    		return true;
    	default:
    		return false;
    	}
    }
    
    static const struct power_supply_desc bq25790_power_supply_desc = {
    	.name = "bq25790-charger",
    	.type = POWER_SUPPLY_TYPE_USB,
    	.usb_types = bq25790_usb_type,
    	.num_usb_types = ARRAY_SIZE(bq25790_usb_type),
    	.properties = bq25790_power_supply_props,
    	.num_properties = ARRAY_SIZE(bq25790_power_supply_props),
    	.get_property = bq25790_get_property,
    	.set_property = bq25790_set_property,
    	.property_is_writeable = bq25790_property_is_writeable,
    };
    
    static const struct power_supply_desc bq25790_battery_desc = {
    	.name = "bq25790-battery",
    	.type = POWER_SUPPLY_TYPE_BATTERY,
    	.get_property = bq25790_battery_get_property,
    	.properties = bq25790_battery_props,
    	.num_properties = ARRAY_SIZE(bq25790_battery_props),
    };
    
    static bool bq25790_is_volatile_reg(struct device *dev, unsigned int reg)
    {
    	switch (reg) {
    	case BQ25790_ICO_I_LIM...BQ25790_FAULT_FLAG_1:
    	case BQ25790_ADC_IBUS...BQ25790_ADC_DM:
    	case BQ25790_CHRG_CTRL_0:
    		return true;
    	default:
    		return false;
    	}
    }
    
    static const struct regmap_config bq25790_regmap_config = {
    	.reg_bits = 8,
    	.val_bits = 8,
    
    	.max_register = BQ25790_PART_INFO,
    	.reg_defaults	= bq25790_reg_defs,
    	.num_reg_defaults = ARRAY_SIZE(bq25790_reg_defs),
    	.cache_type = REGCACHE_RBTREE,
    	.volatile_reg = bq25790_is_volatile_reg,
    };
    
    static int bq25790_power_supply_init(struct bq25790_device *bq,
    							struct device *dev)
    {
    	struct power_supply_config psy_cfg = { .drv_data = bq,
    						.of_node = dev->of_node, };
    
    	psy_cfg.supplied_to = bq25790_charger_supplied_to;
    	psy_cfg.num_supplicants = ARRAY_SIZE(bq25790_charger_supplied_to);
    
    	bq->charger = devm_power_supply_register(bq->dev,
    						 &bq25790_power_supply_desc,
    						 &psy_cfg);
    	if (IS_ERR(bq->charger))
    		return -EINVAL;
    
    	bq->battery = devm_power_supply_register(bq->dev,
    						      &bq25790_battery_desc,
    						      &psy_cfg);
    	if (IS_ERR(bq->battery))
    		return -EINVAL;
    	return 0;
    }
    
    static int bq25790_hw_init(struct bq25790_device *bq)
    {
        struct power_supply_battery_info *bat_info = NULL; // Declare as a pointer
        int wd_reg_val = BQ25790_WATCHDOG_DIS;
        int wd_max_val = BQ25790_NUM_WD_VAL - 1;
        int ret = 0;
        int i;
    
        static struct power_supply_battery_info default_bat_info = { // Static default struct
            .constant_charge_current_max_ua = BQ25790_ICHRG_I_DEF_uA,
            .constant_charge_voltage_max_uv = BQ25790_VREG_V_DEF_uV,
            .precharge_current_ua = BQ25790_PRECHRG_I_DEF_uA,
            .charge_term_current_ua = BQ25790_TERMCHRG_I_DEF_uA,
        };
    
        dev_info(bq->dev, "Line %d: Starting hardware initialization\n", __LINE__);
    
        if (bq->watchdog_timer) {
            if (bq->watchdog_timer >= bq25790_watchdog_time[wd_max_val])
                wd_reg_val = wd_max_val;
            else {
                for (i = 0; i < wd_max_val; i++) {
                    if (bq->watchdog_timer > bq25790_watchdog_time[i] &&
                        bq->watchdog_timer < bq25790_watchdog_time[i + 1]) {
                        wd_reg_val = i;
                        break;
                    }
                }
            }
        }
    
        dev_info(bq->dev, "Line %d: Watchdog timer value: %d\n", __LINE__, wd_reg_val);
    
        ret = regmap_update_bits(bq->regmap, BQ25790_CHRG_CTRL_1,
                                 BQ25790_WATCHDOG_MASK, wd_reg_val);
        if (ret) {
    	    dev_err(bq->dev, "Line %d: Failed to update watchdog bits: %d\n", __LINE__, ret);
            return ret;
        }
    
        ret = power_supply_get_battery_info(bq->charger, &bat_info); // Pass address of pointer
        if (ret) {
            dev_warn(bq->dev, "battery info missing, default values will be applied\n");
            bat_info = &default_bat_info; // Point to default values
            bq->init_data.ichg_max = BQ25790_ICHRG_I_MAX_uA;
            bq->init_data.vreg_max = BQ25790_VREG_V_MAX_uV;
        } else {
            bq->init_data.ichg_max = bat_info->constant_charge_current_max_ua;
            bq->init_data.vreg_max = bat_info->constant_charge_voltage_max_uv;
        }
    
    dev_info(bq->dev, "Line %d: Setting charge current: %d\n", __LINE__, bat_info->constant_charge_current_max_ua);
        ret = bq25790_set_ichrg_curr(bq, bat_info->constant_charge_current_max_ua);
        if (ret){
    	    dev_err(bq->dev, "Line %d: Failed to set charge current: %d\n", __LINE__, ret);
            goto err_out;
        }
    
        dev_info(bq->dev, "Line %d: Setting precharge current: %d\n", __LINE__, bat_info->precharge_current_ua);
    
        ret = bq25790_set_prechrg_curr(bq, bat_info->precharge_current_ua);
        if (ret){
    	    dev_err(bq->dev, "Line %d: Failed to set precharge current: %d\n", __LINE__, ret);
            goto err_out;
        }
    
    	dev_info(bq->dev, "Line %d: Setting charge voltage: %d\n", __LINE__, bat_info->constant_charge_voltage_max_uv);
        ret = bq25790_set_chrg_volt(bq, bat_info->constant_charge_voltage_max_uv);
        if (ret){
    	    dev_err(bq->dev, "Line %d: Failed to set charge voltage: %d\n", __LINE__, ret);
            goto err_out;
        }
    
        dev_info(bq->dev, "Line %d: Setting termination current: %d\n", __LINE__, bat_info->charge_term_current_ua);
        ret = bq25790_set_term_curr(bq, bat_info->charge_term_current_ua);
        if (ret){
    	     dev_err(bq->dev, "Line %d: Failed to set termination current: %d\n", __LINE__, ret);
            goto err_out;
        }
    
        ret = bq25790_set_input_volt_lim(bq, bq->init_data.vlim);
        if (ret){
    	    dev_err(bq->dev, "Line %d: Failed to set input voltage limit: %d\n", __LINE__, ret);
            goto err_out;
        }
    
        ret = bq25790_set_input_curr_lim(bq, bq->init_data.ilim);
        if (ret){
    	    dev_err(bq->dev, "Line %d: Failed to set input current limit: %d\n", __LINE__, ret);
            goto err_out;
        }
    
         dev_info(bq->dev, "Line %d: Hardware initialization completed successfully\n", __LINE__ );
    err_out:
        return ret;
    }
    
    static int bq25790_parse_dt(struct bq25790_device *bq)
    {
    	int ret;
    	ret = device_property_read_u32(bq->dev, "ti,watchdog-timeout-ms",
    				       &bq->watchdog_timer);
    	if (ret)
    		bq->watchdog_timer = BQ25790_WATCHDOG_DIS;
    
    	if (bq->watchdog_timer > BQ25790_WATCHDOG_MAX ||
    	    bq->watchdog_timer < BQ25790_WATCHDOG_DIS)
    		return -EINVAL;
    
    	dev_info(bq->dev, "Line %d: Watchdog timer: %d\n", __LINE__, bq->watchdog_timer);
    
    	ret = device_property_read_u32(bq->dev,
    				       "input-voltage-limit-microvolt",
    				       &bq->init_data.vlim);
    	if (ret)
    		bq->init_data.vlim = BQ25790_VINDPM_DEF_uV;
    
    	if (bq->init_data.vlim > BQ25790_VINDPM_V_MAX_uV ||
    	    bq->init_data.vlim < BQ25790_VINDPM_V_MIN_uV)
    		return -EINVAL;
    
    	dev_info(bq->dev, "Line %d: Input voltage limit: %d\n", __LINE__, bq->init_data.vlim);
    
    	ret = device_property_read_u32(bq->dev,
    				       "input-current-limit-microamp",
    				       &bq->init_data.ilim);
    	if (ret)
    		bq->init_data.ilim = BQ25790_IINDPM_DEF_uA;
    
    	if (bq->init_data.ilim > BQ25790_IINDPM_I_MAX_uA ||
    	    bq->init_data.ilim < BQ25790_IINDPM_I_MIN_uA)
    		return -EINVAL;
    	dev_info(bq->dev, "Line %d: Input current limit: %d\n", __LINE__, bq->init_data.ilim);
    
    
    	return 0;
    }
    
    static int bq25790_probe(struct i2c_client *client,
    			 const struct i2c_device_id *id)
    {
    	struct device *dev = &client->dev;
    	struct bq25790_device *bq;
    	int ret;
    
    	bq = devm_kzalloc(dev, sizeof(*bq), GFP_KERNEL);
    	if (!bq)
    		return -ENOMEM;
    
    	bq->client = client;
    	bq->dev = dev;
    
    	mutex_init(&bq->lock);
    
    	strncpy(bq->model_name, id->name, I2C_NAME_SIZE);
    
    	bq->regmap = devm_regmap_init_i2c(client, &bq25790_regmap_config);
    	if (IS_ERR(bq->regmap)) {
    		dev_err(dev, "Failed to allocate register map\n");
    		return PTR_ERR(bq->regmap);
    	}
    
    	i2c_set_clientdata(client, bq);
    
    	ret = bq25790_parse_dt(bq);
    	if (ret) {
    		dev_err(dev, "Failed to read device tree properties%d\n", ret);
    		return ret;
    	}
    
    	/* OTG reporting */
    	bq->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
    	if (!IS_ERR_OR_NULL(bq->usb2_phy)) {
    		INIT_WORK(&bq->usb_work, bq25790_usb_work);
    		bq->usb_nb.notifier_call = bq25790_usb_notifier;
    		usb_register_notifier(bq->usb2_phy, &bq->usb_nb);
    	}
    
    	bq->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
    	if (!IS_ERR_OR_NULL(bq->usb3_phy)) {
    		INIT_WORK(&bq->usb_work, bq25790_usb_work);
    		bq->usb_nb.notifier_call = bq25790_usb_notifier;
    		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
    	}
    
    	if (client->irq) {
    		ret = devm_request_threaded_irq(dev, client->irq, NULL,
    						bq25790_irq_handler_thread,
    						IRQF_TRIGGER_FALLING |
    						IRQF_ONESHOT,
    						dev_name(&client->dev), bq);
    		if (ret)
    			goto error_out;
    	}
    
    	ret = bq25790_power_supply_init(bq, dev);
    	if (ret) {
    		dev_err(dev, "Failed to register power supply\n");
    		goto error_out;
    	}
    
    	ret = bq25790_hw_init(bq);
    	if (ret) {
    		dev_err(dev, "Cannot initialize the chip.\n");
    		goto error_out;
    	}
    
    	return ret;
    error_out:
    	if (!IS_ERR_OR_NULL(bq->usb2_phy))
    		usb_unregister_notifier(bq->usb2_phy, &bq->usb_nb);
    
    	if (!IS_ERR_OR_NULL(bq->usb3_phy))
    		usb_unregister_notifier(bq->usb3_phy, &bq->usb_nb);
    	return ret;
    }
    
    static const struct i2c_device_id bq25790_i2c_ids[] = {
    	{ BQ25790_NAME, 0 },
    	{ BQ25792_NAME, 1 },
    	{},
    };
    MODULE_DEVICE_TABLE(i2c, bq25790_i2c_ids);
    
    static const struct of_device_id bq25790_of_match[] = {
    	{ .compatible = "ti,bq25790", },
    	{ .compatible = "ti,bq25792", },
    	{ },
    };
    MODULE_DEVICE_TABLE(of, bq25790_of_match);
    
    static const struct acpi_device_id bq25790_acpi_match[] = {
    	{BQ25790_NAME, 0},
    	{BQ25792_NAME, 0},
    	{},
    };
    MODULE_DEVICE_TABLE(acpi, bq25790_acpi_match);
    
    static struct i2c_driver bq25790_driver = {
    	.driver = {
    		.name = "bq25790-charger",
    		.of_match_table = bq25790_of_match,
    		.acpi_match_table = ACPI_PTR(bq25790_acpi_match),
    	},
    	.probe = bq25790_probe,
    	.id_table = bq25790_i2c_ids,
    };
    module_i2c_driver(bq25790_driver);
    
    MODULE_AUTHOR("Dan Murphy <dmurphy@ti.com>");
    MODULE_AUTHOR("Ricardo Rivera-Matos <r-rivera-matos@ti.com>");
    MODULE_DESCRIPTION("bq25790 charger driver");
    MODULE_LICENSE("GPL v2");
    

  • Hi Master j,

    There is no restriction on that register.  If you can write to precharge register, you should be able to write to term register by simply changing the register address.  I do not see any obvious issues with the code.

    Regards,

    Jeff

  • Hi Jeff 
    Thank you for your inputs, 

    Now We are able to load the driver, but i do not see battery getting charged, 
    Connected Battery detail's
    single cell 10,000mah 3.7v, 37wh 
     
    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 8.071736] bq25790-charger 0-006b: Line 1007: Watchdog timer: 40000
    [ 8.071755] bq25790-charger 0-006b: Line 1019: Input voltage limit: 4500000
    [ 8.071760] bq25790-charger 0-006b: Line 1030: Input current limit: 1500000
    [ 8.133903] bq25790-charger 0-006b: Line 913: Starting hardware initialization
    [ 8.133919] bq25790-charger 0-006b: Line 929: Watchdog timer value: 0
    [ 8.134344] bq25790-charger 0-006b: Line 949: Setting charge current: 2000000
    [ 8.134935] bq25790-charger 0-006b: Line 956: Setting precharge current: 180000
    [ 8.135649] bq25790-charger 0-006b: Line 964: Setting charge voltage: 4200000
    [ 8.136244] bq25790-charger 0-006b: Line 971: Setting termination current: 200000
    [ 8.136256] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 8.136261] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 8.137381] bq25790-charger 0-006b: Line 990: Hardware initialization completed successfully
    root@imx8mp-lpddr4-evk:~#

    root@imx8mp-lpddr4-evk:/lib/modules/6.1.55+g770c5fe2c1d1/kernel/drivers/power/supply# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 2c 00 8f c4 04 23 00 dc 4b 3d a2 ???.?,.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a 54 00 8f 09 0a 01 00 08 ?@.????zT.????.?
    20: 00 00 89 10 40 08 00 40 00 00 00 00 00 00 b0 00 ..??@?.@......?.
    30: 00 02 b3 00 00 14 40 00 1a 00 00 0e bf 0f e6 03 .??..?@.?..?????
    40: 5d 00 42 00 00 00 00 00 08 ff ff ff ff ff ff ff ].B.....?.......
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    root@imx8mp-lpddr4-evk:
    root@imx8mp-lpddr4-evk:~# upower -i /org/freedesktop/UPower/devices/battery_bq25790_battery
    native-path: bq25790-battery
    power supply: yes
    updated: Wed Aug 7 17:36:48 2024 (54 seconds ago)
    has history: yes
    has statistics: yes
    battery
    present: yes
    rechargeable: yes
    state: empty
    warning-level: none
    energy: 0 Wh
    energy-empty: 0 Wh
    energy-full: 0 Wh
    energy-full-design: 0 Wh
    energy-rate: 0 W
    voltage: 3.775 V
    charge-cycles: N/A
    percentage: 0%
    capacity: 100%
    icon-name: 'battery-empty-symbolic'

    root@imx8mp-lpddr4-evk:~#

  • Hi Master J,

    The registers are reporting VACx not present and TS Cold.  Is power not being applied to VACx/VBUS?  If thermistor is not attached, you can disable TS function using REG0x18[1].

    Regards,
    Jeff

  • Hi, jeff 
    This i my circuit design  for BQ25792 and battery. 
    Ya i have set REG0x18[1] it in disable mode.



    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 2c 00 8f c4 05 23 00 dc 4b 3d a2 ???.?,.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a 16 00 8f 09 0a 01 00 08 ?@.????z?.????.?
    20: 00 00 89 10 40 08 00 00 00 00 00 00 00 00 b0 00 ..??@?........?.
    30: 00 02 8a 00 00 14 4e 00 10 00 16 0e 6f 0f 4a 03 .??..?N.?.??o?J?
    40: 5c 00 3f 00 00 00 00 00 08 ff ff ff ff ff ff ff \.?.....?.......
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    root@imx8mp-lpddr4-evk:~#

  • Hi,

    The register dump above still shows TS Cold with REG18[0] =0.  I mistyped REG18[1] before.    Also on the schematic,

    1. VAC1=VAC2.  With ACDRVx=GND, VAC1 and VAC2 must be tied to VBUS.  

    2. There is minimum capacitance after derating for applied DC voltage and temperature on BAT pin = 3uF

    3.  I see a VDD_5V with an arrow pointing to the SYS node.  Hopefully that is not a separate 5V power source attached to SYS?  When V(BAT)>MINSYS, the internal BATFET turns on full so any external power source applied at SYS would be shorted to BAT.

    Regards,

    Jeff

  • Hi,

    The register dump above still shows TS Cold with REG18[0] =0.  I mistyped REG18[1] before.    Also on the schematic,

    1. VAC1=VAC2.  With ACDRVx=GND, VAC1 and VAC2 must be tied to VBUS.  : Yes VAC1 VAC2 connected to VBUS.

    2. There is minimum capacitance after derating for applied DC voltage and temperature on BAT pin = 3uF. OK, does this impact for charging the battery?

    3.  I see a VDD_5V with an arrow pointing to the SYS node.  Hopefully that is not a separate 5V power source attached to SYS?  When V(BAT)>MINSYS, the internal BATFET turns on full so any external power source applied at SYS would be shorted to BAT. : Yes it is same.

    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 2b 00 8f c4 04 23 00 dc 4b 3d a2 ???.?+.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a 10 00 8f 0f 0a 01 00 08 ?@.????z?.????.?
    20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b0 00 ..............?.
    30: 00 02 e3 00 00 13 5c 13 26 13 5c 0e 64 0f 38 03 .??..?\?&?\?d?8?
    40: 5e 00 41 00 00 00 00 00 08 ff ff ff ff ff ff ff ^.A.....?.......
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 8.799365] bq25790-charger 0-006b: Line 1007: Watchdog timer: 2000
    [ 8.799382] bq25790-charger 0-006b: Line 1019: Input voltage limit: 4500000
    [ 8.799387] bq25790-charger 0-006b: Line 1030: Input current limit: 1500000
    [ 8.811946] bq25790-charger 0-006b: Line 913: Starting hardware initialization
    [ 8.811962] bq25790-charger 0-006b: Line 929: Watchdog timer value: 0
    [ 8.828492] bq25790-charger 0-006b: Line 949: Setting charge current: 2000000
    [ 8.829896] bq25790-charger 0-006b: Line 956: Setting precharge current: 180000
    [ 8.830220] bq25790-charger 0-006b: Line 964: Setting charge voltage: 4200000
    [ 8.830804] bq25790-charger 0-006b: Line 971: Setting termination current: 200000
    [ 8.830822] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 8.830826] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 8.862656] bq25790-charger 0-006b: Line 990: Hardware initialization completed successfully
    root@imx8mp-lpddr4-evk:~#




  • Hi Master J,

    Register 0x1F is still reporting TS cold and Register 0x18 still has TS cold = 0.  So either disable TS function with Register 0x18[0]=1 or apply 2.5V to TS pin or connect TS pin to 10kohm resistor/thermistor or change TS pin resistor so that they are equal to each other.

    Regards,

    Jeff

  • Hi Jeff,

    we are using bellow commands to set 

    i2cset -y -f 0 0x6b 0x1f 0xAE


    i2cset -y -f 0 0x6b 0x18 0xD4

    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 2b 00 8f c4 05 23 00 dc 4b 3d a2 ???.?+.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a d4 00 8f 0f 0a 01 00 08 ?@.????z?.????.?
    20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b0 00 ..............?.
    30: 00 03 6d 00 00 14 64 14 66 14 4e 0e 5a 0f 22 03 .?m..?d?f?N?Z?"?
    40: 5d d7 XX XX XX XX XX XX XX XX XX XX XX XX XX XX ]?XXXXXXXXXXXXXX
    50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    root@imx8mp-lpddr4-evk:~#

    we tried with connecting TS pin to 10kohm resistor

    after connecting TS pin to 10kohm resistor


    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 03 XX XX XX XX XX XX XX XX XX XX XX XX XX XX ??XXXXXXXXXXXXXX
    10: XX XX XX XX XX XX XX XX XX XX XX XX 6a 21 d7 XX XXXXXXXXXXXXj!?X
    20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq2579*"
    [ 8.920788] bq25790-charger 0-006b: Line 1007: Watchdog timer: 2000
    [ 8.920802] bq25790-charger 0-006b: Line 1019: Input voltage limit: 4500000
    [ 8.920807] bq25790-charger 0-006b: Line 1030: Input current limit: 1500000
    [ 9.039706] bq25790-charger 0-006b: Line 913: Starting hardware initialization
    [ 9.039718] bq25790-charger 0-006b: Line 929: Watchdog timer value: 0
    [ 9.044063] bq25790-charger 0-006b: Line 949: Setting charge current: 2000000
    [ 9.045285] bq25790-charger 0-006b: Line 956: Setting precharge current: 180000
    [ 9.047803] bq25790-charger 0-006b: Line 964: Setting charge voltage: 4200000
    [ 9.048414] bq25790-charger 0-006b: Line 971: Setting termination current: 200000
    [ 9.048429] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 9.048434] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 9.050286] bq25790-charger 0-006b: Line 990: Hardware initialization completed successfully
    root@imx8mp-lpddr4-evk:~#
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

     static struct reg_default bq25790_reg_defs[] = {

    {BQ25790_NTC_CTRL_1, 0x54}, /// i will change it 0xD4 . okay ?


    Can you please tell me which all values need to be set, in driver default reg, ? to set TS function disabled.






  • Hi Master j,

    Can you add at least a 10uF cap on BAT pin?

    To disable TS function, set REG0x18[0]=1.

    Regards,

    Jeff

  • Hi Jeff,

    Good morning,

    1. Can you add at least a 10uF cap on BAT pin? OK will connect.

    2. To disable TS function, set REG0x18[0]=1

    {BQ25790_NTC_CTRL_1, 0x54}, /// i will change it 0xD4 . Can I do this ?

    3. Is that updated attached schematic is correct with respect to TS ?

  • Hi Master j,

    Regarding 2, to disable TS and keep the other NTC settings, write 0xD5.

    Regarding 3, yes, the 10k ohm resistor should fool the charger into thinking the thermistor is at 25C and not report TS_COLD.  You could then write 0xD4.

    Regards,

    Jeff

  • Hi Jeff,

    I have connected 10uF cap on BAT and set  0xD5.

    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 8.917583] bq25790-charger 0-006b: Line 998: Watchdog timer: 2000
    [ 8.917605] bq25790-charger 0-006b: Line 1007: Input voltage limit: 4500000
    [ 8.917610] bq25790-charger 0-006b: Line 1015: Input current limit: 1500000
    [ 9.016417] bq25790-charger 0-006b: Line 907: Starting hardware initialization
    [ 9.016431] bq25790-charger 0-006b: Line 922: Watchdog timer value: 0
    [ 9.017613] bq25790-charger 0-006b: Line 941: Setting charge current: 2000000
    [ 9.022777] bq25790-charger 0-006b: Line 948: Setting precharge current: 180000
    [ 9.023356] bq25790-charger 0-006b: Line 956: Setting charge voltage: 4200000
    [ 9.023975] bq25790-charger 0-006b: Line 963: Setting termination current: 200000
    [ 9.023994] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 9.023999] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 9.032774] bq25790-charger 0-006b: Line 982: Hardware initialization completed successfully
    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 24 00 96 c4 04 23 00 dc 4b 3d a2 ???.?$.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a d5 00 32 00 00 01 00 00 ?@.????z?.2..?..
    20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b0 00 ..............?.
    30: 00 00 04 ff f3 00 00 00 00 00 00 0d 8e 0d 8e 03 ..?.?......?????
    40: 5a 00 3d 00 00 00 00 00 08 ff ff ff ff ff ff ff Z.=.....?.......
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    root@imx8mp-lpddr4-evk:~#

    root@imx8mp-lpddr4-evk:~# upower -i /org/freedesktop/UPower/devices/battery_bq25790_battery
    native-path: bq25790-battery
    power supply: yes
    updated: Thu Aug 15 03:47:31 2024 (16 seconds ago)
    has history: yes
    has statistics: yes
    battery
    present: yes
    rechargeable: yes
    state: empty
    warning-level: none
    energy: 0 Wh
    energy-empty: 0 Wh
    energy-full: 0 Wh
    energy-full-design: 0 Wh
    energy-rate: 0 W
    voltage: 3.433 V
    charge-cycles: N/A
    percentage: 0%
    capacity: 100%
    icon-name: 'battery-empty-symbolic'

    root@imx8mp-lpddr4-evk:~#

    1. is my battery charging ?
    2. If NO. what changes need to be done?

     

  • Hi Master J,

    No. The status registers are reporting no input voltage at VBUS so the charger is not charging.  You can quickly identify the status and faults by downloading BQSTUDIO, selecting charger then BQ25792 or BQ25798, changing to Field View and then typing in your register dump for 0x1B-0x27

    Regards,

    Jeff

  • Hi Jeff, 
    We see input voltage given to battery  charger  VBUS, VAC1, & VAC2 is 5V checked by Multi meter.


    I have doubt, we have connected  CE pin to ground is that making an issue,  

    REG0E_Timer_Control Register is 3D , 1h = Enabled.

  • Hi Master j,

    The register dump you sent was when there was no input voltage or at least the charger didn't think there was an input voltage.  /CE pin = GND is correct.  REG03 is set correctly.

    Regards,

    Jeff 

  • Hi Jeff 

    When i set write i2cset -y -f 0 0x6b 0x18 0xD5, rest configuration is same with DTs and driver code as attached in the previews text, 10uF Capacitor connected.
    i am getting the bellow failure to load the driver is there any thing am i missing ?

    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 8.438584] bq25790-charger 0-006b: Line 998: Watchdog timer: 2000
    [ 8.438593] bq25790-charger 0-006b: Line 1007: Input voltage limit: 4500000
    [ 8.438598] bq25790-charger 0-006b: Line 1015: Input current limit: 1500000
    [ 8.723695] bq25790-charger 0-006b: Line 907: Starting hardware initialization
    [ 8.723712] bq25790-charger 0-006b: Line 922: Watchdog timer value: 0
    [ 8.726100] bq25790-charger 0-006b: Line 941: Setting charge current: 2000000
    [ 8.726929] bq25790-charger 0-006b: Line 948: Setting precharge current: 160000
    [ 8.728937] bq25790-charger 0-006b: Line 956: Setting charge voltage: 4200000
    [ 8.881581] bq25790-charger 0-006b: Line 963: Setting termination current: 200000
    [ 8.881600] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 8.881606] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 8.909500] bq25790-charger 0-006b: Line 982: Hardware initialization completed successfully
    [ 9.020936] power_supply bq25790-battery: driver failed to report `constant_charge_current_max' property: -6
    root@imx8mp-lpddr4-evk:~#

    some time some random errors 


    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 7.998248] bq25790-charger 0-006b: Line 998: Watchdog timer: 2000
    [ 7.998265] bq25790-charger 0-006b: Line 1007: Input voltage limit: 4500000
    [ 7.998270] bq25790-charger 0-006b: Line 1015: Input current limit: 1500000
    [ 8.026557] bq25790-charger 0-006b: Line 907: Starting hardware initialization
    [ 8.026573] bq25790-charger 0-006b: Line 922: Watchdog timer value: 0
    [ 8.128591] bq25790-charger 0-006b: Line 926: Failed to update watchdog bits: -110
    [ 8.128607] bq25790-charger 0-006b: Cannot initialize the chip.
    [ 8.323602] bq25790-charger: probe of 0-006b failed with error -110
    root@imx8mp-lpddr4-evk:~#

  • Hi Master j,

    Unfortunately, I don't see the error.

    Regards,

    Jeff

  • Hi Jeff,
    Here is the scenario when i wont give power supply to the board i dont see any errors has in the bellow,

    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 01 a4 00 c8 2b 00 8f c4 05 23 00 dc 4b 3d a2 ???.?+.???#.?K=?
    10: 80 40 00 01 16 aa c0 7a d5 00 32 00 00 01 00 00 ?@.????z?.2..?..
    20: 00 00 cf 90 40 00 00 00 00 00 00 00 00 00 b0 00 ..??@.........?.
    30: 00 00 01 00 00 00 00 00 00 00 00 0d aa 0d aa 03 ..?........?????
    40: 5a 00 37 00 00 00 00 00 08 ff ff ff ff ff ff ff Z.7.....?.......
    50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
    root@imx8mp-lpddr4-evk:~# upower -e
    [ 752.217048] audit: type=1334 audit(1677842155.920:18): prog-id=15 op=LOAD
    [ 752.223908] audit: type=1334 audit(1677842155.928:19): prog-id=16 op=LOAD
    /org/freedesktop/UPower/devices/battery_bq25790_battery
    /org/freedesktop/UPower/devices/line_power_bq25790_charger
    /org/freedesktop/UPower/devices/DisplayDevice
    root@imx8mp-lpddr4-evk:~# upower -i /org/freedesktop/UPower/devices/battery_bq25790_battery
    native-path: bq25790-battery
    power supply: yes
    updated: Fri Mar 3 11:15:56 2023 (15 seconds ago)
    has history: yes
    has statistics: yes
    battery
    present: yes
    rechargeable: yes
    state: empty
    warning-level: none
    energy: 0 Wh
    energy-empty: 0 Wh
    energy-full: 0 Wh
    energy-full-design: 0 Wh
    energy-rate: 0 W
    voltage: 3.484 V
    charge-cycles: N/A
    percentage: 0%
    capacity: 100%
    icon-name: 'battery-empty-symbolic'
    History (charge):
    1677842156 0.000 unknown
    History (rate):
    1677842156 0.000 unknown

    When i connect supply or power to board i facing the issue,
    root@imx8mp-lpddr4-evk:~# i2cdump -y -f 0 0x6b
    No size specified (using byte-data access)
    0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
    00: 04 d7 XX XX XX XX XX XX XX XX XX XX XX XX XX XX ??XXXXXXXXXXXXXX
    10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
    root@imx8mp-lpddr4-evk:~# dmesg | grep "bq257*"
    [ 8.153235] bq25790-charger 0-006b: Line 998: Watchdog timer: 2000
    [ 8.153251] bq25790-charger 0-006b: Line 1007: Input voltage limit: 4500000
    [ 8.153256] bq25790-charger 0-006b: Line 1015: Input current limit: 1500000
    [ 8.162315] bq25790-charger 0-006b: Line 907: Starting hardware initialization
    [ 8.162330] bq25790-charger 0-006b: Line 922: Watchdog timer value: 0
    [ 8.162705] bq25790-charger 0-006b: Line 941: Setting charge current: 2000000
    [ 8.163464] bq25790-charger 0-006b: Line 948: Setting precharge current: 160000
    [ 8.163885] bq25790-charger 0-006b: Line 956: Setting charge voltage: 4200000
    [ 8.164479] bq25790-charger 0-006b: Line 963: Setting termination current: 200000
    [ 8.164492] bq25790-charger 0-006b: Line 285: bq25790_set_term_curr: term_current = 200000
    [ 8.164497] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5
    [ 8.167776] bq25790-charger 0-006b: Line 982: Hardware initialization completed successfully
    root@imx8mp-lpddr4-evk:~# [ 873.118847] cpu cpu0: _set_opp_voltage: failed to set voltage (950000 950000 950000 mV): -11
    [ 873.127330] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.132937] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.140674] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.149425] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.155026] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.162773] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.171498] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.177092] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.184930] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.193704] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.199303] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.206986] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.215732] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.221321] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.229052] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.237808] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.243406] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.250970] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.259718] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.265303] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.273055] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.281828] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.287426] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.294972] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.303717] cpu cpu0: Failed to set regulator voltages: -11
    [ 873.309307] cpufreq: __target_index: Failed to change cpu frequency: -11
    [ 873.317058] cpu cpu0: _set_opp_voltage: failed to set voltage (1000000 1000000 1000000 mV): -11
    [ 873.325814] cpu cpu0: Failed to set regulator voltages: -11



    Can you tell me what is the wrong?
     

  • Hi Master j,

    I am not an experienced coder.  I am more a power supply designer. I see a couple of things that I don't understand:

    [ 8.164497] bq25790-charger 0-006b: Line 294: bq25790_set_term_curr: reg_val = 5 - this is outside the range if using uA

    950000 950000 950000 mV and 1000000 1000000 1000000 mV are outside the range of any voltage register.

    Regards,

    Jeff