1,wait_for_completion_timeout
此函数用于阻塞当前进程,超时或者想要的信号来了,才会继续执行,下面函数又加了锁,意味着其他地方想调用该函数也调用不了
static int battery_chg_write(struct battery_chg_dev *bcdev, void *data,int len)
mutex_lock(&bcdev->rw_lock);//持锁了 需要等函数运行完,下一个调用该函数的地方才能跑
reinit_completion(&bcdev->ack);//ack复位
rc = pmic_glink_write(bcdev->client, data, len);//glink发送
if (!rc) {
rc = wait_for_completion_timeout(&bcdev>ack,msecs_to_jiffies(BC_WAIT_TIME_MS));
//挂起该线程 就是这个函数,除非ack来了(发送了指令收到回复后(硬件协议行为)),或者超时了,,,这样下一个
if (!rc) {
pr_err("Error, timed out sending message\n");
if (len == sizeof(*req_msg)) {
if (BATT_CAPACITY == req_msg->property_id)
bcdev->read_capacity_timeout = true;
}
up_read(&bcdev->state_sem);
mutex_unlock(&bcdev->rw_lock);//释放锁
return rc;
}
2,next