diff options
Diffstat (limited to 'drivers/mfd/ab8500-gpadc.c')
-rw-r--r-- | drivers/mfd/ab8500-gpadc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/mfd/ab8500-gpadc.c b/drivers/mfd/ab8500-gpadc.c index 6421ad1160de..82708c1f316d 100644 --- a/drivers/mfd/ab8500-gpadc.c +++ b/drivers/mfd/ab8500-gpadc.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #define SW_AVG_16 0x60 | 57 | #define SW_AVG_16 0x60 |
58 | #define ADC_SW_CONV 0x04 | 58 | #define ADC_SW_CONV 0x04 |
59 | #define EN_ICHAR 0x80 | 59 | #define EN_ICHAR 0x80 |
60 | #define BATTEMP_PULLUP 0x04 | ||
60 | #define EN_BUF 0x40 | 61 | #define EN_BUF 0x40 |
61 | #define DIS_ZERO 0x00 | 62 | #define DIS_ZERO 0x00 |
62 | #define GPADC_BUSY 0x01 | 63 | #define GPADC_BUSY 0x01 |
@@ -101,6 +102,7 @@ struct adc_cal_data { | |||
101 | 102 | ||
102 | /** | 103 | /** |
103 | * struct ab8500_gpadc - AB8500 GPADC device information | 104 | * struct ab8500_gpadc - AB8500 GPADC device information |
105 | * @chip_id ABB chip id | ||
104 | * @dev: pointer to the struct device | 106 | * @dev: pointer to the struct device |
105 | * @node: a list of AB8500 GPADCs, hence prepared for | 107 | * @node: a list of AB8500 GPADCs, hence prepared for |
106 | reentrance | 108 | reentrance |
@@ -112,6 +114,7 @@ struct adc_cal_data { | |||
112 | * @cal_data array of ADC calibration data structs | 114 | * @cal_data array of ADC calibration data structs |
113 | */ | 115 | */ |
114 | struct ab8500_gpadc { | 116 | struct ab8500_gpadc { |
117 | u8 chip_id; | ||
115 | struct device *dev; | 118 | struct device *dev; |
116 | struct list_head node; | 119 | struct list_head node; |
117 | struct completion ab8500_gpadc_complete; | 120 | struct completion ab8500_gpadc_complete; |
@@ -274,6 +277,7 @@ int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 input) | |||
274 | dev_err(gpadc->dev, "gpadc_conversion: enable gpadc failed\n"); | 277 | dev_err(gpadc->dev, "gpadc_conversion: enable gpadc failed\n"); |
275 | goto out; | 278 | goto out; |
276 | } | 279 | } |
280 | |||
277 | /* Select the input source and set average samples to 16 */ | 281 | /* Select the input source and set average samples to 16 */ |
278 | ret = abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC, | 282 | ret = abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC, |
279 | AB8500_GPADC_CTRL2_REG, (input | SW_AVG_16)); | 283 | AB8500_GPADC_CTRL2_REG, (input | SW_AVG_16)); |
@@ -282,9 +286,11 @@ int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 input) | |||
282 | "gpadc_conversion: set avg samples failed\n"); | 286 | "gpadc_conversion: set avg samples failed\n"); |
283 | goto out; | 287 | goto out; |
284 | } | 288 | } |
289 | |||
285 | /* | 290 | /* |
286 | * Enable ADC, buffering, select rising edge and enable ADC path | 291 | * Enable ADC, buffering, select rising edge and enable ADC path |
287 | * charging current sense if it needed | 292 | * charging current sense if it needed, ABB 3.0 needs some special |
293 | * treatment too. | ||
288 | */ | 294 | */ |
289 | switch (input) { | 295 | switch (input) { |
290 | case MAIN_CHARGER_C: | 296 | case MAIN_CHARGER_C: |
@@ -294,6 +300,23 @@ int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 input) | |||
294 | EN_BUF | EN_ICHAR, | 300 | EN_BUF | EN_ICHAR, |
295 | EN_BUF | EN_ICHAR); | 301 | EN_BUF | EN_ICHAR); |
296 | break; | 302 | break; |
303 | case BTEMP_BALL: | ||
304 | if (gpadc->chip_id >= AB8500_CUT3P0) { | ||
305 | /* Turn on btemp pull-up on ABB 3.0 */ | ||
306 | ret = abx500_mask_and_set_register_interruptible( | ||
307 | gpadc->dev, | ||
308 | AB8500_GPADC, AB8500_GPADC_CTRL1_REG, | ||
309 | EN_BUF | BATTEMP_PULLUP, | ||
310 | EN_BUF | BATTEMP_PULLUP); | ||
311 | |||
312 | /* | ||
313 | * Delay might be needed for ABB8500 cut 3.0, if not, remove | ||
314 | * when hardware will be availible | ||
315 | */ | ||
316 | msleep(1); | ||
317 | break; | ||
318 | } | ||
319 | /* Intentional fallthrough */ | ||
297 | default: | 320 | default: |
298 | ret = abx500_mask_and_set_register_interruptible(gpadc->dev, | 321 | ret = abx500_mask_and_set_register_interruptible(gpadc->dev, |
299 | AB8500_GPADC, AB8500_GPADC_CTRL1_REG, EN_BUF, EN_BUF); | 322 | AB8500_GPADC, AB8500_GPADC_CTRL1_REG, EN_BUF, EN_BUF); |
@@ -304,6 +327,7 @@ int ab8500_gpadc_convert(struct ab8500_gpadc *gpadc, u8 input) | |||
304 | "gpadc_conversion: select falling edge failed\n"); | 327 | "gpadc_conversion: select falling edge failed\n"); |
305 | goto out; | 328 | goto out; |
306 | } | 329 | } |
330 | |||
307 | ret = abx500_mask_and_set_register_interruptible(gpadc->dev, | 331 | ret = abx500_mask_and_set_register_interruptible(gpadc->dev, |
308 | AB8500_GPADC, AB8500_GPADC_CTRL1_REG, ADC_SW_CONV, ADC_SW_CONV); | 332 | AB8500_GPADC, AB8500_GPADC_CTRL1_REG, ADC_SW_CONV, ADC_SW_CONV); |
309 | if (ret < 0) { | 333 | if (ret < 0) { |
@@ -552,6 +576,14 @@ static int __devinit ab8500_gpadc_probe(struct platform_device *pdev) | |||
552 | goto fail; | 576 | goto fail; |
553 | } | 577 | } |
554 | 578 | ||
579 | /* Get Chip ID of the ABB ASIC */ | ||
580 | ret = abx500_get_chip_id(gpadc->dev); | ||
581 | if (ret < 0) { | ||
582 | dev_err(gpadc->dev, "failed to get chip ID\n"); | ||
583 | goto fail_irq; | ||
584 | } | ||
585 | gpadc->chip_id = (u8) ret; | ||
586 | |||
555 | /* VTVout LDO used to power up ab8500-GPADC */ | 587 | /* VTVout LDO used to power up ab8500-GPADC */ |
556 | gpadc->regu = regulator_get(&pdev->dev, "vddadc"); | 588 | gpadc->regu = regulator_get(&pdev->dev, "vddadc"); |
557 | if (IS_ERR(gpadc->regu)) { | 589 | if (IS_ERR(gpadc->regu)) { |