|
|
|
@ -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; |
|
|
|
|
struct list_head solutions; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
@ -669,22 +671,15 @@ 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, 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, |
|
|
|
|