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.
Unified · Split
| @@ -156,30 +156,55 @@ struct bq20z75_info { · 155 unmodified lines | ||
| 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; | |
| 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 | 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; | |
| 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 | 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 | |
| @@ -28,10 +28,12 @@ · 27 unmodified lines | ||
| 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 |