Skip to content

Commit 712d661

Browse files
vadimp-nvidiawsakernel
authored andcommitted
i2c: mlxcpld: Allow flexible polling time setting for I2C transactions
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 <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent 3abdc89 commit 712d661

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

drivers/i2c/busses/i2c-mlxcpld.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ struct mlxcpld_i2c_priv {
7373
struct mlxcpld_i2c_curr_xfer xfer;
7474
struct device *dev;
7575
bool smbus_block;
76+
int polling_time;
7677
};
7778

7879
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)
267268
do {
268269
if (!mlxcpld_i2c_check_busy(priv))
269270
break;
270-
usleep_range(MLXCPLD_I2C_POLL_TIME / 2, MLXCPLD_I2C_POLL_TIME);
271-
timeout += MLXCPLD_I2C_POLL_TIME;
271+
usleep_range(priv->polling_time / 2, priv->polling_time);
272+
timeout += priv->polling_time;
272273
} while (timeout <= MLXCPLD_I2C_XFER_TO);
273274

274275
if (timeout > MLXCPLD_I2C_XFER_TO)
@@ -288,10 +289,10 @@ static int mlxcpld_i2c_wait_for_tc(struct mlxcpld_i2c_priv *priv)
288289
u8 datalen, val;
289290

290291
do {
291-
usleep_range(MLXCPLD_I2C_POLL_TIME / 2, MLXCPLD_I2C_POLL_TIME);
292+
usleep_range(priv->polling_time / 2, priv->polling_time);
292293
if (!mlxcpld_i2c_check_status(priv, &status))
293294
break;
294-
timeout += MLXCPLD_I2C_POLL_TIME;
295+
timeout += priv->polling_time;
295296
} while (status == 0 && timeout < MLXCPLD_I2C_XFER_TO);
296297

297298
switch (status) {
@@ -498,9 +499,11 @@ mlxcpld_i2c_set_frequency(struct mlxcpld_i2c_priv *priv,
498499
switch ((regval & data->mask) >> data->bit) {
499500
case MLXCPLD_I2C_FREQ_1000KHZ:
500501
freq = MLXCPLD_I2C_FREQ_1000KHZ_SET;
502+
priv->polling_time /= 4;
501503
break;
502504
case MLXCPLD_I2C_FREQ_400KHZ:
503505
freq = MLXCPLD_I2C_FREQ_400KHZ_SET;
506+
priv->polling_time /= 4;
504507
break;
505508
default:
506509
return 0;
@@ -527,6 +530,7 @@ static int mlxcpld_i2c_probe(struct platform_device *pdev)
527530

528531
priv->dev = &pdev->dev;
529532
priv->base_addr = MLXPLAT_CPLD_LPC_I2C_BASE_ADDR;
533+
priv->polling_time = MLXCPLD_I2C_POLL_TIME;
530534

531535
/* Set I2C bus frequency if platform data provides this info. */
532536
pdata = dev_get_platdata(&pdev->dev);

0 commit comments

Comments
 (0)