Commit 50b7c322 authored by Rui Miguel Silva's avatar Rui Miguel Silva Committed by Greg Kroah-Hartman

staging: typec: fusb302: refactor resume retry mechanism

The i2c functions need to test the pm_suspend state and do, if needed, some
retry before i2c operations. This code was repeated 4x.

To isolate this, create a new function to check suspend state and call it in
every need place.

As at it, move the error message from pr_err to dev_err.
Signed-off-by: default avatarRui Miguel Silva <rmfrfs@gmail.com>
Acked-by: default avatarYueyao Zhu <yueyao.zhu@gmail.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f0d39a17
...@@ -264,22 +264,36 @@ static void fusb302_debugfs_exit(const struct fusb302_chip *chip) { } ...@@ -264,22 +264,36 @@ static void fusb302_debugfs_exit(const struct fusb302_chip *chip) { }
#define FUSB302_RESUME_RETRY 10 #define FUSB302_RESUME_RETRY 10
#define FUSB302_RESUME_RETRY_SLEEP 50 #define FUSB302_RESUME_RETRY_SLEEP 50
static int fusb302_i2c_write(struct fusb302_chip *chip,
u8 address, u8 data) static bool fusb302_is_suspended(struct fusb302_chip *chip)
{ {
int retry_cnt; int retry_cnt;
int ret = 0;
atomic_set(&chip->i2c_busy, 1);
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) { for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
if (atomic_read(&chip->pm_suspend)) { if (atomic_read(&chip->pm_suspend)) {
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n", dev_err(chip->dev, "i2c: pm suspend, retry %d/%d\n",
retry_cnt + 1, FUSB302_RESUME_RETRY); retry_cnt + 1, FUSB302_RESUME_RETRY);
msleep(FUSB302_RESUME_RETRY_SLEEP); msleep(FUSB302_RESUME_RETRY_SLEEP);
} else { } else {
break; return false;
} }
} }
return true;
}
static int fusb302_i2c_write(struct fusb302_chip *chip,
u8 address, u8 data)
{
int ret = 0;
atomic_set(&chip->i2c_busy, 1);
if (fusb302_is_suspended(chip)) {
atomic_set(&chip->i2c_busy, 0);
return -ETIMEDOUT;
}
ret = i2c_smbus_write_byte_data(chip->i2c_client, address, data); ret = i2c_smbus_write_byte_data(chip->i2c_client, address, data);
if (ret < 0) if (ret < 0)
fusb302_log(chip, "cannot write 0x%02x to 0x%02x, ret=%d", fusb302_log(chip, "cannot write 0x%02x to 0x%02x, ret=%d",
...@@ -292,21 +306,17 @@ static int fusb302_i2c_write(struct fusb302_chip *chip, ...@@ -292,21 +306,17 @@ static int fusb302_i2c_write(struct fusb302_chip *chip,
static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address, static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address,
u8 length, const u8 *data) u8 length, const u8 *data)
{ {
int retry_cnt;
int ret = 0; int ret = 0;
if (length <= 0) if (length <= 0)
return ret; return ret;
atomic_set(&chip->i2c_busy, 1); atomic_set(&chip->i2c_busy, 1);
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
if (atomic_read(&chip->pm_suspend)) { if (fusb302_is_suspended(chip)) {
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n", atomic_set(&chip->i2c_busy, 0);
retry_cnt + 1, FUSB302_RESUME_RETRY); return -ETIMEDOUT;
msleep(FUSB302_RESUME_RETRY_SLEEP);
} else {
break;
}
} }
ret = i2c_smbus_write_i2c_block_data(chip->i2c_client, address, ret = i2c_smbus_write_i2c_block_data(chip->i2c_client, address,
length, data); length, data);
if (ret < 0) if (ret < 0)
...@@ -320,19 +330,15 @@ static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address, ...@@ -320,19 +330,15 @@ static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address,
static int fusb302_i2c_read(struct fusb302_chip *chip, static int fusb302_i2c_read(struct fusb302_chip *chip,
u8 address, u8 *data) u8 address, u8 *data)
{ {
int retry_cnt;
int ret = 0; int ret = 0;
atomic_set(&chip->i2c_busy, 1); atomic_set(&chip->i2c_busy, 1);
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
if (atomic_read(&chip->pm_suspend)) { if (fusb302_is_suspended(chip)) {
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n", atomic_set(&chip->i2c_busy, 0);
retry_cnt + 1, FUSB302_RESUME_RETRY); return -ETIMEDOUT;
msleep(FUSB302_RESUME_RETRY_SLEEP);
} else {
break;
}
} }
ret = i2c_smbus_read_byte_data(chip->i2c_client, address); ret = i2c_smbus_read_byte_data(chip->i2c_client, address);
*data = (u8)ret; *data = (u8)ret;
if (ret < 0) if (ret < 0)
...@@ -345,21 +351,17 @@ static int fusb302_i2c_read(struct fusb302_chip *chip, ...@@ -345,21 +351,17 @@ static int fusb302_i2c_read(struct fusb302_chip *chip,
static int fusb302_i2c_block_read(struct fusb302_chip *chip, u8 address, static int fusb302_i2c_block_read(struct fusb302_chip *chip, u8 address,
u8 length, u8 *data) u8 length, u8 *data)
{ {
int retry_cnt;
int ret = 0; int ret = 0;
if (length <= 0) if (length <= 0)
return ret; return ret;
atomic_set(&chip->i2c_busy, 1); atomic_set(&chip->i2c_busy, 1);
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
if (atomic_read(&chip->pm_suspend)) { if (fusb302_is_suspended(chip)) {
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n", atomic_set(&chip->i2c_busy, 0);
retry_cnt + 1, FUSB302_RESUME_RETRY); return -ETIMEDOUT;
msleep(FUSB302_RESUME_RETRY_SLEEP);
} else {
break;
}
} }
ret = i2c_smbus_read_i2c_block_data(chip->i2c_client, address, ret = i2c_smbus_read_i2c_block_data(chip->i2c_client, address,
length, data); length, data);
if (ret < 0) { if (ret < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment