162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * setup.c - boot time setup code 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/init.h> 762306a36Sopenharmony_ci#include <linux/export.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <asm/bootinfo.h> 1062306a36Sopenharmony_ci#include <asm/reboot.h> 1162306a36Sopenharmony_ci#include <asm/time.h> 1262306a36Sopenharmony_ci#include <linux/ioport.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <asm/mach-rc32434/rb.h> 1562306a36Sopenharmony_ci#include <asm/mach-rc32434/pci.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct pci_reg __iomem *pci_reg; 1862306a36Sopenharmony_ciEXPORT_SYMBOL(pci_reg); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic struct resource pci0_res[] = { 2162306a36Sopenharmony_ci { 2262306a36Sopenharmony_ci .name = "pci_reg0", 2362306a36Sopenharmony_ci .start = PCI0_BASE_ADDR, 2462306a36Sopenharmony_ci .end = PCI0_BASE_ADDR + sizeof(struct pci_reg), 2562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic void rb_machine_restart(char *command) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci /* just jump to the reset vector */ 3262306a36Sopenharmony_ci writel(0x80000001, IDT434_REG_BASE + RST); 3362306a36Sopenharmony_ci ((void (*)(void)) KSEG1ADDR(0x1FC00000u))(); 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic void rb_machine_halt(void) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci for (;;) 3962306a36Sopenharmony_ci continue; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_civoid __init plat_mem_setup(void) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci u32 val; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci _machine_restart = rb_machine_restart; 4762306a36Sopenharmony_ci _machine_halt = rb_machine_halt; 4862306a36Sopenharmony_ci pm_power_off = rb_machine_halt; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci set_io_port_base(KSEG1); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci pci_reg = ioremap(pci0_res[0].start, 5362306a36Sopenharmony_ci pci0_res[0].end - pci0_res[0].start); 5462306a36Sopenharmony_ci if (!pci_reg) { 5562306a36Sopenharmony_ci printk(KERN_ERR "Could not remap PCI registers\n"); 5662306a36Sopenharmony_ci return; 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci val = __raw_readl(&pci_reg->pcic); 6062306a36Sopenharmony_ci val &= 0xFFFFFF7; 6162306a36Sopenharmony_ci __raw_writel(val, (void *)&pci_reg->pcic); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#ifdef CONFIG_PCI 6462306a36Sopenharmony_ci /* Enable PCI interrupts in EPLD Mask register */ 6562306a36Sopenharmony_ci *epld_mask = 0x0; 6662306a36Sopenharmony_ci *(epld_mask + 1) = 0x0; 6762306a36Sopenharmony_ci#endif 6862306a36Sopenharmony_ci write_c0_wired(0); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciconst char *get_system_type(void) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci switch (mips_machtype) { 7462306a36Sopenharmony_ci case MACH_MIKROTIK_RB532A: 7562306a36Sopenharmony_ci return "Mikrotik RB532A"; 7662306a36Sopenharmony_ci break; 7762306a36Sopenharmony_ci default: 7862306a36Sopenharmony_ci return "Mikrotik RB532"; 7962306a36Sopenharmony_ci break; 8062306a36Sopenharmony_ci } 8162306a36Sopenharmony_ci} 82