mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 15:41:39 +00:00
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: Rui Miguel Silva <rmfrfs@gmail.com> Acked-by: Yueyao Zhu <yueyao.zhu@gmail.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f0d39a179b
commit
50b7c322cf
@ -264,22 +264,36 @@ static void fusb302_debugfs_exit(const struct fusb302_chip *chip) { }
|
||||
|
||||
#define FUSB302_RESUME_RETRY 10
|
||||
#define FUSB302_RESUME_RETRY_SLEEP 50
|
||||
|
||||
static bool fusb302_is_suspended(struct fusb302_chip *chip)
|
||||
{
|
||||
int retry_cnt;
|
||||
|
||||
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
|
||||
if (atomic_read(&chip->pm_suspend)) {
|
||||
dev_err(chip->dev, "i2c: pm suspend, retry %d/%d\n",
|
||||
retry_cnt + 1, FUSB302_RESUME_RETRY);
|
||||
msleep(FUSB302_RESUME_RETRY_SLEEP);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int fusb302_i2c_write(struct fusb302_chip *chip,
|
||||
u8 address, u8 data)
|
||||
{
|
||||
int retry_cnt;
|
||||
int ret = 0;
|
||||
|
||||
atomic_set(&chip->i2c_busy, 1);
|
||||
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
|
||||
if (atomic_read(&chip->pm_suspend)) {
|
||||
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n",
|
||||
retry_cnt + 1, FUSB302_RESUME_RETRY);
|
||||
msleep(FUSB302_RESUME_RETRY_SLEEP);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
if (fusb302_is_suspended(chip)) {
|
||||
atomic_set(&chip->i2c_busy, 0);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_write_byte_data(chip->i2c_client, address, data);
|
||||
if (ret < 0)
|
||||
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,
|
||||
static int fusb302_i2c_block_write(struct fusb302_chip *chip, u8 address,
|
||||
u8 length, const u8 *data)
|
||||
{
|
||||
int retry_cnt;
|
||||
int ret = 0;
|
||||
|
||||
if (length <= 0)
|
||||
return ret;
|
||||
atomic_set(&chip->i2c_busy, 1);
|
||||
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
|
||||
if (atomic_read(&chip->pm_suspend)) {
|
||||
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n",
|
||||
retry_cnt + 1, FUSB302_RESUME_RETRY);
|
||||
msleep(FUSB302_RESUME_RETRY_SLEEP);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
if (fusb302_is_suspended(chip)) {
|
||||
atomic_set(&chip->i2c_busy, 0);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_write_i2c_block_data(chip->i2c_client, address,
|
||||
length, data);
|
||||
if (ret < 0)
|
||||
@ -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,
|
||||
u8 address, u8 *data)
|
||||
{
|
||||
int retry_cnt;
|
||||
int ret = 0;
|
||||
|
||||
atomic_set(&chip->i2c_busy, 1);
|
||||
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
|
||||
if (atomic_read(&chip->pm_suspend)) {
|
||||
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n",
|
||||
retry_cnt + 1, FUSB302_RESUME_RETRY);
|
||||
msleep(FUSB302_RESUME_RETRY_SLEEP);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
if (fusb302_is_suspended(chip)) {
|
||||
atomic_set(&chip->i2c_busy, 0);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_read_byte_data(chip->i2c_client, address);
|
||||
*data = (u8)ret;
|
||||
if (ret < 0)
|
||||
@ -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,
|
||||
u8 length, u8 *data)
|
||||
{
|
||||
int retry_cnt;
|
||||
int ret = 0;
|
||||
|
||||
if (length <= 0)
|
||||
return ret;
|
||||
atomic_set(&chip->i2c_busy, 1);
|
||||
for (retry_cnt = 0; retry_cnt < FUSB302_RESUME_RETRY; retry_cnt++) {
|
||||
if (atomic_read(&chip->pm_suspend)) {
|
||||
pr_err("fusb302_i2c: pm suspend, retry %d/%d\n",
|
||||
retry_cnt + 1, FUSB302_RESUME_RETRY);
|
||||
msleep(FUSB302_RESUME_RETRY_SLEEP);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
if (fusb302_is_suspended(chip)) {
|
||||
atomic_set(&chip->i2c_busy, 0);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ret = i2c_smbus_read_i2c_block_data(chip->i2c_client, address,
|
||||
length, data);
|
||||
if (ret < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user