NFC: Fix to resolve abnormal read thread exit

During hiberantion/suspend, freezer process sends
fake signals to all running processes to put the
device into system wide sleep, which leads to
ungraceful exit of I2c read thread leaving the
upper layer retry the I2C access & ends up with
excessive error logging on the console.

Modified code to set/unset the no-freeze flag to
ensure such freezer fake signals can be avoided
when NFC is enabled & vice versa.

Change-Id: If0b8814daa172b3734a331ad9ab225c714e11e43
Signed-off-by: Tapas Dey <quic_c_tdey@quicinc.com>
这个提交包含在:
Tapas Dey
2022-06-06 13:34:14 +05:30
提交者 Gerrit - the friendly Code Review server
父节点 ade85437e3
当前提交 3963d26d45

查看文件

@@ -586,6 +586,15 @@ int nfc_dev_open(struct inode *inode, struct file *filp)
pr_debug("%s: %d, %d\n", __func__, imajor(inode), iminor(inode));
/* Set flag to block freezer fake signal if not set already.
* Without this Signal being set, Driver is trying to do a read
* which is causing the delay in moving to Hibernate Mode.
*/
if (!(current->flags & PF_NOFREEZE)) {
current->flags |= PF_NOFREEZE;
pr_debug("%s: current->flags 0x%x. \n", __func__, current->flags);
}
mutex_lock(&nfc_dev->dev_ref_mutex);
filp->private_data = nfc_dev;
@@ -632,6 +641,13 @@ int nfc_dev_close(struct inode *inode, struct file *filp)
return -ENODEV;
pr_debug("%s: %d, %d\n", __func__, imajor(inode), iminor(inode));
/* unset the flag to restore to previous state */
if (current->flags & PF_NOFREEZE) {
current->flags &= ~PF_NOFREEZE;
pr_debug("%s: current->flags 0x%x. \n", __func__, current->flags);
}
mutex_lock(&nfc_dev->dev_ref_mutex);
if (nfc_dev->dev_ref_count == 1) {
nfc_dev->nfc_disable_intr(nfc_dev);