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