All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] NFC: pn544: GPIO access that may sleep
@ 2015-01-09 12:02 ` Robert Dolca
  0 siblings, 0 replies; 7+ messages in thread
From: Robert Dolca @ 2015-01-09 12:02 UTC (permalink / raw)
  To: linux-nfc
  Cc: linux-kernel, linux-wireless, netdev, Lauro Ramos Venancio,
	Aloisio Almeida Jr, Samuel Ortiz, David S. Miller, Johannes Berg,
	Clement Perrochaud, Robert Dolca

gpio_set_value was replaced with gpio_set_value_cansleep in order
to allow GPIO access that may sleep. This is particularelly useful
when GPIO is accessed using busses like I2C, SPI, USB

Signed-off-by: Robert Dolca <robert.dolca@intel.com>
---
 drivers/nfc/pn544/i2c.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index fc02e8d..5f4b9c1 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -195,18 +195,18 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
 	nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n");
 
 	/* Disable fw download */
-	gpio_set_value(phy->gpio_fw, 0);
+	gpio_set_value_cansleep(phy->gpio_fw, 0);
 
 	for (polarity = 0; polarity < 2; polarity++) {
 		phy->en_polarity = polarity;
 		retry = 3;
 		while (retry--) {
 			/* power off */
-			gpio_set_value(phy->gpio_en, !phy->en_polarity);
+			gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 			usleep_range(10000, 15000);
 
 			/* power on */
-			gpio_set_value(phy->gpio_en, phy->en_polarity);
+			gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 			usleep_range(10000, 15000);
 
 			/* send reset */
@@ -225,13 +225,13 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
 		"Could not detect nfc_en polarity, fallback to active high\n");
 
 out:
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 }
 
 static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode)
 {
-	gpio_set_value(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
-	gpio_set_value(phy->gpio_en, phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
+	gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 	usleep_range(10000, 15000);
 
 	phy->run_mode = run_mode;
@@ -254,14 +254,14 @@ static void pn544_hci_i2c_disable(void *phy_id)
 {
 	struct pn544_i2c_phy *phy = phy_id;
 
-	gpio_set_value(phy->gpio_fw, 0);
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_fw, 0);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 	usleep_range(10000, 15000);
 
-	gpio_set_value(phy->gpio_en, phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 	usleep_range(10000, 15000);
 
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 	usleep_range(10000, 15000);
 
 	phy->powered = 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 1/2] NFC: pn544: GPIO access that may sleep
@ 2015-01-09 12:02 ` Robert Dolca
  0 siblings, 0 replies; 7+ messages in thread
From: Robert Dolca @ 2015-01-09 12:02 UTC (permalink / raw)
  To: linux-nfc
  Cc: linux-kernel, linux-wireless, netdev, Lauro Ramos Venancio,
	Aloisio Almeida Jr, Samuel Ortiz, David S. Miller, Johannes Berg,
	Clement Perrochaud, Robert Dolca

gpio_set_value was replaced with gpio_set_value_cansleep in order
to allow GPIO access that may sleep. This is particularelly useful
when GPIO is accessed using busses like I2C, SPI, USB

Signed-off-by: Robert Dolca <robert.dolca@intel.com>
---
 drivers/nfc/pn544/i2c.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index fc02e8d..5f4b9c1 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -195,18 +195,18 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
 	nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n");
 
 	/* Disable fw download */
