bq20z75: Add i2c retry mechanism

With the support of platform data, now adding support for option i2c
retries on read/write failures. Ths is specified through the optional
platform data.

Signed-off-by: Rhyland Klein <rklein@nvidia.com>
Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>

authored by Rhyland Klein and committed by Anton Vorontsov ff28fcef bb879101

+33 -6
+31 -6
drivers/power/bq20z75.c
··· 156 156 157 157 static 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; 160 162 161 - ret = i2c_smbus_read_word_data(client, address); 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 + } 172 + 162 173 if (ret < 0) { 163 - dev_err(&client->dev, 174 + dev_warn(&client->dev, 164 175 "%s: i2c read at address 0x%x failed\n", 165 176 __func__, address); 166 177 return ret; 167 178 } 179 + 168 180 return le16_to_cpu(ret); 169 181 } 170 182 171 183 static int bq20z75_write_word_data(struct i2c_client *client, u8 address, 172 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; 175 189 176 - ret = i2c_smbus_write_word_data(client, address, le16_to_cpu(value)); 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 + } 200 + 177 201 if (ret < 0) { 178 - dev_err(&client->dev, 202 + dev_warn(&client->dev, 179 203 "%s: i2c write to address 0x%x failed\n", 180 204 __func__, address); 181 205 return ret; 182 206 } 207 + 183 208 return 0; 184 209 } 185 210
+2
include/linux/power/bq20z75.h
··· 28 28 * struct bq20z75_platform_data - platform data for bq20z75 devices 29 29 * @battery_detect: GPIO which is used to detect battery presence 30 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 */ 32 33 struct bq20z75_platform_data { 33 34 int battery_detect; 34 35 int battery_detect_present; 36 + int i2c_retry_count; 35 37 }; 36 38 37 39 #endif