GPIO consumer interface and DT

Arkadiusz Lis areklis909 at gmail.com
Wed Aug 15 18:11:02 EDT 2018


Hi guys,
I'd like emxx_udc driver to start using gpio consumer interface. I
prepared draft of a patch and I have a question regarding obtaining gpio
descriptor.
So I use this:
devm_gpiod_get(struct device *dev, const char *con_id,
enum gpiod_flags flags), the second argument is con_id. What I learned
from Documentation/driver-api/gpio/board.rst is this string should be
equal to <function> prefix in <function>-gpios node in device tree.
For example: in file drivers/i2c/busses/i2c-gpio.c author gets gpio
descriptor with con_ids 'sda' and 'scl'. They are described in
Documentation/devicetree/bindings/i2c/i2c-gpio.txt as required
properties. 
In my case I didn't find bindings for emxx_udc driver and I don't know
what string should I insert:
gpiod = devm_gpiod_get(udc->dev, "DT_GPIOS_NAME", GPIOD_IN); //
"DT_GPIOS_NAME" is a placeholder

Do you know who defines bindings or how can I solve this issue? Maybe
I'm searching in the wrong direction and this is not how it should be
done? Comments and hints are very welcome

Thanks,
Arek
---

>From 2afe158b9793f614518b1897d6f67d74f92bc95e Mon Sep 17 00:00:00 2001
From: Arkadiusz Lis <areklis909 at gmail.com>
Date: Wed, 15 Aug 2018 23:34:12 +0200
Subject: [PATCH] Staging: emxx_udc: start using gpio consumer interface

Remove usages of old linux/gpio.h interface, instead prefer
new linux/gpio/consumer.h
Obtain gpio descriptor in probe(), port getting gpio value
to more recent interface.

Signed-off-by: Arkadiusz Lis <areklis909 at gmail.com>
---
 drivers/staging/emxx_udc/emxx_udc.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c
index 3e51476..fe8546a 100644
--- a/drivers/staging/emxx_udc/emxx_udc.c
+++ b/drivers/staging/emxx_udc/emxx_udc.c
@@ -27,7 +27,7 @@
 #include <linux/usb/gadget.h>
 
 #include <linux/irq.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 
 #include "emxx_udc.h"
 
@@ -57,7 +57,7 @@
 /*===========================================================================*/
 /* Global */
 struct nbu2ss_udc udc_controller;
-
+static struct gpio_desc *gpiod;
 /*-------------------------------------------------------------------------*/
 /* Read */
 static inline u32 _nbu2ss_readl(void *address)
@@ -2303,7 +2303,7 @@ static inline void _nbu2ss_check_vbus(struct nbu2ss_udc *udc)
 	mdelay(VBUS_CHATTERING_MDELAY);		/* wait (ms) */
 
 	/* VBUS ON Check*/
-	reg_dt = gpio_get_value(VBUS_VALUE);
+	reg_dt = gpiod_get_value(gpiod);
 	if (reg_dt == 0) {
 		udc->linux_suspended = 0;
 
@@ -2330,7 +2330,7 @@ static inline void _nbu2ss_check_vbus(struct nbu2ss_udc *udc)
 		}
 	} else {
 		mdelay(5);		/* wait (5ms) */
-		reg_dt = gpio_get_value(VBUS_VALUE);
+		reg_dt = gpiod_get_value(gpiod);
 		if (reg_dt == 0)
 			return;
 
@@ -2394,7 +2394,7 @@ static inline void _nbu2ss_int_usb_suspend(struct nbu2ss_udc *udc)
 	u32	reg_dt;
 
 	if (udc->usb_suspended == 0) {
-		reg_dt = gpio_get_value(VBUS_VALUE);
+		reg_dt = gpiod_get_value(gpiod);
 
 		if (reg_dt == 0)
 			return;
@@ -2434,7 +2434,7 @@ static irqreturn_t _nbu2ss_udc_irq(int irq, void *_udc)
 	struct nbu2ss_udc	*udc = (struct nbu2ss_udc *)_udc;
 	struct fc_regs	*preg = udc->p_regs;
 
-	if (gpio_get_value(VBUS_VALUE) == 0) {
+	if (gpiod_get_value(gpiod) == 0) {
 		_nbu2ss_writel(&preg->USB_INT_STA, ~USB_INT_STA_RW);
 		_nbu2ss_writel(&preg->USB_INT_ENA, 0);
 		return IRQ_HANDLED;
@@ -2443,7 +2443,7 @@ static irqreturn_t _nbu2ss_udc_irq(int irq, void *_udc)
 	spin_lock(&udc->lock);
 
 	for (;;) {
-		if (gpio_get_value(VBUS_VALUE) == 0) {
+		if (gpiod_get_value(gpiod) == 0) {
 			_nbu2ss_writel(&preg->USB_INT_STA, ~USB_INT_STA_RW);
 			_nbu2ss_writel(&preg->USB_INT_ENA, 0);
 			status = 0;
@@ -2852,7 +2852,7 @@ static int nbu2ss_ep_fifo_status(struct usb_ep *_ep)
 
 	preg = udc->p_regs;
 
-	data = gpio_get_value(VBUS_VALUE);
+	data = gpiod_get_value(gpiod);
 	if (data == 0)
 		return -EINVAL;
 
@@ -2896,7 +2896,7 @@ static void  nbu2ss_ep_fifo_flush(struct usb_ep *_ep)
 		return;
 	}
 
-	data = gpio_get_value(VBUS_VALUE);
+	data = gpiod_get_value(gpiod);
 	if (data == 0)
 		return;
 
@@ -2938,7 +2938,7 @@ static int nbu2ss_gad_get_frame(struct usb_gadget *pgadget)
 	}
 
 	udc = container_of(pgadget, struct nbu2ss_udc, gadget);
-	data = gpio_get_value(VBUS_VALUE);
+	data = gpiod_get_value(gpiod);
 	if (data == 0)
 		return -EINVAL;
 
@@ -2964,7 +2964,7 @@ static int nbu2ss_gad_wakeup(struct usb_gadget *pgadget)
 		return -EINVAL;
 	}
 
-	data = gpio_get_value(VBUS_VALUE);
+	data = gpiod_get_value(gpiod);
 	if (data == 0) {
 		dev_warn(&pgadget->dev, "VBUS LEVEL = %d\n", data);
 		return -EINVAL;
@@ -3224,6 +3224,11 @@ static int nbu2ss_drv_probe(struct platform_device *pdev)
 		return status;
 	}
 
+        gpiod = devm_gpiod_get(udc->dev, "DT_GPIOS_NAME", GPIOD_IN);
+        if(IS_ERR(gpiod)) {
+		dev_err(udc->dev, "failed to get gpio\n");
+		return PTR_ERR(gpiod);
+	}
 	/* Driver Initialization */
 	status = nbu2ss_drv_contest_init(pdev, udc);
 	if (status < 0) {
@@ -3314,7 +3319,7 @@ static int nbu2ss_drv_resume(struct platform_device *pdev)
 	if (!udc)
 		return 0;
 
-	data = gpio_get_value(VBUS_VALUE);
+	data = gpiod_get_value(gpiod);
 	if (data) {
 		udc->vbus_active = 1;
 		udc->devstate = USB_STATE_POWERED;
-- 
1.9.1





More information about the Kernelnewbies mailing list