1 /* 2 * Copyright Altera Corporation (C) 2016. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16 #include <linux/io.h> 17 #include <linux/genalloc.h> 18 #include <linux/module.h> 19 #include <linux/of_address.h> 20 #include <linux/of_platform.h> 21 22 #define ALTR_OCRAM_CLEAR_ECC 0x00000018 23 #define ALTR_OCRAM_ECC_EN 0x00000019 24 25 void socfpga_init_ocram_ecc(void) 26 { 27 struct device_node *np; 28 void __iomem *mapped_ocr_edac_addr; 29 30 /* Find the OCRAM EDAC device tree node */ 31 np = of_find_compatible_node(NULL, NULL, "altr,socfpga-ocram-ecc"); 32 if (!np) { 33 pr_err("Unable to find socfpga-ocram-ecc\n"); 34 return; 35 } 36 37 mapped_ocr_edac_addr = of_iomap(np, 0); 38 of_node_put(np); 39 if (!mapped_ocr_edac_addr) { 40 pr_err("Unable to map OCRAM ecc regs.\n"); 41 return; 42 } 43 44 /* Clear any pending OCRAM ECC interrupts, then enable ECC */ 45 writel(ALTR_OCRAM_CLEAR_ECC, mapped_ocr_edac_addr); 46 writel(ALTR_OCRAM_ECC_EN, mapped_ocr_edac_addr); 47 48 iounmap(mapped_ocr_edac_addr); 49 } 50