From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kmu-office.ch ([178.209.48.109]:42014 "EHLO mail.kmu-office.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753813AbcKIArd (ORCPT ); Tue, 8 Nov 2016 19:47:33 -0500 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Tue, 08 Nov 2016 16:34:50 -0800 From: Stefan Agner To: stable@vger.kernel.org Cc: Wolfram Sang , stable@kernel.org Subject: Re: [PATCH] i2c: imx: defer probe if bus recovery GPIOs are not ready In-Reply-To: <20161109003239.16940-1-stefan@agner.ch> References: <20161109003239.16940-1-stefan@agner.ch> Message-ID: <847750bba7bed752906f75f5df3f8344@agner.ch> Sender: stable-owner@vger.kernel.org List-ID: On 2016-11-08 16:32, Stefan Agner wrote: > commit 533169d164c6b4c8571d0d48779f6ff6be593d72 upstream. > > Some SoC might load the GPIO driver after the I2C driver and > using the I2C bus recovery mechanism via GPIOs. In this case > it is crucial to defer probing if the GPIO request functions > do so, otherwise the I2C driver gets loaded without recovery > mechanisms enabled. > > Signed-off-by: Stefan Agner > Acked-by: Uwe Kleine-König > Acked-by: Li Yang > Signed-off-by: Wolfram Sang > Cc: stable@kernel.org I forgot to mention, this should be applied to 4.4 only. Later versions made the return value void, and it would require a larger rework. I am mainly concerned about LTS... -- Stefan > --- > drivers/i2c/busses/i2c-imx.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c > index d4d8536..32fae2c 100644 > --- a/drivers/i2c/busses/i2c-imx.c > +++ b/drivers/i2c/busses/i2c-imx.c > @@ -1002,10 +1002,13 @@ static void i2c_imx_init_recovery_info(struct > imx_i2c_struct *i2c_imx, > rinfo->scl_gpio = of_get_named_gpio_flags(pdev->dev.of_node, > "scl-gpios", 0, NULL); > > - if (!gpio_is_valid(rinfo->sda_gpio) || > - !gpio_is_valid(rinfo->scl_gpio) || > - IS_ERR(i2c_imx->pinctrl_pins_default) || > - IS_ERR(i2c_imx->pinctrl_pins_gpio)) { > + if (rinfo->sda_gpio == -EPROBE_DEFER || > + rinfo->scl_gpio == -EPROBE_DEFER) { > + return -EPROBE_DEFER; > + } else if (!gpio_is_valid(rinfo->sda_gpio) || > + !gpio_is_valid(rinfo->scl_gpio) || > + IS_ERR(i2c_imx->pinctrl_pins_default) || > + IS_ERR(i2c_imx->pinctrl_pins_gpio)) { > dev_dbg(&pdev->dev, "recovery information incomplete\n"); > return; > }