diff options
-rw-r--r-- | drivers/power/bq20z75.c | 37 | ||||
-rw-r--r-- | include/linux/power/bq20z75.h | 2 |
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 | ||
157 | static int bq20z75_read_word_data(struct i2c_client *client, u8 address) | 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 | 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 | ||
171 | static int bq20z75_write_word_data(struct i2c_client *client, u8 address, | 183 | static 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 | */ |
32 | struct bq20z75_platform_data { | 33 | struct 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 |