[PATCH v2] i2c: designware: Replace magic numbers with named constants

Artem Shimko posted 1 patch 2 weeks, 1 day ago
There is a newer version of this series
drivers/i2c/busses/i2c-designware-common.c | 33 ++++++++++++++--------
drivers/i2c/busses/i2c-designware-core.h   | 13 +++++++++
2 files changed, 35 insertions(+), 11 deletions(-)
[PATCH v2] i2c: designware: Replace magic numbers with named constants
Posted by Artem Shimko 2 weeks, 1 day ago
Replace various magic numbers with properly named constants to improve
code readability and maintainability. This includes constants for
register access, timing adjustments, timeouts, FIFO parameters,
and default values.

The change makes the code more self-documenting without altering any
functionality.

Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
---

Hello maintainers and reviewers,

Fix replaces magic numbers throughout the DesignWare I2C driver with named 
constants to improve code readability and maintainability.

The change introduces constants for register access, timing adjustments, 
timeouts, FIFO parameters, and default values, all properly documented 
with comments.

No functional changes.

Thank you for your consideration.
--
Regards,
Artem

ChangeLog:
  v1:
    * https://lore.kernel.org/all/20251105161845.2535367-1-a.shimko.dev@gmail.com/T/#u
  v2:
    * Move register-related constants to i2c-designware-core.h
    * Remove unnecessary comments to reduce clutter  
    * Keep only essential timeouts and default parameters in .c file
    * Use FIELD_GET() for FIFO depth extraction as suggested

 drivers/i2c/busses/i2c-designware-common.c | 33 ++++++++++++++--------
 drivers/i2c/busses/i2c-designware-core.h   | 13 +++++++++
 2 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/drivers/i2c/busses/i2c-designware-common.c b/drivers/i2c/busses/i2c-designware-common.c
index 5b1e8f74c4ac..3bc55068da03 100644
--- a/drivers/i2c/busses/i2c-designware-common.c
+++ b/drivers/i2c/busses/i2c-designware-common.c
@@ -12,6 +12,7 @@
 #define DEFAULT_SYMBOL_NAMESPACE	"I2C_DW_COMMON"
 
 #include <linux/acpi.h>
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/device.h>
@@ -34,6 +35,14 @@
 
 #include "i2c-designware-core.h"
 
+#define DW_IC_DEFAULT_BUS_CAPACITANCE_PF	100
+
+#define DW_IC_ABORT_TIMEOUT_US			10
+#define DW_IC_ABORT_TOTAL_TIMEOUT_US		100
+
+#define DW_IC_BUSY_POLL_TIMEOUT_US		1100
+#define DW_IC_BUSY_TOTAL_TIMEOUT_US		20000
+
 static const char *const abort_sources[] = {
 	[ABRT_7B_ADDR_NOACK] =
 		"slave address not acknowledged (7bit mode)",
@@ -106,7 +115,7 @@ static int dw_reg_read_word(void *context, unsigned int reg, unsigned int *val)
 	struct dw_i2c_dev *dev = context;
 
 	*val = readw(dev->base + reg) |
-		(readw(dev->base + reg + 2) << 16);
+		(readw(dev->base + reg + DW_IC_REG_STEP_BYTES) << DW_IC_REG_WORD_SHIFT);
 
 	return 0;
 }
@@ -116,7 +125,7 @@ static int dw_reg_write_word(void *context, unsigned int reg, unsigned int val)
 	struct dw_i2c_dev *dev = context;
 
 	writew(val, dev->base + reg);
-	writew(val >> 16, dev->base + reg + 2);
+	writew(val >> DW_IC_REG_WORD_SHIFT, dev->base + reg + DW_IC_REG_STEP_BYTES);
 
 	return 0;
 }
