From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932600AbcHIWMB (ORCPT ); Tue, 9 Aug 2016 18:12:01 -0400 Received: from mail-by2nam03on0040.outbound.protection.outlook.com ([104.47.42.40]:54736 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932483AbcHIWL5 (ORCPT ); Tue, 9 Aug 2016 18:11:57 -0400 X-Greylist: delayed 709 seconds by postgrey-1.27 at vger.kernel.org; Tue, 09 Aug 2016 18:11:57 EDT Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=fail action=none header.from=nxp.com; From: York Sun To: CC: , , , , York Sun , Rob Herring , Mark Rutland , Doug Thompson , , , Subject: [Patch v4 6/9] driver/edac/fsl_ddr: Add support of little endian Date: Tue, 9 Aug 2016 14:55:43 -0700 Message-ID: <1470779760-16483-7-git-send-email-york.sun@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1470779760-16483-1-git-send-email-york.sun@nxp.com> References: <1470779760-16483-1-git-send-email-york.sun@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131152534376718694;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.158.2;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(54534003)(105606002)(11100500001)(92566002)(2950100001)(104016004)(68736007)(4326007)(2906002)(87936001)(86362001)(7416002)(50226002)(5003940100001)(8936002)(50466002)(48376002)(85426001)(8676002)(69596002)(50986999)(76176999)(47776003)(305945005)(2351001)(36756003)(356003)(8666005)(106466001)(110136002)(97736004)(77096005)(189998001)(19580405001)(586003)(81166006)(81156014)(19580395003)(33646002)(229853001)(7846002)(7059030)(358055004);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR0301MB1196;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD014;1:z/zv08NGtYsROyF9PQwsTEwh///cotU8QsDzOoQBGloxaZvyrpmdfJyEyK7Il8IpT4ZNBg/EY8mNKRH0Do1EvHuURF86FgEPQE/En1Txs0GB4MOCxARORz7UU8cmFwbNbmXN3s43IfY/kXNoCZTk/wpGtid/y14PPgZQcytYrfj/X7cRI/IA95XlFIZLtukOSy3cQnn7l6oHqLGj5cdB5oC4eYVZlw5UmHPJ8x2SMUEeQxT3m+lhLKA6Xsq0ojW6d3kBC5XcUURax9sWQ0iuG6+dYEZhjkjQzIpZf9A7UAeAALO6qpW71YIozSB6z/r9I/A/qE+DkgN3gZqsCoAzUaGd2lqBQ5SbhvmbCeO5amyGO1Eh0JbvoSgjqs9PpOQf/rmsk0eQgAud24NsukyGeI75aar8EkqBc5rxcSEeOG5VWwWjE6ghZSWgSl0Zb1KvLWOA+RqtbKU2d8i+XrOqZVgvNb9xYqMDotYgk4E797U8VrAihZPoSxXkS6wGO7bnTgZim+MTmLnU05XTffwDCnjsAT4TgTRf+yfVc8GP0PDpZt776DcnVPoi+mtKgRfZt9fu/R2e7K49UrgRBtB4qYKoVDT+n/BH6GBGp870uNA= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 1fa86ac3-1615-4ce2-4005-08d3c0a0215f X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1196;2:EupvrrCPmP7cxHq2aeD5mET1rGxnrpee8upV4zDQf7nnuMUEkkcSFRRxqnmV6EUQEwf8ULivmVCtc4YfTsY50xI2bkACCfi5Y2pPN6Rh+DLRPKEMItr+Q+4TwDde7QzBMTy8JH9aX7ZdWnBU1pSOrU9yD5q/y134iRjeigv3H/EurWM/FvIjU1aqKw5gng8o;3:JO6XZMAruuvWBdWZLgqkUgvCooe/lZ5LA2cnB1lB8N/S+jlYoGOTvWQPRDCTvwDw9eiAx2HxqO2JwAKYmpn2ClBY/Zr7lX8eb2UXUGzTCW3HpZ89Z6bUa7XjHwafvcSoaUZJMooolYtYrsMXrk09LiGkeLWFvPWhf6SXMeE8LUfFgb+6HAj72T87Og8aM0DN7T1T08UlU3fcdl0MX1It0eUKsmenGT+ypFlN0jdrRxM=;25:GGFIRyX6fdE9h32lmo0qFcPsSgRgrkmMFv4I9En9Pe875R13hKDPX8Lq+XGXImNtNs/UCBY+VZ3Hs6LGDdN9gGic+/RL9K9jlvWQRSjj1VyDTBoaFTgL1Mm5vapEflPlmv/fDh0T+7tfST3Qc9PsRgRq77IsnIAvHoO393k09bJNTe/Glry7BPY3G4z4Ymrv13zjIAlGNoukJGpoqZQH1WBgqiYtwrwJX892Jxnd9sAy2tiPiDouR65F00ABQ+DCTj3vvxjMTEFYl9G65OuCKj+yQxO0RdsA+dQYhrxUmCqaCmMzcpgF+IZBAe35LamxcvKyX9AENAgnwPG4U3HbPEcEbwxXwpZynRAarlOQGoWDXquEhECgFU/wiUw8ZoGmPiaALhbgNebrc3S9JMFSJJPkBwWUzXFxSu/xGMCY7eU= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1196; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1196;31:BYf5YFs6vGnqKhc8Dv1A/mTKyocgmsBi2bxxcm551P3m1OGIWctTC7QvwCWgzVLhYkR+NlqSYWpSVUwHBHMmlP/ZJR2ZYKzgfnwOP283nIaydkG0DrDnMUtO7sabKqRpodEbkDWxaqpEpr3yTC1xr/pWZJX9Kpr83USo1tUqIY9f0xsQaDW/nuwQalhQlG6caE+8cOm6XOLCq8RCEyo2YTe4cC9A7mOfFh8dSUcXkk0=;4:s2Kx1oYYErR9BQiEpSpLHNSoYWszFDlxgBL/GuOP2hZqRKb+lA7ysSvQshoBzfMYZElNOIrWznTNzfUpLmnWNEk9p+e5Mm/EApwIFo2aRDbuSGqWLDHik2lnQJir1u/XWcqv9UiMWzKOsy1u6cHCDOe0gvU9E8urgaLOcsBggxK6k419x1y8xHhN9aE1xNCs22dpXzHRKFBP8pk9dmtIOPUXZbYshwnIUV8CFm9mlydyq3f42SpK9c+5O31kf/nFPiipNVyTs25JKzXAUZAiwV92hbLn6TbvXat+l0TjoBrZJCiLzVLDHLx8cWOoAYXYlDzEBL1pcDcLHLj4osLNA8lo1D8KfwyLBmTb86EPn9nPyrFeewBLrkJ7QgwRlqWRxPlupExUf69ZDr/kIhyAfzGuMKAOOwFi/8Yu9hP475u3RMo5+M33SLgS2G18VfHmyM9czdE9afQ8yxqrRbeTP5WnjlGrLOiTUzLkJyEWQaUGxZzd+6sK7OyXxCT2Z7oOMF0C/T3uEK/IzFOjAG72BQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(13024025)(13015025)(13018025)(13017025)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:CY1PR0301MB1196;BCL:0;PCL:0;RULEID:(400006);SRVR:CY1PR0301MB1196; X-Forefront-PRVS: 0029F17A3F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1196;23:DKLXNolT7ucb9+iCQHzRwx8Rp4YVzEPu3XntMuQ?= =?us-ascii?Q?dtefDLjKfZU9WD7ixQWzr2AhTUWxcIe7ZqdOqeb9zfWSE3ek14kXPBQo7qM/?= =?us-ascii?Q?MtT5mj62pL5TH7pI6JUdnEoUOabLLkFXEwo0FnT+iJbIrtBAlYlMHHMTAkDf?= =?us-ascii?Q?LxRxmPUTaHAqnkpwCBqLzkxA5QQUdMr3opq4Ere9lpanmNrGj4U3wfq/hXsF?= =?us-ascii?Q?OoPQDTHfb6kE4YEfcRKivsSGhKbD3PC+qmVbuPE48Tz27QNvB7tb/SWRJ7sS?= =?us-ascii?Q?v1AX42CpqbPx0z/s1d/LpCR7Fz+vdT3wRMU5cf9hOifuHITY8p7evFDNs1GA?= =?us-ascii?Q?371ZkbsnQwMzQgzlpg8p7s5KP/+fya/VSfFEIYsUDrIhwHdkuyxcfvub4whd?= =?us-ascii?Q?msj5G1reIW1/4NejIfB6rLIBjmT4xPrCOxF9ht3YGWDxhPBpiE9SL3/wmb3K?= =?us-ascii?Q?2/QzNGkmf2wCPaf3Spx8x2kN+HdTzKkhUtJY8/U8tSukA90b4LAc9OuuQSuJ?= =?us-ascii?Q?NMpwbY7vjFn55OdsG75ZpEgzhoJWkyTTynvV5pIFRuc3SUVLTOCF4NWJ9vdj?= =?us-ascii?Q?BHr4B+MWxLLvNmV5lepuln1ZtrCtYdtNoI/7MYIodIwQGvBZDHO7NJ4qKnf5?= =?us-ascii?Q?mohkc+rWMLAzpmWGmU8+Es/26+F4oznMQieII4jDhpDgGMak+cx2OQmtNgb+?= =?us-ascii?Q?Ye/D/YCRlqnDov48vg1Jyv2bXLIZdSqIPSqB23xUsfMIlrNCR/F8K24g2htW?= =?us-ascii?Q?1PmHNpvHQX3n7BZK18azNb3LCdIfNI6ipJqND8/QXzOKGGf8JhdQH4wMZxin?= =?us-ascii?Q?ek6zkwEhpMrl/gXKUjLhBB00TX9RfvU3joMG953VDmEIDThTi/6AqDr279+f?= =?us-ascii?Q?XyifqFSOVWreucfnOKyLJFkW9u/cuv1YJZVdO7/uXBIcaz7fEZnvG6cIJqoc?= =?us-ascii?Q?v5cQMMMt5slXz928vc9jzkfzG3I3D+ZUshnGizVtYSikOXORm33GsK0AHr3/?= =?us-ascii?Q?meVAxrgWk7gD6cVlr680DcO2AyzHYXOzkJTY+HgDO5o3iq/kSvIkhPvXLNjI?= =?us-ascii?Q?QU541TDLfsPSD4/sokme9ml6J1SpoHkt/p8VmgZ81iL8rgYP8moxODYSc3qy?= =?us-ascii?Q?PqYu/1v35YUF4AT3tqXPZFf/ssCuU7zjT6JIjGEPpjacvLo22+/OOa7xM9a5?= =?us-ascii?Q?E4iI5sMVd7oQNjdqsi94tr1DSwELNII5nQl1ZXJ84KNG78mgmuahKDO2A2w?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1196;6:1OtqC9/VJj6HYpAicumjTv7PjIgPekmAVBLPOlI3MePAgyeh2JWN6vALQ5D6OwjBOiZEZY/TjDc1/+aqc6+pvKRmHvJ81IJ5jYYdgNF1KzFiUKrcm7c1cxYZsswTkTnR4nqFXGvJlf590euttvlTDZh31qqCmqlTadpNwrFpFwvEr0XluTZxUrer12Vfh7ikn4siUgjBH9Orbxiwcnkjrs9J/zglpEVo5LqmSSwUddr0EFJWrVNmTE/C4nAA9T9UMpbRay8Pq48ph43u45f5IkeekQ940w16LU0J/R5eMdY=;5:GrSwskyQaWvF3l/FhTJ1udNUrvGNCkbU7bMZ9sx48VTecRNdI/HCzvDBfk4OYpfR9VpDYKLqLI2Zg3ASSTcnnHfE2YO6WAqzMPjajTovEXFvj6tna9lsVj7HMAaEMnkto11hD2u82e8LGEkexhJ1RlNdwCxG3AwpI6hTIrf7cNg=;24:V5hM4VsA6UOrDxCW4OOGQWAOGwn7VdHtEjidtb+p7vGyzYS36yGzgx9rQgyQ/ngZswnWfVJgLJ0JgcNGkhavgQeKkK9Im4LWd4cClVfTKQU=;7:veyq+skxZbsnhkjtF5PDbr/D8hbHK8Q6JLBFLQyttaY2LbsfSkiT8dQ9d2dbwzUGEzoLFD4C972yS/5DlsG5DFMH4ZR8cxCQzDNvDfKQbBHdTIkGWiBv1HmUbJ57pBTv92XqannspD4/HYnY3qxNYPqKpsX8Hd9Rd7IeEdKki6TogTnE2xKviYJOjg+agXYm/wV3SvavkWfWIPjY0gStPvQbDdQItKDcyGAQI7R/NkQJS9YuckGj+LNhBPVfZmvn SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2016 21:57:17.4378 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1196 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Get endianness from device tree. Both big endian and little endian are supported. Default to big endian for backward compatibility to MPC85xx. Signed-off-by: York Sun --- Change log v4: Absorb name changes by "Rename macros and names" Drop testing for big-endian as suggested Use of_property_read_bool() as suggested v3: no change v2: Separated from "Add support for ARM-based SoCs" patch .../fsl/ddr.txt} | 2 + drivers/edac/fsl_ddr_edac.c | 96 +++++++++++++--------- 2 files changed, 58 insertions(+), 40 deletions(-) rename Documentation/devicetree/bindings/{powerpc/fsl/mem-ctrlr.txt => memory-controllers/fsl/ddr.txt} (86%) diff --git a/Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt b/Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt similarity index 86% rename from Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt rename to Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt index f87856f..dde6d83 100644 --- a/Documentation/devicetree/bindings/powerpc/fsl/mem-ctrlr.txt +++ b/Documentation/devicetree/bindings/memory-controllers/fsl/ddr.txt @@ -7,6 +7,8 @@ Properties: "fsl,qoriq-memory-controller". - reg : Address and size of DDR controller registers - interrupts : Error interrupt of DDR controller +- little-endian : Specifies little-endian access to registers + If omitted, big-endian will be used. Example 1: diff --git a/drivers/edac/fsl_ddr_edac.c b/drivers/edac/fsl_ddr_edac.c index 46b00e1..6d4dd84 100644 --- a/drivers/edac/fsl_ddr_edac.c +++ b/drivers/edac/fsl_ddr_edac.c @@ -13,7 +13,6 @@ * the terms of the GNU General Public License version 2. This program * is licensed "as is" without any warranty of any kind, whether express * or implied. - * */ #include #include @@ -37,6 +36,20 @@ static int edac_mc_idx; static u32 orig_ddr_err_disable; static u32 orig_ddr_err_sbe; +static bool little_endian; + +static inline u32 ddr_in32(void __iomem *addr) +{ + return little_endian ? ioread32(addr) : ioread32be(addr); +} + +static inline void ddr_out32(void __iomem *addr, u32 value) +{ + if (little_endian) + iowrite32(value, addr); + else + iowrite32be(value, addr); +} /************************ MC SYSFS parts ***********************************/ @@ -49,8 +62,7 @@ static ssize_t fsl_mc_inject_data_hi_show(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; return sprintf(data, "0x%08x", - in_be32(pdata->mc_vbase + - FSL_MC_DATA_ERR_INJECT_HI)); + ddr_in32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_HI)); } static ssize_t fsl_mc_inject_data_lo_show(struct device *dev, @@ -60,8 +72,7 @@ static ssize_t fsl_mc_inject_data_lo_show(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; return sprintf(data, "0x%08x", - in_be32(pdata->mc_vbase + - FSL_MC_DATA_ERR_INJECT_LO)); + ddr_in32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_LO)); } static ssize_t fsl_mc_inject_ctrl_show(struct device *dev, @@ -71,7 +82,7 @@ static ssize_t fsl_mc_inject_ctrl_show(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; return sprintf(data, "0x%08x", - in_be32(pdata->mc_vbase + FSL_MC_ECC_ERR_INJECT)); + ddr_in32(pdata->mc_vbase + FSL_MC_ECC_ERR_INJECT)); } static ssize_t fsl_mc_inject_data_hi_store(struct device *dev, @@ -81,8 +92,8 @@ static ssize_t fsl_mc_inject_data_hi_store(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; if (isdigit(*data)) { - out_be32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_HI, - simple_strtoul(data, NULL, 0)); + ddr_out32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_HI, + simple_strtoul(data, NULL, 0)); return count; } return 0; @@ -95,8 +106,8 @@ static ssize_t fsl_mc_inject_data_lo_store(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; if (isdigit(*data)) { - out_be32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_LO, - simple_strtoul(data, NULL, 0)); + ddr_out32(pdata->mc_vbase + FSL_MC_DATA_ERR_INJECT_LO, + simple_strtoul(data, NULL, 0)); return count; } return 0; @@ -109,8 +120,8 @@ static ssize_t fsl_mc_inject_ctrl_store(struct device *dev, struct mem_ctl_info *mci = to_mci(dev); struct fsl_mc_pdata *pdata = mci->pvt_info; if (isdigit(*data)) { - out_be32(pdata->mc_vbase + FSL_MC_ECC_ERR_INJECT, - simple_strtoul(data, NULL, 0)); + ddr_out32(pdata->mc_vbase + FSL_MC_ECC_ERR_INJECT, + simple_strtoul(data, NULL, 0)); return count; } return 0; @@ -256,7 +267,7 @@ static void fsl_mc_check(struct mem_ctl_info *mci) int bad_data_bit; int bad_ecc_bit; - err_detect = in_be32(pdata->mc_vbase + FSL_MC_ERR_DETECT); + err_detect = ddr_in32(pdata->mc_vbase + FSL_MC_ERR_DETECT); if (!err_detect) return; @@ -265,23 +276,23 @@ static void fsl_mc_check(struct mem_ctl_info *mci) /* no more processing if not ECC bit errors */ if (!(err_detect & (DDR_EDE_SBE | DDR_EDE_MBE))) { - out_be32(pdata->mc_vbase + FSL_MC_ERR_DETECT, err_detect); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_DETECT, err_detect); return; } - syndrome = in_be32(pdata->mc_vbase + FSL_MC_CAPTURE_ECC); + syndrome = ddr_in32(pdata->mc_vbase + FSL_MC_CAPTURE_ECC); /* Mask off appropriate bits of syndrome based on bus width */ - bus_width = (in_be32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG) & - DSC_DBW_MASK) ? 32 : 64; + bus_width = (ddr_in32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG) & + DSC_DBW_MASK) ? 32 : 64; if (bus_width == 64) syndrome &= 0xff; else syndrome &= 0xffff; err_addr = make64( - in_be32(pdata->mc_vbase + FSL_MC_CAPTURE_EXT_ADDRESS), - in_be32(pdata->mc_vbase + FSL_MC_CAPTURE_ADDRESS)); + ddr_in32(pdata->mc_vbase + FSL_MC_CAPTURE_EXT_ADDRESS), + ddr_in32(pdata->mc_vbase + FSL_MC_CAPTURE_ADDRESS)); pfn = err_addr >> PAGE_SHIFT; for (row_index = 0; row_index < mci->nr_csrows; row_index++) { @@ -290,8 +301,8 @@ static void fsl_mc_check(struct mem_ctl_info *mci) break; } - cap_high = in_be32(pdata->mc_vbase + FSL_MC_CAPTURE_DATA_HI); - cap_low = in_be32(pdata->mc_vbase + FSL_MC_CAPTURE_DATA_LO); + cap_high = ddr_in32(pdata->mc_vbase + FSL_MC_CAPTURE_DATA_HI); + cap_low = ddr_in32(pdata->mc_vbase + FSL_MC_CAPTURE_DATA_LO); /* * Analyze single-bit errors on 64-bit wide buses @@ -337,7 +348,7 @@ static void fsl_mc_check(struct mem_ctl_info *mci) row_index, 0, -1, mci->ctl_name, ""); - out_be32(pdata->mc_vbase + FSL_MC_ERR_DETECT, err_detect); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_DETECT, err_detect); } static irqreturn_t fsl_mc_isr(int irq, void *dev_id) @@ -346,7 +357,7 @@ static irqreturn_t fsl_mc_isr(int irq, void *dev_id) struct fsl_mc_pdata *pdata = mci->pvt_info; u32 err_detect; - err_detect = in_be32(pdata->mc_vbase + FSL_MC_ERR_DETECT); + err_detect = ddr_in32(pdata->mc_vbase + FSL_MC_ERR_DETECT); if (!err_detect) return IRQ_NONE; @@ -366,7 +377,7 @@ static void fsl_ddr_init_csrows(struct mem_ctl_info *mci) u32 cs_bnds; int index; - sdram_ctl = in_be32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG); + sdram_ctl = ddr_in32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG); sdtype = sdram_ctl & DSC_SDTYPE_MASK; if (sdram_ctl & DSC_RD_EN) { @@ -414,8 +425,8 @@ static void fsl_ddr_init_csrows(struct mem_ctl_info *mci) csrow = mci->csrows[index]; dimm = csrow->channels[0]->dimm; - cs_bnds = in_be32(pdata->mc_vbase + FSL_MC_CS_BNDS_0 + - (index * FSL_MC_CS_BNDS_OFS)); + cs_bnds = ddr_in32(pdata->mc_vbase + FSL_MC_CS_BNDS_0 + + (index * FSL_MC_CS_BNDS_OFS)); start = (cs_bnds & 0xffff0000) >> 16; end = (cs_bnds & 0x0000ffff); @@ -474,6 +485,12 @@ int fsl_mc_err_probe(struct platform_device *op) mci->ctl_name = pdata->name; mci->dev_name = pdata->name; + /* + * Get the endianness of DDR controller registers. + * Default is big endian. + */ + little_endian = of_property_read_bool(op->dev.of_node, "little-endian"); + res = of_address_to_resource(op->dev.of_node, 0, &r); if (res) { pr_err("%s: Unable to get resource for MC err regs\n", @@ -496,7 +513,7 @@ int fsl_mc_err_probe(struct platform_device *op) goto err; } - sdram_ctl = in_be32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG); + sdram_ctl = ddr_in32(pdata->mc_vbase + FSL_MC_DDR_SDRAM_CFG); if (!(sdram_ctl & DSC_ECC_EN)) { /* no ECC */ pr_warn("%s: No ECC DIMMs discovered\n", __func__); @@ -523,12 +540,11 @@ int fsl_mc_err_probe(struct platform_device *op) fsl_ddr_init_csrows(mci); /* store the original error disable bits */ - orig_ddr_err_disable = - in_be32(pdata->mc_vbase + FSL_MC_ERR_DISABLE); - out_be32(pdata->mc_vbase + FSL_MC_ERR_DISABLE, 0); + orig_ddr_err_disable = ddr_in32(pdata->mc_vbase + FSL_MC_ERR_DISABLE); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_DISABLE, 0); /* clear all error bits */ - out_be32(pdata->mc_vbase + FSL_MC_ERR_DETECT, ~0); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_DETECT, ~0); if (edac_mc_add_mc_with_groups(mci, fsl_ddr_dev_groups)) { edac_dbg(3, "failed edac_mc_add_mc()\n"); @@ -536,15 +552,15 @@ int fsl_mc_err_probe(struct platform_device *op) } if (edac_op_state == EDAC_OPSTATE_INT) { - out_be32(pdata->mc_vbase + FSL_MC_ERR_INT_EN, - DDR_EIE_MBEE | DDR_EIE_SBEE); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_INT_EN, + DDR_EIE_MBEE | DDR_EIE_SBEE); /* store the original error management threshold */ - orig_ddr_err_sbe = in_be32(pdata->mc_vbase + - FSL_MC_ERR_SBE) & 0xff0000; + orig_ddr_err_sbe = ddr_in32(pdata->mc_vbase + + FSL_MC_ERR_SBE) & 0xff0000; /* set threshold to 1 error per interrupt */ - out_be32(pdata->mc_vbase + FSL_MC_ERR_SBE, 0x10000); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_SBE, 0x10000); /* register interrupts */ pdata->irq = irq_of_parse_and_map(op->dev.of_node, 0); @@ -586,13 +602,13 @@ int fsl_mc_err_remove(struct platform_device *op) edac_dbg(0, "\n"); if (edac_op_state == EDAC_OPSTATE_INT) { - out_be32(pdata->mc_vbase + FSL_MC_ERR_INT_EN, 0); irq_dispose_mapping(pdata->irq); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_INT_EN, 0); } - out_be32(pdata->mc_vbase + FSL_MC_ERR_DISABLE, - orig_ddr_err_disable); - out_be32(pdata->mc_vbase + FSL_MC_ERR_SBE, orig_ddr_err_sbe); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_DISABLE, + orig_ddr_err_disable); + ddr_out32(pdata->mc_vbase + FSL_MC_ERR_SBE, orig_ddr_err_sbe); edac_mc_del_mc(&op->dev); edac_mc_free(mci); -- 2.7.4