mfd: qcom-i2c-pmic: Add retry mechanism for slow slave responding
In some devices, qcom-i2c-pmic driver fails probe from the initial poke failure of attached SEM slave. As software workaround, this issue can be recovered by retrying to ensure the unresponsive device is powered. CRs-Fixed: 1083672 Change-Id: Ie828ba236f42b24a3d2acefdf069445cc72503f1 Signed-off-by: Harry Yang <harryy@codeaurora.org> Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
This commit is contained in:
parent
37c5f804a2
commit
c079a27b73
1 changed files with 19 additions and 2 deletions
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2016 The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -467,12 +467,29 @@ static int i2c_pmic_parse_dt(struct i2c_pmic *chip)
|
|||
return rc;
|
||||
}
|
||||
|
||||
#define MAX_I2C_RETRIES 3
|
||||
static int i2c_pmic_read(struct regmap *map, unsigned int reg, void *val,
|
||||
size_t val_count)
|
||||
{
|
||||
int rc, retries = 0;
|
||||
|
||||
do {
|
||||
rc = regmap_bulk_read(map, reg, val, val_count);
|
||||
} while (rc == -ENOTCONN && retries++ < MAX_I2C_RETRIES);
|
||||
|
||||
if (retries > 1)
|
||||
pr_err("i2c_pmic_read failed for %d retries, rc = %d\n",
|
||||
retries - 1, rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int i2c_pmic_determine_initial_status(struct i2c_pmic *chip)
|
||||
{
|
||||
int rc, i;
|
||||
|
||||
for (i = 0; i < chip->num_periphs; i++) {
|
||||
rc = regmap_bulk_read(chip->regmap,
|
||||
rc = i2c_pmic_read(chip->regmap,
|
||||
chip->periph[i].addr | INT_SET_TYPE_OFFSET,
|
||||
chip->periph[i].cached, IRQ_MAX_REGS);
|
||||
if (rc < 0) {
|
||||
|
|
Loading…
Add table
Reference in a new issue