@@ -165,7 +174,7 @@ int i2c_dw_init_regmap(struct dw_i2c_dev *dev)
 	if (reg == swab32(DW_IC_COMP_TYPE_VALUE)) {
 		map_cfg.reg_read = dw_reg_read_swab;
 		map_cfg.reg_write = dw_reg_write_swab;
-	} else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {
+	} else if (reg == lower_16_bits(DW_IC_COMP_TYPE_VALUE)) {
 		map_cfg.reg_read = dw_reg_read_word;
 		map_cfg.reg_write = dw_reg_write_word;
 	} else if (reg != DW_IC_COMP_TYPE_VALUE) {
@@ -384,7 +393,7 @@ int i2c_dw_fw_parse_and_configure(struct dw_i2c_dev *dev)
 	i2c_parse_fw_timings(device, t, false);
 
 	if (device_property_read_u32(device, "snps,bus-capacitance-pf", &dev->bus_capacitance_pF))
-		dev->bus_capacitance_pF = 100;
+		dev->bus_capacitance_pF = DW_IC_DEFAULT_BUS_CAPACITANCE_PF;
 
 	dev->clk_freq_optimized = device_property_read_bool(device, "snps,clk-freq-optimized");
 
@@ -539,8 +548,9 @@ void __i2c_dw_disable(struct dw_i2c_dev *dev)
 
 		regmap_write(dev->map, DW_IC_ENABLE, enable | DW_IC_ENABLE_ABORT);
 		ret = regmap_read_poll_timeout(dev->map, DW_IC_ENABLE, enable,
-					       !(enable & DW_IC_ENABLE_ABORT), 10,
-					       100);
+					       !(enable & DW_IC_ENABLE_ABORT),
+					       DW_IC_ABORT_TIMEOUT_US,
+					       DW_IC_ABORT_TOTAL_TIMEOUT_US);
 		if (ret)
 			dev_err(dev->dev, "timeout while trying to abort current transfer\n");
 	}
@@ -552,7 +562,7 @@ void __i2c_dw_disable(struct dw_i2c_dev *dev)
 		 * in that case this test reads zero and exits the loop.
 		 */
 		regmap_read(dev->map, DW_IC_ENABLE_STATUS, &status);
-		if ((status & 1) == 0)
+		if (!(status & 1))
 			return;
 
 		/*
@@ -635,7 +645,8 @@ int i2c_dw_wait_bus_not_busy(struct dw_i2c_dev *dev)
 
 	ret = regmap_read_poll_timeout(dev->map, DW_IC_STATUS, status,
 				       !(status & DW_IC_STATUS_ACTIVITY),
-				       1100, 20000);
+				       DW_IC_BUSY_POLL_TIMEOUT_US,
+				       DW_IC_BUSY_TOTAL_TIMEOUT_US);
 	if (ret) {
 		dev_warn(dev->dev, "timeout waiting for bus ready\n");
 
@@ -699,12 +710,12 @@ int i2c_dw_set_fifo_size(struct dw_i2c_dev *dev)
 	if (ret)
 		return ret;
 
-	tx_fifo_depth = ((param >> 16) & 0xff) + 1;
-	rx_fifo_depth = ((param >> 8)  & 0xff) + 1;
+	tx_fifo_depth = FIELD_GET(DW_IC_FIFO_TX_FIELD, param) + 1;
+	rx_fifo_depth = FIELD_GET(DW_IC_FIFO_RX_FIELD, param) + 1;
 	if (!dev->tx_fifo_depth) {
 		dev->tx_fifo_depth = tx_fifo_depth;
 		dev->rx_fifo_depth = rx_fifo_depth;
-	} else if (tx_fifo_depth >= 2) {
+	} else if (tx_fifo_depth >= DW_IC_FIFO_MIN_DEPTH) {
 		dev->tx_fifo_depth = min_t(u32, dev->tx_fifo_depth,
 				tx_fifo_depth);
 		dev->rx_fifo_depth = min_t(u32, dev->rx_fifo_depth,
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
index 347843b4f5dd..a699953bf5ae 100644
--- a/drivers/i2c/busses/i2c-designware-core.h
+++ b/drivers/i2c/busses/i2c-designware-core.h
@@ -41,6 +41,19 @@
 #define DW_IC_DATA_CMD_DAT			GENMASK(7, 0)
 #define DW_IC_DATA_CMD_FIRST_DATA_BYTE		BIT(11)
 
+/*
+ * Register access parameters
+ */
+#define DW_IC_REG_STEP_BYTES			2
+#define DW_IC_REG_WORD_SHIFT			16
+
+/*
+ * FIFO depth configuration
+ */
+#define DW_IC_FIFO_TX_FIELD			GENMASK(23, 16)
+#define DW_IC_FIFO_RX_FIELD			GENMASK(15, 8)
+#define DW_IC_FIFO_MIN_DEPTH			2
+
 /*
  * Registers offset
  */
