linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table
@ 2017-04-24 18:41 Andy Shevchenko
  2017-04-24 18:41 ` [PATCH v1 2/2] NFC: st21nfca: Get rid of code duplication in ->probe() Andy Shevchenko
  2017-05-22 18:33 ` [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
  0 siblings, 2 replies; 4+ messages in thread
From: Andy Shevchenko @ 2017-04-24 18:41 UTC (permalink / raw)
  To: Samuel Ortiz, linux-wireless, Christophe Ricard; +Cc: Andy Shevchenko

In order to make GPIO ACPI library stricter prepare users of
gpiod_get_index() to correctly behave when there no mapping is
provided by firmware.

Here we add explicit mapping between _CRS GpioIo() resources and
their names used in the driver.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/nfc/st21nfca/i2c.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index 02a920ca07c8..a04f24334b54 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -501,14 +501,25 @@ static struct nfc_phy_ops i2c_phy_ops = {
 	.disable = st21nfca_hci_i2c_disable,
 };
 
+static const struct acpi_gpio_params enable_gpios = { 1, 0, false };
+
+static const struct acpi_gpio_mapping acpi_st21nfca_gpios[] = {
+	{ "enable-gpios", &enable_gpios, 1 },
+	{},
+};
+
 static int st21nfca_hci_i2c_acpi_request_resources(struct i2c_client *client)
 {
 	struct st21nfca_i2c_phy *phy = i2c_get_clientdata(client);
 	struct device *dev = &client->dev;
+	int ret;
+
+	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), acpi_st21nfca_gpios);
+	if (ret)
+		return ret;
 
 	/* Get EN GPIO from ACPI */
-	phy->gpiod_ena = devm_gpiod_get_index(dev, ST21NFCA_GPIO_NAME_EN, 1,
-					      GPIOD_OUT_LOW);
+	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN, GPIOD_OUT_LOW);
 	if (IS_ERR(phy->gpiod_ena)) {
 		nfc_err(dev, "Unable to get ENABLE GPIO\n");
 		return PTR_ERR(phy->gpiod_ena);
@@ -523,8 +534,7 @@ static int st21nfca_hci_i2c_of_request_resources(struct i2c_client *client)
 	struct device *dev = &client->dev;
 
 	/* Get GPIO from device tree */
-	phy->gpiod_ena = devm_gpiod_get_index(dev, ST21NFCA_GPIO_NAME_EN, 0,
-					      GPIOD_OUT_HIGH);
+	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN, GPIOD_OUT_HIGH);
 	if (IS_ERR(phy->gpiod_ena)) {
 		nfc_err(dev, "Failed to request enable pin\n");
 		return PTR_ERR(phy->gpiod_ena);
@@ -618,6 +628,7 @@ static int st21nfca_hci_i2c_remove(struct i2c_client *client)
 	if (phy->powered)
 		st21nfca_hci_i2c_disable(phy);
 
+	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&client->dev));
 	return 0;
 }
 
-- 
2.11.0

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

