| From 954abf2a084b2ee36c36723a847afea28b557c90 Mon Sep 17 00:00:00 2001 |
| From: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Date: Fri, 2 May 2014 21:15:14 +0200 |
| Subject: i2c: sh_mobile: bail out on errors when initializing |
| |
| sh_mobile_i2c_init() could detect wrong settings, but didn't bail out, |
| so it would continue unconfigured. Fix this. |
| |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit 6ed7053c2255c34886297b995c6a18607b36d668) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/i2c/busses/i2c-sh_mobile.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c |
| index 9a5b693454e1..9f02013eaeeb 100644 |
| --- a/drivers/i2c/busses/i2c-sh_mobile.c |
| +++ b/drivers/i2c/busses/i2c-sh_mobile.c |
| @@ -228,7 +228,7 @@ static u32 sh_mobile_i2c_icch(unsigned long count_khz, u32 tHIGH, u32 tf) |
| return (((count_khz * (tHIGH + tf)) + 5000) / 10000); |
| } |
| |
| -static void sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd) |
| +static int sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd) |
| { |
| unsigned long i2c_clk_khz; |
| u32 tHIGH, tLOW, tf; |
| @@ -236,6 +236,7 @@ static void sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd) |
| /* Get clock rate after clock is enabled */ |
| clk_prepare_enable(pd->clk); |
| i2c_clk_khz = clk_get_rate(pd->clk) / 1000; |
| + clk_disable_unprepare(pd->clk); |
| i2c_clk_khz /= pd->clks_per_count; |
| |
| if (pd->bus_speed == STANDARD_MODE) { |
| @@ -249,7 +250,7 @@ static void sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd) |
| } else { |
| dev_err(pd->dev, "unrecognized bus speed %lu Hz\n", |
| pd->bus_speed); |
| - goto out; |
| + return -EINVAL; |
| } |
| |
| pd->iccl = sh_mobile_i2c_iccl(i2c_clk_khz, tLOW, tf); |
| @@ -266,8 +267,7 @@ static void sh_mobile_i2c_init(struct sh_mobile_i2c_data *pd) |
| else |
| pd->icic &= ~ICIC_ICCHB8; |
| |
| -out: |
| - clk_disable_unprepare(pd->clk); |
| + return 0; |
| } |
| |
| static void activate_ch(struct sh_mobile_i2c_data *pd) |
| @@ -677,7 +677,9 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) |
| if (resource_size(res) > 0x17) |
| pd->flags |= IIC_FLAG_HAS_ICIC67; |
| |
| - sh_mobile_i2c_init(pd); |
| + ret = sh_mobile_i2c_init(pd); |
| + if (ret) |
| + return ret; |
| |
| /* Enable Runtime PM for this device. |
| * |
| -- |
| 2.1.2 |
| |