提交 81c48437 编写于 作者: C Christophe Kerello 提交者: Heiko Schocher

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: NChristophe Kerello <christophe.kerello@st.com>
Reviewed-by: NPatrick DELAUNAY <patrick.delaunay@st.com>
Signed-off-by: NPatrice Chotard <patrice.chotard@st.com>
上级 c4e5990a
......@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册