Hi, Andi Sorry for the long time to reply. According to your advice, I found the patch is too redundant! so I will send V2 patch. I find gpio and pinctrl assignement from the default i2c_init_recovery() have been defined very well. Lpi2c have special initialization conditions for i2c recovery and I have added a comment in V2. > -----Original Message----- > From: Andi Shyti <andi.shyti@xxxxxxxxxx> > Sent: Wednesday, June 14, 2023 7:20 AM > To: Carlos Song <carlos.song@xxxxxxx> > Cc: Aisheng Dong <aisheng.dong@xxxxxxx>; shawnguo@xxxxxxxxxx; > s.hauer@xxxxxxxxxxxxxx; kernel@xxxxxxxxxxxxxx; festevam@xxxxxxxxx; > robh+dt@xxxxxxxxxx; krzysztof.kozlowski+dt@xxxxxxxxxx; conor+dt@xxxxxxxxxx; > Anson.Huang@xxxxxxx; Clark Wang <xiaoning.wang@xxxxxxx>; Bough Chen > <haibo.chen@xxxxxxx>; dl-linux-imx <linux-imx@xxxxxxx>; > linux-i2c@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx; > linux-arm-kernel@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx > Subject: [EXT] Re: [PATCH 1/2] i2c: imx-lpi2c: add bus recovery feature > > Caution: This is an external email. Please take care when clicking links or > opening attachments. When in doubt, report the message using the 'Report this > email' button > > > Hi, > > On Mon, May 29, 2023 at 03:43:01PM +0800, carlos.song@xxxxxxx wrote: > > From: Clark Wang <xiaoning.wang@xxxxxxx> > > > > Add bus recovery feature for LPI2C. > > Need add gpio pinctrl, scl-gpios and sda-gpios configuration in dts. > > please update the commit message according to the dts changes, as well. > Carlos: There is still a need to add gpio pinctrl to set i2c sda/scl pin to gpio > [...] > > > +static void lpi2c_imx_prepare_recovery(struct i2c_adapter *adap) { > > + struct lpi2c_imx_struct *lpi2c_imx; > > + > > + lpi2c_imx = container_of(adap, struct lpi2c_imx_struct, > > + adapter); > > + > > + pinctrl_select_state(lpi2c_imx->pinctrl, > > +lpi2c_imx->pinctrl_pins_gpio); } > > + > > +static void lpi2c_imx_unprepare_recovery(struct i2c_adapter *adap) { > > + struct lpi2c_imx_struct *lpi2c_imx; > > + > > + lpi2c_imx = container_of(adap, struct lpi2c_imx_struct, > > + adapter); > > + > > + pinctrl_select_state(lpi2c_imx->pinctrl, > > +lpi2c_imx->pinctrl_pins_default); } > > + > > +/* > > + * We switch SCL and SDA to their GPIO function and do some > > +bitbanging > > + * for bus recovery. These alternative pinmux settings can be > > + * described in the device tree by a separate pinctrl state "gpio". > > +If > > is this still true? > Carlos: Yes it is true. > > + * this is missing this is not a big problem, the only implication is > > + * that we can't do bus recovery. > > + */ > > +static int lpi2c_imx_init_recovery_info(struct lpi2c_imx_struct *lpi2c_imx, > > + struct platform_device *pdev) { > > + struct i2c_bus_recovery_info *rinfo = &lpi2c_imx->rinfo; > > + > > + lpi2c_imx->pinctrl = devm_pinctrl_get(&pdev->dev); > > + if (!lpi2c_imx->pinctrl || IS_ERR(lpi2c_imx->pinctrl)) { > > + dev_info(&pdev->dev, "can't get pinctrl, bus recovery not > supported\n"); > > + return PTR_ERR(lpi2c_imx->pinctrl); > > + } > > + > > + lpi2c_imx->pinctrl_pins_default = > pinctrl_lookup_state(lpi2c_imx->pinctrl, > > + PINCTRL_STATE_DEFAULT); > > + lpi2c_imx->pinctrl_pins_gpio = pinctrl_lookup_state(lpi2c_imx->pinctrl, > > + "gpio"); > > + rinfo->sda_gpiod = devm_gpiod_get(&pdev->dev, "sda", GPIOD_IN); > > + rinfo->scl_gpiod = devm_gpiod_get(&pdev->dev, "scl", > > + GPIOD_OUT_HIGH_OPEN_DRAIN); > > + > > + if (PTR_ERR(rinfo->sda_gpiod) == -EPROBE_DEFER || > > + PTR_ERR(rinfo->scl_gpiod) == -EPROBE_DEFER) { > > + return -EPROBE_DEFER; > > + } else if (IS_ERR(rinfo->sda_gpiod) || > > + IS_ERR(rinfo->scl_gpiod) || > > + IS_ERR(lpi2c_imx->pinctrl_pins_default) || > > + IS_ERR(lpi2c_imx->pinctrl_pins_gpio)) { > > + dev_dbg(&pdev->dev, "recovery information incomplete\n"); > > + return 0; > > + } > > Why not use these assignement from the default i2c_init_recovery()? Is there > anything you are doing I am not seeing? > Carlos: these assignements are too redundant and I will fix it in V2 patch. > > + > > + dev_info(&pdev->dev, "using scl%s for recovery\n", > > + rinfo->sda_gpiod ? ",sda" : ""); > > is there any case when sda_gpiod is NULL? > Carlos: I will delete it in V2. > > + > > + rinfo->prepare_recovery = lpi2c_imx_prepare_recovery; > > + rinfo->unprepare_recovery = lpi2c_imx_unprepare_recovery; > > + rinfo->recover_bus = i2c_generic_scl_recovery; > > + lpi2c_imx->adapter.bus_recovery_info = rinfo; > > do you need also the set_scl() function? It should be mandatory. > Carlos: I will use the default setting in V2 patch. > > + > > + return 0; > > +} > > Besides, this is a copy/paste from i2c-imx.c, any chance to put the two things > together? > Carlos: I hope to apply the new recovery patch for lpi2c. > Andi