diff options
author | Gao Pan <b54642@freescale.com> | 2015-12-08 22:08:22 -0500 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2016-01-03 13:06:50 -0500 |
commit | a5f650182bcf956b2b0341575e8bff01e402224f (patch) | |
tree | 379b9a84ff590a2b7113b606bf2cbc359086143e | |
parent | 7ee24eb508d61e5b74dcc80f644adfb5916f7580 (diff) |
i2c: imx: init bus recovery info before adding i2c adapter
During driver probe, i2c_imx_init_recovery_info() must come before
i2c_add_numbered_adapter(), because the get/set_scl() functions
are assigned in i2c_register_adapter() under the conditon that bus
recover_info are initialized. Otherwise, get/set_scl() function
pointers never get assigned.
In such case, when i2c_generic_gpio_recovery() is used for bus recovery,
there will be kernel crash because bri->set_scl is NULL.
The solution to this bug is moving i2c_imx_init_recovery_info() before
i2c_register_adapter().
Signed-off-by: Gao Pan <b54642@freescale.com>
Signed-off-by: Fugang Duan <B38611@freescale.com>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Cc: stable@kernel.org
-rw-r--r-- | drivers/i2c/busses/i2c-imx.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 9bb0b056b25f..d4d853680ae4 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
@@ -1119,6 +1119,8 @@ static int i2c_imx_probe(struct platform_device *pdev) | |||
1119 | i2c_imx, IMX_I2C_I2CR); | 1119 | i2c_imx, IMX_I2C_I2CR); |
1120 | imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR); | 1120 | imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR); |
1121 | 1121 | ||
1122 | i2c_imx_init_recovery_info(i2c_imx, pdev); | ||
1123 | |||
1122 | /* Add I2C adapter */ | 1124 | /* Add I2C adapter */ |
1123 | ret = i2c_add_numbered_adapter(&i2c_imx->adapter); | 1125 | ret = i2c_add_numbered_adapter(&i2c_imx->adapter); |
1124 | if (ret < 0) { | 1126 | if (ret < 0) { |
@@ -1126,8 +1128,6 @@ static int i2c_imx_probe(struct platform_device *pdev) | |||
1126 | goto clk_disable; | 1128 | goto clk_disable; |
1127 | } | 1129 | } |
1128 | 1130 | ||
1129 | i2c_imx_init_recovery_info(i2c_imx, pdev); | ||
1130 | |||
1131 | /* Set up platform driver data */ | 1131 | /* Set up platform driver data */ |
1132 | platform_set_drvdata(pdev, i2c_imx); | 1132 | platform_set_drvdata(pdev, i2c_imx); |
1133 | clk_disable_unprepare(i2c_imx->clk); | 1133 | clk_disable_unprepare(i2c_imx->clk); |