162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/sh/boards/landisk/setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * I-O DATA Device, Inc. LANDISK Support. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2000 Kazumoto Kojima 862306a36Sopenharmony_ci * Copyright (C) 2002 Paul Mundt 962306a36Sopenharmony_ci * Copylight (C) 2002 Atom Create Engineering Co., Ltd. 1062306a36Sopenharmony_ci * Copyright (C) 2005-2007 kogiidena 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci#include <linux/init.h> 1362306a36Sopenharmony_ci#include <linux/platform_device.h> 1462306a36Sopenharmony_ci#include <linux/ata_platform.h> 1562306a36Sopenharmony_ci#include <linux/pm.h> 1662306a36Sopenharmony_ci#include <linux/mm.h> 1762306a36Sopenharmony_ci#include <asm/machvec.h> 1862306a36Sopenharmony_ci#include <mach-landisk/mach/iodata_landisk.h> 1962306a36Sopenharmony_ci#include <asm/io.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistatic void landisk_power_off(void) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci __raw_writeb(0x01, PA_SHUTDOWN); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic struct resource cf_ide_resources[3]; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic struct pata_platform_info pata_info = { 2962306a36Sopenharmony_ci .ioport_shift = 1, 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic struct platform_device cf_ide_device = { 3362306a36Sopenharmony_ci .name = "pata_platform", 3462306a36Sopenharmony_ci .id = -1, 3562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(cf_ide_resources), 3662306a36Sopenharmony_ci .resource = cf_ide_resources, 3762306a36Sopenharmony_ci .dev = { 3862306a36Sopenharmony_ci .platform_data = &pata_info, 3962306a36Sopenharmony_ci }, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic struct platform_device rtc_device = { 4362306a36Sopenharmony_ci .name = "rs5c313", 4462306a36Sopenharmony_ci .id = -1, 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic struct platform_device *landisk_devices[] __initdata = { 4862306a36Sopenharmony_ci &cf_ide_device, 4962306a36Sopenharmony_ci &rtc_device, 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic int __init landisk_devices_setup(void) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci pgprot_t prot; 5562306a36Sopenharmony_ci unsigned long paddrbase; 5662306a36Sopenharmony_ci void *cf_ide_base; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* open I/O area window */ 5962306a36Sopenharmony_ci paddrbase = virt_to_phys((void *)PA_AREA5_IO); 6062306a36Sopenharmony_ci prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16); 6162306a36Sopenharmony_ci cf_ide_base = ioremap_prot(paddrbase, PAGE_SIZE, pgprot_val(prot)); 6262306a36Sopenharmony_ci if (!cf_ide_base) { 6362306a36Sopenharmony_ci printk("allocate_cf_area : can't open CF I/O window!\n"); 6462306a36Sopenharmony_ci return -ENOMEM; 6562306a36Sopenharmony_ci } 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci /* IDE cmd address : 0x1f0-0x1f7 and 0x3f6 */ 6862306a36Sopenharmony_ci cf_ide_resources[0].start = (unsigned long)cf_ide_base + 0x40; 6962306a36Sopenharmony_ci cf_ide_resources[0].end = (unsigned long)cf_ide_base + 0x40 + 0x0f; 7062306a36Sopenharmony_ci cf_ide_resources[0].flags = IORESOURCE_IO; 7162306a36Sopenharmony_ci cf_ide_resources[1].start = (unsigned long)cf_ide_base + 0x2c; 7262306a36Sopenharmony_ci cf_ide_resources[1].end = (unsigned long)cf_ide_base + 0x2c + 0x03; 7362306a36Sopenharmony_ci cf_ide_resources[1].flags = IORESOURCE_IO; 7462306a36Sopenharmony_ci cf_ide_resources[2].start = IRQ_FATA; 7562306a36Sopenharmony_ci cf_ide_resources[2].flags = IORESOURCE_IRQ; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci return platform_add_devices(landisk_devices, 7862306a36Sopenharmony_ci ARRAY_SIZE(landisk_devices)); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cidevice_initcall(landisk_devices_setup); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic void __init landisk_setup(char **cmdline_p) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci /* I/O port identity mapping */ 8662306a36Sopenharmony_ci __set_io_port_base(0); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci /* LED ON */ 8962306a36Sopenharmony_ci __raw_writeb(__raw_readb(PA_LED) | 0x03, PA_LED); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n"); 9262306a36Sopenharmony_ci pm_power_off = landisk_power_off; 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* 9662306a36Sopenharmony_ci * The Machine Vector 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_cistatic struct sh_machine_vector mv_landisk __initmv = { 9962306a36Sopenharmony_ci .mv_name = "LANDISK", 10062306a36Sopenharmony_ci .mv_setup = landisk_setup, 10162306a36Sopenharmony_ci .mv_init_irq = init_landisk_IRQ, 10262306a36Sopenharmony_ci}; 103