Merge branch 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
Pull thermal fixes from Zhang Rui: "Three fixes for Armada (380) and TI (dra7 and OMAP5) thermal soc drivers" * 'for-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux: thermal: armada: Update Armada 380 thermal sensor coefficients thermal: ti-soc-thermal: OMAP5: Implement Workaround for Errata i813 thermal: ti-soc-thermal: dra7: Implement Workaround for Errata i814
This commit is contained in:
commit
18658921a2
5 changed files with 89 additions and 7 deletions
|
@ -224,9 +224,9 @@ static const struct armada_thermal_data armada380_data = {
|
|||
.is_valid_shift = 10,
|
||||
.temp_shift = 0,
|
||||
.temp_mask = 0x3ff,
|
||||
.coef_b = 1169498786UL,
|
||||
.coef_m = 2000000UL,
|
||||
.coef_div = 4289,
|
||||
.coef_b = 2931108200UL,
|
||||
.coef_m = 5000000UL,
|
||||
.coef_div = 10502,
|
||||
.inverted = true,
|
||||
};
|
||||
|
||||
|
|
|
@ -420,7 +420,8 @@ const struct ti_bandgap_data dra752_data = {
|
|||
TI_BANDGAP_FEATURE_FREEZE_BIT |
|
||||
TI_BANDGAP_FEATURE_TALERT |
|
||||
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",
|
||||
.div_ck_name = "l3instr_ts_gclk_div",
|
||||
.conv_table = dra752_adc_to_temp,
|
||||
|
|
|
@ -319,7 +319,8 @@ const struct ti_bandgap_data omap5430_data = {
|
|||
TI_BANDGAP_FEATURE_FREEZE_BIT |
|
||||
TI_BANDGAP_FEATURE_TALERT |
|
||||
TI_BANDGAP_FEATURE_COUNTER_DELAY |
|
||||
TI_BANDGAP_FEATURE_HISTORY_BUFFER,
|
||||
TI_BANDGAP_FEATURE_HISTORY_BUFFER |
|
||||
TI_BANDGAP_FEATURE_ERRATA_813,
|
||||
.fclock_name = "l3instr_ts_gclk_div",
|
||||
.div_ck_name = "l3instr_ts_gclk_div",
|
||||
.conv_table = omap5430_adc_to_temp,
|
||||
|
|
|
@ -118,6 +118,37 @@ static int ti_bandgap_power(struct ti_bandgap *bgp, bool on)
|
|||
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
|
||||
* @bgp: pointer to ti_bandgap structure
|
||||
|
@ -148,7 +179,11 @@ static u32 ti_bandgap_read_temp(struct ti_bandgap *bgp, int id)
|
|||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
if (TI_BANDGAP_HAS(bgp, FREEZE_BIT))
|
||||
|
@ -410,7 +445,7 @@ static int ti_bandgap_update_alert_threshold(struct ti_bandgap *bgp, int id,
|
|||
{
|
||||
struct temp_sensor_data *ts_data = bgp->conf->sensors[id].ts_data;
|
||||
struct temp_sensor_registers *tsr;
|
||||
u32 thresh_val, reg_val, t_hot, t_cold;
|
||||
u32 thresh_val, reg_val, t_hot, t_cold, ctrl;
|
||||
int err = 0;
|
||||
|
||||
tsr = bgp->conf->sensors[id].registers;
|
||||
|
@ -442,8 +477,47 @@ static int ti_bandgap_update_alert_threshold(struct ti_bandgap *bgp, int id,
|
|||
~(tsr->threshold_thot_mask | tsr->threshold_tcold_mask);
|
||||
reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)) |
|
||||
(t_cold << __ffs(tsr->threshold_tcold_mask));
|
||||
|
||||
/**
|
||||
* Errata i813:
|
||||
* Spurious Thermal Alert: Talert can happen randomly while the device
|
||||
* remains under the temperature limit defined for this event to trig.
|
||||
* This spurious event is caused by a incorrect re-synchronization
|
||||
* between clock domains. The comparison between configured threshold
|
||||
* and current temperature value can happen while the value is
|
||||
* transitioning (metastable), thus causing inappropriate event
|
||||
* generation. No spurious event occurs as long as the threshold value
|
||||
* stays unchanged. Spurious event can be generated while a thermal
|
||||
* alert threshold is modified in
|
||||
* CONTROL_BANDGAP_THRESHOLD_MPU/GPU/CORE/DSPEVE/IVA_n.
|
||||
*/
|
||||
|
||||
if (TI_BANDGAP_HAS(bgp, ERRATA_813)) {
|
||||
/* Mask t_hot and t_cold events at the IP Level */
|
||||
ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl);
|
||||
|
||||
if (hot)
|
||||
ctrl &= ~tsr->mask_hot_mask;
|
||||
else
|
||||
ctrl &= ~tsr->mask_cold_mask;
|
||||
|
||||
ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl);
|
||||
}
|
||||
|
||||
/* Write the threshold value */
|
||||
ti_bandgap_writel(bgp, reg_val, tsr->bgap_threshold);
|
||||
|
||||
if (TI_BANDGAP_HAS(bgp, ERRATA_813)) {
|
||||
/* Unmask t_hot and t_cold events at the IP Level */
|
||||
ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl);
|
||||
if (hot)
|
||||
ctrl |= tsr->mask_hot_mask;
|
||||
else
|
||||
ctrl |= tsr->mask_cold_mask;
|
||||
|
||||
ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl);
|
||||
}
|
||||
|
||||
if (err) {
|
||||
dev_err(bgp->dev, "failed to reprogram thot threshold\n");
|
||||
err = -EIO;
|
||||
|
|
|
@ -318,6 +318,10 @@ struct ti_temp_sensor {
|
|||
* TI_BANDGAP_FEATURE_HISTORY_BUFFER - used when the bandgap device features
|
||||
* a history buffer of temperatures.
|
||||
*
|
||||
* TI_BANDGAP_FEATURE_ERRATA_814 - used to workaorund when the bandgap device
|
||||
* has Errata 814
|
||||
* TI_BANDGAP_FEATURE_ERRATA_813 - used to workaorund when the bandgap device
|
||||
* has Errata 813
|
||||
* 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.
|
||||
*/
|
||||
|
@ -331,6 +335,8 @@ struct ti_temp_sensor {
|
|||
#define TI_BANDGAP_FEATURE_FREEZE_BIT BIT(7)
|
||||
#define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8)
|
||||
#define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9)
|
||||
#define TI_BANDGAP_FEATURE_ERRATA_814 BIT(10)
|
||||
#define TI_BANDGAP_FEATURE_ERRATA_813 BIT(11)
|
||||
#define TI_BANDGAP_HAS(b, f) \
|
||||
((b)->conf->features & TI_BANDGAP_FEATURE_ ## f)
|
||||
|
||||
|
|
Loading…
Reference in a new issue