On Thu, Jun 13, 2019 at 7:08 PM Andy Shevchenko <andriy.shevche...@linux.intel.com> wrote: > > On Thu, Jun 13, 2019 at 05:45:40PM +0200, Stefan Roese wrote: > > This patch adds a check for the GPIOs property existence, before the > > GPIO is requested. This fixes an issue seen when the 8250 mctrl_gpio > > support is added (2nd patch in this patch series) on x86 platforms using > > ACPI. > > > > Here Mika's comments from 2016-08-09: > > > > " > > I noticed that with v4.8-rc1 serial console of some of our Broxton > > systems does not work properly anymore. I'm able to see output but input > > does not work. > > > > I bisected it down to commit 4ef03d328769eddbfeca1f1c958fdb181a69c341 > > ("tty/serial/8250: use mctrl_gpio helpers"). > > > > The reason why it fails is that in ACPI we do not have names for GPIOs > > (except when _DSD is used) so we use the "idx" to index into _CRS GPIO > > resources. Now mctrl_gpio_init_noauto() goes through a list of GPIOs > > calling devm_gpiod_get_index_optional() passing "idx" of 0 for each. The > > UART device in Broxton has following (simplified) ACPI description: > > > > Device (URT4) > > { > > ... > > Name (_CRS, ResourceTemplate () { > > GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, > > IoRestrictionOutputOnly, > > "\\_SB.GPO0", 0x00, ResourceConsumer) > > { > > 0x003A > > } > > GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, > > IoRestrictionOutputOnly, > > "\\_SB.GPO0", 0x00, ResourceConsumer) > > { > > 0x003D > > } > > }) > > > > In this case it finds the first GPIO (0x003A which happens to be RX pin > > for that UART), turns it into GPIO which then breaks input for the UART > > device. This also breaks systems with bluetooth connected to UART (those > > typically have some GPIOs in their _CRS). > > > > Any ideas how to fix this? > > > > We cannot just drop the _CRS index lookup fallback because that would > > break many existing machines out there so maybe we can limit this to > > only DT enabled machines. Or alternatively probe if the property first > > exists before trying to acquire the GPIOs (using > > device_property_present()). > > " > > > > This patch implements the fix suggested by Mika in his statement above. > > > > Reviewed-by: Andy Shevchenko <andriy.shevche...@linux.intel.com>
I cannot compile the driver without adding #include <linux/property.h> to drivers/tty/serial/serial_mctrl_gpio.c. My platform is AM335X (OMAP3). I've tried the patches both against the main repo and also tty-next. Other than that everything is working. Yegor > > Signed-off-by: Stefan Roese <s...@denx.de> > > Reviewed-by: Mika Westerberg <mika.westerb...@linux.intel.com> > > Cc: Mika Westerberg <mika.westerb...@linux.intel.com> > > Cc: Andy Shevchenko <andriy.shevche...@linux.intel.com> > > Cc: Yegor Yefremov <yegorsli...@googlemail.com> > > Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org> > > Cc: Giulio Benetti <giulio.bene...@micronovasrl.com> > > --- > > v6: > > - No change > > > > v5: > > - Simplified the code a bit (Andy) > > - Added gpio_str == NULL handling (Andy) > > > > v4: > > - Add missing free() calls (Johan) > > - Added Mika's reviewed by tag > > - Added Johan to Cc > > > > v3: > > - No change > > > > v2: > > - Include the problem description and analysis from Mika into the commit > > text, as suggested by Greg. > > > > drivers/tty/serial/serial_mctrl_gpio.c | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/drivers/tty/serial/serial_mctrl_gpio.c > > b/drivers/tty/serial/serial_mctrl_gpio.c > > index 39ed56214cd3..65348887a749 100644 > > --- a/drivers/tty/serial/serial_mctrl_gpio.c > > +++ b/drivers/tty/serial/serial_mctrl_gpio.c > > @@ -116,6 +116,19 @@ struct mctrl_gpios *mctrl_gpio_init_noauto(struct > > device *dev, unsigned int idx) > > > > for (i = 0; i < UART_GPIO_MAX; i++) { > > enum gpiod_flags flags; > > + char *gpio_str; > > + bool present; > > + > > + /* Check if GPIO property exists and continue if not */ > > + gpio_str = kasprintf(GFP_KERNEL, "%s-gpios", > > + mctrl_gpios_desc[i].name); > > + if (!gpio_str) > > + continue; > > + > > + present = device_property_present(dev, gpio_str); > > + kfree(gpio_str); > > + if (!present) > > + continue; > > > > if (mctrl_gpios_desc[i].dir_out) > > flags = GPIOD_OUT_LOW; > > -- > > 2.22.0 > > > > -- > With Best Regards, > Andy Shevchenko > >