Loading drivers/nfc/nfc-nci.c +39 −5 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ MODULE_DEVICE_TABLE(of, msm_match_table); #define CORE_RESET_OID (0x00) #define CORE_RST_NTF_LENGTH (0x02) #define WAKE_TIMEOUT (10) #define WAKE_REG (0x10) struct qca199x_dev { Loading Loading @@ -508,11 +509,13 @@ static int nfc_open(struct inode *inode, struct file *filp) int nfcc_wake(int level, struct file *filp) { int r = 0; int time_taken = 0; unsigned char raw_nci_sleep[] = {0x2F, 0x03, 0x00}; /* Change slave address to 0xE */ unsigned char raw_nci_wake[] = {0x10, 0x0F}; unsigned short slave_addr = 0xE; unsigned short curr_addr; unsigned char wake_status = WAKE_REG; struct qca199x_dev *qca199x_dev = filp->private_data; dev_dbg(&qca199x_dev->client->dev, "nfcc_wake: %s: info: %p\n", Loading @@ -522,7 +525,6 @@ int nfcc_wake(int level, struct file *filp) r = i2c_master_send(qca199x_dev->client, &raw_nci_sleep[0], sizeof(raw_nci_sleep)); r = sizeof(raw_nci_sleep); if (r != sizeof(raw_nci_sleep)) return -EMSGSIZE; qca199x_dev->state = NFCC_STATE_NORMAL_SLEEP; Loading @@ -531,10 +533,31 @@ int nfcc_wake(int level, struct file *filp) qca199x_dev->client->addr = slave_addr; r = nfc_i2c_write(qca199x_dev->client, &raw_nci_wake[0], sizeof(raw_nci_wake)); do { wake_status = WAKE_REG; r = nfc_i2c_write(qca199x_dev->client, &wake_status, 1); /* * NFCC chip needs to be at least * 10usec high before make it low */ usleep_range(10, 15); r = i2c_master_recv(qca199x_dev->client, &wake_status, sizeof(wake_status)); time_taken++; if ((wake_status & NCI_WAKE) != 0) /* NFCC wakeup time is between 0.5 and .52 ms */ usleep_range(500, 520); } while ((wake_status & NCI_WAKE) && (time_taken < WAKE_TIMEOUT)); /* Restore original NFCC slave I2C address */ if (time_taken >= WAKE_TIMEOUT) dev_err(&qca199x_dev->client->dev, "nfc_ioctl_nfcc_version : TIMED OUT to get WAKEUP bit\n"); qca199x_dev->client->addr = curr_addr; r = sizeof(raw_nci_wake); if (r != sizeof(raw_nci_wake)) if (r != sizeof(wake_status)) return -EMSGSIZE; qca199x_dev->state = NFCC_STATE_NORMAL_WAKE; } Loading Loading @@ -733,13 +756,24 @@ int nfc_ioctl_nfcc_version(struct file *filp, unsigned int cmd, * been cleared. */ do { raw_nci_read = 0x10; r = nfc_i2c_write(qca199x_dev->client, &raw_nci_read, 1); /* * NFCC chip needs to be at least * 10usec high before make it low */ usleep_range(10, 15); r = i2c_master_recv(qca199x_dev->client, &raw_nci_read, sizeof(raw_nci_read)); if ((raw_nci_read & NCI_WAKE) != 0) usleep(1000); /* NFCC wakeup time is between 0.5 and .52 ms */ usleep_range(500, 520); time_taken++; } while ((r == 1) && (raw_nci_read & NCI_WAKE) } while ((raw_nci_read & NCI_WAKE) && (time_taken < WAKE_TIMEOUT)); if (time_taken < WAKE_TIMEOUT) Loading Loading
drivers/nfc/nfc-nci.c +39 −5 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ MODULE_DEVICE_TABLE(of, msm_match_table); #define CORE_RESET_OID (0x00) #define CORE_RST_NTF_LENGTH (0x02) #define WAKE_TIMEOUT (10) #define WAKE_REG (0x10) struct qca199x_dev { Loading Loading @@ -508,11 +509,13 @@ static int nfc_open(struct inode *inode, struct file *filp) int nfcc_wake(int level, struct file *filp) { int r = 0; int time_taken = 0; unsigned char raw_nci_sleep[] = {0x2F, 0x03, 0x00}; /* Change slave address to 0xE */ unsigned char raw_nci_wake[] = {0x10, 0x0F}; unsigned short slave_addr = 0xE; unsigned short curr_addr; unsigned char wake_status = WAKE_REG; struct qca199x_dev *qca199x_dev = filp->private_data; dev_dbg(&qca199x_dev->client->dev, "nfcc_wake: %s: info: %p\n", Loading @@ -522,7 +525,6 @@ int nfcc_wake(int level, struct file *filp) r = i2c_master_send(qca199x_dev->client, &raw_nci_sleep[0], sizeof(raw_nci_sleep)); r = sizeof(raw_nci_sleep); if (r != sizeof(raw_nci_sleep)) return -EMSGSIZE; qca199x_dev->state = NFCC_STATE_NORMAL_SLEEP; Loading @@ -531,10 +533,31 @@ int nfcc_wake(int level, struct file *filp) qca199x_dev->client->addr = slave_addr; r = nfc_i2c_write(qca199x_dev->client, &raw_nci_wake[0], sizeof(raw_nci_wake)); do { wake_status = WAKE_REG; r = nfc_i2c_write(qca199x_dev->client, &wake_status, 1); /* * NFCC chip needs to be at least * 10usec high before make it low */ usleep_range(10, 15); r = i2c_master_recv(qca199x_dev->client, &wake_status, sizeof(wake_status)); time_taken++; if ((wake_status & NCI_WAKE) != 0) /* NFCC wakeup time is between 0.5 and .52 ms */ usleep_range(500, 520); } while ((wake_status & NCI_WAKE) && (time_taken < WAKE_TIMEOUT)); /* Restore original NFCC slave I2C address */ if (time_taken >= WAKE_TIMEOUT) dev_err(&qca199x_dev->client->dev, "nfc_ioctl_nfcc_version : TIMED OUT to get WAKEUP bit\n"); qca199x_dev->client->addr = curr_addr; r = sizeof(raw_nci_wake); if (r != sizeof(raw_nci_wake)) if (r != sizeof(wake_status)) return -EMSGSIZE; qca199x_dev->state = NFCC_STATE_NORMAL_WAKE; } Loading Loading @@ -733,13 +756,24 @@ int nfc_ioctl_nfcc_version(struct file *filp, unsigned int cmd, * been cleared. */ do { raw_nci_read = 0x10; r = nfc_i2c_write(qca199x_dev->client, &raw_nci_read, 1); /* * NFCC chip needs to be at least * 10usec high before make it low */ usleep_range(10, 15); r = i2c_master_recv(qca199x_dev->client, &raw_nci_read, sizeof(raw_nci_read)); if ((raw_nci_read & NCI_WAKE) != 0) usleep(1000); /* NFCC wakeup time is between 0.5 and .52 ms */ usleep_range(500, 520); time_taken++; } while ((r == 1) && (raw_nci_read & NCI_WAKE) } while ((raw_nci_read & NCI_WAKE) && (time_taken < WAKE_TIMEOUT)); if (time_taken < WAKE_TIMEOUT) Loading