All of lore.kernel.org
 help / color / mirror / Atom feed
* CP2105 gives kernel error -22 when in modem mode
@ 2021-11-25 15:42 Maarten Brock
  2021-11-26  9:47 ` Johan Hovold
  0 siblings, 1 reply; 3+ messages in thread
From: Maarten Brock @ 2021-11-25 15:42 UTC (permalink / raw)
  To: linux-usb, Johan Hovold

Hello all,

When a uart of the CP2105 USB-serial chip is programmed to be in modem 
mode, all its gpio pins are in alternate use and none are available for 
gpio. Still the cp210x driver tries to add a gpiochip unconditionally, 
which results in an error.

> cp210x 1-1.4.4:1.0: cp210x converter detected
> usb 1-1.4.4: cp210x converter now attached to ttyUSB0
> cp210x 1-1.4.4:1.1: cp210x converter detected
> gpio gpiochip2: (cp210x): tried to insert a GPIO chip with zero lines
> gpiochip_add_data_with_key: GPIOs 0..-1 (cp210x) failed to register, 
> -22
> cp210x 1-1.4.4:1.1: GPIO initialisation failed: -22
> usb 1-1.4.4: cp210x converter now attached to ttyUSB1

I propose to add something like the following to cp210x_gpio_init

+	unsigned long valid_mask, altfunc_mask;
...
+	altfunc_mask = priv->gpio_altfunc;
+	bitmap_complement(&valid_mask, &altfunc_mask, priv->gc.ngpio);
+	if (bitmap_empty(&valid_mask, priv->gc.ngpio))
+		return 0;
+
  	priv->gc.label = "cp210x";
  	priv->gc.request = cp210x_gpio_request;
  	priv->gc.get_direction = cp210x_gpio_direction_get;

I can write a proper patch, but am unsure if and what the Fixes tag 
should be.

Maarten


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

* Re: CP2105 gives kernel error -22 when in modem mode
  2021-11-25 15:42 CP2105 gives kernel error -22 when in modem mode Maarten Brock
@ 2021-11-26  9:47 ` Johan Hovold
  2021-11-26 12:53   ` Maarten Brock
  0 siblings, 1 reply; 3+ messages in thread
From: Johan Hovold @ 2021-11-26  9:47 UTC (permalink / raw)
  To: Maarten Brock; +Cc: linux-usb

On Thu, Nov 25, 2021 at 04:42:27PM +0100, Maarten Brock wrote:
> Hello all,
> 
> When a uart of the CP2105 USB-serial chip is programmed to be in modem 
> mode, all its gpio pins are in alternate use and none are available for 
> gpio. Still the cp210x driver tries to add a gpiochip unconditionally, 
> which results in an error.
> 
> > cp210x 1-1.4.4:1.0: cp210x converter detected
> > usb 1-1.4.4: cp210x converter now attached to ttyUSB0
> > cp210x 1-1.4.4:1.1: cp210x converter detected
> > gpio gpiochip2: (cp210x): tried to insert a GPIO chip with zero lines
> > gpiochip_add_data_with_key: GPIOs 0..-1 (cp210x) failed to register, 
> > -22
> > cp210x 1-1.4.4:1.1: GPIO initialisation failed: -22
> > usb 1-1.4.4: cp210x converter now attached to ttyUSB1

Thanks for reporting this.

> I propose to add something like the following to cp210x_gpio_init
> 
> +	unsigned long valid_mask, altfunc_mask;
> ...
> +	altfunc_mask = priv->gpio_altfunc;
> +	bitmap_complement(&valid_mask, &altfunc_mask, priv->gc.ngpio);
> +	if (bitmap_empty(&valid_mask, priv->gc.ngpio))
> +		return 0;
> +
>   	priv->gc.label = "cp210x";
>   	priv->gc.request = cp210x_gpio_request;
>   	priv->gc.get_direction = cp210x_gpio_direction_get;
> 
> I can write a proper patch, but am unsure if and what the Fixes tag 
> should be.

This was introduced by commit c8acfe0aadbe ("USB: serial: cp210x:
implement GPIO support for CP2102N") when generalising GPIO support and
adding support for CP2102N. Before that commit, the GPIO chip would
indeed never have been registered in this case.

The right fix however is to continue to always register the gpiochip but
to make sure that the number of lines is initialised before doing so.
This is how we deal with with the other device types and is also how
CP2105 is handled when both pins of the CP2105 ECI port are muxed for
LED function.

I've just posted a fix here:

	https://lore.kernel.org/r/20211126094348.31698-1-johan@kernel.org

Johan

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

* Re: CP2105 gives kernel error -22 when in modem mode
  2021-11-26  9:47 ` Johan Hovold
