Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal into for-rc

Zhang Rui e93cd950 e2608180

+89 -7
+3 -3
drivers/thermal/armada_thermal.c
··· 224 224 .is_valid_shift = 10, 225 225 .temp_shift = 0, 226 226 .temp_mask = 0x3ff, 227 - .coef_b = 1169498786UL, 228 - .coef_m = 2000000UL, 229 - .coef_div = 4289, 227 + .coef_b = 2931108200UL, 228 + .coef_m = 5000000UL, 229 + .coef_div = 10502, 230 230 .inverted = true, 231 231 }; 232 232
+2 -1
drivers/thermal/ti-soc-thermal/dra752-thermal-data.c
··· 420 420 TI_BANDGAP_FEATURE_FREEZE_BIT | 421 421 TI_BANDGAP_FEATURE_TALERT | 422 422 TI_BANDGAP_FEATURE_COUNTER_DELAY | 423 - TI_BANDGAP_FEATURE_HISTORY_BUFFER, 423 + TI_BANDGAP_FEATURE_HISTORY_BUFFER | 424 + TI_BANDGAP_FEATURE_ERRATA_814, 424 425 .fclock_name = "l3instr_ts_gclk_div", 425 426 .div_ck_name = "l3instr_ts_gclk_div", 426 427 .conv_table = dra752_adc_to_temp,
+2 -1
drivers/thermal/ti-soc-thermal/omap5-thermal-data.c
··· 319 319 TI_BANDGAP_FEATURE_FREEZE_BIT | 320 320 TI_BANDGAP_FEATURE_TALERT | 321 321 TI_BANDGAP_FEATURE_COUNTER_DELAY | 322 - TI_BANDGAP_FEATURE_HISTORY_BUFFER, 322 + TI_BANDGAP_FEATURE_HISTORY_BUFFER | 323 + TI_BANDGAP_FEATURE_ERRATA_813, 323 324 .fclock_name = "l3instr_ts_gclk_div", 324 325 .div_ck_name = "l3instr_ts_gclk_div", 325 326 .conv_table = omap5430_adc_to_temp,
+76 -2
drivers/thermal/ti-soc-thermal/ti-bandgap.c
··· 119 119 } 120 120 121 121 /** 122 + * ti_errata814_bandgap_read_temp() - helper function to read dra7 sensor temperature 123 + * @bgp: pointer to ti_bandgap structure 124 + * @reg: desired register (offset) to be read 125 + * 126 + * Function to read dra7 bandgap sensor temperature. This is done separately 127 + * so as to workaround the errata "Bandgap Temperature read Dtemp can be 128 + * corrupted" - Errata ID: i814". 129 + * Read accesses to registers listed below can be corrupted due to incorrect 130 + * resynchronization between clock domains. 131 + * Read access to registers below can be corrupted : 132 + * CTRL_CORE_DTEMP_MPU/GPU/CORE/DSPEVE/IVA_n (n = 0 to 4) 133 + * CTRL_CORE_TEMP_SENSOR_MPU/GPU/CORE/DSPEVE/IVA_n 134 + * 135 + * Return: the register value. 136 + */ 137 + static u32 ti_errata814_bandgap_read_temp(struct ti_bandgap *bgp, u32 reg) 138 + { 139 + u32 val1, val2; 140 + 141 + val1 = ti_bandgap_readl(bgp, reg); 142 + val2 = ti_bandgap_readl(bgp, reg); 143 + 144 + /* If both times we read the same value then that is right */ 145 + if (val1 == val2) 146 + return val1; 147 + 148 + /* if val1 and val2 are different read it third time */ 149 + return ti_bandgap_readl(bgp, reg); 150 + } 151 + 152 + /** 122 153 * ti_bandgap_read_temp() - helper function to read sensor temperature 123 154 * @bgp: pointer to ti_bandgap structure 124 155 * @id: bandgap sensor id ··· 179 148 } 180 149 181 150 /* read temperature */ 182 - temp = ti_bandgap_readl(bgp, reg); 151 + if (TI_BANDGAP_HAS(bgp, ERRATA_814)) 152 + temp = ti_errata814_bandgap_read_temp(bgp, reg); 153 + else 154 + temp = ti_bandgap_readl(bgp, reg); 155 + 183 156 temp &= tsr->bgap_dtemp_mask; 184 157 185 158 if (TI_BANDGAP_HAS(bgp, FREEZE_BIT)) ··· 445 410 { 446 411 struct temp_sensor_data *ts_data = bgp->conf->sensors[id].ts_data; 447 412 struct temp_sensor_registers *tsr; 448 - u32 thresh_val, reg_val, t_hot, t_cold; 413 + u32 thresh_val, reg_val, t_hot, t_cold, ctrl; 449 414 int err = 0; 450 415 451 416 tsr = bgp->conf->sensors[id].registers; ··· 477 442 ~(tsr->threshold_thot_mask | tsr->threshold_tcold_mask); 478 443 reg_val |= (t_hot << __ffs(tsr->threshold_thot_mask)) | 479 444 (t_cold << __ffs(tsr->threshold_tcold_mask)); 445 + 446 + /** 447 + * Errata i813: 448 + * Spurious Thermal Alert: Talert can happen randomly while the device 449 + * remains under the temperature limit defined for this event to trig. 450 + * This spurious event is caused by a incorrect re-synchronization 451 + * between clock domains. The comparison between configured threshold 452 + * and current temperature value can happen while the value is 453 + * transitioning (metastable), thus causing inappropriate event 454 + * generation. No spurious event occurs as long as the threshold value 455 + * stays unchanged. Spurious event can be generated while a thermal 456 + * alert threshold is modified in 457 + * CONTROL_BANDGAP_THRESHOLD_MPU/GPU/CORE/DSPEVE/IVA_n. 458 + */ 459 + 460 + if (TI_BANDGAP_HAS(bgp, ERRATA_813)) { 461 + /* Mask t_hot and t_cold events at the IP Level */ 462 + ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl); 463 + 464 + if (hot) 465 + ctrl &= ~tsr->mask_hot_mask; 466 + else 467 + ctrl &= ~tsr->mask_cold_mask; 468 + 469 + ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl); 470 + } 471 + 472 + /* Write the threshold value */ 480 473 ti_bandgap_writel(bgp, reg_val, tsr->bgap_threshold); 474 + 475 + if (TI_BANDGAP_HAS(bgp, ERRATA_813)) { 476 + /* Unmask t_hot and t_cold events at the IP Level */ 477 + ctrl = ti_bandgap_readl(bgp, tsr->bgap_mask_ctrl); 478 + if (hot) 479 + ctrl |= tsr->mask_hot_mask; 480 + else 481 + ctrl |= tsr->mask_cold_mask; 482 + 483 + ti_bandgap_writel(bgp, ctrl, tsr->bgap_mask_ctrl); 484 + } 481 485 482 486 if (err) { 483 487 dev_err(bgp->dev, "failed to reprogram thot threshold\n");
+6
drivers/thermal/ti-soc-thermal/ti-bandgap.h
··· 318 318 * TI_BANDGAP_FEATURE_HISTORY_BUFFER - used when the bandgap device features 319 319 * a history buffer of temperatures. 320 320 * 321 + * TI_BANDGAP_FEATURE_ERRATA_814 - used to workaorund when the bandgap device 322 + * has Errata 814 323 + * TI_BANDGAP_FEATURE_ERRATA_813 - used to workaorund when the bandgap device 324 + * has Errata 813 321 325 * TI_BANDGAP_HAS(b, f) - macro to check if a bandgap device is capable of a 322 326 * specific feature (above) or not. Return non-zero, if yes. 323 327 */ ··· 335 331 #define TI_BANDGAP_FEATURE_FREEZE_BIT BIT(7) 336 332 #define TI_BANDGAP_FEATURE_COUNTER_DELAY BIT(8) 337 333 #define TI_BANDGAP_FEATURE_HISTORY_BUFFER BIT(9) 334 + #define TI_BANDGAP_FEATURE_ERRATA_814 BIT(10) 335 + #define TI_BANDGAP_FEATURE_ERRATA_813 BIT(11) 338 336 #define TI_BANDGAP_HAS(b, f) \ 339 337 ((b)->conf->features & TI_BANDGAP_FEATURE_ ## f) 340 338