问题场景
linux内核版本:Linux version 4.14.117(查看内核版本信息命令 cat /proc/version)
我们使用的充电ic,需要在关机流程中进行复位。在.remove中已经调用了复位充电IC的函数,为什么芯片没有复位?
问题的排查与解决
- 初步猜测关机并没有走remove的流程,验证猜想,在remove函数中增加打印,走关机流程,查看LOG信息,并未找到增加的打印LOG。
- 上网查找相关资料,发现关机需要走shutdown流程,增加模块,增加打印信息,信息打印成功,增加复位芯片操作,关机复位成功。
问题解决
方法:增加shutdown流程
注意
shutdown返回值为void,开始抄remove流程未修改,导致编译报错。。。细节还是需要注意!!!
简单分析
- probe的执行有两个时机,一是设备创建时,二是驱动注册时;remove相对也有两个执行时机,一是设备注销时,二是驱动注销时。
- 系统关机或重启的过程中,会调用设备驱动的shutdown函数来完成设备的关闭操作,有需要的设备可以在驱动中定义该函数。
static struct i2c_driver bq25890_driver = {
.driver = {
.name = "bq25890-charger",
.of_match_table = of_match_ptr(bq25890_of_match),
.acpi_match_table = ACPI_PTR(bq25890_acpi_match),
.pm = &bq25890_pm,
},
.probe = bq25890_probe,
.remove = bq25890_remove,
.shutdown = bq25890_shutdown,
.id_table = bq25890_i2c_ids,
};