This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/BQ27426: bq27426 gauge driver

Part Number: BQ27426

Tool/software: Linux

hi,

I have a problem about bq27426 gauge driver. In the probe function "bq_fg_probe()", I have a question that whether we need to execute  function "devm_request_threaded_irq" brefore function "fg_psy_register", or we need to execute function "fg_psy_register" before function "devm_request_threaded_irq"?

Here is the whole code of probe function:

static int bq_fg_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{

int ret;
struct bq_fg_chip *bq;
u8 *regs;

bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL);

if (!bq) {
pr_err("Could not allocate memory\n");
return -ENOMEM;
}

bq->dev = &client->dev;
bq->client = client;
bq->chip = id->driver_data;

bq->batt_soc = -ENODATA;
bq->batt_fcc = -ENODATA;
bq->batt_rm = -ENODATA;
bq->batt_dc = -ENODATA;
bq->batt_volt = -ENODATA;
bq->batt_temp = -ENODATA;
bq->batt_curr = -ENODATA;
bq->batt_cyclecnt = -ENODATA;

bq->fake_soc = -EINVAL;
bq->fake_temp = -EINVAL;

if (bq->chip == BQ27426) {
regs = bq27426_regs;
} else {
pr_err("unexpected fuel gauge: %d\n", bq->chip);
regs = bq27426_regs;
}

memcpy(bq->regs, regs, NUM_REGS);

i2c_set_clientdata(client, bq);

mutex_init(&bq->i2c_rw_lock);
mutex_init(&bq->data_lock);
mutex_init(&bq->update_lock);
mutex_init(&bq->irq_complete);

bq->resume_completed = true;
bq->irq_waiting = false;

bq->vadc_dev = qpnp_get_vadc(bq->dev, "batt_id");
if (IS_ERR(bq->vadc_dev)) {
ret = PTR_ERR(bq->vadc_dev);
if (ret == -EPROBE_DEFER)
pr_err("vadc not found - defer rc=%d\n", ret);
else
pr_err("vadc property missing, rc=%d\n", ret);

return ret;
}
ret = bq_parse_dt(bq);
if (ret < 0) {
dev_err(&client->dev, "Unable to parse DT nodes\n");
//goto destroy_mutex;
}

#if BQFS_UPDATER
INIT_WORK(&bq->update_work, fg_update_bqfs_workfunc);

fg_parse_batt_id(bq);

fg_update_bqfs(bq);
#endif

if (client->irq) {
ret = devm_request_threaded_irq(&client->dev, client->irq, NULL,
fg_irq_thread,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"bq fuel gauge irq", bq);
if (ret < 0) {
pr_err("request irq for irq=%d failed, ret = %d\n", client->irq, ret);
goto err_1;
}
enable_irq_wake(client->irq);
}

device_init_wakeup(bq->dev, 1);

bq->fw_ver = fg_read_fw_version(bq);

fg_psy_register(bq);

create_debugfs_entry(bq);
ret = sysfs_create_group(&bq->dev->kobj, &fg_attr_group);
if (ret) {
pr_err("Failed to register sysfs, err:%d\n", ret);
}

determine_initial_status(bq);

pr_err("bq fuel gauge probe successfully, %s FW ver:%d\n",
device2str[bq->chip], bq->fw_ver);

return 0;

err_1:
fg_psy_unregister(bq);
return ret;
}



Thanks for reply!

Xuehao Yin