From: Marc Zyngier <maz@kernel.org>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: Johan Hovold <johan@kernel.org>, linux-usb@vger.kernel.org
Subject: Re: [PATCH] USB: serial: ftdi_sio: Helpful error on GPIO attempt
Date: Wed, 02 Dec 2020 18:13:19 +0000 [thread overview]
Message-ID: <76a8c528f98df0797c79d870bb6587a4@kernel.org> (raw)
In-Reply-To: <43d788c69a0f4fe3caf578b98ae72395@kernel.org>
On 2020-12-01 15:01, Marc Zyngier wrote:
> Hi Linus,
>
> On 2020-12-01 14:10, Linus Walleij wrote:
>> The FTDI adapters present all potentially available GPIO
>> lines to userspace, and they are often also visibly
>> available on things like breakout boards. These are
>> appetizing targets for random GPIO tinkering such as
>> bit-banging or other industrial control over USB.
>>
>> When a user attempts to use one of the GPIO lines, they
>> can get the opaque error -ENODEV, because the flashed
>> configuration says that the line is not in GPIO mode
>> but another alternative function.
>>
>> We had one user run into this, debug and finally fix the
>> problem using ftx-prog.
>
> Well, you gave me 2/3 of the solution ;-). How about adding
> a pointer to this tool? [1]
>
>>
>> Give the user some more helpful dmesg text and a pointer
>> to ftx-prog when the error occurs.
>>
>> Reported-by: Marc Zyngier <maz@kernel.org>
>> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
>> ---
>> drivers/usb/serial/ftdi_sio.c | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/serial/ftdi_sio.c
>> b/drivers/usb/serial/ftdi_sio.c
>> index e0f4c3d9649c..405fec78f2fc 100644
>> --- a/drivers/usb/serial/ftdi_sio.c
>> +++ b/drivers/usb/serial/ftdi_sio.c
>> @@ -1841,8 +1841,11 @@ static int ftdi_gpio_request(struct gpio_chip
>> *gc, unsigned int offset)
>> struct ftdi_private *priv = usb_get_serial_port_data(port);
>> int result;
>>
>> - if (priv->gpio_altfunc & BIT(offset))
>> + if (priv->gpio_altfunc & BIT(offset)) {
>> + dev_err(&port->dev, "FTDI firmware says line is not in GPIO
>> mode\n");
>> + dev_err(&port->dev, "if you really know what you're doing the flash
>> can be reconfigured using ftx-prog\n");
>> return -ENODEV;
>> + }
>>
>> mutex_lock(&priv->gpio_lock);
>> if (!priv->gpio_used) {
>
> It occurs to me that since the driver already knows which of the CBUS
> pins are unusable, we should maybe find a way to expose the line as
> "reserved", one way or another? Generic tools such as gpioinfo would
> (or should?) be able to display the status of the pin to the user.
>
> enum gpio_v2_line_flag doesn't have a "reserved" flag, so maybe
> GPIO_V2_LINE_FLAG_USED is an adequate way to mark the line as
> being unavailable for userspace?
And to clarify what I mean, here's a patchlet that does the trick.
maz@tiger-roach:~$ sudo gpioinfo gpiochip3
gpiochip3 - 4 lines:
line 0: unnamed unused output active-high
line 1: "AltFunc" kernel input active-high [used]
line 2: "AltFunc" kernel input active-high [used]
line 3: "AltFunc" kernel input active-high [used]
It at least make clear that you can't grab the GPIO. Of course, you
don't get the message that you just added...
Thoughts?
M.
diff --git a/drivers/usb/serial/ftdi_sio.c
b/drivers/usb/serial/ftdi_sio.c
index e0f4c3d9649c..00da3f42139f 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -44,6 +44,8 @@
#include "ftdi_sio.h"
#include "ftdi_sio_ids.h"
+#include "../../gpio/gpiolib.h"
+
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Bill Ryder
<bryder@sgi.com>, Kuba Ober <kuba@mareimbrium.org>, Andreas Mohr, Johan
Hovold <jhovold@gmail.com>"
#define DRIVER_DESC "USB FTDI Serial Converters Driver"
@@ -2143,11 +2145,13 @@ static int ftdi_gpio_init_ftx(struct
usb_serial_port *port)
return result;
}
+static const char *altfunc = "AltFunc";
+
static int ftdi_gpio_init(struct usb_serial_port *port)
{
struct ftdi_private *priv = usb_get_serial_port_data(port);
struct usb_serial *serial = port->serial;
- int result;
+ int result, i;
switch (priv->chip_type) {
case FT232H:
@@ -2183,10 +2187,23 @@ static int ftdi_gpio_init(struct usb_serial_port
*port)
priv->gc.can_sleep = true;
result = gpiochip_add_data(&priv->gc, port);
- if (!result)
- priv->gpio_registered = true;
+ if (result)
+ return result;
- return result;
+ priv->gpio_registered = true;
+
+ for (i = 0; i < priv->gc.ngpio; i++) {
+ struct gpio_desc *desc;
+
+ if (!(priv->gpio_altfunc & BIT(i)))
+ continue;
+
+ desc = gpiochip_get_desc(&priv->gc, i);
+ desc->flags |= BIT(FLAG_REQUESTED);
+ desc->name = altfunc;
+ }
+
+ return 0;
}
static void ftdi_gpio_remove(struct usb_serial_port *port)
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2020-12-02 18:14 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-01 14:10 [PATCH] USB: serial: ftdi_sio: Helpful error on GPIO attempt Linus Walleij
2020-12-01 15:01 ` Marc Zyngier
2020-12-02 18:13 ` Marc Zyngier [this message]
2020-12-08 8:39 ` Linus Walleij
2020-12-08 9:02 ` Johan Hovold
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=76a8c528f98df0797c79d870bb6587a4@kernel.org \
--to=maz@kernel.org \
--cc=johan@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).