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