i2c: stm32f7: fix configuration of the digital filter
authorAlain Volmat <alain.volmat@foss.st.com>
Fri, 5 Feb 2021 08:51:40 +0000 (09:51 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Feb 2021 10:02:28 +0000 (11:02 +0100)
[ Upstream commit 3d6a3d3a2a7a3a60a824e7c04e95fd50dec57812 ]

The digital filter related computation are present in the driver
however the programming of the filter within the IP is missing.
The maximum value for the DNF is wrong and should be 15 instead of 16.

Fixes: aeb068c57214 ("i2c: i2c-stm32f7: add driver")

Signed-off-by: Alain Volmat <alain.volmat@foss.st.com>
Signed-off-by: Pierre-Yves MORDRET <pierre-yves.mordret@foss.st.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-stm32f7.c

index f41f51a..6747353 100644 (file)
@@ -57,6 +57,8 @@
 #define STM32F7_I2C_CR1_RXDMAEN                        BIT(15)
 #define STM32F7_I2C_CR1_TXDMAEN                        BIT(14)
 #define STM32F7_I2C_CR1_ANFOFF                 BIT(12)
+#define STM32F7_I2C_CR1_DNF_MASK               GENMASK(11, 8)
+#define STM32F7_I2C_CR1_DNF(n)                 (((n) & 0xf) << 8)
 #define STM32F7_I2C_CR1_ERRIE                  BIT(7)
 #define STM32F7_I2C_CR1_TCIE                   BIT(6)
 #define STM32F7_I2C_CR1_STOPIE                 BIT(5)
@@ -160,7 +162,7 @@ enum {
 };
 
 #define STM32F7_I2C_DNF_DEFAULT                        0
-#define STM32F7_I2C_DNF_MAX                    16
+#define STM32F7_I2C_DNF_MAX                    15
 
 #define STM32F7_I2C_ANALOG_FILTER_ENABLE       1
 #define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN    50      /* ns */
@@ -725,6 +727,13 @@ static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
        else
                stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
                                     STM32F7_I2C_CR1_ANFOFF);
+
+       /* Program the Digital Filter */
+       stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
+                            STM32F7_I2C_CR1_DNF_MASK);
+       stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
+                            STM32F7_I2C_CR1_DNF(i2c_dev->setup.dnf));
+
        stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
                             STM32F7_I2C_CR1_PE);
 }