162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/mach-rpc/riscpc.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1998-2001 Russell King 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Architecture specific fixups. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/tty.h> 1162306a36Sopenharmony_ci#include <linux/delay.h> 1262306a36Sopenharmony_ci#include <linux/pm.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/sched.h> 1562306a36Sopenharmony_ci#include <linux/device.h> 1662306a36Sopenharmony_ci#include <linux/serial_8250.h> 1762306a36Sopenharmony_ci#include <linux/ata_platform.h> 1862306a36Sopenharmony_ci#include <linux/io.h> 1962306a36Sopenharmony_ci#include <linux/i2c.h> 2062306a36Sopenharmony_ci#include <linux/reboot.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <asm/elf.h> 2362306a36Sopenharmony_ci#include <asm/mach-types.h> 2462306a36Sopenharmony_ci#include <mach/hardware.h> 2562306a36Sopenharmony_ci#include <asm/hardware/iomd.h> 2662306a36Sopenharmony_ci#include <asm/page.h> 2762306a36Sopenharmony_ci#include <asm/domain.h> 2862306a36Sopenharmony_ci#include <asm/setup.h> 2962306a36Sopenharmony_ci#include <asm/system_misc.h> 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#include <asm/mach/map.h> 3262306a36Sopenharmony_ci#include <asm/mach/arch.h> 3362306a36Sopenharmony_ci#include <asm/mach/time.h> 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciextern void rpc_init_irq(void); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciunsigned int vram_size; 3862306a36Sopenharmony_ciunsigned int memc_ctrl_reg; 3962306a36Sopenharmony_ciunsigned int number_mfm_drives; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic int __init parse_tag_acorn(const struct tag *tag) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci memc_ctrl_reg = tag->u.acorn.memc_control_reg; 4462306a36Sopenharmony_ci number_mfm_drives = tag->u.acorn.adfsdrives; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci switch (tag->u.acorn.vram_pages) { 4762306a36Sopenharmony_ci case 512: 4862306a36Sopenharmony_ci vram_size += PAGE_SIZE * 256; 4962306a36Sopenharmony_ci fallthrough; /* ??? */ 5062306a36Sopenharmony_ci case 256: 5162306a36Sopenharmony_ci vram_size += PAGE_SIZE * 256; 5262306a36Sopenharmony_ci break; 5362306a36Sopenharmony_ci default: 5462306a36Sopenharmony_ci break; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci#if 0 5762306a36Sopenharmony_ci if (vram_size) { 5862306a36Sopenharmony_ci desc->video_start = 0x02000000; 5962306a36Sopenharmony_ci desc->video_end = 0x02000000 + vram_size; 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci#endif 6262306a36Sopenharmony_ci return 0; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci__tagtable(ATAG_ACORN, parse_tag_acorn); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic struct map_desc rpc_io_desc[] __initdata = { 6862306a36Sopenharmony_ci { /* VRAM */ 6962306a36Sopenharmony_ci .virtual = SCREEN_BASE, 7062306a36Sopenharmony_ci .pfn = __phys_to_pfn(SCREEN_START), 7162306a36Sopenharmony_ci .length = 2*1048576, 7262306a36Sopenharmony_ci .type = MT_DEVICE 7362306a36Sopenharmony_ci }, { /* IO space */ 7462306a36Sopenharmony_ci .virtual = (u32)IO_BASE, 7562306a36Sopenharmony_ci .pfn = __phys_to_pfn(IO_START), 7662306a36Sopenharmony_ci .length = IO_SIZE , 7762306a36Sopenharmony_ci .type = MT_DEVICE 7862306a36Sopenharmony_ci }, { /* EASI space */ 7962306a36Sopenharmony_ci .virtual = (unsigned long)EASI_BASE, 8062306a36Sopenharmony_ci .pfn = __phys_to_pfn(EASI_START), 8162306a36Sopenharmony_ci .length = EASI_SIZE, 8262306a36Sopenharmony_ci .type = MT_DEVICE 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic void __init rpc_map_io(void) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci iotable_init(rpc_io_desc, ARRAY_SIZE(rpc_io_desc)); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci /* 9162306a36Sopenharmony_ci * Turn off floppy. 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_ci writeb(0xc, PCIO_BASE + (0x3f2 << 2)); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci /* 9662306a36Sopenharmony_ci * RiscPC can't handle half-word loads and stores 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ci elf_hwcap &= ~HWCAP_HALF; 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic struct resource acornfb_resources[] = { 10262306a36Sopenharmony_ci /* VIDC */ 10362306a36Sopenharmony_ci DEFINE_RES_MEM(0x03400000, 0x00200000), 10462306a36Sopenharmony_ci DEFINE_RES_IRQ(IRQ_VSYNCPULSE), 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic struct platform_device acornfb_device = { 10862306a36Sopenharmony_ci .name = "acornfb", 10962306a36Sopenharmony_ci .id = -1, 11062306a36Sopenharmony_ci .dev = { 11162306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 11262306a36Sopenharmony_ci }, 11362306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(acornfb_resources), 11462306a36Sopenharmony_ci .resource = acornfb_resources, 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistatic struct resource iomd_resources[] = { 11862306a36Sopenharmony_ci DEFINE_RES_MEM(0x03200000, 0x10000), 11962306a36Sopenharmony_ci}; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic struct platform_device iomd_device = { 12262306a36Sopenharmony_ci .name = "iomd", 12362306a36Sopenharmony_ci .id = -1, 12462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(iomd_resources), 12562306a36Sopenharmony_ci .resource = iomd_resources, 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic struct resource iomd_kart_resources[] = { 12962306a36Sopenharmony_ci DEFINE_RES_IRQ(IRQ_KEYBOARDRX), 13062306a36Sopenharmony_ci DEFINE_RES_IRQ(IRQ_KEYBOARDTX), 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic struct platform_device kbd_device = { 13462306a36Sopenharmony_ci .name = "kart", 13562306a36Sopenharmony_ci .id = -1, 13662306a36Sopenharmony_ci .dev = { 13762306a36Sopenharmony_ci .parent = &iomd_device.dev, 13862306a36Sopenharmony_ci }, 13962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(iomd_kart_resources), 14062306a36Sopenharmony_ci .resource = iomd_kart_resources, 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic struct plat_serial8250_port serial_platform_data[] = { 14462306a36Sopenharmony_ci { 14562306a36Sopenharmony_ci .mapbase = 0x03010fe0, 14662306a36Sopenharmony_ci .irq = IRQ_SERIALPORT, 14762306a36Sopenharmony_ci .uartclk = 1843200, 14862306a36Sopenharmony_ci .regshift = 2, 14962306a36Sopenharmony_ci .iotype = UPIO_MEM, 15062306a36Sopenharmony_ci .flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SKIP_TEST, 15162306a36Sopenharmony_ci }, 15262306a36Sopenharmony_ci { }, 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic struct platform_device serial_device = { 15662306a36Sopenharmony_ci .name = "serial8250", 15762306a36Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM, 15862306a36Sopenharmony_ci .dev = { 15962306a36Sopenharmony_ci .platform_data = serial_platform_data, 16062306a36Sopenharmony_ci }, 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic struct pata_platform_info pata_platform_data = { 16462306a36Sopenharmony_ci .ioport_shift = 2, 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistatic struct resource pata_resources[] = { 16862306a36Sopenharmony_ci DEFINE_RES_MEM(0x030107c0, 0x20), 16962306a36Sopenharmony_ci DEFINE_RES_MEM(0x03010fd8, 0x04), 17062306a36Sopenharmony_ci DEFINE_RES_IRQ(IRQ_HARDDISK), 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic struct platform_device pata_device = { 17462306a36Sopenharmony_ci .name = "pata_platform", 17562306a36Sopenharmony_ci .id = -1, 17662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(pata_resources), 17762306a36Sopenharmony_ci .resource = pata_resources, 17862306a36Sopenharmony_ci .dev = { 17962306a36Sopenharmony_ci .platform_data = &pata_platform_data, 18062306a36Sopenharmony_ci .coherent_dma_mask = ~0, /* grumble */ 18162306a36Sopenharmony_ci }, 18262306a36Sopenharmony_ci}; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic struct platform_device *devs[] __initdata = { 18562306a36Sopenharmony_ci &iomd_device, 18662306a36Sopenharmony_ci &kbd_device, 18762306a36Sopenharmony_ci &serial_device, 18862306a36Sopenharmony_ci &acornfb_device, 18962306a36Sopenharmony_ci &pata_device, 19062306a36Sopenharmony_ci}; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic struct i2c_board_info i2c_rtc = { 19362306a36Sopenharmony_ci I2C_BOARD_INFO("pcf8583", 0x50) 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistatic int __init rpc_init(void) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci i2c_register_board_info(0, &i2c_rtc, 1); 19962306a36Sopenharmony_ci return platform_add_devices(devs, ARRAY_SIZE(devs)); 20062306a36Sopenharmony_ci} 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ciarch_initcall(rpc_init); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic void rpc_restart(enum reboot_mode mode, const char *cmd) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci iomd_writeb(0, IOMD_ROMCR0); 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci /* 20962306a36Sopenharmony_ci * Jump into the ROM 21062306a36Sopenharmony_ci */ 21162306a36Sopenharmony_ci soft_restart(0); 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_civoid ioc_timer_init(void); 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ciMACHINE_START(RISCPC, "Acorn-RiscPC") 21762306a36Sopenharmony_ci /* Maintainer: Russell King */ 21862306a36Sopenharmony_ci .atag_offset = 0x100, 21962306a36Sopenharmony_ci .reserve_lp0 = 1, 22062306a36Sopenharmony_ci .reserve_lp1 = 1, 22162306a36Sopenharmony_ci .map_io = rpc_map_io, 22262306a36Sopenharmony_ci .init_irq = rpc_init_irq, 22362306a36Sopenharmony_ci .init_time = ioc_timer_init, 22462306a36Sopenharmony_ci .restart = rpc_restart, 22562306a36Sopenharmony_ciMACHINE_END 226