|
@@ -53,6 +53,16 @@ enum sensor_id {
|
|
|
SENSOR_GPU,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+* The conversion table has the adc value and temperature.
|
|
|
+* ADC_DECREMENT is the adc value decremnet.(e.g. v2_code_table)
|
|
|
+* ADC_INCREMNET is the adc value incremnet.(e.g. v3_code_table)
|
|
|
+*/
|
|
|
+enum adc_sort_mode {
|
|
|
+ ADC_DECREMENT = 0,
|
|
|
+ ADC_INCREMENT,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* The max sensors is two in rockchip SoCs.
|
|
|
* Two sensors: CPU and GPU sensor.
|
|
@@ -67,6 +77,9 @@ struct chip_tsadc_table {
|
|
|
|
|
|
/* that analogic mask data */
|
|
|
u32 data_mask;
|
|
|
+
|
|
|
+ /* the sort mode is adc value that increment or decrement in table */
|
|
|
+ enum adc_sort_mode mode;
|
|
|
};
|
|
|
|
|
|
struct rockchip_tsadc_chip {
|
|
@@ -224,19 +237,43 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code,
|
|
|
|
|
|
WARN_ON(table.length < 2);
|
|
|
|
|
|
- code &= table.data_mask;
|
|
|
- if (code < table.id[high].code)
|
|
|
- return -EAGAIN; /* Incorrect reading */
|
|
|
-
|
|
|
- while (low <= high) {
|
|
|
- if (code >= table.id[mid].code &&
|
|
|
- code < table.id[mid - 1].code)
|
|
|
- break;
|
|
|
- else if (code < table.id[mid].code)
|
|
|
- low = mid + 1;
|
|
|
- else
|
|
|
- high = mid - 1;
|
|
|
- mid = (low + high) / 2;
|
|
|
+ switch (table.mode) {
|
|
|
+ case ADC_DECREMENT:
|
|
|
+ code &= table.data_mask;
|
|
|
+ if (code < table.id[high].code)
|
|
|
+ return -EAGAIN; /* Incorrect reading */
|
|
|
+
|
|
|
+ while (low <= high) {
|
|
|
+ if (code >= table.id[mid].code &&
|
|
|
+ code < table.id[mid - 1].code)
|
|
|
+ break;
|
|
|
+ else if (code < table.id[mid].code)
|
|
|
+ low = mid + 1;
|
|
|
+ else
|
|
|
+ high = mid - 1;
|
|
|
+
|
|
|
+ mid = (low + high) / 2;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ADC_INCREMENT:
|
|
|
+ code &= table.data_mask;
|
|
|
+ if (code < table.id[low].code)
|
|
|
+ return -EAGAIN; /* Incorrect reading */
|
|
|
+
|
|
|
+ while (low <= high) {
|
|
|
+ if (code >= table.id[mid - 1].code &&
|
|
|
+ code < table.id[mid].code)
|
|
|
+ break;
|
|
|
+ else if (code > table.id[mid].code)
|
|
|
+ low = mid + 1;
|
|
|
+ else
|
|
|
+ high = mid - 1;
|
|
|
+
|
|
|
+ mid = (low + high) / 2;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pr_err("Invalid the conversion table\n");
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -246,8 +283,8 @@ static int rk_tsadcv2_code_to_temp(struct chip_tsadc_table table, u32 code,
|
|
|
* to produce less granular result.
|
|
|
*/
|
|
|
num = table.id[mid].temp - v2_code_table[mid - 1].temp;
|
|
|
- num *= table.id[mid - 1].code - code;
|
|
|
- denom = table.id[mid - 1].code - table.id[mid].code;
|
|
|
+ num *= abs(table.id[mid - 1].code - code);
|
|
|
+ denom = abs(table.id[mid - 1].code - table.id[mid].code);
|
|
|
*temp = table.id[mid - 1].temp + (num / denom);
|
|
|
|
|
|
return 0;
|
|
@@ -368,6 +405,7 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
|
|
|
.id = v2_code_table,
|
|
|
.length = ARRAY_SIZE(v2_code_table),
|
|
|
.data_mask = TSADCV2_DATA_MASK,
|
|
|
+ .mode = ADC_DECREMENT,
|
|
|
},
|
|
|
};
|
|
|
|