aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/power/bq20z75.c37
-rw-r--r--include/linux/power/bq20z75.h2
2 files changed, 33 insertions, 6 deletions
diff --git a/drivers/power/bq20z75.c b/drivers/power/bq20z75.c
index a51e98d74d34..e82d10e25e8c 100644
--- a/drivers/power/bq20z75.c
+++ b/drivers/power/bq20z75.c
@@ -156,30 +156,55 @@ struct bq20z75_info {
156 156
157static int bq20z75_read_word_data(struct i2c_client *client, u8 address) 157static int bq20z75_read_word_data(struct i2c_client *client, u8 address)
158{ 158{
159 s32 ret; 159 struct bq20z75_info *bq20z75_device = i2c_get_clientdata(client);
160 s32 ret = 0;
161 int retries = 1;
162
163 if (bq20z75_device->pdata)
164 retries = max(bq20z75_device->pdata->i2c_retry_count + 1, 1);
165
166 while (retries > 0) {
167 ret = i2c_smbus_read_word_data(client, address);
168 if (ret >= 0)
169 break;
170 retries--;
171 }
160 172
161 ret = i2c_smbus_read_word_data(client, address);
162 if (ret < 0) { 173 if (ret < 0) {
163 dev_err(&client->dev, 174 dev_warn(&client->dev,
164 "%s: i2c read at address 0x%x failed\n", 175 "%s: i2c read at address 0x%x failed\n",
165 __func__, address); 176 __func__, address);
166 return ret; 177 return ret;
167 } 178 }
179
168 return le16_to_cpu(ret); 180 return le16_to_cpu(ret);
169} 181}
170 182
171static int bq20z75_write_word_data(struct i2c_client *client, u8 address, 183static int bq20z75_write_word_data(struct i2c_client *client, u8 address,
172 u16 value) 184 u16 value)
173{ 185{
174 s32 ret; 186 struct bq20z75_info *bq20z75_device = i2c_get_clientdata(client);
187 s32 ret = 0;
188 int retries = 1;
189
190 if (bq20z75_device->pdata)
191 retries = max(bq20z75_device->pdata->i2c_retry_count + 1, 1);
192
193 while (retries > 0) {
194 ret = i2c_smbus_write_word_data(client, address,
195 le16_to_cpu(value));
196 if (ret >= 0)
197 break;
198 retries--;
199 }
175 200
176 ret = i2c_smbus_write_word_data(client, address, le16_to_cpu(value));
177 if (ret < 0) { 201 if (ret < 0) {
178 dev_err(&client->dev, 202 dev_warn(&client->dev,
179 "%s: i2c write to address 0x%x failed\n", 203 "%s: i2c write to address 0x%x failed\n",
180 __func__, address); 204 __func__, address);
181 return ret; 205 return ret;
182 } 206 }
207
183 return 0; 208 return 0;
184} 209}
185 210
diff --git a/include/linux/power/bq20z75.h b/include/linux/power/bq20z75.h
index 0e1b8a26a9b1..b0843b68af92 100644
--- a/include/linux/power/bq20z75.h
+++ b/include/linux/power/bq20z75.h
@@ -28,10 +28,12 @@
28 * struct bq20z75_platform_data - platform data for bq20z75 devices 28 * struct bq20z75_platform_data - platform data for bq20z75 devices
29 * @battery_detect: GPIO which is used to detect battery presence 29 * @battery_detect: GPIO which is used to detect battery presence
30 * @battery_detect_present: gpio state when battery is present (0 / 1) 30 * @battery_detect_present: gpio state when battery is present (0 / 1)
31 * @i2c_retry_count: # of times to retry on i2c IO failure
31 */ 32 */
32struct bq20z75_platform_data { 33struct bq20z75_platform_data {
33 int battery_detect; 34 int battery_detect;
34 int battery_detect_present; 35 int battery_detect_present;
36 int i2c_retry_count;
35}; 37};
36 38
37#endif 39#endif