162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/sh/boards/renesas/r7780rp/setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Renesas Solutions Highlander Support. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2002 Atom Create Engineering Co., Ltd. 862306a36Sopenharmony_ci * Copyright (C) 2005 - 2008 Paul Mundt 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * This contains support for the R7780RP-1, R7780MP, and R7785RP 1162306a36Sopenharmony_ci * Highlander modules. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/io.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include <linux/ata_platform.h> 1762306a36Sopenharmony_ci#include <linux/types.h> 1862306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 1962306a36Sopenharmony_ci#include <linux/i2c.h> 2062306a36Sopenharmony_ci#include <linux/irq.h> 2162306a36Sopenharmony_ci#include <linux/interrupt.h> 2262306a36Sopenharmony_ci#include <linux/usb/r8a66597.h> 2362306a36Sopenharmony_ci#include <linux/usb/m66592.h> 2462306a36Sopenharmony_ci#include <linux/clkdev.h> 2562306a36Sopenharmony_ci#include <net/ax88796.h> 2662306a36Sopenharmony_ci#include <asm/machvec.h> 2762306a36Sopenharmony_ci#include <mach/highlander.h> 2862306a36Sopenharmony_ci#include <asm/clock.h> 2962306a36Sopenharmony_ci#include <asm/heartbeat.h> 3062306a36Sopenharmony_ci#include <asm/io.h> 3162306a36Sopenharmony_ci#include <asm/io_trapped.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic struct r8a66597_platdata r8a66597_data = { 3462306a36Sopenharmony_ci .xtal = R8A66597_PLATDATA_XTAL_12MHZ, 3562306a36Sopenharmony_ci .vif = 1, 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic struct resource r8a66597_usb_host_resources[] = { 3962306a36Sopenharmony_ci [0] = { 4062306a36Sopenharmony_ci .start = 0xA4200000, 4162306a36Sopenharmony_ci .end = 0xA42000FF, 4262306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 4362306a36Sopenharmony_ci }, 4462306a36Sopenharmony_ci [1] = { 4562306a36Sopenharmony_ci .start = IRQ_EXT1, /* irq number */ 4662306a36Sopenharmony_ci .end = IRQ_EXT1, 4762306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 4862306a36Sopenharmony_ci }, 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic struct platform_device r8a66597_usb_host_device = { 5262306a36Sopenharmony_ci .name = "r8a66597_hcd", 5362306a36Sopenharmony_ci .id = -1, 5462306a36Sopenharmony_ci .dev = { 5562306a36Sopenharmony_ci .dma_mask = NULL, /* don't use dma */ 5662306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 5762306a36Sopenharmony_ci .platform_data = &r8a66597_data, 5862306a36Sopenharmony_ci }, 5962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), 6062306a36Sopenharmony_ci .resource = r8a66597_usb_host_resources, 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic struct m66592_platdata usbf_platdata = { 6462306a36Sopenharmony_ci .xtal = M66592_PLATDATA_XTAL_24MHZ, 6562306a36Sopenharmony_ci .vif = 1, 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistatic struct resource m66592_usb_peripheral_resources[] = { 6962306a36Sopenharmony_ci [0] = { 7062306a36Sopenharmony_ci .name = "m66592_udc", 7162306a36Sopenharmony_ci .start = 0xb0000000, 7262306a36Sopenharmony_ci .end = 0xb00000FF, 7362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 7462306a36Sopenharmony_ci }, 7562306a36Sopenharmony_ci [1] = { 7662306a36Sopenharmony_ci .name = "m66592_udc", 7762306a36Sopenharmony_ci .start = IRQ_EXT4, /* irq number */ 7862306a36Sopenharmony_ci .end = IRQ_EXT4, 7962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 8062306a36Sopenharmony_ci }, 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic struct platform_device m66592_usb_peripheral_device = { 8462306a36Sopenharmony_ci .name = "m66592_udc", 8562306a36Sopenharmony_ci .id = -1, 8662306a36Sopenharmony_ci .dev = { 8762306a36Sopenharmony_ci .dma_mask = NULL, /* don't use dma */ 8862306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 8962306a36Sopenharmony_ci .platform_data = &usbf_platdata, 9062306a36Sopenharmony_ci }, 9162306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(m66592_usb_peripheral_resources), 9262306a36Sopenharmony_ci .resource = m66592_usb_peripheral_resources, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic struct resource cf_ide_resources[] = { 9662306a36Sopenharmony_ci [0] = { 9762306a36Sopenharmony_ci .start = PA_AREA5_IO + 0x1000, 9862306a36Sopenharmony_ci .end = PA_AREA5_IO + 0x1000 + 0x08 - 1, 9962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10062306a36Sopenharmony_ci }, 10162306a36Sopenharmony_ci [1] = { 10262306a36Sopenharmony_ci .start = PA_AREA5_IO + 0x80c, 10362306a36Sopenharmony_ci .end = PA_AREA5_IO + 0x80c + 0x16 - 1, 10462306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10562306a36Sopenharmony_ci }, 10662306a36Sopenharmony_ci [2] = { 10762306a36Sopenharmony_ci .start = IRQ_CF, 10862306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 10962306a36Sopenharmony_ci }, 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistatic struct pata_platform_info pata_info = { 11362306a36Sopenharmony_ci .ioport_shift = 1, 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic struct platform_device cf_ide_device = { 11762306a36Sopenharmony_ci .name = "pata_platform", 11862306a36Sopenharmony_ci .id = -1, 11962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(cf_ide_resources), 12062306a36Sopenharmony_ci .resource = cf_ide_resources, 12162306a36Sopenharmony_ci .dev = { 12262306a36Sopenharmony_ci .platform_data = &pata_info, 12362306a36Sopenharmony_ci }, 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic struct resource heartbeat_resources[] = { 12762306a36Sopenharmony_ci [0] = { 12862306a36Sopenharmony_ci .start = PA_OBLED, 12962306a36Sopenharmony_ci .end = PA_OBLED, 13062306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 13162306a36Sopenharmony_ci }, 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci#ifndef CONFIG_SH_R7785RP 13562306a36Sopenharmony_cistatic unsigned char heartbeat_bit_pos[] = { 2, 1, 0, 3, 6, 5, 4, 7 }; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic struct heartbeat_data heartbeat_data = { 13862306a36Sopenharmony_ci .bit_pos = heartbeat_bit_pos, 13962306a36Sopenharmony_ci .nr_bits = ARRAY_SIZE(heartbeat_bit_pos), 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci#endif 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistatic struct platform_device heartbeat_device = { 14462306a36Sopenharmony_ci .name = "heartbeat", 14562306a36Sopenharmony_ci .id = -1, 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /* R7785RP has a slightly more sensible FPGA.. */ 14862306a36Sopenharmony_ci#ifndef CONFIG_SH_R7785RP 14962306a36Sopenharmony_ci .dev = { 15062306a36Sopenharmony_ci .platform_data = &heartbeat_data, 15162306a36Sopenharmony_ci }, 15262306a36Sopenharmony_ci#endif 15362306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(heartbeat_resources), 15462306a36Sopenharmony_ci .resource = heartbeat_resources, 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic struct ax_plat_data ax88796_platdata = { 15862306a36Sopenharmony_ci .flags = AXFLG_HAS_93CX6, 15962306a36Sopenharmony_ci .wordlength = 2, 16062306a36Sopenharmony_ci .dcr_val = 0x1, 16162306a36Sopenharmony_ci .rcr_val = 0x40, 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic struct resource ax88796_resources[] = { 16562306a36Sopenharmony_ci { 16662306a36Sopenharmony_ci#ifdef CONFIG_SH_R7780RP 16762306a36Sopenharmony_ci .start = 0xa5800400, 16862306a36Sopenharmony_ci .end = 0xa5800400 + (0x20 * 0x2) - 1, 16962306a36Sopenharmony_ci#else 17062306a36Sopenharmony_ci .start = 0xa4100400, 17162306a36Sopenharmony_ci .end = 0xa4100400 + (0x20 * 0x2) - 1, 17262306a36Sopenharmony_ci#endif 17362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 17462306a36Sopenharmony_ci }, 17562306a36Sopenharmony_ci { 17662306a36Sopenharmony_ci .start = IRQ_AX88796, 17762306a36Sopenharmony_ci .end = IRQ_AX88796, 17862306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 17962306a36Sopenharmony_ci }, 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic struct platform_device ax88796_device = { 18362306a36Sopenharmony_ci .name = "ax88796", 18462306a36Sopenharmony_ci .id = 0, 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci .dev = { 18762306a36Sopenharmony_ci .platform_data = &ax88796_platdata, 18862306a36Sopenharmony_ci }, 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ax88796_resources), 19162306a36Sopenharmony_ci .resource = ax88796_resources, 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistatic struct mtd_partition nor_flash_partitions[] = { 19562306a36Sopenharmony_ci { 19662306a36Sopenharmony_ci .name = "loader", 19762306a36Sopenharmony_ci .offset = 0x00000000, 19862306a36Sopenharmony_ci .size = 512 * 1024, 19962306a36Sopenharmony_ci }, 20062306a36Sopenharmony_ci { 20162306a36Sopenharmony_ci .name = "bootenv", 20262306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 20362306a36Sopenharmony_ci .size = 512 * 1024, 20462306a36Sopenharmony_ci }, 20562306a36Sopenharmony_ci { 20662306a36Sopenharmony_ci .name = "kernel", 20762306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 20862306a36Sopenharmony_ci .size = 4 * 1024 * 1024, 20962306a36Sopenharmony_ci }, 21062306a36Sopenharmony_ci { 21162306a36Sopenharmony_ci .name = "data", 21262306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 21362306a36Sopenharmony_ci .size = MTDPART_SIZ_FULL, 21462306a36Sopenharmony_ci }, 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic struct physmap_flash_data nor_flash_data = { 21862306a36Sopenharmony_ci .width = 4, 21962306a36Sopenharmony_ci .parts = nor_flash_partitions, 22062306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(nor_flash_partitions), 22162306a36Sopenharmony_ci}; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci/* This config is flash board for mass production. */ 22462306a36Sopenharmony_cistatic struct resource nor_flash_resources[] = { 22562306a36Sopenharmony_ci [0] = { 22662306a36Sopenharmony_ci .start = PA_NORFLASH_ADDR, 22762306a36Sopenharmony_ci .end = PA_NORFLASH_ADDR + PA_NORFLASH_SIZE - 1, 22862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 22962306a36Sopenharmony_ci } 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic struct platform_device nor_flash_device = { 23362306a36Sopenharmony_ci .name = "physmap-flash", 23462306a36Sopenharmony_ci .dev = { 23562306a36Sopenharmony_ci .platform_data = &nor_flash_data, 23662306a36Sopenharmony_ci }, 23762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(nor_flash_resources), 23862306a36Sopenharmony_ci .resource = nor_flash_resources, 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic struct resource smbus_resources[] = { 24262306a36Sopenharmony_ci [0] = { 24362306a36Sopenharmony_ci .start = PA_SMCR, 24462306a36Sopenharmony_ci .end = PA_SMCR + 0x100 - 1, 24562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 24662306a36Sopenharmony_ci }, 24762306a36Sopenharmony_ci [1] = { 24862306a36Sopenharmony_ci .start = IRQ_SMBUS, 24962306a36Sopenharmony_ci .end = IRQ_SMBUS, 25062306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 25162306a36Sopenharmony_ci }, 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistatic struct platform_device smbus_device = { 25562306a36Sopenharmony_ci .name = "i2c-highlander", 25662306a36Sopenharmony_ci .id = 0, 25762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(smbus_resources), 25862306a36Sopenharmony_ci .resource = smbus_resources, 25962306a36Sopenharmony_ci}; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic struct i2c_board_info __initdata highlander_i2c_devices[] = { 26262306a36Sopenharmony_ci { 26362306a36Sopenharmony_ci I2C_BOARD_INFO("r2025sd", 0x32), 26462306a36Sopenharmony_ci }, 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic struct platform_device *r7780rp_devices[] __initdata = { 26862306a36Sopenharmony_ci &r8a66597_usb_host_device, 26962306a36Sopenharmony_ci &m66592_usb_peripheral_device, 27062306a36Sopenharmony_ci &heartbeat_device, 27162306a36Sopenharmony_ci &smbus_device, 27262306a36Sopenharmony_ci &nor_flash_device, 27362306a36Sopenharmony_ci#ifndef CONFIG_SH_R7780RP 27462306a36Sopenharmony_ci &ax88796_device, 27562306a36Sopenharmony_ci#endif 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci/* 27962306a36Sopenharmony_ci * The CF is connected using a 16-bit bus where 8-bit operations are 28062306a36Sopenharmony_ci * unsupported. The linux ata driver is however using 8-bit operations, so 28162306a36Sopenharmony_ci * insert a trapped io filter to convert 8-bit operations into 16-bit. 28262306a36Sopenharmony_ci */ 28362306a36Sopenharmony_cistatic struct trapped_io cf_trapped_io = { 28462306a36Sopenharmony_ci .resource = cf_ide_resources, 28562306a36Sopenharmony_ci .num_resources = 2, 28662306a36Sopenharmony_ci .minimum_bus_width = 16, 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic int __init r7780rp_devices_setup(void) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci int ret = 0; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci#ifndef CONFIG_SH_R7780RP 29462306a36Sopenharmony_ci if (register_trapped_io(&cf_trapped_io) == 0) 29562306a36Sopenharmony_ci ret |= platform_device_register(&cf_ide_device); 29662306a36Sopenharmony_ci#endif 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci ret |= platform_add_devices(r7780rp_devices, 29962306a36Sopenharmony_ci ARRAY_SIZE(r7780rp_devices)); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci ret |= i2c_register_board_info(0, highlander_i2c_devices, 30262306a36Sopenharmony_ci ARRAY_SIZE(highlander_i2c_devices)); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci return ret; 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_cidevice_initcall(r7780rp_devices_setup); 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci/* 30962306a36Sopenharmony_ci * Platform specific clocks 31062306a36Sopenharmony_ci */ 31162306a36Sopenharmony_cistatic int ivdr_clk_enable(struct clk *clk) 31262306a36Sopenharmony_ci{ 31362306a36Sopenharmony_ci __raw_writew(__raw_readw(PA_IVDRCTL) | (1 << IVDR_CK_ON), PA_IVDRCTL); 31462306a36Sopenharmony_ci return 0; 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cistatic void ivdr_clk_disable(struct clk *clk) 31862306a36Sopenharmony_ci{ 31962306a36Sopenharmony_ci __raw_writew(__raw_readw(PA_IVDRCTL) & ~(1 << IVDR_CK_ON), PA_IVDRCTL); 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_cistatic struct sh_clk_ops ivdr_clk_ops = { 32362306a36Sopenharmony_ci .enable = ivdr_clk_enable, 32462306a36Sopenharmony_ci .disable = ivdr_clk_disable, 32562306a36Sopenharmony_ci}; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic struct clk ivdr_clk = { 32862306a36Sopenharmony_ci .ops = &ivdr_clk_ops, 32962306a36Sopenharmony_ci}; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_cistatic struct clk *r7780rp_clocks[] = { 33262306a36Sopenharmony_ci &ivdr_clk, 33362306a36Sopenharmony_ci}; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistatic struct clk_lookup lookups[] = { 33662306a36Sopenharmony_ci /* main clocks */ 33762306a36Sopenharmony_ci CLKDEV_CON_ID("ivdr_clk", &ivdr_clk), 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic void r7780rp_power_off(void) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci if (mach_is_r7780mp() || mach_is_r7785rp()) 34362306a36Sopenharmony_ci __raw_writew(0x0001, PA_POFF); 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/* 34762306a36Sopenharmony_ci * Initialize the board 34862306a36Sopenharmony_ci */ 34962306a36Sopenharmony_cistatic void __init highlander_setup(char **cmdline_p) 35062306a36Sopenharmony_ci{ 35162306a36Sopenharmony_ci u16 ver = __raw_readw(PA_VERREG); 35262306a36Sopenharmony_ci int i; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci printk(KERN_INFO "Renesas Solutions Highlander %s support.\n", 35562306a36Sopenharmony_ci mach_is_r7780rp() ? "R7780RP-1" : 35662306a36Sopenharmony_ci mach_is_r7780mp() ? "R7780MP" : 35762306a36Sopenharmony_ci "R7785RP"); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci printk(KERN_INFO "Board version: %d (revision %d), " 36062306a36Sopenharmony_ci "FPGA version: %d (revision %d)\n", 36162306a36Sopenharmony_ci (ver >> 12) & 0xf, (ver >> 8) & 0xf, 36262306a36Sopenharmony_ci (ver >> 4) & 0xf, ver & 0xf); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci highlander_plat_pinmux_setup(); 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci /* 36762306a36Sopenharmony_ci * Enable the important clocks right away.. 36862306a36Sopenharmony_ci */ 36962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(r7780rp_clocks); i++) { 37062306a36Sopenharmony_ci struct clk *clk = r7780rp_clocks[i]; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci clk_register(clk); 37362306a36Sopenharmony_ci clk_enable(clk); 37462306a36Sopenharmony_ci } 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci clkdev_add_table(lookups, ARRAY_SIZE(lookups)); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci __raw_writew(0x0000, PA_OBLED); /* Clear LED. */ 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci if (mach_is_r7780rp()) 38162306a36Sopenharmony_ci __raw_writew(0x0001, PA_SDPOW); /* SD Power ON */ 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci __raw_writew(__raw_readw(PA_IVDRCTL) | 0x01, PA_IVDRCTL); /* Si13112 */ 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci pm_power_off = r7780rp_power_off; 38662306a36Sopenharmony_ci} 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic unsigned char irl2irq[HL_NR_IRL]; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cistatic int highlander_irq_demux(int irq) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci if (irq >= HL_NR_IRL + 16 || irq < 16 || !irl2irq[irq - 16]) 39362306a36Sopenharmony_ci return irq; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci return irl2irq[irq - 16]; 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistatic void __init highlander_init_irq(void) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci unsigned char *ucp = highlander_plat_irq_setup(); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci if (ucp) { 40362306a36Sopenharmony_ci plat_irq_setup_pins(IRQ_MODE_IRL3210); 40462306a36Sopenharmony_ci memcpy(irl2irq, ucp, HL_NR_IRL); 40562306a36Sopenharmony_ci } 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* 40962306a36Sopenharmony_ci * The Machine Vector 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_cistatic struct sh_machine_vector mv_highlander __initmv = { 41262306a36Sopenharmony_ci .mv_name = "Highlander", 41362306a36Sopenharmony_ci .mv_setup = highlander_setup, 41462306a36Sopenharmony_ci .mv_init_irq = highlander_init_irq, 41562306a36Sopenharmony_ci .mv_irq_demux = highlander_irq_demux, 41662306a36Sopenharmony_ci}; 417