From: Christophe Kerello <christophe.kere...@st.com>

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 <christophe.kere...@st.com>
Reviewed-by: Patrick DELAUNAY <patrick.delau...@st.com>
Signed-off-by: Patrice Chotard <patrice.chot...@st.com>
---
 drivers/i2c/stm32f7_i2c.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c
index bf5fefa..d519c17 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) {
                error("%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,
-- 
1.9.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to