i2c: tegra: check the clk_prepare_enable() return value

NVIDIA's Tegra SoC allows read/write of controller register only
if controller clock is enabled. System hangs if read/write happens
to registers without enabling clock.

clk_prepare_enable() can be fail due to unknown reason and hence
adding check for return value of this function. If this function
success then only access register otherwise return to caller with
error.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Cc: stable@kernel.org
This commit is contained in:
Laxman Dewangan 2013-03-15 05:34:08 +00:00 committed by Wolfram Sang
parent a937536b86
commit 132c803f7b
1 changed files with 11 additions and 2 deletions

View File

@ -411,7 +411,11 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
int clk_multiplier = I2C_CLK_MULTIPLIER_STD_FAST_MODE; int clk_multiplier = I2C_CLK_MULTIPLIER_STD_FAST_MODE;
u32 clk_divisor; u32 clk_divisor;
tegra_i2c_clock_enable(i2c_dev); err = tegra_i2c_clock_enable(i2c_dev);
if (err < 0) {
dev_err(i2c_dev->dev, "Clock enable failed %d\n", err);
return err;
}
tegra_periph_reset_assert(i2c_dev->div_clk); tegra_periph_reset_assert(i2c_dev->div_clk);
udelay(2); udelay(2);
@ -628,7 +632,12 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
if (i2c_dev->is_suspended) if (i2c_dev->is_suspended)
return -EBUSY; return -EBUSY;
tegra_i2c_clock_enable(i2c_dev); ret = tegra_i2c_clock_enable(i2c_dev);
if (ret < 0) {
dev_err(i2c_dev->dev, "Clock enable failed %d\n", ret);
return ret;
}
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
enum msg_end_type end_type = MSG_END_STOP; enum msg_end_type end_type = MSG_END_STOP;
if (i < (num - 1)) { if (i < (num - 1)) {