Commit 79010636 authored by Keerthy's avatar Keerthy Committed by Eduardo Valentin

thermal: ti-soc-thermal: dra7: Implement Workaround for Errata i814

Bandgap Temperature read Dtemp can be corrupted

DESCRIPTION
        Read accesses to registers listed below can be corrupted due to
	incorrect resynchronization between clock domains.

        Read access to registers below can be corrupted :
                • CTRL_CORE_DTEMP_MPU/GPU/CORE/DSPEVE/IVA_n (n = 0 to 4)
        • CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA_n

WORKAROUND
    Multiple reads to CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA[9:0]:
    BGAP_DTEMPMPU/GPU/CORE/DSPEVE/IVA is needed to discard false value and
    read right value:
       1. Perform two successive reads to BGAP_DTEMP bit field.
               (a) If read1 returns Val1 and read2 returns Val1, then
       	right value is Val1.
               (b) If read1 returns Val1, read 2 returns Val2, a third
       	read is needed.
       2. Perform third read
               (a) If read3 returns Val2 then right value is Val2.
               (b) If read3 returns Val3, then right value is Val3.

    The above in gist means if val1 and val2 are the same then we can go
    ahead with that value else we need a third read which will be right
    since synchronization will be complete by then.
Signed-off-by: default avatarKeerthy <j-keerthy@ti.com>
Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
parent 5ebe6afa
...@@ -420,7 +420,8 @@ const struct ti_bandgap_data dra752_data = { ...@@ -420,7 +420,8 @@ const struct ti_bandgap_data dra752_data = {
TI_BANDGAP_FEATURE_FREEZE_BIT | TI_BANDGAP_FEATURE_FREEZE_BIT |
TI_BANDGAP_FEATURE_TALERT | TI_BANDGAP_FEATURE_TALERT |
TI_BANDGAP_FEATURE_COUNTER_DELAY | TI_BANDGAP_FEATURE_COUNTER_DELAY |
TI_BANDGAP_FEATURE_HISTORY_BUFFER, TI_BANDGAP_FEATURE_HISTORY_BUFFER |
TI_BANDGAP_FEATURE_ERRATA_814,
.fclock_name = "l3instr_ts_gclk_div", .fclock_name = "l3instr_ts_gclk_div",
.div_ck_name = "l3instr_ts_gclk_div", .div_ck_name = "l3instr_ts_gclk_div",
.conv_table = dra752_adc_to_temp, .conv_table = dra752_adc_to_temp,
......
...@@ -118,6 +118,37 @@ static int ti_bandgap_power(struct ti_bandgap *bgp, bool on) ...@@ -118,6 +118,37 @@ static int ti_bandgap_power(struct ti_bandgap *bgp, bool on)
return ret; return ret;
} }
/**
* ti_errata814_bandgap_read_temp() - helper function to read dra7 sensor temperature
* @bgp: pointer to ti_bandgap structure
* @reg: desired register (offset) to be read
*
* Function to read dra7 bandgap sensor temperature. This is done separately
* so as to workaround the errata "Bandgap Temperature read Dtemp can be
* corrupted" - Errata ID: i814".
* Read accesses to registers listed below can be corrupted due to incorrect
* resynchronization between clock domains.
* Read access to registers below can be corrupted :
* CTRL_CORE_DTEMP_MPU/GPU/CORE/DSPEVE/IVA_n (n = 0 to 4)
* CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA_n
*
* Return: the register value.
*/
static u32 ti_errata814_bandgap_read_temp(struct ti_bandgap *bgp, u32 reg)
{
u32 val1, val2;
val1 = ti_bandgap_readl(bgp, reg);
val2 = ti_bandgap_readl(bgp, reg);
/* If both times we read the same value then that is right */
if (val1 == val2)
return val1;
/* if val1 and val2 are different read it third time */
return ti_bandgap_readl(bgp, reg);
}
/** /**
* ti_bandgap_read_temp() - helper function to read sensor temperature * ti_bandgap_read_temp() - helper function to read sensor temperature
* @bgp: pointer to ti_bandgap structure * @bgp: pointer to ti_bandgap structure
...@@ -148,7 +179,11 @@ static u32 ti_bandgap_read_temp(struct ti_bandgap *bgp, int id) ...@@ -148,7 +179,11 @@ static u32 ti_bandgap_read_temp(struct ti_bandgap *bgp, int id)
} }
/* read temperature */ /* read temperature */
temp = ti_bandgap_readl(bgp, reg); if (TI_BANDGAP_HAS(bgp, ERRATA_814))
temp = ti_errata814_bandgap_read_temp(bgp, reg);
else
temp = ti_bandgap_readl(bgp, reg);
temp &= tsr->bgap_dtemp_mask; temp &= tsr->bgap_dtemp_mask;
if (TI_BANDGAP_HAS(bgp, FREEZE_BIT)) if (TI_BANDGAP_HAS(bgp, FREEZE_BIT))
......
...@@ -318,6 +318,9 @@ struct ti_temp_sensor { ...@@ -318,6 +318,9 @@ struct ti_temp_sensor {
* TI_BANDGAP_FEATURE_HISTORY_BUFFER - used when the bandgap device features * TI_BANDGAP_FEATURE_HISTORY_BUFFER - used when the bandgap device features
* a history buffer of temperatures. * a history buffer of temperatures.
* *
* TI_BANDGAP_FEATURE_ERRATA_814 - used to workaorund when the bandgap device
* has Errata 814
*
* TI_BANDGAP_HAS(b, f) - macro to check if a bandgap device is capable of a * TI_BANDGAP_HAS(b, f) - macro to check if a bandgap device is capable of a
* specific feature (above) or not. Return non-zero, if yes. * specific feature (above) or not. Return non-zero, if yes.
*/ */
...@@ -331,6 +334,7 @@ struct ti_temp_sensor { ...@@ -331,6 +334,7 @@ struct ti_temp_sensor {
#define TI_BANDGAP_FEATURE_FREEZE_BIT BIT(7) #define TI_BANDGAP_FEATURE_FREEZE_BIT BIT(7)
#define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8) #define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8)
#define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9) #define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9)
#define TI_BANDGAP_FEATURE_ERRATA_814 BIT(10)
#define TI_BANDGAP_HAS(b, f) \ #define TI_BANDGAP_HAS(b, f) \
((b)->conf->features & TI_BANDGAP_FEATURE_ ## f) ((b)->conf->features & TI_BANDGAP_FEATURE_ ## f)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment