18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * arch/sh/boards/landisk/setup.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * I-O DATA Device, Inc. LANDISK Support.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 2000 Kazumoto Kojima
88c2ecf20Sopenharmony_ci * Copyright (C) 2002 Paul Mundt
98c2ecf20Sopenharmony_ci * Copylight (C) 2002 Atom Create Engineering Co., Ltd.
108c2ecf20Sopenharmony_ci * Copyright (C) 2005-2007 kogiidena
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_ci#include <linux/init.h>
138c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
148c2ecf20Sopenharmony_ci#include <linux/ata_platform.h>
158c2ecf20Sopenharmony_ci#include <linux/pm.h>
168c2ecf20Sopenharmony_ci#include <linux/mm.h>
178c2ecf20Sopenharmony_ci#include <asm/machvec.h>
188c2ecf20Sopenharmony_ci#include <mach-landisk/mach/iodata_landisk.h>
198c2ecf20Sopenharmony_ci#include <asm/io.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic void landisk_power_off(void)
228c2ecf20Sopenharmony_ci{
238c2ecf20Sopenharmony_ci	__raw_writeb(0x01, PA_SHUTDOWN);
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic struct resource cf_ide_resources[3];
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistatic struct pata_platform_info pata_info = {
298c2ecf20Sopenharmony_ci	.ioport_shift	= 1,
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic struct platform_device cf_ide_device = {
338c2ecf20Sopenharmony_ci	.name		= "pata_platform",
348c2ecf20Sopenharmony_ci	.id		= -1,
358c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(cf_ide_resources),
368c2ecf20Sopenharmony_ci	.resource	= cf_ide_resources,
378c2ecf20Sopenharmony_ci	.dev		= {
388c2ecf20Sopenharmony_ci		.platform_data = &pata_info,
398c2ecf20Sopenharmony_ci	},
408c2ecf20Sopenharmony_ci};
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cistatic struct platform_device rtc_device = {
438c2ecf20Sopenharmony_ci	.name		= "rs5c313",
448c2ecf20Sopenharmony_ci	.id		= -1,
458c2ecf20Sopenharmony_ci};
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cistatic struct platform_device *landisk_devices[] __initdata = {
488c2ecf20Sopenharmony_ci	&cf_ide_device,
498c2ecf20Sopenharmony_ci	&rtc_device,
508c2ecf20Sopenharmony_ci};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic int __init landisk_devices_setup(void)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	pgprot_t prot;
558c2ecf20Sopenharmony_ci	unsigned long paddrbase;
568c2ecf20Sopenharmony_ci	void *cf_ide_base;
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci	/* open I/O area window */
598c2ecf20Sopenharmony_ci	paddrbase = virt_to_phys((void *)PA_AREA5_IO);
608c2ecf20Sopenharmony_ci	prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16);
618c2ecf20Sopenharmony_ci	cf_ide_base = ioremap_prot(paddrbase, PAGE_SIZE, pgprot_val(prot));
628c2ecf20Sopenharmony_ci	if (!cf_ide_base) {
638c2ecf20Sopenharmony_ci		printk("allocate_cf_area : can't open CF I/O window!\n");
648c2ecf20Sopenharmony_ci		return -ENOMEM;
658c2ecf20Sopenharmony_ci	}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	/* IDE cmd address : 0x1f0-0x1f7 and 0x3f6 */
688c2ecf20Sopenharmony_ci	cf_ide_resources[0].start = (unsigned long)cf_ide_base + 0x40;
698c2ecf20Sopenharmony_ci	cf_ide_resources[0].end   = (unsigned long)cf_ide_base + 0x40 + 0x0f;
708c2ecf20Sopenharmony_ci	cf_ide_resources[0].flags = IORESOURCE_IO;
718c2ecf20Sopenharmony_ci	cf_ide_resources[1].start = (unsigned long)cf_ide_base + 0x2c;
728c2ecf20Sopenharmony_ci	cf_ide_resources[1].end   = (unsigned long)cf_ide_base + 0x2c + 0x03;
738c2ecf20Sopenharmony_ci	cf_ide_resources[1].flags = IORESOURCE_IO;
748c2ecf20Sopenharmony_ci	cf_ide_resources[2].start = IRQ_FATA;
758c2ecf20Sopenharmony_ci	cf_ide_resources[2].flags = IORESOURCE_IRQ;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	return platform_add_devices(landisk_devices,
788c2ecf20Sopenharmony_ci				    ARRAY_SIZE(landisk_devices));
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cidevice_initcall(landisk_devices_setup);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_cistatic void __init landisk_setup(char **cmdline_p)
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	/* I/O port identity mapping */
868c2ecf20Sopenharmony_ci	__set_io_port_base(0);
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	/* LED ON */
898c2ecf20Sopenharmony_ci	__raw_writeb(__raw_readb(PA_LED) | 0x03, PA_LED);
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci	printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n");
928c2ecf20Sopenharmony_ci	pm_power_off = landisk_power_off;
938c2ecf20Sopenharmony_ci}
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci/*
968c2ecf20Sopenharmony_ci * The Machine Vector
978c2ecf20Sopenharmony_ci */
988c2ecf20Sopenharmony_cistatic struct sh_machine_vector mv_landisk __initmv = {
998c2ecf20Sopenharmony_ci	.mv_name = "LANDISK",
1008c2ecf20Sopenharmony_ci	.mv_setup = landisk_setup,
1018c2ecf20Sopenharmony_ci	.mv_init_irq = init_landisk_IRQ,
1028c2ecf20Sopenharmony_ci};
103