-- 
2.43.0
Re: [PATCH v2] i2c: designware: Replace magic numbers with named constants
Posted by Mika Westerberg 2 weeks, 1 day ago
On Thu, Dec 04, 2025 at 02:41:29PM +0300, Artem Shimko wrote:
> Replace various magic numbers with properly named constants to improve
> code readability and maintainability. This includes constants for
> register access, timing adjustments, timeouts, FIFO parameters,
> and default values.
> 
> The change makes the code more self-documenting without altering any
> functionality.
> 
> Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
> ---
> 
> Hello maintainers and reviewers,
> 
> Fix replaces magic numbers throughout the DesignWare I2C driver with named 
> constants to improve code readability and maintainability.
> 
> The change introduces constants for register access, timing adjustments, 
> timeouts, FIFO parameters, and default values, all properly documented 
> with comments.
> 
> No functional changes.

There is already v3 at least of this patch. What changed?

Also can you please send new versions on a new thread instead of replying
on the existing one? It is really hard to follow.
Re: [PATCH v2] i2c: designware: Replace magic numbers with named constants
Posted by Artem Shimko 2 weeks, 1 day ago
Hi Mika,

Sorry about that, I'm a newbie and might make mistakes.

Yes, I'm confused about the versions myself, and yes, there is a v3.

Am I right? Even though I already sent it in response to the kernel
robot report, would it be better to forward v3 to a separate thread?

Regards,
Artem

On Thu, Dec 4, 2025 at 3:00 PM Mika Westerberg
<mika.westerberg@linux.intel.com> wrote:
>
> On Thu, Dec 04, 2025 at 02:41:29PM +0300, Artem Shimko wrote:
> > Replace various magic numbers with properly named constants to improve
> > code readability and maintainability. This includes constants for
> > register access, timing adjustments, timeouts, FIFO parameters,
> > and default values.
> >
> > The change makes the code more self-documenting without altering any
> > functionality.
> >
> > Signed-off-by: Artem Shimko <a.shimko.dev@gmail.com>
> > ---
> >
> > Hello maintainers and reviewers,
> >
> > Fix replaces magic numbers throughout the DesignWare I2C driver with named
> > constants to improve code readability and maintainability.
> >
> > The change introduces constants for register access, timing adjustments,
> > timeouts, FIFO parameters, and default values, all properly documented
> > with comments.
> >
> > No functional changes.
>
> There is already v3 at least of this patch. What changed?
>
> Also can you please send new versions on a new thread instead of replying
> on the existing one? It is really hard to follow.
Re: [PATCH v2] i2c: designware: Replace magic numbers with named constants
Posted by Mika Westerberg 2 weeks, 1 day ago
On Thu, Dec 04, 2025 at 03:07:55PM +0300, Artem Shimko wrote:
> Hi Mika,
> 
> Sorry about that, I'm a newbie and might make mistakes.
> 
> Yes, I'm confused about the versions myself, and yes, there is a v3.
> 
> Am I right? Even though I already sent it in response to the kernel
> robot report, would it be better to forward v3 to a separate thread?

Just send the next version (whatever it is, v4?) as a separate thread with
proper explanations what was changed under the '---' line.
Re: [PATCH v2] i2c: designware: Replace magic numbers with named constants
Posted by Artem Shimko 2 weeks, 1 day ago
On Thu, Dec 4, 2025 at 3:12 PM Mika Westerberg
<mika.westerberg@linux.intel.com> wrote:
>
> On Thu, Dec 04, 2025 at 03:07:55PM +0300, Artem Shimko wrote:
> > Hi Mika,
> >
> > Sorry about that, I'm a newbie and might make mistakes.
> >
> > Yes, I'm confused about the versions myself, and yes, there is a v3.
> >
> > Am I right? Even though I already sent it in response to the kernel
> > robot report, would it be better to forward v3 to a separate thread?
>
> Just send the next version (whatever it is, v4?) as a separate thread with
> proper explanations what was changed under the '---' line.
Hi Mika,

Thank you.

There's no v4. This was an attempt to resend v3, but I sent it
incorrectly and with a version error.

Let me post it as a separate thread to fix this mess.

Regards,
Artem