From c4e5990ad20e9d387dd0f1e6649c7676b869bc0d Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Fri, 13 Oct 2017 19:29:03 +0900 Subject: i2c: remove DECLARE_GLOBAL_DATA_PTR from i2c-uclass No global pointer is used in this file. Signed-off-by: Masahiro Yamada Reviewed-by: Heiko Schocher diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index 1397f34..920811a 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -12,8 +12,6 @@ #include #include -DECLARE_GLOBAL_DATA_PTR; - #define I2C_MAX_OFFSET_LEN 4 /* Useful debugging function */ -- cgit v0.10.2 From 81c484376353251ba13b7ea987a15a896b3d106a Mon Sep 17 00:00:00 2001 From: Christophe Kerello Date: Tue, 17 Oct 2017 11:21:32 +0200 Subject: i2c: stm32f7_i2c: fix data abort As "v" is a local variable in stm32_i2c_choose_solution() "v" has to be copied into "s" to avoid data abort in stm32_i2c_compute_timing(). Signed-off-by: Christophe Kerello Reviewed-by: Patrick DELAUNAY Signed-off-by: Patrice Chotard diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c index 196f236..346748d 100644 --- a/drivers/i2c/stm32f7_i2c.c +++ b/drivers/i2c/stm32f7_i2c.c @@ -571,6 +571,7 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup, u32 dnf_delay; u32 tsync; u16 l, h; + bool sol_found = false; int ret = 0; af_delay_min = setup->analog_filter ? @@ -619,14 +620,15 @@ static int stm32_i2c_choose_solution(struct stm32_i2c_setup *setup, clk_error_prev = clk_error; v->scll = l; v->sclh = h; - s = v; + sol_found = true; + memcpy(s, v, sizeof(*s)); } } } } } - if (!s) { + if (!sol_found) { pr_err("%s: no solution at all\n", __func__); ret = -EPERM; } @@ -638,7 +640,7 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, struct stm32_i2c_setup *setup, struct stm32_i2c_timings *output) { - struct stm32_i2c_timings *v, *_v, *s; + struct stm32_i2c_timings *v, *_v, s; struct list_head solutions; int ret; @@ -669,21 +671,20 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, return -EINVAL; } - s = NULL; INIT_LIST_HEAD(&solutions); ret = stm32_i2c_compute_solutions(setup, &solutions); if (ret) goto exit; - ret = stm32_i2c_choose_solution(setup, &solutions, s); + ret = stm32_i2c_choose_solution(setup, &solutions, &s); if (ret) goto exit; - output->presc = s->presc; - output->scldel = s->scldel; - output->sdadel = s->sdadel; - output->scll = s->scll; - output->sclh = s->sclh; + output->presc = s.presc; + output->scldel = s.scldel; + output->sdadel = s.sdadel; + output->scll = s.scll; + output->sclh = s.sclh; debug("%s: Presc: %i, scldel: %i, sdadel: %i, scll: %i, sclh: %i\n", __func__, output->presc, -- cgit v0.10.2 From d10bd6cfd85c2a9f27c950e22e83d27ff978e7e8 Mon Sep 17 00:00:00 2001 From: Patrice Chotard Date: Tue, 17 Oct 2017 11:21:33 +0200 Subject: i2c: stm32f7_i2c: fix usage of useless local variable Remove useless local variable "s" and use directly function's parameter "output" Signed-off-by: Patrice Chotard diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c index 346748d..8662487 100644 --- a/drivers/i2c/stm32f7_i2c.c +++ b/drivers/i2c/stm32f7_i2c.c @@ -640,7 +640,7 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, struct stm32_i2c_setup *setup, struct stm32_i2c_timings *output) { - struct stm32_i2c_timings *v, *_v, s; + struct stm32_i2c_timings *v, *_v; struct list_head solutions; int ret; @@ -676,16 +676,10 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, if (ret) goto exit; - ret = stm32_i2c_choose_solution(setup, &solutions, &s); + ret = stm32_i2c_choose_solution(setup, &solutions, output); if (ret) goto exit; - output->presc = s.presc; - output->scldel = s.scldel; - output->sdadel = s.sdadel; - output->scll = s.scll; - output->sclh = s.sclh; - debug("%s: Presc: %i, scldel: %i, sdadel: %i, scll: %i, sclh: %i\n", __func__, output->presc, output->scldel, output->sdadel, -- cgit v0.10.2