Messages in this thread | | | Date | Thu, 16 Feb 2012 17:20:20 +0530 | From | Aneesh V <> | Subject | Re: [RFC PATCH 6/8] misc: emif: add interrupt and temperature handling |
| |
On Thursday 16 February 2012 04:11 PM, Santosh Shilimkar wrote: > On Saturday 04 February 2012 05:46 PM, Aneesh V wrote: >> Add an ISR for EMIF that: >> 1. reports details of access errors >> 2. takes action on thermal events >> >> On thermal events SDRAM timing parameters are >> adjusted to ensure safe operation >> >> Also clear all interrupts on shut-down. Pending IRQs >> may casue problems during warm-reset. >> > Add some more details like MR4, EMIF polling frequency etc > for better understanding.
Will do.
> >> Signed-off-by: Aneesh V<aneesh@ti.com> >> --- >> drivers/misc/emif.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++- >> 1 files changed, 207 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/misc/emif.c b/drivers/misc/emif.c >> index 36ba6f4..5c2b0ae 100644 >> --- a/drivers/misc/emif.c >> +++ b/drivers/misc/emif.c >> @@ -500,6 +500,45 @@ static u32 get_pwr_mgmt_ctrl(u32 freq, struct emif_data *emif, u32 ip_rev) >> } >> >> /* >> + * Get the temperature level of the EMIF instance: >> + * Reads the MR4 register of attached SDRAM parts to find out the temperature >> + * level. If there are two parts attached(one on each CS), then the temperature >> + * level for the EMIF instance is the higher of the two temperatures. >> + */ >> +static void get_temperature_level(struct emif_data *emif) >> +{ >> + u32 temp, temperature_level; >> + unsigned long irqs; >> + void __iomem *base; >> + >> + base = emif->base; >> + >> + /* Read mode register 4 */ >> + writel(DDR_MR4, base + EMIF_LPDDR2_MODE_REG_CONFIG); >> + temperature_level = readl(base + EMIF_LPDDR2_MODE_REG_DATA); >> + temperature_level = (temperature_level& MR4_SDRAM_REF_RATE_MASK)>> >> + MR4_SDRAM_REF_RATE_SHIFT; >> + >> + if (emif->plat_data->device_info->cs1_used) { >> + writel(DDR_MR4 | CS_MASK, base + EMIF_LPDDR2_MODE_REG_CONFIG); >> + temp = readl(base + EMIF_LPDDR2_MODE_REG_DATA); >> + temp = (temp& MR4_SDRAM_REF_RATE_MASK) >> + >> MR4_SDRAM_REF_RATE_SHIFT; >> + temperature_level = max(temp, temperature_level); >> + } >> + >> + spin_lock_irqsave(&emif->lock, irqs); > Add a line here.
Will do.
>> + /* treat everything less than nominal(3) in MR4 as nominal */ >> + if (unlikely(temperature_level< SDRAM_TEMP_NOMINAL)) >> + temperature_level = SDRAM_TEMP_NOMINAL; >> + >> + /* if we get reserved value in MR4 persist with the existing value */ >> + if (likely(temperature_level != SDRAM_TEMP_RESERVED_4)) >> + emif->temperature_level = temperature_level; >> + spin_unlock_irqrestore(&emif->lock, irqs); >> +} >> + > > rest of the patch looks fine to me
Thanks, Aneesh
| |