diff mbox series

[2/2] i2c: i2c-cdns.c: Update driver to read fifo-depth from device tree

Message ID 20230104072005.7812-3-peiyue.ho@starfivetech.com
State Changes Requested
Delegated to: Heiko Schocher
Headers show
Series i2c: i2c-cdns.c: Update driver to read fifo-depth from device tree | expand

Commit Message

Pei Yue Ho Jan. 4, 2023, 7:20 a.m. UTC
Enable driver to fetch the optional parameter (fifo-depth)
from device tree. If the parameter is not found in the device
tree, it will use the default value declared in the driver.

Signed-off-by: Pei Yue Ho <peiyue.ho@starfivetech.com>
Reviewed-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
Reviewed-by: Eng Lee Teh <englee.teh@starfivetech.com>
---
 drivers/i2c/i2c-cdns.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

Comments

Heiko Schocher Feb. 13, 2023, 5:47 a.m. UTC | #1
Hello Pei Yue Ho,

On 04.01.23 08:20, Pei Yue Ho wrote:
> Enable driver to fetch the optional parameter (fifo-depth)
> from device tree. If the parameter is not found in the device
> tree, it will use the default value declared in the driver.
> 
> Signed-off-by: Pei Yue Ho <peiyue.ho@starfivetech.com>
> Reviewed-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
> Reviewed-by: Eng Lee Teh <englee.teh@starfivetech.com>
> ---
>  drivers/i2c/i2c-cdns.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)

Reviewed-by: Heiko Schocher <hs@denx.de>

bye,
Heiko
Heiko Schocher Feb. 13, 2023, 6:38 a.m. UTC | #2
Hello Pei Yue Ho,

On 13.02.23 06:47, Heiko Schocher wrote:
> Hello Pei Yue Ho,
> 
> On 04.01.23 08:20, Pei Yue Ho wrote:
>> Enable driver to fetch the optional parameter (fifo-depth)
>> from device tree. If the parameter is not found in the device
>> tree, it will use the default value declared in the driver.
>>
>> Signed-off-by: Pei Yue Ho <peiyue.ho@starfivetech.com>
>> Reviewed-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
>> Reviewed-by: Eng Lee Teh <englee.teh@starfivetech.com>
>> ---
>>  drivers/i2c/i2c-cdns.c | 26 ++++++++++++++++----------
>>  1 file changed, 16 insertions(+), 10 deletions(-)
> 
> Reviewed-by: Heiko Schocher <hs@denx.de>

I am sorry, your patch drops error in gitlab Ci, see:

https://dev.azure.com/hs0298/110c3e42-44d5-4db4-9bd5-8a8bbead15f3/_apis/build/builds/100/logs/310