-	gpio_set_value(phy->gpio_fw, 0);
+	gpio_set_value_cansleep(phy->gpio_fw, 0);
 
 	for (polarity = 0; polarity < 2; polarity++) {
 		phy->en_polarity = polarity;
 		retry = 3;
 		while (retry--) {
 			/* power off */
-			gpio_set_value(phy->gpio_en, !phy->en_polarity);
+			gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 			usleep_range(10000, 15000);
 
 			/* power on */
-			gpio_set_value(phy->gpio_en, phy->en_polarity);
+			gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 			usleep_range(10000, 15000);
 
 			/* send reset */
@@ -225,13 +225,13 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
 		"Could not detect nfc_en polarity, fallback to active high\n");
 
 out:
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 }
 
 static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode)
 {
-	gpio_set_value(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
-	gpio_set_value(phy->gpio_en, phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
+	gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 	usleep_range(10000, 15000);
 
 	phy->run_mode = run_mode;
@@ -254,14 +254,14 @@ static void pn544_hci_i2c_disable(void *phy_id)
 {
 	struct pn544_i2c_phy *phy = phy_id;
 
-	gpio_set_value(phy->gpio_fw, 0);
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_fw, 0);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 	usleep_range(10000, 15000);
 
-	gpio_set_value(phy->gpio_en, phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity);
 	usleep_range(10000, 15000);
 
-	gpio_set_value(phy->gpio_en, !phy->en_polarity);
+	gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity);
 	usleep_range(10000, 15000);
 
 	phy->powered = 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] nfc: NXP PN544 ACPI support
  2015-01-09 12:02 ` Robert Dolca
  (?)
@ 2015-01-09 12:02   ` Robert Dolca
  -1 siblings, 0 replies; 7+ messages in thread
From: Robert Dolca @ 2015-01-09 12:02 UTC (permalink / raw)
  To: linux-nfc
  Cc: linux-kernel, linux-wireless, netdev, Lauro Ramos Venancio,
	Aloisio Almeida Jr, Samuel Ortiz, David S. Miller, Johannes Berg,
	Clement Perrochaud, Robert Dolca

Device id: NXP5440
Pin mapping:
 - 0 IRQ pin
 - 1 enable pin
 - 2 firmware pin

Signed-off-by: Robert Dolca <robert.dolca@intel.com>
---
 drivers/nfc/Kconfig     |   1 +
 drivers/nfc/pn544/i2c.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
 net/nfc/core.c          |   1 +
 3 files changed, 114 insertions(+), 3 deletions(-)

diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
index 7929fac..a25e712 100644
--- a/drivers/nfc/Kconfig
+++ b/drivers/nfc/Kconfig
@@ -68,6 +68,7 @@ config NFC_PORT100
 
 	  If unsure, say N.
 
+source "drivers/nfc/pn547/Kconfig"
 source "drivers/nfc/pn544/Kconfig"
 source "drivers/nfc/microread/Kconfig"
 source "drivers/nfc/nfcmrvl/Kconfig"
diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index 5f4b9c1..58b9029 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
 #include <linux/of_irq.h>
+#include <linux/acpi.h>
 #include <linux/miscdevice.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
@@ -41,6 +42,11 @@
 #define PN544_I2C_FRAME_HEADROOM 1
 #define PN544_I2C_FRAME_TAILROOM 2
 
+/* GPIO names */
+#define PN544_GPIO_NAME_IRQ "pn544_irq"
+#define PN544_GPIO_NAME_FW  "pn544_fw"
+#define PN544_GPIO_NAME_EN  "pn544_en"
+
 /* framing in HCI mode */
 #define PN544_HCI_I2C_LLC_LEN		1
 #define PN544_HCI_I2C_LLC_CRC		2
@@ -58,6 +64,13 @@ static struct i2c_device_id pn544_hci_i2c_id_table[] = {
 
 MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
 
+static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
+	{"NXP5440", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
+
 #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
 
 /*
@@ -859,6 +872,90 @@ exit_state_wait_secure_write_answer:
 	}
 }
 
+static int pn544_hci_i2c_acpi_request_resources(struct i2c_client *client)
+{
+	struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
+	const struct acpi_device_id *id;
+	struct gpio_desc *gpiod_en, *gpiod_irq, *gpiod_fw;
+	struct device *dev;
+	int ret;
+
+	if (!client)
+		return -EINVAL;
+
+	dev = &client->dev;
+
+	/* Match the struct device against a given list of ACPI IDs */
+	id = acpi_match_device(dev->driver->acpi_match_table, dev);
+
+	if (!id)
+		return -ENODEV;
+
+	/* Get EN GPIO from ACPI */
+	gpiod_en = devm_gpiod_get_index(dev, PN544_GPIO_NAME_EN, 1);
+	if (IS_ERR(gpiod_en)) {
+		nfc_err(dev,
+			"Unable to get EN GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_en  = desc_to_gpio(gpiod_en);
+
+	/* Configuration EN GPIO */
+	ret = gpiod_direction_output(gpiod_en, 0);
+	if (ret) {
+		nfc_err(dev, "Fail EN pin direction\n");
+		return ret;
+	}
+
+	/* Get FW GPIO from ACPI */
+	gpiod_fw = devm_gpiod_get_index(dev, PN544_GPIO_NAME_FW, 2);
+	if (IS_ERR(gpiod_fw)) {
+		nfc_err(dev,
+			"Unable to get FW GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_fw  = desc_to_gpio(gpiod_fw);
+
+	/* Configuration FW GPIO */
+	ret = gpiod_direction_output(gpiod_fw, 0);
+	if (ret) {
+		nfc_err(dev, "Fail FW pin direction\n");
+		return ret;
+	}
+
+	/* Get IRQ GPIO */
+	gpiod_irq = devm_gpiod_get_index(dev, PN544_GPIO_NAME_IRQ, 0);
+	if (IS_ERR(gpiod_irq)) {
+		nfc_err(dev,
+			"Unable to get IRQ GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_irq = desc_to_gpio(gpiod_irq);
+
+	/* Configure IRQ GPIO */
+	ret = gpiod_direction_input(gpiod_irq);
+	if (ret) {
+		nfc_err(dev, "Fail IRQ pin direction\n");
+		return ret;
+	}
+
+	/* Map the pin to an IRQ */
+	ret = gpiod_to_irq(gpiod_irq);
+	if (ret < 0) {
+		nfc_err(dev, "Fail pin IRQ mapping\n");
+		return ret;
+	}
+
+	nfc_info(dev, "GPIO resource, no:%d irq:%d\n",
+			desc_to_gpio(gpiod_irq), ret);
+	client->irq = ret;
+
+	return 0;
+}
+
 #ifdef CONFIG_OF
 
 static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
@@ -884,7 +981,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_en = ret;
 
 	/* Configuration of EN GPIO */
-	ret = gpio_request(phy->gpio_en, "pn544_en");
+	ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN);
 	if (ret) {
 		nfc_err(&client->dev, "Fail EN pin\n");
 		goto err_dt;
@@ -906,7 +1003,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_fw = ret;
 
 	/* Configuration of FW GPIO */
-	ret = gpio_request(phy->gpio_fw, "pn544_fw");
+	ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW);
 	if (ret) {
 		nfc_err(&client->dev, "Fail FW pin\n");
 		goto err_gpio_en;
@@ -1001,6 +1098,14 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 		phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
 		phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
 		phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
+	/* Using ACPI */
+	} else if (ACPI_HANDLE(&client->dev)) {
+		r = pn544_hci_i2c_acpi_request_resources(client);
+		if (r) {
+			nfc_err(&client->dev,
+				"Cannot get ACPI data\n");
+			return r;
+		}
 	} else {
 		nfc_err(&client->dev, "No platform data\n");
 		return -EINVAL;
@@ -1020,9 +1125,12 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 			    PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
 			    PN544_HCI_I2C_LLC_MAX_PAYLOAD,
 			    pn544_hci_i2c_fw_download, &phy->hdev);
-	if (r < 0)
+	if (r < 0) {
+		nfc_err(&client->dev, "HCI Probing error\n");
 		goto err_hci;
+	}
 
+	nfc_info(&client->dev, "NFC I2C driver loaded\n");
 	return 0;
 
 err_hci:
@@ -1080,6 +1188,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
 		   .name = PN544_HCI_I2C_DRIVER_NAME,
 		   .owner  = THIS_MODULE,
 		   .of_match_table = of_match_ptr(of_pn544_i2c_match),
+		   .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
 		  },
 	.probe = pn544_hci_i2c_probe,
 	.id_table = pn544_hci_i2c_id_table,
diff --git a/net/nfc/core.c b/net/nfc/core.c
index 819b877..a53c2cc 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -32,6 +32,7 @@
 
 #include "nfc.h"
 
+#define DEBUG
 #define VERSION "0.1"
 
 #define NFC_CHECK_PRES_FREQ_MS	2000
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] nfc: NXP PN544 ACPI support
@ 2015-01-09 12:02   ` Robert Dolca
  0 siblings, 0 replies; 7+ messages in thread
From: Robert Dolca @ 2015-01-09 12:02 UTC (permalink / raw)
  To: linux-nfc
  Cc: linux-kernel, linux-wireless, netdev, Lauro Ramos Venancio,
	Aloisio Almeida Jr, Samuel Ortiz, David S. Miller, Johannes Berg,
	Clement Perrochaud, Robert Dolca

Device id: NXP5440
Pin mapping:
 - 0 IRQ pin
 - 1 enable pin
 - 2 firmware pin

Signed-off-by: Robert Dolca <robert.dolca@intel.com>
---
 drivers/nfc/Kconfig     |   1 +
 drivers/nfc/pn544/i2c.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
 net/nfc/core.c          |   1 +
 3 files changed, 114 insertions(+), 3 deletions(-)

diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
index 7929fac..a25e712 100644
--- a/drivers/nfc/Kconfig
+++ b/drivers/nfc/Kconfig
@@ -68,6 +68,7 @@ config NFC_PORT100
 
 	  If unsure, say N.
 
+source "drivers/nfc/pn547/Kconfig"
 source "drivers/nfc/pn544/Kconfig"
 source "drivers/nfc/microread/Kconfig"
 source "drivers/nfc/nfcmrvl/Kconfig"
diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index 5f4b9c1..58b9029 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
 #include <linux/of_irq.h>
+#include <linux/acpi.h>
 #include <linux/miscdevice.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
@@ -41,6 +42,11 @@
 #define PN544_I2C_FRAME_HEADROOM 1
 #define PN544_I2C_FRAME_TAILROOM 2
 
+/* GPIO names */
+#define PN544_GPIO_NAME_IRQ "pn544_irq"
+#define PN544_GPIO_NAME_FW  "pn544_fw"
+#define PN544_GPIO_NAME_EN  "pn544_en"
+
 /* framing in HCI mode */
 #define PN544_HCI_I2C_LLC_LEN		1
 #define PN544_HCI_I2C_LLC_CRC		2
@@ -58,6 +64,13 @@ static struct i2c_device_id pn544_hci_i2c_id_table[] = {
 
 MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
 
+static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
+	{"NXP5440", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
+
 #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
 
 /*
@@ -859,6 +872,90 @@ exit_state_wait_secure_write_answer:
 	}
 }
 
+static int pn544_hci_i2c_acpi_request_resources(struct i2c_client *client)
+{
+	struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
+	const struct acpi_device_id *id;
+	struct gpio_desc *gpiod_en, *gpiod_irq, *gpiod_fw;
+	struct device *dev;
+	int ret;
+
+	if (!client)
+		return -EINVAL;
+
+	dev = &client->dev;
+
+	/* Match the struct device against a given list of ACPI IDs */
+	id = acpi_match_device(dev->driver->acpi_match_table, dev);
+
+	if (!id)
+		return -ENODEV;
+
+	/* Get EN GPIO from ACPI */
+	gpiod_en = devm_gpiod_get_index(dev, PN544_GPIO_NAME_EN, 1);
+	if (IS_ERR(gpiod_en)) {
+		nfc_err(dev,
+			"Unable to get EN GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_en  = desc_to_gpio(gpiod_en);
+
+	/* Configuration EN GPIO */
+	ret = gpiod_direction_output(gpiod_en, 0);
+	if (ret) {
+		nfc_err(dev, "Fail EN pin direction\n");
+		return ret;
+	}
+
+	/* Get FW GPIO from ACPI */
+	gpiod_fw = devm_gpiod_get_index(dev, PN544_GPIO_NAME_FW, 2);
+	if (IS_ERR(gpiod_fw)) {
+		nfc_err(dev,
+			"Unable to get FW GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_fw  = desc_to_gpio(gpiod_fw);
+
+	/* Configuration FW GPIO */
+	ret = gpiod_direction_output(gpiod_fw, 0);
+	if (ret) {
+		nfc_err(dev, "Fail FW pin direction\n");
+		return ret;
+	}
+
+	/* Get IRQ GPIO */
+	gpiod_irq = devm_gpiod_get_index(dev, PN544_GPIO_NAME_IRQ, 0);
+	if (IS_ERR(gpiod_irq)) {
+		nfc_err(dev,
+			"Unable to get IRQ GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_irq = desc_to_gpio(gpiod_irq);
+
+	/* Configure IRQ GPIO */
+	ret = gpiod_direction_input(gpiod_irq);
+	if (ret) {
+		nfc_err(dev, "Fail IRQ pin direction\n");
+		return ret;
+	}
+
+	/* Map the pin to an IRQ */
+	ret = gpiod_to_irq(gpiod_irq);
+	if (ret < 0) {
+		nfc_err(dev, "Fail pin IRQ mapping\n");
+		return ret;
+	}
+
+	nfc_info(dev, "GPIO resource, no:%d irq:%d\n",
+			desc_to_gpio(gpiod_irq), ret);
+	client->irq = ret;
+
+	return 0;
+}
+
 #ifdef CONFIG_OF
 
 static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
@@ -884,7 +981,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_en = ret;
 
 	/* Configuration of EN GPIO */
-	ret = gpio_request(phy->gpio_en, "pn544_en");
+	ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN);
 	if (ret) {
 		nfc_err(&client->dev, "Fail EN pin\n");
 		goto err_dt;
@@ -906,7 +1003,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_fw = ret;
 
 	/* Configuration of FW GPIO */
-	ret = gpio_request(phy->gpio_fw, "pn544_fw");
+	ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW);
 	if (ret) {
 		nfc_err(&client->dev, "Fail FW pin\n");
 		goto err_gpio_en;
@@ -1001,6 +1098,14 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 		phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
 		phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
 		phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
+	/* Using ACPI */
+	} else if (ACPI_HANDLE(&client->dev)) {
+		r = pn544_hci_i2c_acpi_request_resources(client);
+		if (r) {
+			nfc_err(&client->dev,
+				"Cannot get ACPI data\n");
+			return r;
+		}
 	} else {
 		nfc_err(&client->dev, "No platform data\n");
 		return -EINVAL;
@@ -1020,9 +1125,12 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 			    PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
 			    PN544_HCI_I2C_LLC_MAX_PAYLOAD,
 			    pn544_hci_i2c_fw_download, &phy->hdev);
-	if (r < 0)
+	if (r < 0) {
+		nfc_err(&client->dev, "HCI Probing error\n");
 		goto err_hci;
+	}
 
+	nfc_info(&client->dev, "NFC I2C driver loaded\n");
 	return 0;
 
 err_hci:
@@ -1080,6 +1188,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
 		   .name = PN544_HCI_I2C_DRIVER_NAME,
 		   .owner  = THIS_MODULE,
 		   .of_match_table = of_match_ptr(of_pn544_i2c_match),
+		   .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
 		  },
 	.probe = pn544_hci_i2c_probe,
 	.id_table = pn544_hci_i2c_id_table,
diff --git a/net/nfc/core.c b/net/nfc/core.c
index 819b877..a53c2cc 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -32,6 +32,7 @@
 
 #include "nfc.h"
 
+#define DEBUG
 #define VERSION "0.1"
 
 #define NFC_CHECK_PRES_FREQ_MS	2000
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] nfc: NXP PN544 ACPI support
@ 2015-01-09 12:02   ` Robert Dolca
  0 siblings, 0 replies; 7+ messages in thread
From: Robert Dolca @ 2015-01-09 12:02 UTC (permalink / raw)
  To: linux-nfc-hn68Rpc1hR1g9hUCZPvPmw
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-wireless-u79uwXL29TY76Z2rM5mHXA,
	netdev-u79uwXL29TY76Z2rM5mHXA, Lauro Ramos Venancio,
	Aloisio Almeida Jr, Samuel Ortiz, David S. Miller, Johannes Berg,
	Clement Perrochaud, Robert Dolca

Device id: NXP5440
Pin mapping:
 - 0 IRQ pin
 - 1 enable pin
 - 2 firmware pin

Signed-off-by: Robert Dolca <robert.dolca-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 drivers/nfc/Kconfig     |   1 +
 drivers/nfc/pn544/i2c.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
 net/nfc/core.c          |   1 +
 3 files changed, 114 insertions(+), 3 deletions(-)

diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
index 7929fac..a25e712 100644
--- a/drivers/nfc/Kconfig
+++ b/drivers/nfc/Kconfig
@@ -68,6 +68,7 @@ config NFC_PORT100
 
 	  If unsure, say N.
 
+source "drivers/nfc/pn547/Kconfig"
 source "drivers/nfc/pn544/Kconfig"
 source "drivers/nfc/microread/Kconfig"
 source "drivers/nfc/nfcmrvl/Kconfig"
diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
index 5f4b9c1..58b9029 100644
--- a/drivers/nfc/pn544/i2c.c
+++ b/drivers/nfc/pn544/i2c.c
@@ -24,6 +24,7 @@
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
 #include <linux/of_irq.h>
+#include <linux/acpi.h>
 #include <linux/miscdevice.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
@@ -41,6 +42,11 @@
 #define PN544_I2C_FRAME_HEADROOM 1
 #define PN544_I2C_FRAME_TAILROOM 2
 
+/* GPIO names */
+#define PN544_GPIO_NAME_IRQ "pn544_irq"
+#define PN544_GPIO_NAME_FW  "pn544_fw"
+#define PN544_GPIO_NAME_EN  "pn544_en"
+
 /* framing in HCI mode */
 #define PN544_HCI_I2C_LLC_LEN		1
 #define PN544_HCI_I2C_LLC_CRC		2
@@ -58,6 +64,13 @@ static struct i2c_device_id pn544_hci_i2c_id_table[] = {
 
 MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
 
+static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
+	{"NXP5440", 0},
+	{}
+};
+
+MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
+
 #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
 
 /*
@@ -859,6 +872,90 @@ exit_state_wait_secure_write_answer:
 	}
 }
 
+static int pn544_hci_i2c_acpi_request_resources(struct i2c_client *client)
+{
+	struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
+	const struct acpi_device_id *id;
+	struct gpio_desc *gpiod_en, *gpiod_irq, *gpiod_fw;
+	struct device *dev;
+	int ret;
+
+	if (!client)
+		return -EINVAL;
+
+	dev = &client->dev;
+
+	/* Match the struct device against a given list of ACPI IDs */
+	id = acpi_match_device(dev->driver->acpi_match_table, dev);
+
+	if (!id)
+		return -ENODEV;
+
+	/* Get EN GPIO from ACPI */
+	gpiod_en = devm_gpiod_get_index(dev, PN544_GPIO_NAME_EN, 1);
+	if (IS_ERR(gpiod_en)) {
+		nfc_err(dev,
+			"Unable to get EN GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_en  = desc_to_gpio(gpiod_en);
+
+	/* Configuration EN GPIO */
+	ret = gpiod_direction_output(gpiod_en, 0);
+	if (ret) {
+		nfc_err(dev, "Fail EN pin direction\n");
+		return ret;
+	}
+
+	/* Get FW GPIO from ACPI */
+	gpiod_fw = devm_gpiod_get_index(dev, PN544_GPIO_NAME_FW, 2);
+	if (IS_ERR(gpiod_fw)) {
+		nfc_err(dev,
+			"Unable to get FW GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_fw  = desc_to_gpio(gpiod_fw);
+
+	/* Configuration FW GPIO */
+	ret = gpiod_direction_output(gpiod_fw, 0);
+	if (ret) {
+		nfc_err(dev, "Fail FW pin direction\n");
+		return ret;
+	}
+
+	/* Get IRQ GPIO */
+	gpiod_irq = devm_gpiod_get_index(dev, PN544_GPIO_NAME_IRQ, 0);
+	if (IS_ERR(gpiod_irq)) {
+		nfc_err(dev,
+			"Unable to get IRQ GPIO\n");
+		return -ENODEV;
+	}
+
+	phy->gpio_irq = desc_to_gpio(gpiod_irq);
+
+	/* Configure IRQ GPIO */
+	ret = gpiod_direction_input(gpiod_irq);
+	if (ret) {
+		nfc_err(dev, "Fail IRQ pin direction\n");
+		return ret;
+	}
+
+	/* Map the pin to an IRQ */
+	ret = gpiod_to_irq(gpiod_irq);
+	if (ret < 0) {
+		nfc_err(dev, "Fail pin IRQ mapping\n");
+		return ret;
+	}
+
+	nfc_info(dev, "GPIO resource, no:%d irq:%d\n",
+			desc_to_gpio(gpiod_irq), ret);
+	client->irq = ret;
+
+	return 0;
+}
+
 #ifdef CONFIG_OF
 
 static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
@@ -884,7 +981,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_en = ret;
 
 	/* Configuration of EN GPIO */
-	ret = gpio_request(phy->gpio_en, "pn544_en");
+	ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN);
 	if (ret) {
 		nfc_err(&client->dev, "Fail EN pin\n");
 		goto err_dt;
@@ -906,7 +1003,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
 	phy->gpio_fw = ret;
 
 	/* Configuration of FW GPIO */
-	ret = gpio_request(phy->gpio_fw, "pn544_fw");
+	ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW);
 	if (ret) {
 		nfc_err(&client->dev, "Fail FW pin\n");
 		goto err_gpio_en;
@@ -1001,6 +1098,14 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 		phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
 		phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
 		phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
+	/* Using ACPI */
+	} else if (ACPI_HANDLE(&client->dev)) {
+		r = pn544_hci_i2c_acpi_request_resources(client);
+		if (r) {
+			nfc_err(&client->dev,
+				"Cannot get ACPI data\n");
+			return r;
+		}
 	} else {
 		nfc_err(&client->dev, "No platform data\n");
 		return -EINVAL;
@@ -1020,9 +1125,12 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
 			    PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
 			    PN544_HCI_I2C_LLC_MAX_PAYLOAD,
 			    pn544_hci_i2c_fw_download, &phy->hdev);
-	if (r < 0)
+	if (r < 0) {
+		nfc_err(&client->dev, "HCI Probing error\n");
 		goto err_hci;
+	}
 
+	nfc_info(&client->dev, "NFC I2C driver loaded\n");
 	return 0;
 
 err_hci:
@@ -1080,6 +1188,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
 		   .name = PN544_HCI_I2C_DRIVER_NAME,
 		   .owner  = THIS_MODULE,
 		   .of_match_table = of_match_ptr(of_pn544_i2c_match),
+		   .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
 		  },
 	.probe = pn544_hci_i2c_probe,
 	.id_table = pn544_hci_i2c_id_table,
diff --git a/net/nfc/core.c b/net/nfc/core.c
index 819b877..a53c2cc 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -32,6 +32,7 @@
 
 #include "nfc.h"
 
+#define DEBUG
 #define VERSION "0.1"
 
 #define NFC_CHECK_PRES_FREQ_MS	2000
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] nfc: NXP PN544 ACPI support
  2015-01-09 12:02   ` Robert Dolca
@ 2015-01-22 16:07     ` Daniel Baluta
  -1 siblings, 0 replies; 7+ messages in thread
From: Daniel Baluta @ 2015-01-22 16:07 UTC (permalink / raw)
  To: Robert Dolca
  Cc: linux-nfc, Linux Kernel Mailing List, linux-wireless, netdev,
	Lauro Ramos Venancio, Aloisio Almeida Jr, Samuel Ortiz,
	David S. Miller, Johannes Berg, Clement Perrochaud

On Fri, Jan 9, 2015 at 2:02 PM, Robert Dolca <robert.dolca@intel.com> wrote:
> Device id: NXP5440
> Pin mapping:
>  - 0 IRQ pin
>  - 1 enable pin
>  - 2 firmware pin
>
> Signed-off-by: Robert Dolca <robert.dolca@intel.com>
> ---
>  drivers/nfc/Kconfig     |   1 +
>  drivers/nfc/pn544/i2c.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
>  net/nfc/core.c          |   1 +
>  3 files changed, 114 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
> index 7929fac..a25e712 100644
> --- a/drivers/nfc/Kconfig
> +++ b/drivers/nfc/Kconfig
> @@ -68,6 +68,7 @@ config NFC_PORT100
>
>           If unsure, say N.
>
> +source "drivers/nfc/pn547/Kconfig"

I think this line shouldn't be here :).

>  source "drivers/nfc/pn544/Kconfig"
>  source "drivers/nfc/microread/Kconfig"
>  source "drivers/nfc/nfcmrvl/Kconfig"
> diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
> index 5f4b9c1..58b9029 100644
> --- a/drivers/nfc/pn544/i2c.c
> +++ b/drivers/nfc/pn544/i2c.c
> @@ -24,6 +24,7 @@
>  #include <linux/gpio.h>
>  #include <linux/of_gpio.h>
>  #include <linux/of_irq.h>
> +#include <linux/acpi.h>
>  #include <linux/miscdevice.h>
>  #include <linux/interrupt.h>
>  #include <linux/delay.h>
> @@ -41,6 +42,11 @@
>  #define PN544_I2C_FRAME_HEADROOM 1
>  #define PN544_I2C_FRAME_TAILROOM 2
>
> +/* GPIO names */
> +#define PN544_GPIO_NAME_IRQ "pn544_irq"
> +#define PN544_GPIO_NAME_FW  "pn544_fw"
> +#define PN544_GPIO_NAME_EN  "pn544_en"
> +
>  /* framing in HCI mode */
>  #define PN544_HCI_I2C_LLC_LEN          1
>  #define PN544_HCI_I2C_LLC_CRC          2
> @@ -58,6 +64,13 @@ static struct i2c_device_id pn544_hci_i2c_id_table[] = {
>
>  MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
>
> +static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
> +       {"NXP5440", 0},
> +       {}
> +};
> +
> +MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
> +
>  #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
>
>  /*
> @@ -859,6 +872,90 @@ exit_state_wait_secure_write_answer:
>         }
>  }
>
> +static int pn544_hci_i2c_acpi_request_resources(struct i2c_client *client)
> +{
> +       struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
> +       const struct acpi_device_id *id;
> +       struct gpio_desc *gpiod_en, *gpiod_irq, *gpiod_fw;
> +       struct device *dev;
> +       int ret;
> +
> +       if (!client)
> +               return -EINVAL;
> +
> +       dev = &client->dev;
> +
> +       /* Match the struct device against a given list of ACPI IDs */
> +       id = acpi_match_device(dev->driver->acpi_match_table, dev);
> +
> +       if (!id)
> +               return -ENODEV;
> +
> +       /* Get EN GPIO from ACPI */
> +       gpiod_en = devm_gpiod_get_index(dev, PN544_GPIO_NAME_EN, 1);
> +       if (IS_ERR(gpiod_en)) {
> +               nfc_err(dev,
> +                       "Unable to get EN GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_en  = desc_to_gpio(gpiod_en);
> +
> +       /* Configuration EN GPIO */
> +       ret = gpiod_direction_output(gpiod_en, 0);
> +       if (ret) {
> +               nfc_err(dev, "Fail EN pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Get FW GPIO from ACPI */
> +       gpiod_fw = devm_gpiod_get_index(dev, PN544_GPIO_NAME_FW, 2);
> +       if (IS_ERR(gpiod_fw)) {
> +               nfc_err(dev,
> +                       "Unable to get FW GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_fw  = desc_to_gpio(gpiod_fw);
> +
> +       /* Configuration FW GPIO */
> +       ret = gpiod_direction_output(gpiod_fw, 0);
> +       if (ret) {
> +               nfc_err(dev, "Fail FW pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Get IRQ GPIO */
> +       gpiod_irq = devm_gpiod_get_index(dev, PN544_GPIO_NAME_IRQ, 0);
> +       if (IS_ERR(gpiod_irq)) {
> +               nfc_err(dev,
> +                       "Unable to get IRQ GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_irq = desc_to_gpio(gpiod_irq);
> +
> +       /* Configure IRQ GPIO */
> +       ret = gpiod_direction_input(gpiod_irq);
> +       if (ret) {
> +               nfc_err(dev, "Fail IRQ pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Map the pin to an IRQ */
> +       ret = gpiod_to_irq(gpiod_irq);
> +       if (ret < 0) {
> +               nfc_err(dev, "Fail pin IRQ mapping\n");
> +               return ret;
> +       }
> +
> +       nfc_info(dev, "GPIO resource, no:%d irq:%d\n",
> +                       desc_to_gpio(gpiod_irq), ret);
> +       client->irq = ret;
> +
> +       return 0;
> +}
> +
>  #ifdef CONFIG_OF
>
>  static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
> @@ -884,7 +981,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
>         phy->gpio_en = ret;
>
>         /* Configuration of EN GPIO */
> -       ret = gpio_request(phy->gpio_en, "pn544_en");
> +       ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN);
>         if (ret) {
>                 nfc_err(&client->dev, "Fail EN pin\n");
>                 goto err_dt;
> @@ -906,7 +1003,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
>         phy->gpio_fw = ret;
>
>         /* Configuration of FW GPIO */
> -       ret = gpio_request(phy->gpio_fw, "pn544_fw");
> +       ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW);
>         if (ret) {
>                 nfc_err(&client->dev, "Fail FW pin\n");
>                 goto err_gpio_en;
> @@ -1001,6 +1098,14 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
>                 phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
>                 phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
>                 phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
> +       /* Using ACPI */
> +       } else if (ACPI_HANDLE(&client->dev)) {
> +               r = pn544_hci_i2c_acpi_request_resources(client);
> +               if (r) {
> +                       nfc_err(&client->dev,
> +                               "Cannot get ACPI data\n");
> +                       return r;
> +               }
>         } else {
>                 nfc_err(&client->dev, "No platform data\n");
>                 return -EINVAL;
> @@ -1020,9 +1125,12 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
>                             PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
>                             PN544_HCI_I2C_LLC_MAX_PAYLOAD,
>                             pn544_hci_i2c_fw_download, &phy->hdev);
> -       if (r < 0)
> +       if (r < 0) {
> +               nfc_err(&client->dev, "HCI Probing error\n");
>                 goto err_hci;
> +       }
>
> +       nfc_info(&client->dev, "NFC I2C driver loaded\n");
>         return 0;
>
>  err_hci:
> @@ -1080,6 +1188,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
>                    .name = PN544_HCI_I2C_DRIVER_NAME,
>                    .owner  = THIS_MODULE,
>                    .of_match_table = of_match_ptr(of_pn544_i2c_match),
> +                  .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
>                   },
>         .probe = pn544_hci_i2c_probe,
>         .id_table = pn544_hci_i2c_id_table,
> diff --git a/net/nfc/core.c b/net/nfc/core.c
> index 819b877..a53c2cc 100644
> --- a/net/nfc/core.c
> +++ b/net/nfc/core.c
> @@ -32,6 +32,7 @@
>
>  #include "nfc.h"
>
> +#define DEBUG
>  #define VERSION "0.1"
>
>  #define NFC_CHECK_PRES_FREQ_MS 2000
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] nfc: NXP PN544 ACPI support
@ 2015-01-22 16:07     ` Daniel Baluta
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Baluta @ 2015-01-22 16:07 UTC (permalink / raw)
  To: Robert Dolca
  Cc: linux-nfc, Linux Kernel Mailing List, linux-wireless, netdev,
	Lauro Ramos Venancio, Aloisio Almeida Jr, Samuel Ortiz,
	David S. Miller, Johannes Berg, Clement Perrochaud

On Fri, Jan 9, 2015 at 2:02 PM, Robert Dolca <robert.dolca@intel.com> wrote:
> Device id: NXP5440
> Pin mapping:
>  - 0 IRQ pin
>  - 1 enable pin
>  - 2 firmware pin
>
> Signed-off-by: Robert Dolca <robert.dolca@intel.com>
> ---
>  drivers/nfc/Kconfig     |   1 +
>  drivers/nfc/pn544/i2c.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++--
>  net/nfc/core.c          |   1 +
>  3 files changed, 114 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
> index 7929fac..a25e712 100644
> --- a/drivers/nfc/Kconfig
> +++ b/drivers/nfc/Kconfig
> @@ -68,6 +68,7 @@ config NFC_PORT100
>
>           If unsure, say N.
>
> +source "drivers/nfc/pn547/Kconfig"

I think this line shouldn't be here :).

>  source "drivers/nfc/pn544/Kconfig"
>  source "drivers/nfc/microread/Kconfig"
>  source "drivers/nfc/nfcmrvl/Kconfig"
> diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c
> index 5f4b9c1..58b9029 100644
> --- a/drivers/nfc/pn544/i2c.c
> +++ b/drivers/nfc/pn544/i2c.c
> @@ -24,6 +24,7 @@
>  #include <linux/gpio.h>
>  #include <linux/of_gpio.h>
>  #include <linux/of_irq.h>
> +#include <linux/acpi.h>
>  #include <linux/miscdevice.h>
>  #include <linux/interrupt.h>
>  #include <linux/delay.h>
> @@ -41,6 +42,11 @@
>  #define PN544_I2C_FRAME_HEADROOM 1
>  #define PN544_I2C_FRAME_TAILROOM 2
>
> +/* GPIO names */
> +#define PN544_GPIO_NAME_IRQ "pn544_irq"
> +#define PN544_GPIO_NAME_FW  "pn544_fw"
> +#define PN544_GPIO_NAME_EN  "pn544_en"
> +
>  /* framing in HCI mode */
>  #define PN544_HCI_I2C_LLC_LEN          1
>  #define PN544_HCI_I2C_LLC_CRC          2
> @@ -58,6 +64,13 @@ static struct i2c_device_id pn544_hci_i2c_id_table[] = {
>
>  MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
>
> +static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
> +       {"NXP5440", 0},
> +       {}
> +};
> +
> +MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
> +
>  #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
>
>  /*
> @@ -859,6 +872,90 @@ exit_state_wait_secure_write_answer:
>         }
>  }
>
> +static int pn544_hci_i2c_acpi_request_resources(struct i2c_client *client)
> +{
> +       struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
> +       const struct acpi_device_id *id;
> +       struct gpio_desc *gpiod_en, *gpiod_irq, *gpiod_fw;
> +       struct device *dev;
> +       int ret;
> +
> +       if (!client)
> +               return -EINVAL;
> +
> +       dev = &client->dev;
> +
> +       /* Match the struct device against a given list of ACPI IDs */
> +       id = acpi_match_device(dev->driver->acpi_match_table, dev);
> +
> +       if (!id)
> +               return -ENODEV;
> +
> +       /* Get EN GPIO from ACPI */
> +       gpiod_en = devm_gpiod_get_index(dev, PN544_GPIO_NAME_EN, 1);
> +       if (IS_ERR(gpiod_en)) {
> +               nfc_err(dev,
> +                       "Unable to get EN GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_en  = desc_to_gpio(gpiod_en);
> +
> +       /* Configuration EN GPIO */
> +       ret = gpiod_direction_output(gpiod_en, 0);
> +       if (ret) {
> +               nfc_err(dev, "Fail EN pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Get FW GPIO from ACPI */
> +       gpiod_fw = devm_gpiod_get_index(dev, PN544_GPIO_NAME_FW, 2);
> +       if (IS_ERR(gpiod_fw)) {
> +               nfc_err(dev,
> +                       "Unable to get FW GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_fw  = desc_to_gpio(gpiod_fw);
> +
> +       /* Configuration FW GPIO */
> +       ret = gpiod_direction_output(gpiod_fw, 0);
> +       if (ret) {
> +               nfc_err(dev, "Fail FW pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Get IRQ GPIO */
> +       gpiod_irq = devm_gpiod_get_index(dev, PN544_GPIO_NAME_IRQ, 0);
> +       if (IS_ERR(gpiod_irq)) {
> +               nfc_err(dev,
> +                       "Unable to get IRQ GPIO\n");
> +               return -ENODEV;
> +       }
> +
> +       phy->gpio_irq = desc_to_gpio(gpiod_irq);
> +
> +       /* Configure IRQ GPIO */
> +       ret = gpiod_direction_input(gpiod_irq);
> +       if (ret) {
> +               nfc_err(dev, "Fail IRQ pin direction\n");
> +               return ret;
> +       }
> +
> +       /* Map the pin to an IRQ */
> +       ret = gpiod_to_irq(gpiod_irq);
> +       if (ret < 0) {
> +               nfc_err(dev, "Fail pin IRQ mapping\n");
> +               return ret;
> +       }
> +
> +       nfc_info(dev, "GPIO resource, no:%d irq:%d\n",
> +                       desc_to_gpio(gpiod_irq), ret);
> +       client->irq = ret;
> +
> +       return 0;
> +}
> +
>  #ifdef CONFIG_OF
>
>  static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
> @@ -884,7 +981,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
>         phy->gpio_en = ret;
>
>         /* Configuration of EN GPIO */
> -       ret = gpio_request(phy->gpio_en, "pn544_en");
> +       ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN);
>         if (ret) {
>                 nfc_err(&client->dev, "Fail EN pin\n");
>                 goto err_dt;
> @@ -906,7 +1003,7 @@ static int pn544_hci_i2c_of_request_resources(struct i2c_client *client)
>         phy->gpio_fw = ret;
>
>         /* Configuration of FW GPIO */
> -       ret = gpio_request(phy->gpio_fw, "pn544_fw");
> +       ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW);
>         if (ret) {
>                 nfc_err(&client->dev, "Fail FW pin\n");
>                 goto err_gpio_en;
> @@ -1001,6 +1098,14 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
>                 phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
>                 phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
>                 phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
> +       /* Using ACPI */
> +       } else if (ACPI_HANDLE(&client->dev)) {
> +               r = pn544_hci_i2c_acpi_request_resources(client);
> +               if (r) {
> +                       nfc_err(&client->dev,
> +                               "Cannot get ACPI data\n");
> +                       return r;
> +               }
>         } else {
>                 nfc_err(&client->dev, "No platform data\n");
>                 return -EINVAL;
> @@ -1020,9 +1125,12 @@ static int pn544_hci_i2c_probe(struct i2c_client *client,
>                             PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
>                             PN544_HCI_I2C_LLC_MAX_PAYLOAD,
>                             pn544_hci_i2c_fw_download, &phy->hdev);
> -       if (r < 0)
> +       if (r < 0) {
> +               nfc_err(&client->dev, "HCI Probing error\n");
>                 goto err_hci;
> +       }
>
> +       nfc_info(&client->dev, "NFC I2C driver loaded\n");
>         return 0;
>
>  err_hci:
> @@ -1080,6 +1188,7 @@ static struct i2c_driver pn544_hci_i2c_driver = {
>                    .name = PN544_HCI_I2C_DRIVER_NAME,
>                    .owner  = THIS_MODULE,
>                    .of_match_table = of_match_ptr(of_pn544_i2c_match),
> +                  .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
>                   },
>         .probe = pn544_hci_i2c_probe,
>         .id_table = pn544_hci_i2c_id_table,
> diff --git a/net/nfc/core.c b/net/nfc/core.c
> index 819b877..a53c2cc 100644
> --- a/net/nfc/core.c
> +++ b/net/nfc/core.c
> @@ -32,6 +32,7 @@
>
>  #include "nfc.h"
>
> +#define DEBUG
>  #define VERSION "0.1"
>
>  #define NFC_CHECK_PRES_FREQ_MS 2000
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-01-22 16:07 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-09 12:02 [PATCH 1/2] NFC: pn544: GPIO access that may sleep Robert Dolca
2015-01-09 12:02 ` Robert Dolca
2015-01-09 12:02 ` [PATCH 2/2] nfc: NXP PN544 ACPI support Robert Dolca
2015-01-09 12:02   ` Robert Dolca
2015-01-09 12:02   ` Robert Dolca
2015-01-22 16:07   ` Daniel Baluta
2015-01-22 16:07     ` Daniel Baluta

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.