@@ -989,6 +989,15 @@ static void i2c_imx_init_recovery_info(struct imx_i2c_struct *i2c_imx,
{
struct i2c_bus_recovery_info *rinfo = &i2c_imx->rinfo;
+ /* if pinctrl is not supported on the system */
+ if (IS_ERR(i2c_imx->pinctrl))
+ i2c_imx->pinctrl = NULL;
+
+ if (!i2c_imx->pinctrl) {
+ dev_info(&i2c_imx->adapter.dev, "can't get pinctrl, bus recovery not supported\n");
+ return;
+ }
+
i2c_imx->pinctrl_pins_default = pinctrl_lookup_state(i2c_imx->pinctrl,
PINCTRL_STATE_DEFAULT);
i2c_imx->pinctrl_pins_gpio = pinctrl_lookup_state(i2c_imx->pinctrl,
@@ -1081,8 +1090,11 @@ static int i2c_imx_probe(struct platform_device *pdev)
return ret;
}
+ /* optional bus recovery feature through pinctrl */
i2c_imx->pinctrl = devm_pinctrl_get(&pdev->dev);
- if (IS_ERR(i2c_imx->pinctrl)) {
+ /* bailout on -ENOMEM or -EPROBE_DEFER, continue for other errors */
+ if (PTR_ERR(i2c_imx->pinctrl) == -ENOMEM ||
+ PTR_ERR(i2c_imx->pinctrl) == -EPROBE_DEFER) {
ret = PTR_ERR(i2c_imx->pinctrl);
goto clk_disable;
}
@@ -1125,8 +1137,6 @@ static int i2c_imx_probe(struct platform_device *pdev)
i2c_imx, IMX_I2C_I2CR);
imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR);
- i2c_imx_init_recovery_info(i2c_imx, pdev);
-
/* Add I2C adapter */
ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
if (ret < 0) {
@@ -1146,6 +1156,9 @@ static int i2c_imx_probe(struct platform_device *pdev)
/* Init DMA config if supported */
i2c_imx_dma_request(i2c_imx, phy_addr);
+ /* Init bus recovery if supported */
+ i2c_imx_init_recovery_info(i2c_imx, pdev);
+
return 0; /* Return OK */
rpm_disable: