|
@@ -918,6 +918,7 @@ static irqreturn_t handle_temp_alert(void __iomem *base, struct emif_data *emif)
|
|
|
{
|
|
|
u32 old_temp_level;
|
|
|
irqreturn_t ret = IRQ_HANDLED;
|
|
|
+ struct emif_custom_configs *custom_configs;
|
|
|
|
|
|
spin_lock_irqsave(&emif_lock, irq_state);
|
|
|
old_temp_level = emif->temperature_level;
|
|
@@ -930,6 +931,29 @@ static irqreturn_t handle_temp_alert(void __iomem *base, struct emif_data *emif)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ custom_configs = emif->plat_data->custom_configs;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * IF we detect higher than "nominal rating" from DDR sensor
|
|
|
+ * on an unsupported DDR part, shutdown system
|
|
|
+ */
|
|
|
+ if (custom_configs && !(custom_configs->mask &
|
|
|
+ EMIF_CUSTOM_CONFIG_EXTENDED_TEMP_PART)) {
|
|
|
+ if (emif->temperature_level >= SDRAM_TEMP_HIGH_DERATE_REFRESH) {
|
|
|
+ dev_err(emif->dev,
|
|
|
+ "%s:NOT Extended temperature capable memory."
|
|
|
+ "Converting MR4=0x%02x as shutdown event\n",
|
|
|
+ __func__, emif->temperature_level);
|
|
|
+ /*
|
|
|
+ * Temperature far too high - do kernel_power_off()
|
|
|
+ * from thread context
|
|
|
+ */
|
|
|
+ emif->temperature_level = SDRAM_TEMP_VERY_HIGH_SHUTDOWN;
|
|
|
+ ret = IRQ_WAKE_THREAD;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (emif->temperature_level < old_temp_level ||
|
|
|
emif->temperature_level == SDRAM_TEMP_VERY_HIGH_SHUTDOWN) {
|
|
|
/*
|
|
@@ -1228,6 +1252,9 @@ static void __init_or_module of_get_custom_configs(struct device_node *np_emif,
|
|
|
cust_cfgs->temp_alert_poll_interval_ms = *poll_intvl;
|
|
|
}
|
|
|
|
|
|
+ if (of_find_property(np_emif, "extended-temp-part", &len))
|
|
|
+ cust_cfgs->mask |= EMIF_CUSTOM_CONFIG_EXTENDED_TEMP_PART;
|
|
|
+
|
|
|
if (!is_custom_config_valid(cust_cfgs, emif->dev)) {
|
|
|
devm_kfree(emif->dev, cust_cfgs);
|
|
|
return;
|