"""
2023-02-13T06:30:04.2539867Z        arm:  +   xilinx_zynq_virt
2023-02-13T06:30:04.2540416Z +drivers/i2c/i2c-cdns.c: In function 'cdns_i2c_read_data':
2023-02-13T06:30:04.2541494Z +drivers/i2c/i2c-cdns.c:363:48: error: passing argument 1 of
'cdns_is_hold_quirk' makes pointer from integer without a cast [-Werror=int-conversion]
2023-02-13T06:30:04.2542415Z +  363 |                         if (cdns_is_hold_quirk(hold_quirk,
curr_recv_count))
2023-02-13T06:30:04.2542799Z +      |                                                ^~~~~~~~~~
2023-02-13T06:30:04.2543066Z +      |                                                |
2023-02-13T06:30:04.2579584Z +      |                                                int
2023-02-13T06:30:04.2580260Z +drivers/i2c/i2c-cdns.c:314:60: note: expected 'struct i2c_cdns_bus *'
but argument is of type 'int'
2023-02-13T06:30:04.2580754Z +  314 | static inline bool cdns_is_hold_quirk(struct i2c_cdns_bus
*i2c_bus, int hold_quirk,
2023-02-13T06:30:04.2581135Z +      |                                       ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
2023-02-13T06:30:04.2581604Z +drivers/i2c/i2c-cdns.c:363:29: error: too few arguments to function
'cdns_is_hold_quirk'
2023-02-13T06:30:04.2581973Z +      |                             ^~~~~~~~~~~~~~~~~~
2023-02-13T06:30:04.2582352Z +drivers/i2c/i2c-cdns.c:314:20: note: declared here
2023-02-13T06:30:04.2582649Z +      |                    ^~~~~~~~~~~~~~~~~~
2023-02-13T06:30:04.2583415Z +drivers/i2c/i2c-cdns.c:367:40: error: passing argument 1 of
'cdns_is_hold_quirk' makes pointer from integer without a cast [-Werror=int-conversion]
2023-02-13T06:30:04.2583944Z +  367 |                 if (cdns_is_hold_quirk(hold_quirk,
curr_recv_count)) {
2023-02-13T06:30:04.2584262Z +      |                                        ^~~~~~~~~~
2023-02-13T06:30:04.2584510Z +      |                                        |
2023-02-13T06:30:04.2584743Z +      |                                        int
2023-02-13T06:30:04.2585511Z +drivers/i2c/i2c-cdns.c:367:21: error: too few arguments to function
'cdns_is_hold_quirk'
2023-02-13T06:30:04.2585984Z +      |                     ^~~~~~~~~~~~~~~~~~
2023-02-13T06:30:04.2586267Z +cc1: all warnings being treated as errors
2023-02-13T06:30:04.2586703Z +make[3]: *** [scripts/Makefile.build:257: drivers/i2c/i2c-cdns.o] Error 1
2023-02-13T06:30:04.2587106Z +make[2]: *** [scripts/Makefile.build:397: drivers/i2c] Error 2
2023-02-13T06:30:04.2587457Z +make[1]: *** [Makefile:1845: drivers] Error 2
2023-02-13T06:30:04.2587832Z +make: *** [Makefile:177: sub-make] Error 2
2023-02-13T06:30:04.2587979Z
2023-02-13T06:30:04.2588213Z     0    0    1 /1              xilinx_zynq_virt
"""

Please fix!

Thanks!

bye,
Heiko
Heiko Schocher Feb. 13, 2023, 2:49 p.m. UTC | #3
Hello Pei Yue Ho,

On 04.01.23 08:20, Pei Yue Ho wrote:
> Enable driver to fetch the optional parameter (fifo-depth)
> from device tree. If the parameter is not found in the device
> tree, it will use the default value declared in the driver.
> 
> Signed-off-by: Pei Yue Ho <peiyue.ho@starfivetech.com>
> Reviewed-by: Wei Liang Lim <weiliang.lim@starfivetech.com>
> Reviewed-by: Eng Lee Teh <englee.teh@starfivetech.com>
> Reviewed-by: Heiko Schocher <hs@denx.de>
> ---
>  drivers/i2c/i2c-cdns.c | 26 ++++++++++++++++----------
>  1 file changed, 16 insertions(+), 10 deletions(-)


Applied to u-boot-i2c.git master

bye,
Heiko
diff mbox series

Patch

diff --git a/drivers/i2c/i2c-cdns.c b/drivers/i2c/i2c-cdns.c
index 0da9f6f35a..65a0c76a2a 100644
--- a/drivers/i2c/i2c-cdns.c
+++ b/drivers/i2c/i2c-cdns.c
@@ -78,7 +78,7 @@  struct cdns_i2c_regs {
 					CDNS_I2C_INTERRUPT_RXUNF | \
 					CDNS_I2C_INTERRUPT_ARBLOST)
 
-#define CDNS_I2C_FIFO_DEPTH		16
+#define CDNS_I2C_FIFO_DEPTH_DEFAULT	16
 #define CDNS_I2C_TRANSFER_SIZE_MAX	255 /* Controller transfer limit */
 #define CDNS_I2C_TRANSFER_SIZE		(CDNS_I2C_TRANSFER_SIZE_MAX - 3)
 
