From: Steve Sakoman Date: Wed, 30 May 2012 07:38:07 +0000 (+0000) Subject: omap: emif: deal with rams that return duplicate mr data on all byte lanes X-Git-Tag: v2012.07-rc1~11^2~78 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=55c1284942b18cf83a297d33c8746aadcbf5f096;p=platform%2Fkernel%2Fu-boot.git omap: emif: deal with rams that return duplicate mr data on all byte lanes Some rams (Micron for example) return duplicate mr data on all byte lanes. Users of the get_mr function currently don't deal with this duplicated data gracefully. This patch detects the duplicated data and returns only the expected 8 bit mr data. Signed-off-by: Steve Sakoman --- diff --git a/arch/arm/cpu/armv7/omap-common/emif-common.c b/arch/arm/cpu/armv7/omap-common/emif-common.c index 64427e6..61ade4c 100644 --- a/arch/arm/cpu/armv7/omap-common/emif-common.c +++ b/arch/arm/cpu/armv7/omap-common/emif-common.c @@ -77,7 +77,12 @@ static inline u32 get_mr(u32 base, u32 cs, u32 mr_addr) mr = readl(&emif->emif_lpddr2_mode_reg_data); debug("get_mr: EMIF%d cs %d mr %08x val 0x%x\n", emif_num(base), cs, mr_addr, mr); - return mr; + if (((mr & 0x0000ff00) >> 8) == (mr & 0xff) && + ((mr & 0x00ff0000) >> 16) == (mr & 0xff) && + ((mr & 0xff000000) >> 24) == (mr & 0xff)) + return mr & 0xff; + else + return mr; } static inline void set_mr(u32 base, u32 cs, u32 mr_addr, u32 mr_val)