* [PATCH v1 2/2] NFC: st21nfca: Get rid of code duplication in ->probe()
  2017-04-24 18:41 [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
@ 2017-04-24 18:41 ` Andy Shevchenko
  2017-05-22 18:33 ` [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
  1 sibling, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2017-04-24 18:41 UTC (permalink / raw)
  To: Samuel Ortiz, linux-wireless, Christophe Ricard; +Cc: Andy Shevchenko

Since OF and ACPI case almost the same get rid of code duplication
by moving gpiod_get() calls directly to ->probe().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/nfc/st21nfca/i2c.c | 62 ++++++++--------------------------------------
 1 file changed, 10 insertions(+), 52 deletions(-)

diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index a04f24334b54..525f72f49b73 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -61,8 +61,6 @@
 #define ST21NFCA_HCI_DRIVER_NAME "st21nfca_hci"
 #define ST21NFCA_HCI_I2C_DRIVER_NAME "st21nfca_hci_i2c"
 
-#define ST21NFCA_GPIO_NAME_EN "enable"
-
 struct st21nfca_i2c_phy {
 	struct i2c_client *i2c_dev;
 	struct nfc_hci_dev *hdev;
@@ -508,44 +506,10 @@ static const struct acpi_gpio_mapping acpi_st21nfca_gpios[] = {
 	{},
 };
 
-static int st21nfca_hci_i2c_acpi_request_resources(struct i2c_client *client)
-{
-	struct st21nfca_i2c_phy *phy = i2c_get_clientdata(client);
-	struct device *dev = &client->dev;
-	int ret;
-
-	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), acpi_st21nfca_gpios);
-	if (ret)
-		return ret;
-
-	/* Get EN GPIO from ACPI */
-	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN, GPIOD_OUT_LOW);
-	if (IS_ERR(phy->gpiod_ena)) {
-		nfc_err(dev, "Unable to get ENABLE GPIO\n");
-		return PTR_ERR(phy->gpiod_ena);
-	}
-
-	return 0;
-}
-
-static int st21nfca_hci_i2c_of_request_resources(struct i2c_client *client)
-{
-	struct st21nfca_i2c_phy *phy = i2c_get_clientdata(client);
-	struct device *dev = &client->dev;
-
-	/* Get GPIO from device tree */
-	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN, GPIOD_OUT_HIGH);
-	if (IS_ERR(phy->gpiod_ena)) {
-		nfc_err(dev, "Failed to request enable pin\n");
-		return PTR_ERR(phy->gpiod_ena);
-	}
-
-	return 0;
-}
-
 static int st21nfca_hci_i2c_probe(struct i2c_client *client,
 				  const struct i2c_device_id *id)
 {
+	struct device *dev = &client->dev;
 	struct st21nfca_i2c_phy *phy;
 	int r;
 
@@ -572,21 +536,15 @@ static int st21nfca_hci_i2c_probe(struct i2c_client *client,
 	mutex_init(&phy->phy_lock);
 	i2c_set_clientdata(client, phy);
 
-	if (client->dev.of_node) {
-		r = st21nfca_hci_i2c_of_request_resources(client);
-		if (r) {
-			nfc_err(&client->dev, "No platform data\n");
-			return r;
-		}
-	} else if (ACPI_HANDLE(&client->dev)) {
-		r = st21nfca_hci_i2c_acpi_request_resources(client);
-		if (r) {
-			nfc_err(&client->dev, "Cannot get ACPI data\n");
-			return r;
-		}
-	} else {
-		nfc_err(&client->dev, "st21nfca platform resources not available\n");
-		return -ENODEV;
+	r = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), acpi_st21nfca_gpios);
+	if (r)
+		dev_dbg(dev, "Unable to add GPIO mapping table\n");
+
+	/* Get EN GPIO from resource provider */
+	phy->gpiod_ena = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
+	if (IS_ERR(phy->gpiod_ena)) {
+		nfc_err(dev, "Unable to get ENABLE GPIO\n");
+		return PTR_ERR(phy->gpiod_ena);
 	}
 
 	phy->se_status.is_ese_present =
-- 
2.11.0

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

* Re: [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table
  2017-04-24 18:41 [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
  2017-04-24 18:41 ` [PATCH v1 2/2] NFC: st21nfca: Get rid of code duplication in ->probe() Andy Shevchenko
@ 2017-05-22 18:33 ` Andy Shevchenko
  2017-06-05 20:20   ` Andy Shevchenko
  1 sibling, 1 reply; 4+ messages in thread
From: Andy Shevchenko @ 2017-05-22 18:33 UTC (permalink / raw)
  To: Samuel Ortiz, linux-wireless, Christophe Ricard

On Mon, 2017-04-24 at 21:41 +0300, Andy Shevchenko wrote:
> In order to make GPIO ACPI library stricter prepare users of
> gpiod_get_index() to correctly behave when there no mapping is
> provided by firmware.
> 
> Here we add explicit mapping between _CRS GpioIo() resources and
> their names used in the driver.
> 

Samuel, can you apply this if no objections?

> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  drivers/nfc/st21nfca/i2c.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
> index 02a920ca07c8..a04f24334b54 100644
> --- a/drivers/nfc/st21nfca/i2c.c
> +++ b/drivers/nfc/st21nfca/i2c.c
> @@ -501,14 +501,25 @@ static struct nfc_phy_ops i2c_phy_ops = {
>  	.disable = st21nfca_hci_i2c_disable,
>  };
>  
> +static const struct acpi_gpio_params enable_gpios = { 1, 0, false };
> +
> +static const struct acpi_gpio_mapping acpi_st21nfca_gpios[] = {
> +	{ "enable-gpios", &enable_gpios, 1 },
> +	{},
> +};
> +
>  static int st21nfca_hci_i2c_acpi_request_resources(struct i2c_client
> *client)
>  {
>  	struct st21nfca_i2c_phy *phy = i2c_get_clientdata(client);
>  	struct device *dev = &client->dev;
> +	int ret;
> +
> +	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev),
> acpi_st21nfca_gpios);
> +	if (ret)
> +		return ret;
>  
>  	/* Get EN GPIO from ACPI */
> -	phy->gpiod_ena = devm_gpiod_get_index(dev,
> ST21NFCA_GPIO_NAME_EN, 1,
> -					      GPIOD_OUT_LOW);
> +	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN,
> GPIOD_OUT_LOW);
>  	if (IS_ERR(phy->gpiod_ena)) {
>  		nfc_err(dev, "Unable to get ENABLE GPIO\n");
>  		return PTR_ERR(phy->gpiod_ena);
> @@ -523,8 +534,7 @@ static int
> st21nfca_hci_i2c_of_request_resources(struct i2c_client *client)
>  	struct device *dev = &client->dev;
>  
>  	/* Get GPIO from device tree */
> -	phy->gpiod_ena = devm_gpiod_get_index(dev,
> ST21NFCA_GPIO_NAME_EN, 0,
> -					      GPIOD_OUT_HIGH);
> +	phy->gpiod_ena = devm_gpiod_get(dev, ST21NFCA_GPIO_NAME_EN,
> GPIOD_OUT_HIGH);
>  	if (IS_ERR(phy->gpiod_ena)) {
>  		nfc_err(dev, "Failed to request enable pin\n");
>  		return PTR_ERR(phy->gpiod_ena);
> @@ -618,6 +628,7 @@ static int st21nfca_hci_i2c_remove(struct
> i2c_client *client)
>  	if (phy->powered)
>  		st21nfca_hci_i2c_disable(phy);
>  
> +	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&client->dev));
>  	return 0;
>  }
>  

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

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

* Re: [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table
  2017-05-22 18:33 ` [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
@ 2017-06-05 20:20   ` Andy Shevchenko
  0 siblings, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2017-06-05 20:20 UTC (permalink / raw)
  To: Samuel Ortiz, linux-wireless, Christophe Ricard

On Mon, 2017-05-22 at 21:33 +0300, Andy Shevchenko wrote:
> On Mon, 2017-04-24 at 21:41 +0300, Andy Shevchenko wrote:
> > In order to make GPIO ACPI library stricter prepare users of
> > gpiod_get_index() to correctly behave when there no mapping is
> > provided by firmware.
> > 
> > Here we add explicit mapping between _CRS GpioIo() resources and
> > their names used in the driver.
> > 
> 
> Samuel, can you apply this if no objections?

Never mind, I just sent v2 with other drivers fixed / cleaned up as
well.

Please, review, we already at rc4.

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

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

end of thread, other threads:[~2017-06-05 20:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-24 18:41 [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
2017-04-24 18:41 ` [PATCH v1 2/2] NFC: st21nfca: Get rid of code duplication in ->probe() Andy Shevchenko
2017-05-22 18:33 ` [PATCH v1 1/2] NFC: st21nfca: Add GPIO ACPI mapping table Andy Shevchenko
2017-06-05 20:20   ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).