History

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.

Rhyland Klein committed 15 years ago

Commit ff28fce1 parent bb879102 files · +33 −6Browse files

Unified · Split

2 files
  1. drivers/power/bq20z75.c +31 −6
  2. include/linux/power/bq20z75.h +2 −0
drivers/power/bq20z75.c+31−6
@@ -156,30 +156,55 @@ struct bq20z75_info { · 155 unmodified lines
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
include/linux/power/bq20z75.h+2−0
@@ -28,10 +28,12 @@ · 27 unmodified lines
28 * struct bq20z75_platform_data - platform data for bq20z75 devices28 * struct bq20z75_platform_data - platform data for bq20z75 devices
29 * @battery_detect: GPIO which is used to detect battery presence29 * @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#endif39#endif