int bq27520_rom_mode_cmp(int reg_off, int value) { int retry = RETRY_COUNT; struct i2c_client *i2c = NULL; int val=0; int ret=0; mutex_lock(&batt_dev_upt_mutex); i2c = batt_upt_dev_info.i2c; mutex_unlock(&batt_dev_upt_mutex); BAT_DBG_E("[%s] enter \n", __func__); while (retry--) { ret = bq27520_read_i2c(i2c, reg_off, &val, 1); if (ret < 0) continue; break; }; if (!retry && ret < 0) { return ret; } return val == value ? PROC_TRUE : PROC_FALSE; }
int bq27520_exit_rom_mode() { int retry = RETRY_COUNT; struct i2c_client *i2c = NULL; struct i2c_client *client = NULL; int val=0; int ret=0; mutex_lock(&batt_dev_upt_mutex); i2c = batt_upt_dev_info.i2c; mutex_unlock(&batt_dev_upt_mutex); BAT_DBG_E("[%s] enter \n", __func__); while (retry--) { ret = bq27520_write_i2c(i2c, 0x00, 0x0F, 1); if (ret < 0) continue; ret = bq27520_write_i2c(i2c, 0x64, 0x0F, 1); if (ret < 0) continue; ret = bq27520_write_i2c(i2c, 0x65, 0x00, 1); if (ret < 0) continue; break; }; if (!retry) { BAT_DBG_E("Exit ROM mode FAIL \n"); return ret; } /* * verify it's NOT ROM node. * Yes if read registers FAIL from now on. */ ret = bq27520_read_i2c(i2c, 0x00, &val, 1); if (!ret) { BAT_DBG_E("Exit ROM Mode verification FAIL.\n"); return -EACCES; } /* * wait 1s and send IT_ENABLE command * (battery team request) */ msleep(1000); mutex_lock(&bq27520_dev_info_mutex); client = bq27520_dev_info.i2c; mutex_unlock(&bq27520_dev_info_mutex); ret = bq27520_send_subcmd(client, NULL, BQ27520_SUBCMD_ENABLE_IT); if (ret) return ret; return 0; }
int bq27520_rom_mode_read_i2c(u8 reg, int *rt_value, int b_single) { struct i2c_client *i2c = NULL; mutex_lock(&batt_dev_upt_mutex); i2c = batt_upt_dev_info.i2c; mutex_unlock(&batt_dev_upt_mutex); if (!i2c|| !i2c->adapter) return -ENODEV; return bq27520_read_i2c(i2c, reg, rt_value, b_single); }
int bq27520_enter_rom_mode() { int retry = RETRY_COUNT; struct i2c_client *i2c = NULL; int val=0; int ret=0; BAT_DBG_E("[%s] enter \n", __func__); if (bq27520_is_rom_mode()) { return 0; } mutex_lock(&bq27520_dev_info_mutex); i2c = bq27520_dev_info.i2c; mutex_unlock(&bq27520_dev_info_mutex); while (retry--) { ret = bq27520_write_i2c(i2c, 0x00, 0x0F00, 0); if (ret < 0) continue; break; }; if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } /* * verify it's ROM node. * Yes if read registers FAIL from now on. */ ret = bq27520_read_i2c(i2c, 0x00, &val, 1); if (!ret) { BAT_DBG_E("Exit ROM Mode verification FAIL.\n"); return -EACCES; } return 0; }
int bq27520_is_rom_mode(void) { int retry = RETRY_COUNT; struct i2c_client *i2c = NULL; int val=0; int ret=0; BAT_DBG_E("[%s] enter \n", __func__); mutex_lock(&batt_dev_upt_mutex); i2c = batt_upt_dev_info.i2c; mutex_unlock(&batt_dev_upt_mutex); while (retry--) { ret = bq27520_read_i2c(i2c, 0x00, &val, 1); if (ret < 0) continue; break; }; if (ret < 0) { return 0; //not rom mode } return 1; //it's rom mode }
int bq27520_ME560CG_unseal() { struct i2c_client *i2c = NULL; int val=0; int ret=0; BAT_DBG_E("[%s] enter \n", __func__); mutex_lock(&bq27520_dev_info_mutex); i2c = bq27520_dev_info.i2c; mutex_unlock(&bq27520_dev_info_mutex); ret = bq27520_write_i2c_retry(i2c, 0x00, 0x14); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x01, 0x04); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x00, 0x72); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x01, 0x16); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } bq27520_rom_mode_wait(20); ret = bq27520_write_i2c_retry(i2c, 0x00, 0xff); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x01, 0xff); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x00, 0xff); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x01, 0xff); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } bq27520_rom_mode_wait(20); ret = bq27520_write_i2c_retry(i2c, 0x00, 0x00); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } ret = bq27520_write_i2c_retry(i2c, 0x01, 0x0f); if (ret < 0) { BAT_DBG_E("Enter ROM mode FAIL \n"); return ret; } bq27520_rom_mode_wait(20); /* * verify it's ROM mode. * Yes if read registers FAIL from now on. */ ret = bq27520_read_i2c(i2c, 0x00, &val, 1); if (!ret) { BAT_DBG_E("Exit ROM Mode verification FAIL.\n"); return -EACCES; } return 0; }
static inline int bq27520_read(struct i2c_client *client, u8 reg, int *rt_value, int b_single) { return bq27520_read_i2c(client, reg, rt_value, b_single); }