@@ -135,6 +135,7 @@  struct i2c_cdns_bus {
 
 	int hold_flag;
 	u32 quirks;
+	u32 fifo_depth;
 };
 
 struct cdns_i2c_platform_data {
@@ -277,7 +278,7 @@  static int cdns_i2c_write_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
 			writel(addr, &regs->address);
 			start = 0;
 		}
-		if (len && readl(&regs->transfer_size) == CDNS_I2C_FIFO_DEPTH) {
+		if (len && readl(&regs->transfer_size) == i2c_bus->fifo_depth) {
 			ret = cdns_i2c_wait(regs, CDNS_I2C_INTERRUPT_COMP |
 					    CDNS_I2C_INTERRUPT_ARBLOST);
 			if (ret & CDNS_I2C_INTERRUPT_ARBLOST)
@@ -310,9 +311,10 @@  static int cdns_i2c_write_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
 	return 0;
 }
 
-static inline bool cdns_is_hold_quirk(int hold_quirk, int curr_recv_count)
+static inline bool cdns_is_hold_quirk(struct i2c_cdns_bus *i2c_bus, int hold_quirk,
+				      int curr_recv_count)
 {
-	return hold_quirk && (curr_recv_count == CDNS_I2C_FIFO_DEPTH + 1);
+	return hold_quirk && (curr_recv_count == i2c_bus->fifo_depth + 1);
 }
 
 static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
@@ -327,7 +329,7 @@  static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
 	curr_recv_count = recv_count;
 
 	/* Check for the message size against the FIFO depth */
-	if (recv_count > CDNS_I2C_FIFO_DEPTH)
+	if (recv_count > i2c_bus->fifo_depth)
 		setbits_le32(&regs->control, CDNS_I2C_CONTROL_HOLD);
 
 	setbits_le32(&regs->control, CDNS_I2C_CONTROL_CLR_FIFO |
@@ -349,7 +351,7 @@  static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
 
 	while (recv_count && !is_arbitration_lost(regs)) {
 		while (readl(&regs->status) & CDNS_I2C_STATUS_RXDV) {
-			if (recv_count < CDNS_I2C_FIFO_DEPTH &&
+			if (recv_count < i2c_bus->fifo_depth &&
 			    !i2c_bus->hold_flag) {
 				clrbits_le32(&regs->control,
 					     CDNS_I2C_CONTROL_HOLD);
@@ -365,20 +367,20 @@  static int cdns_i2c_read_data(struct i2c_cdns_bus *i2c_bus, u32 addr, u8 *data,
 		if (cdns_is_hold_quirk(hold_quirk, curr_recv_count)) {
 			/* wait while fifo is full */
 			while (readl(&regs->transfer_size) !=
-				     (curr_recv_count - CDNS_I2C_FIFO_DEPTH))
+				     (curr_recv_count - i2c_bus->fifo_depth))
 				;
 			/*
 			 * Check number of bytes to be received against maximum
 			 * transfer size and update register accordingly.
 			 */
-			if ((recv_count - CDNS_I2C_FIFO_DEPTH) >
+			if ((recv_count - i2c_bus->fifo_depth) >
 			    CDNS_I2C_TRANSFER_SIZE) {
 				writel(CDNS_I2C_TRANSFER_SIZE,
 				       &regs->transfer_size);
 				curr_recv_count = CDNS_I2C_TRANSFER_SIZE +
-					CDNS_I2C_FIFO_DEPTH;
+					i2c_bus->fifo_depth;
 			} else {
-				writel(recv_count - CDNS_I2C_FIFO_DEPTH,
+				writel(recv_count - i2c_bus->fifo_depth,
 				       &regs->transfer_size);
 				curr_recv_count = recv_count;
 			}
@@ -496,6 +498,10 @@  static int cdns_i2c_of_to_plat(struct udevice *dev)
 		return ret;
 	}
 
+	/* Update FIFO depth based on device tree entry */
+	i2c_bus->fifo_depth = dev_read_u32_default(dev, "fifo-depth",
+						   CDNS_I2C_FIFO_DEPTH_DEFAULT);
+
 	return 0;
 }