Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23b567df authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "NFC: detect NFC wakeup complete"

parents 902ee4a8 1325a617
Loading
Loading
Loading
Loading
+39 −5
Original line number Diff line number Diff line
@@ -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 {
@@ -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",
@@ -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;
@@ -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;
	}
@@ -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)