* [PATCH i2c-next 1/4] i2c: mlxcpld: Fix criteria for frequency setting
2021-08-16 18:16 [PATCH i2c-next 0/4] i2c: mlxcpld: Add fixes and features for transaction polling time setting Vadim Pasternak
@ 2021-08-16 18:16 ` Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 2/4] i2c: mlxcpld: Modify register setting for 400KHz frequency Vadim Pasternak
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Vadim Pasternak @ 2021-08-16 18:16 UTC (permalink / raw)
To: wsa; +Cc: peda, linux-hwmon, Vadim Pasternak
Value for getting frequency capability wrongly has been taken from
register offset instead of register value.
Fixes: 66b0c2846ba8 ("i2c: mlxcpld: Add support for I2C bus frequency setting")
Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
---
drivers/i2c/busses/i2c-mlxcpld.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-mlxcpld.c b/drivers/i2c/busses/i2c-mlxcpld.c
index 4e0b7c2882ce..6d41c3db8a2b 100644
--- a/drivers/i2c/busses/i2c-mlxcpld.c
+++ b/drivers/i2c/busses/i2c-mlxcpld.c
@@ -495,7 +495,7 @@ mlxcpld_i2c_set_frequency(struct mlxcpld_i2c_priv *priv,
return err;
/* Set frequency only if it is not 100KHz, which is default. */
- switch ((data->reg & data->mask) >> data->bit) {
+ switch ((regval & data->mask) >> data->bit) {
case MLXCPLD_I2C_FREQ_1000KHZ:
freq = MLXCPLD_I2C_FREQ_1000KHZ_SET;
break;
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH i2c-next 2/4] i2c: mlxcpld: Modify register setting for 400KHz frequency
2021-08-16 18:16 [PATCH i2c-next 0/4] i2c: mlxcpld: Add fixes and features for transaction polling time setting Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 1/4] i2c: mlxcpld: Fix criteria for frequency setting Vadim Pasternak
@ 2021-08-16 18:16 ` Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 3/4] i2c: mlxcpld: Reduce polling time for performance improvement Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 4/4] i2c: mlxcpld: Allow flexible polling time setting for I2C transactions Vadim Pasternak
3 siblings, 0 replies; 5+ messages in thread
From: Vadim Pasternak @ 2021-08-16 18:16 UTC (permalink / raw)
To: wsa; +Cc: peda, linux-hwmon, Vadim Pasternak
Change setting for 400KHz frequency support by more accurate value.
Fixes: 66b0c2846ba8 ("i2c: mlxcpld: Add support for I2C bus frequency setting")
Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
---
drivers/i2c/busses/i2c-mlxcpld.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-mlxcpld.c b/drivers/i2c/busses/i2c-mlxcpld.c
index 6d41c3db8a2b..015e11c4663f 100644
--- a/drivers/i2c/busses/i2c-mlxcpld.c
+++ b/drivers/i2c/busses/i2c-mlxcpld.c
@@ -49,7 +49,7 @@
#define MLXCPLD_LPCI2C_NACK_IND 2
#define MLXCPLD_I2C_FREQ_1000KHZ_SET 0x04
-#define MLXCPLD_I2C_FREQ_400KHZ_SET 0x0f
+#define MLXCPLD_I2C_FREQ_400KHZ_SET 0x0c
#define MLXCPLD_I2C_FREQ_100KHZ_SET 0x42
enum mlxcpld_i2c_frequency {
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH i2c-next 3/4] i2c: mlxcpld: Reduce polling time for performance improvement
2021-08-16 18:16 [PATCH i2c-next 0/4] i2c: mlxcpld: Add fixes and features for transaction polling time setting Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 1/4] i2c: mlxcpld: Fix criteria for frequency setting Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 2/4] i2c: mlxcpld: Modify register setting for 400KHz frequency Vadim Pasternak
@ 2021-08-16 18:16 ` Vadim Pasternak
2021-08-16 18:16 ` [PATCH i2c-next 4/4] i2c: mlxcpld: Allow flexible polling time setting for I2C transactions Vadim Pasternak
3 siblings, 0 replies; 5+ messages in thread
From: Vadim Pasternak @ 2021-08-16 18:16 UTC (permalink / raw)
To: wsa; +Cc: peda, linux-hwmon, Vadim Pasternak
Decrease polling time 'MLXCPLD_I2C_POLL_TIME' from 400 usec to 200
usec. It improves performance of I2C transactions.
Reliability of setting polling time to 200 usec has been validated
across all the supported systems.
Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
---
drivers/i2c/busses/i2c-mlxcpld.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-mlxcpld.c b/drivers/i2c/busses/i2c-mlxcpld.c
index 015e11c4663f..615f0a98640e 100644
--- a/drivers/i2c/busses/i2c-mlxcpld.c
+++ b/drivers/i2c/busses/i2c-mlxcpld.c
@@ -27,7 +27,7 @@
#define MLXCPLD_I2C_MAX_ADDR_LEN 4
#define MLXCPLD_I2C_RETR_NUM 2
#define MLXCPLD_I2C_XFER_TO 500000 /* usec */
-#define MLXCPLD_I2C_POLL_TIME 400 /* usec */
+#define MLXCPLD_I2C_POLL_TIME 200 /* usec */
/* LPC I2C registers */
#define MLXCPLD_LPCI2C_CPBLTY_REG 0x0
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH i2c-next 4/4] i2c: mlxcpld: Allow flexible polling time setting for I2C transactions
2021-08-16 18:16 [PATCH i2c-next 0/4] i2c: mlxcpld: Add fixes and features for transaction polling time setting Vadim Pasternak
` (2 preceding siblings ...)
2021-08-16 18:16 ` [PATCH i2c-next 3/4] i2c: mlxcpld: Reduce polling time for performance improvement Vadim Pasternak
@ 2021-08-16 18:16 ` Vadim Pasternak
3 siblings, 0 replies; 5+ messages in thread
From: Vadim Pasternak @ 2021-08-16 18:16 UTC (permalink / raw)
To: wsa; +Cc: peda, linux-hwmon, Vadim Pasternak
Allow polling time setting according to I2C frequency supported across
the system. For base frequency 400 KHz and 1 MHz set polling time is set
four times less than for system with base frequency 100KHz.
Signed-off-by: Vadim Pasternak <vadimp@nvidia.com>
---
drivers/i2c/busses/i2c-mlxcpld.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-mlxcpld.c b/drivers/i2c/busses/i2c-mlxcpld.c
index 615f0a98640e..56aa424fd71d 100644
--- a/drivers/i2c/busses/i2c-mlxcpld.c
+++ b/drivers/i2c/busses/i2c-mlxcpld.c
@@ -73,6 +73,7 @@ struct mlxcpld_i2c_priv {
struct mlxcpld_i2c_curr_xfer xfer;
struct device *dev;
bool smbus_block;
+ int polling_time;
};
static void mlxcpld_i2c_lpc_write_buf(u8 *data, u8 len, u32 addr)
@@ -267,8 +268,8 @@ static int mlxcpld_i2c_wait_for_free(struct mlxcpld_i2c_priv *priv)
do {
if (!mlxcpld_i2c_check_busy(priv))
break;
- usleep_range(MLXCPLD_I2C_POLL_TIME / 2, MLXCPLD_I2C_POLL_TIME);
- timeout += MLXCPLD_I2C_POLL_TIME;
+ usleep_range(priv->polling_time / 2, priv->polling_time);
+ timeout += priv->polling_time;
} while (timeout <= MLXCPLD_I2C_XFER_TO);
if (timeout > MLXCPLD_I2C_XFER_TO)
@@ -288,10 +289,10 @@ static int mlxcpld_i2c_wait_for_tc(struct mlxcpld_i2c_priv *priv)
u8 datalen, val;
do {
- usleep_range(MLXCPLD_I2C_POLL_TIME / 2, MLXCPLD_I2C_POLL_TIME);
+ usleep_range(priv->polling_time / 2, priv->polling_time);
if (!mlxcpld_i2c_check_status(priv, &status))
break;
- timeout += MLXCPLD_I2C_POLL_TIME;
+ timeout += priv->polling_time;
} while (status == 0 && timeout < MLXCPLD_I2C_XFER_TO);
switch (status) {
@@ -498,9 +499,11 @@ mlxcpld_i2c_set_frequency(struct mlxcpld_i2c_priv *priv,
switch ((regval & data->mask) >> data->bit) {
case MLXCPLD_I2C_FREQ_1000KHZ:
freq = MLXCPLD_I2C_FREQ_1000KHZ_SET;
+ priv->polling_time /= 4;
break;
case MLXCPLD_I2C_FREQ_400KHZ:
freq = MLXCPLD_I2C_FREQ_400KHZ_SET;
+ priv->polling_time /= 4;
break;
default:
return 0;
@@ -527,6 +530,7 @@ static int mlxcpld_i2c_probe(struct platform_device *pdev)
priv->dev = &pdev->dev;
priv->base_addr = MLXPLAT_CPLD_LPC_I2C_BASE_ADDR;
+ priv->polling_time = MLXCPLD_I2C_POLL_TIME;
/* Set I2C bus frequency if platform data provides this info. */
pdata = dev_get_platdata(&pdev->dev);
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread