]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
i2c: stm32f7: switch to I²C generic property parsing
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 24 Mar 2020 12:32:14 +0000 (14:32 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Tue, 24 Mar 2020 20:59:58 +0000 (21:59 +0100)
Switch to the new generic functions: i2c_parse_fw_timings().

While here, replace hard coded values with standard bus frequency definitions.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Alain Volmat <alain.volmat@st.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-stm32f7.c

index 6418f5982894f58851130ba92b50c9409fbf479c..330ffed011e022d1b863e3ef63599106e0c0202b 100644 (file)
@@ -344,9 +344,9 @@ struct stm32f7_i2c_dev {
  */
 static struct stm32f7_i2c_spec i2c_specs[] = {
        [STM32_I2C_SPEED_STANDARD] = {
-               .rate = 100000,
-               .rate_min = 80000,
-               .rate_max = 100000,
+               .rate = I2C_MAX_STANDARD_MODE_FREQ,
+               .rate_min = I2C_MAX_STANDARD_MODE_FREQ * 8 / 10,        /* 80% */
+               .rate_max = I2C_MAX_STANDARD_MODE_FREQ,
                .fall_max = 300,
                .rise_max = 1000,
                .hddat_min = 0,
@@ -356,9 +356,9 @@ static struct stm32f7_i2c_spec i2c_specs[] = {
                .h_min = 4000,
        },
        [STM32_I2C_SPEED_FAST] = {
-               .rate = 400000,
-               .rate_min = 320000,
-               .rate_max = 400000,
+               .rate = I2C_MAX_FAST_MODE_FREQ,
+               .rate_min = I2C_MAX_FAST_MODE_FREQ * 8 / 10,            /* 80% */
+               .rate_max = I2C_MAX_FAST_MODE_FREQ,
                .fall_max = 300,
                .rise_max = 300,
                .hddat_min = 0,
@@ -368,9 +368,9 @@ static struct stm32f7_i2c_spec i2c_specs[] = {
                .h_min = 600,
        },
        [STM32_I2C_SPEED_FAST_PLUS] = {
-               .rate = 1000000,
-               .rate_min = 800000,
-               .rate_max = 1000000,
+               .rate = I2C_MAX_FAST_MODE_PLUS_FREQ,
+               .rate_min = I2C_MAX_FAST_MODE_PLUS_FREQ * 8 / 10,       /* 80% */
+               .rate_max = I2C_MAX_FAST_MODE_PLUS_FREQ,
                .fall_max = 100,
                .rise_max = 120,
                .hddat_min = 0,
@@ -610,8 +610,25 @@ exit:
 static int stm32f7_i2c_setup_timing(struct stm32f7_i2c_dev *i2c_dev,
                                    struct stm32f7_i2c_setup *setup)
 {
+       struct i2c_timings timings, *t = &timings;
        int ret = 0;
 
+       t->bus_freq_hz = I2C_MAX_STANDARD_MODE_FREQ;
+       t->scl_rise_ns = i2c_dev->setup.rise_time;
+       t->scl_fall_ns = i2c_dev->setup.fall_time;
+
+       i2c_parse_fw_timings(i2c_dev->dev, t, false);
+
+       if (t->bus_freq_hz >= I2C_MAX_FAST_MODE_PLUS_FREQ)
+               i2c_dev->speed = STM32_I2C_SPEED_FAST_PLUS;
+       else if (t->bus_freq_hz >= I2C_MAX_FAST_MODE_FREQ)
+               i2c_dev->speed = STM32_I2C_SPEED_FAST;
+       else
+               i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
+
+       i2c_dev->setup.rise_time = t->scl_rise_ns;
+       i2c_dev->setup.fall_time = t->scl_fall_ns;
+
        setup->speed = i2c_dev->speed;
        setup->speed_freq = i2c_specs[setup->speed].rate;
        setup->clock_src = clk_get_rate(i2c_dev->clk);
@@ -1914,7 +1931,6 @@ static int stm32f7_i2c_probe(struct platform_device *pdev)
        struct stm32f7_i2c_dev *i2c_dev;
        const struct stm32f7_i2c_setup *setup;
        struct resource *res;
-       u32 clk_rate, rise_time, fall_time;
        struct i2c_adapter *adap;
        struct reset_control *rst;
        dma_addr_t phy_addr;
@@ -1961,17 +1977,6 @@ static int stm32f7_i2c_probe(struct platform_device *pdev)
                return ret;
        }
 
-       i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
-       ret = device_property_read_u32(&pdev->dev, "clock-frequency",
-                                      &clk_rate);
-       if (!ret && clk_rate >= 1000000) {
-               i2c_dev->speed = STM32_I2C_SPEED_FAST_PLUS;
-       } else if (!ret && clk_rate >= 400000) {
-               i2c_dev->speed = STM32_I2C_SPEED_FAST;
-       } else if (!ret && clk_rate >= 100000) {
-               i2c_dev->speed = STM32_I2C_SPEED_STANDARD;
-       }
-
        rst = devm_reset_control_get(&pdev->dev, NULL);
        if (IS_ERR(rst)) {
                dev_err(&pdev->dev, "Error: Missing controller reset\n");
@@ -2011,16 +2016,6 @@ static int stm32f7_i2c_probe(struct platform_device *pdev)
        }
        i2c_dev->setup = *setup;
 
-       ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-rising-time-ns",
-                                      &rise_time);
-       if (!ret)
-               i2c_dev->setup.rise_time = rise_time;
-
-       ret = device_property_read_u32(i2c_dev->dev, "i2c-scl-falling-time-ns",
-                                      &fall_time);
-       if (!ret)
-               i2c_dev->setup.fall_time = fall_time;
-
        ret = stm32f7_i2c_setup_timing(i2c_dev, &i2c_dev->setup);
        if (ret)
                goto clk_free;