162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> 562306a36Sopenharmony_ci * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org> 662306a36Sopenharmony_ci * Copyright (C) 2013 John Crispin <john@phrozen.org> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/io.h> 1062306a36Sopenharmony_ci#include <linux/clk.h> 1162306a36Sopenharmony_ci#include <linux/export.h> 1262306a36Sopenharmony_ci#include <linux/init.h> 1362306a36Sopenharmony_ci#include <linux/sizes.h> 1462306a36Sopenharmony_ci#include <linux/of_fdt.h> 1562306a36Sopenharmony_ci#include <linux/kernel.h> 1662306a36Sopenharmony_ci#include <linux/memblock.h> 1762306a36Sopenharmony_ci#include <linux/of.h> 1862306a36Sopenharmony_ci#include <linux/of_address.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <asm/reboot.h> 2162306a36Sopenharmony_ci#include <asm/bootinfo.h> 2262306a36Sopenharmony_ci#include <asm/addrspace.h> 2362306a36Sopenharmony_ci#include <asm/prom.h> 2462306a36Sopenharmony_ci#include <asm/mach-ralink/ralink_regs.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include "common.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci__iomem void *rt_sysc_membase; 2962306a36Sopenharmony_ci__iomem void *rt_memc_membase; 3062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt_sysc_membase); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic const struct of_device_id mtmips_memc_match[] = { 3362306a36Sopenharmony_ci { .compatible = "mediatek,mt7621-memc" }, 3462306a36Sopenharmony_ci { .compatible = "ralink,mt7620a-memc" }, 3562306a36Sopenharmony_ci { .compatible = "ralink,rt2880-memc" }, 3662306a36Sopenharmony_ci { .compatible = "ralink,rt3050-memc" }, 3762306a36Sopenharmony_ci { .compatible = "ralink,rt3883-memc" }, 3862306a36Sopenharmony_ci {} 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic const struct of_device_id mtmips_sysc_match[] = { 4262306a36Sopenharmony_ci { .compatible = "mediatek,mt7621-sysc" }, 4362306a36Sopenharmony_ci { .compatible = "ralink,mt7620-sysc" }, 4462306a36Sopenharmony_ci { .compatible = "ralink,mt7628-sysc" }, 4562306a36Sopenharmony_ci { .compatible = "ralink,mt7688-sysc" }, 4662306a36Sopenharmony_ci { .compatible = "ralink,rt2880-sysc" }, 4762306a36Sopenharmony_ci { .compatible = "ralink,rt3050-sysc" }, 4862306a36Sopenharmony_ci { .compatible = "ralink,rt3052-sysc" }, 4962306a36Sopenharmony_ci { .compatible = "ralink,rt3352-sysc" }, 5062306a36Sopenharmony_ci { .compatible = "ralink,rt3883-sysc" }, 5162306a36Sopenharmony_ci { .compatible = "ralink,rt5350-sysc" }, 5262306a36Sopenharmony_ci {} 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic __iomem void * 5662306a36Sopenharmony_cimtmips_of_remap_node(const struct of_device_id *match, const char *type) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct resource res; 5962306a36Sopenharmony_ci struct device_node *np; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci np = of_find_matching_node(NULL, match); 6262306a36Sopenharmony_ci if (!np) 6362306a36Sopenharmony_ci panic("Failed to find %s controller node", type); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci if (of_address_to_resource(np, 0, &res)) 6662306a36Sopenharmony_ci panic("Failed to get resource for %s node", np->name); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (!request_mem_region(res.start, 6962306a36Sopenharmony_ci resource_size(&res), 7062306a36Sopenharmony_ci res.name)) 7162306a36Sopenharmony_ci panic("Failed to request resources for %s node", np->name); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci of_node_put(np); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return ioremap(res.start, resource_size(&res)); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_civoid __init ralink_of_remap(void) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci rt_sysc_membase = mtmips_of_remap_node(mtmips_sysc_match, "system"); 8162306a36Sopenharmony_ci rt_memc_membase = mtmips_of_remap_node(mtmips_memc_match, "memory"); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if (!rt_sysc_membase || !rt_memc_membase) 8462306a36Sopenharmony_ci panic("Failed to remap core resources"); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_civoid __init plat_mem_setup(void) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci void *dtb; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci set_io_port_base(KSEG1); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci /* 9462306a36Sopenharmony_ci * Load the builtin devicetree. This causes the chosen node to be 9562306a36Sopenharmony_ci * parsed resulting in our memory appearing. 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_ci dtb = get_fdt(); 9862306a36Sopenharmony_ci __dt_setup_arch(dtb); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci if (early_init_dt_scan_memory()) 10162306a36Sopenharmony_ci return; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci if (soc_info.mem_detect) 10462306a36Sopenharmony_ci soc_info.mem_detect(); 10562306a36Sopenharmony_ci else if (soc_info.mem_size) 10662306a36Sopenharmony_ci memblock_add(soc_info.mem_base, soc_info.mem_size * SZ_1M); 10762306a36Sopenharmony_ci else 10862306a36Sopenharmony_ci detect_memory_region(soc_info.mem_base, 10962306a36Sopenharmony_ci soc_info.mem_size_min * SZ_1M, 11062306a36Sopenharmony_ci soc_info.mem_size_max * SZ_1M); 11162306a36Sopenharmony_ci} 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic int __init plat_of_setup(void) 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci __dt_register_buses(soc_info.compatible, "palmbus"); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci return 0; 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciarch_initcall(plat_of_setup); 121