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