@ 2021-11-26 12:53   ` Maarten Brock
  0 siblings, 0 replies; 3+ messages in thread
From: Maarten Brock @ 2021-11-26 12:53 UTC (permalink / raw)
  To: Johan Hovold; +Cc: linux-usb

On 2021-11-26 10:47, Johan Hovold wrote:
> On Thu, Nov 25, 2021 at 04:42:27PM +0100, Maarten Brock wrote:
>> Hello all,
>> 
>> When a uart of the CP2105 USB-serial chip is programmed to be in modem
>> mode, all its gpio pins are in alternate use and none are available 
>> for
>> gpio. Still the cp210x driver tries to add a gpiochip unconditionally,
>> which results in an error.
>> 
>> > cp210x 1-1.4.4:1.0: cp210x converter detected
>> > usb 1-1.4.4: cp210x converter now attached to ttyUSB0
>> > cp210x 1-1.4.4:1.1: cp210x converter detected
>> > gpio gpiochip2: (cp210x): tried to insert a GPIO chip with zero lines
>> > gpiochip_add_data_with_key: GPIOs 0..-1 (cp210x) failed to register,
>> > -22
>> > cp210x 1-1.4.4:1.1: GPIO initialisation failed: -22
>> > usb 1-1.4.4: cp210x converter now attached to ttyUSB1
> 
> Thanks for reporting this.
> 
>> I propose to add something like the following to cp210x_gpio_init
>> 
>> +	unsigned long valid_mask, altfunc_mask;
>> ...
>> +	altfunc_mask = priv->gpio_altfunc;
>> +	bitmap_complement(&valid_mask, &altfunc_mask, priv->gc.ngpio);
>> +	if (bitmap_empty(&valid_mask, priv->gc.ngpio))
>> +		return 0;
>> +
>>   	priv->gc.label = "cp210x";
>>   	priv->gc.request = cp210x_gpio_request;
>>   	priv->gc.get_direction = cp210x_gpio_direction_get;
>> 
>> I can write a proper patch, but am unsure if and what the Fixes tag
>> should be.
> 
> This was introduced by commit c8acfe0aadbe ("USB: serial: cp210x:
> implement GPIO support for CP2102N") when generalising GPIO support and
> adding support for CP2102N. Before that commit, the GPIO chip would
> indeed never have been registered in this case.
> 
> The right fix however is to continue to always register the gpiochip 
> but
> to make sure that the number of lines is initialised before doing so.
> This is how we deal with with the other device types and is also how
> CP2105 is handled when both pins of the CP2105 ECI port are muxed for
> LED function.
> 
> I've just posted a fix here:
> 
> 	https://lore.kernel.org/r/20211126094348.31698-1-johan@kernel.org
> 
> Johan

Thanks for the quick solution. That patch seems to be a better fix for 
this bug and I have acknowledged it with a Tested-by.

I do however wonder if it is desirable to register a GPIO controller 
that has no lines. It's not like those lines can become available at any 
later time. The CP2105 is OTP, but also the other CP210x devices need to 
be reprogrammed and reenumerated for those lines to become available 
again. So I would still vote to apply my proposal though not as a bug 
fix.

Thanks again,
Maarten


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

end of thread, other threads:[~2021-11-26 12:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-25 15:42 CP2105 gives kernel error -22 when in modem mode Maarten Brock
2021-11-26  9:47 ` Johan Hovold
2021-11-26 12:53   ` Maarten Brock

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.