
Hi Simon,
From: U-Boot u-boot-bounces@lists.denx.de On Behalf Of Simon Glass Sent: vendredi 3 janvier 2020 23:27
Update this driver to use the new standard enums for speed.
Note: This driver needs to move to driver model.
This driver i2c/stm32f7_i2c.c is already a driver model (I think this note is a copy paste of previous commit)
One minor remarks below, but anyway tested on stm32mp1.
Reviewed-by: Patrick Delaunay patrick.delaunay@st.com Tested-by: Patrick Delaunay patrick.delaunay@st.com
Signed-off-by: Simon Glass sjg@chromium.org
Changes in v2: None
drivers/i2c/stm32f7_i2c.c | 43 +++++++++++++++------------------------ 1 file changed, 16 insertions(+), 27 deletions(-)
diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c index 2b18735fea..def84f2e0a 100644 --- a/drivers/i2c/stm32f7_i2c.c +++ b/drivers/i2c/stm32f7_i2c.c @@ -115,17 +115,6 @@ struct stm32_i2c_regs {
#define STM32_NSEC_PER_SEC 1000000000L
-#define STANDARD_RATE 100000 -#define FAST_RATE 400000 -#define FAST_PLUS_RATE 1000000
-enum stm32_i2c_speed {
- STM32_I2C_SPEED_STANDARD, /* 100 kHz */
- STM32_I2C_SPEED_FAST, /* 400 kHz */
- STM32_I2C_SPEED_FAST_PLUS, /* 1 MHz */
- STM32_I2C_SPEED_END,
-};
/**
- struct stm32_i2c_spec - private i2c specification timing
- @rate: I2C bus speed (Hz)
@@ -164,7 +153,7 @@ struct stm32_i2c_spec {
- @analog_filter: Analog filter delay (On/Off)
*/ struct stm32_i2c_setup {
- enum stm32_i2c_speed speed;
- enum i2c_speed_mode speed; u32 speed_freq; u32 clock_src; u32 rise_time;
@@ -198,8 +187,8 @@ struct stm32_i2c_priv { };
static const struct stm32_i2c_spec i2c_specs[] = {
- [STM32_I2C_SPEED_STANDARD] = {
.rate = STANDARD_RATE,
- [IC_SPEED_MODE_STANDARD] = {
.rate_min = 8000, .rate_max = 120000, .fall_max = 300,.rate = I2C_SPEED_STANDARD_RATE,
@@ -210,8 +199,8 @@ static const struct stm32_i2c_spec i2c_specs[] = { .l_min = 4700, .h_min = 4000, },
- [STM32_I2C_SPEED_FAST] = {
.rate = FAST_RATE,
- [IC_SPEED_MODE_FAST] = {
.rate_min = 320000, .rate_max = 480000, .fall_max = 300,.rate = I2C_SPEED_FAST_RATE,
@@ -222,8 +211,8 @@ static const struct stm32_i2c_spec i2c_specs[] = { .l_min = 1300, .h_min = 600, },
- [STM32_I2C_SPEED_FAST_PLUS] = {
.rate = FAST_PLUS_RATE,
- [IC_SPEED_MODE_FAST_PLUS] = {
.rate_min = 800000, .rate_max = 1200000, .fall_max = 100,.rate = I2C_SPEED_FAST_PLUS_RATE,
@@ -648,9 +637,9 @@ static int stm32_i2c_compute_timing(struct stm32_i2c_priv *i2c_priv, struct list_head solutions; int ret;
- if (setup->speed >= STM32_I2C_SPEED_END) {
- if (setup->speed >= IC_SPEED_MODE_HIGH) { pr_err("%s: speed out of bound {%d/%d}\n", __func__,
setup->speed, STM32_I2C_SPEED_END - 1);
return -EINVAL; }setup->speed, IC_SPEED_MODE_FAST_PLUS);
It could be perhaps more clear to use the size of i2c_specs as the test is aonly use to protect access to this array.
if (setup->speed >= ARRAY_SIZE (i2c_specs)) { pr_err("%s: speed out of bound {%d/%d}\n", __func__, setup->speed, ARRAY_SIZE (i2c_specs) - 1); return -EINVAL; }
@@ -719,7 +708,7 @@ static int stm32_i2c_setup_timing(struct stm32_i2c_priv *i2c_priv, if (ret) { debug("%s: failed to compute I2C timings.\n", __func__);
if (i2c_priv->speed > STM32_I2C_SPEED_STANDARD) {
if (i2c_priv->speed > IC_SPEED_MODE_STANDARD) { i2c_priv->speed--; setup->speed = i2c_priv->speed; setup->speed_freq =
@@ -784,14 +773,14 @@ static int stm32_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) struct stm32_i2c_priv *i2c_priv = dev_get_priv(bus);
switch (speed) {
- case STANDARD_RATE:
i2c_priv->speed = STM32_I2C_SPEED_STANDARD;
- case I2C_SPEED_STANDARD_RATE:
break;i2c_priv->speed = IC_SPEED_MODE_STANDARD;
- case FAST_RATE:
i2c_priv->speed = STM32_I2C_SPEED_FAST;
- case I2C_SPEED_FAST_RATE:
break;i2c_priv->speed = IC_SPEED_MODE_FAST;
- case FAST_PLUS_RATE:
i2c_priv->speed = STM32_I2C_SPEED_FAST_PLUS;
- case I2C_SPEED_FAST_PLUS_RATE:
break; default: debug("%s: Speed %d not supported\n", __func__, speed);i2c_priv->speed = IC_SPEED_MODE_FAST_PLUS;
-- 2.24.1.735.g03f4e72817-goog