|
85 | 85 | #define LN8000_ROLE(info) (LN8000_IS_PRIMARY(info) ? "prim" : "sec ") |
86 | 86 | #define LN8000_USE_GPIO(pdata) ((pdata != NULL) && (!IS_ERR_OR_NULL(pdata->irq_gpio))) |
87 | 87 | #define LN8000_STATUS(val, mask) ((val & mask) ? true : false) |
| 88 | +static int ln8000_change_opmode(struct ln8000_info *info, unsigned int target_mode); |
88 | 89 |
|
89 | 90 | /** |
90 | 91 | * I2C control functions : when occurred I2C tranfer fault, we |
@@ -469,14 +470,27 @@ static void ln8000_convert_adc_code(struct ln8000_info *info, unsigned int ch, u |
469 | 470 | adc_raw = ((sts[1] & 0x03)<<8) | (sts[0] & 0xFF); |
470 | 471 | adc_final = adc_raw * LN8000_ADC_IIN_STEP;//uA |
471 | 472 | break; |
472 | | - case LN8000_ADC_CH_DIETEMP: |
473 | | - adc_raw = ((sts[1] & 0x0F)<<6) | ((sts[0] & 0xFC)>>2); |
474 | | - adc_final = (935 - adc_raw) * LN8000_ADC_DIETEMP_STEP / LN8000_ADC_DIETEMP_DENOM;//dC |
475 | | - if (adc_final > LN8000_ADC_DIETEMP_MAX) |
476 | | - adc_final = LN8000_ADC_DIETEMP_MAX; |
477 | | - else if (adc_final < LN8000_ADC_DIETEMP_MIN) |
478 | | - adc_final = LN8000_ADC_DIETEMP_MIN; |
479 | | - break; |
| 473 | +case LN8000_ADC_CH_DIETEMP: { |
| 474 | + int temp_dc; |
| 475 | + adc_raw = ((sts[1] & 0x0F) << 6) | ((sts[0] & 0xFC) >> 2); |
| 476 | + ln_info("Raw ADC bytes: sts[0]=0x%02X, sts[1]=0x%02X\n", sts[0], sts[1]); |
| 477 | + ln_info("Raw ADC value for die temperature: 0x%04X\n", adc_raw); |
| 478 | + |
| 479 | + adc_final = (adc_raw * LN8000_ADC_DIETEMP_STEP) / LN8000_ADC_DIETEMP_DENOM; // dC |
| 480 | + temp_dc = adc_final / 10; |
| 481 | + |
| 482 | + ln_info("Current die temperature: %d°C\n", temp_dc); |
| 483 | + |
| 484 | + if (temp_dc > 1600) { |
| 485 | + temp_dc = 1600; |
| 486 | + ln_err("Die temperature exceeds maximum limit: %d°C\n", temp_dc); |
| 487 | + ln8000_change_opmode(info, LN8000_OPMODE_STANDBY); |
| 488 | + } else if (temp_dc < -250) { |
| 489 | + temp_dc = -250; |
| 490 | + } |
| 491 | + *result = temp_dc; |
| 492 | + break; |
| 493 | +} |
480 | 494 | case LN8000_ADC_CH_TSBAT: |
481 | 495 | adc_raw = ((sts[1] & 0x3F)<<4) | ((sts[0] & 0xF0)>>4); |
482 | 496 | adc_final = adc_raw * LN8000_ADC_NTCV_STEP;//(NTC) uV |
|
0 commit comments