18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/sh/boards/se/7724/setup.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Renesas Solutions Corp. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Kuninori Morimoto <morimoto.kuninori@renesas.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci#include <asm/clock.h> 108c2ecf20Sopenharmony_ci#include <asm/heartbeat.h> 118c2ecf20Sopenharmony_ci#include <asm/io.h> 128c2ecf20Sopenharmony_ci#include <asm/suspend.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <cpu/sh7724.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <linux/delay.h> 178c2ecf20Sopenharmony_ci#include <linux/device.h> 188c2ecf20Sopenharmony_ci#include <linux/gpio.h> 198c2ecf20Sopenharmony_ci#include <linux/init.h> 208c2ecf20Sopenharmony_ci#include <linux/input.h> 218c2ecf20Sopenharmony_ci#include <linux/input/sh_keysc.h> 228c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 238c2ecf20Sopenharmony_ci#include <linux/memblock.h> 248c2ecf20Sopenharmony_ci#include <linux/mfd/tmio.h> 258c2ecf20Sopenharmony_ci#include <linux/mmc/host.h> 268c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 278c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 288c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h> 298c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h> 308c2ecf20Sopenharmony_ci#include <linux/sh_eth.h> 318c2ecf20Sopenharmony_ci#include <linux/sh_intc.h> 328c2ecf20Sopenharmony_ci#include <linux/smc91x.h> 338c2ecf20Sopenharmony_ci#include <linux/usb/r8a66597.h> 348c2ecf20Sopenharmony_ci#include <linux/videodev2.h> 358c2ecf20Sopenharmony_ci#include <linux/dma-map-ops.h> 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#include <mach-se/mach/se7724.h> 388c2ecf20Sopenharmony_ci#include <media/drv-intf/renesas-ceu.h> 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#include <sound/sh_fsi.h> 418c2ecf20Sopenharmony_ci#include <sound/simple_card.h> 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#include <video/sh_mobile_lcdc.h> 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define CEU_BUFFER_MEMORY_SIZE (4 << 20) 468c2ecf20Sopenharmony_cistatic phys_addr_t ceu0_dma_membase; 478c2ecf20Sopenharmony_cistatic phys_addr_t ceu1_dma_membase; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/* 508c2ecf20Sopenharmony_ci * SWx 1234 5678 518c2ecf20Sopenharmony_ci * ------------------------------------ 528c2ecf20Sopenharmony_ci * SW31 : 1001 1100 : default 538c2ecf20Sopenharmony_ci * SW32 : 0111 1111 : use on board flash 548c2ecf20Sopenharmony_ci * 558c2ecf20Sopenharmony_ci * SW41 : abxx xxxx -> a = 0 : Analog monitor 568c2ecf20Sopenharmony_ci * 1 : Digital monitor 578c2ecf20Sopenharmony_ci * b = 0 : VGA 588c2ecf20Sopenharmony_ci * 1 : 720p 598c2ecf20Sopenharmony_ci */ 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* 628c2ecf20Sopenharmony_ci * about 720p 638c2ecf20Sopenharmony_ci * 648c2ecf20Sopenharmony_ci * When you use 1280 x 720 lcdc output, 658c2ecf20Sopenharmony_ci * you should change OSC6 lcdc clock from 25.175MHz to 74.25MHz, 668c2ecf20Sopenharmony_ci * and change SW41 to use 720p 678c2ecf20Sopenharmony_ci */ 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci/* 708c2ecf20Sopenharmony_ci * about sound 718c2ecf20Sopenharmony_ci * 728c2ecf20Sopenharmony_ci * This setup.c supports FSI slave mode. 738c2ecf20Sopenharmony_ci * Please change J20, J21, J22 pin to 1-2 connection. 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* Heartbeat */ 778c2ecf20Sopenharmony_cistatic struct resource heartbeat_resource = { 788c2ecf20Sopenharmony_ci .start = PA_LED, 798c2ecf20Sopenharmony_ci .end = PA_LED, 808c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistatic struct platform_device heartbeat_device = { 848c2ecf20Sopenharmony_ci .name = "heartbeat", 858c2ecf20Sopenharmony_ci .id = -1, 868c2ecf20Sopenharmony_ci .num_resources = 1, 878c2ecf20Sopenharmony_ci .resource = &heartbeat_resource, 888c2ecf20Sopenharmony_ci}; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* LAN91C111 */ 918c2ecf20Sopenharmony_cistatic struct smc91x_platdata smc91x_info = { 928c2ecf20Sopenharmony_ci .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cistatic struct resource smc91x_eth_resources[] = { 968c2ecf20Sopenharmony_ci [0] = { 978c2ecf20Sopenharmony_ci .name = "SMC91C111" , 988c2ecf20Sopenharmony_ci .start = 0x1a300300, 998c2ecf20Sopenharmony_ci .end = 0x1a30030f, 1008c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1018c2ecf20Sopenharmony_ci }, 1028c2ecf20Sopenharmony_ci [1] = { 1038c2ecf20Sopenharmony_ci .start = IRQ0_SMC, 1048c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 1058c2ecf20Sopenharmony_ci }, 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic struct platform_device smc91x_eth_device = { 1098c2ecf20Sopenharmony_ci .name = "smc91x", 1108c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(smc91x_eth_resources), 1118c2ecf20Sopenharmony_ci .resource = smc91x_eth_resources, 1128c2ecf20Sopenharmony_ci .dev = { 1138c2ecf20Sopenharmony_ci .platform_data = &smc91x_info, 1148c2ecf20Sopenharmony_ci }, 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci/* MTD */ 1188c2ecf20Sopenharmony_cistatic struct mtd_partition nor_flash_partitions[] = { 1198c2ecf20Sopenharmony_ci { 1208c2ecf20Sopenharmony_ci .name = "uboot", 1218c2ecf20Sopenharmony_ci .offset = 0, 1228c2ecf20Sopenharmony_ci .size = (1 * 1024 * 1024), 1238c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* Read-only */ 1248c2ecf20Sopenharmony_ci }, { 1258c2ecf20Sopenharmony_ci .name = "kernel", 1268c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1278c2ecf20Sopenharmony_ci .size = (2 * 1024 * 1024), 1288c2ecf20Sopenharmony_ci }, { 1298c2ecf20Sopenharmony_ci .name = "free-area", 1308c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1318c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL, 1328c2ecf20Sopenharmony_ci }, 1338c2ecf20Sopenharmony_ci}; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistatic struct physmap_flash_data nor_flash_data = { 1368c2ecf20Sopenharmony_ci .width = 2, 1378c2ecf20Sopenharmony_ci .parts = nor_flash_partitions, 1388c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(nor_flash_partitions), 1398c2ecf20Sopenharmony_ci}; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistatic struct resource nor_flash_resources[] = { 1428c2ecf20Sopenharmony_ci [0] = { 1438c2ecf20Sopenharmony_ci .name = "NOR Flash", 1448c2ecf20Sopenharmony_ci .start = 0x00000000, 1458c2ecf20Sopenharmony_ci .end = 0x01ffffff, 1468c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1478c2ecf20Sopenharmony_ci } 1488c2ecf20Sopenharmony_ci}; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_cistatic struct platform_device nor_flash_device = { 1518c2ecf20Sopenharmony_ci .name = "physmap-flash", 1528c2ecf20Sopenharmony_ci .resource = nor_flash_resources, 1538c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(nor_flash_resources), 1548c2ecf20Sopenharmony_ci .dev = { 1558c2ecf20Sopenharmony_ci .platform_data = &nor_flash_data, 1568c2ecf20Sopenharmony_ci }, 1578c2ecf20Sopenharmony_ci}; 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci/* LCDC */ 1608c2ecf20Sopenharmony_cistatic const struct fb_videomode lcdc_720p_modes[] = { 1618c2ecf20Sopenharmony_ci { 1628c2ecf20Sopenharmony_ci .name = "LB070WV1", 1638c2ecf20Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 1648c2ecf20Sopenharmony_ci .xres = 1280, 1658c2ecf20Sopenharmony_ci .yres = 720, 1668c2ecf20Sopenharmony_ci .left_margin = 220, 1678c2ecf20Sopenharmony_ci .right_margin = 110, 1688c2ecf20Sopenharmony_ci .hsync_len = 40, 1698c2ecf20Sopenharmony_ci .upper_margin = 20, 1708c2ecf20Sopenharmony_ci .lower_margin = 5, 1718c2ecf20Sopenharmony_ci .vsync_len = 5, 1728c2ecf20Sopenharmony_ci }, 1738c2ecf20Sopenharmony_ci}; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistatic const struct fb_videomode lcdc_vga_modes[] = { 1768c2ecf20Sopenharmony_ci { 1778c2ecf20Sopenharmony_ci .name = "LB070WV1", 1788c2ecf20Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 1798c2ecf20Sopenharmony_ci .xres = 640, 1808c2ecf20Sopenharmony_ci .yres = 480, 1818c2ecf20Sopenharmony_ci .left_margin = 105, 1828c2ecf20Sopenharmony_ci .right_margin = 50, 1838c2ecf20Sopenharmony_ci .hsync_len = 96, 1848c2ecf20Sopenharmony_ci .upper_margin = 33, 1858c2ecf20Sopenharmony_ci .lower_margin = 10, 1868c2ecf20Sopenharmony_ci .vsync_len = 2, 1878c2ecf20Sopenharmony_ci }, 1888c2ecf20Sopenharmony_ci}; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_cistatic struct sh_mobile_lcdc_info lcdc_info = { 1918c2ecf20Sopenharmony_ci .clock_source = LCDC_CLK_EXTERNAL, 1928c2ecf20Sopenharmony_ci .ch[0] = { 1938c2ecf20Sopenharmony_ci .chan = LCDC_CHAN_MAINLCD, 1948c2ecf20Sopenharmony_ci .fourcc = V4L2_PIX_FMT_RGB565, 1958c2ecf20Sopenharmony_ci .clock_divider = 1, 1968c2ecf20Sopenharmony_ci .panel_cfg = { /* 7.0 inch */ 1978c2ecf20Sopenharmony_ci .width = 152, 1988c2ecf20Sopenharmony_ci .height = 91, 1998c2ecf20Sopenharmony_ci }, 2008c2ecf20Sopenharmony_ci } 2018c2ecf20Sopenharmony_ci}; 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_cistatic struct resource lcdc_resources[] = { 2048c2ecf20Sopenharmony_ci [0] = { 2058c2ecf20Sopenharmony_ci .name = "LCDC", 2068c2ecf20Sopenharmony_ci .start = 0xfe940000, 2078c2ecf20Sopenharmony_ci .end = 0xfe942fff, 2088c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2098c2ecf20Sopenharmony_ci }, 2108c2ecf20Sopenharmony_ci [1] = { 2118c2ecf20Sopenharmony_ci .start = evt2irq(0xf40), 2128c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2138c2ecf20Sopenharmony_ci }, 2148c2ecf20Sopenharmony_ci}; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cistatic struct platform_device lcdc_device = { 2178c2ecf20Sopenharmony_ci .name = "sh_mobile_lcdc_fb", 2188c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(lcdc_resources), 2198c2ecf20Sopenharmony_ci .resource = lcdc_resources, 2208c2ecf20Sopenharmony_ci .dev = { 2218c2ecf20Sopenharmony_ci .platform_data = &lcdc_info, 2228c2ecf20Sopenharmony_ci }, 2238c2ecf20Sopenharmony_ci}; 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci/* CEU0 */ 2268c2ecf20Sopenharmony_cistatic struct ceu_platform_data ceu0_pdata = { 2278c2ecf20Sopenharmony_ci .num_subdevs = 0, 2288c2ecf20Sopenharmony_ci}; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic struct resource ceu0_resources[] = { 2318c2ecf20Sopenharmony_ci [0] = { 2328c2ecf20Sopenharmony_ci .name = "CEU0", 2338c2ecf20Sopenharmony_ci .start = 0xfe910000, 2348c2ecf20Sopenharmony_ci .end = 0xfe91009f, 2358c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2368c2ecf20Sopenharmony_ci }, 2378c2ecf20Sopenharmony_ci [1] = { 2388c2ecf20Sopenharmony_ci .start = evt2irq(0x880), 2398c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2408c2ecf20Sopenharmony_ci }, 2418c2ecf20Sopenharmony_ci}; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cistatic struct platform_device ceu0_device = { 2448c2ecf20Sopenharmony_ci .name = "renesas-ceu", 2458c2ecf20Sopenharmony_ci .id = 0, /* "ceu.0" clock */ 2468c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu0_resources), 2478c2ecf20Sopenharmony_ci .resource = ceu0_resources, 2488c2ecf20Sopenharmony_ci .dev = { 2498c2ecf20Sopenharmony_ci .platform_data = &ceu0_pdata, 2508c2ecf20Sopenharmony_ci }, 2518c2ecf20Sopenharmony_ci}; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci/* CEU1 */ 2548c2ecf20Sopenharmony_cistatic struct ceu_platform_data ceu1_pdata = { 2558c2ecf20Sopenharmony_ci .num_subdevs = 0, 2568c2ecf20Sopenharmony_ci}; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_cistatic struct resource ceu1_resources[] = { 2598c2ecf20Sopenharmony_ci [0] = { 2608c2ecf20Sopenharmony_ci .name = "CEU1", 2618c2ecf20Sopenharmony_ci .start = 0xfe914000, 2628c2ecf20Sopenharmony_ci .end = 0xfe91409f, 2638c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2648c2ecf20Sopenharmony_ci }, 2658c2ecf20Sopenharmony_ci [1] = { 2668c2ecf20Sopenharmony_ci .start = evt2irq(0x9e0), 2678c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2688c2ecf20Sopenharmony_ci }, 2698c2ecf20Sopenharmony_ci}; 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_cistatic struct platform_device ceu1_device = { 2728c2ecf20Sopenharmony_ci .name = "renesas-ceu", 2738c2ecf20Sopenharmony_ci .id = 1, /* "ceu.1" clock */ 2748c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu1_resources), 2758c2ecf20Sopenharmony_ci .resource = ceu1_resources, 2768c2ecf20Sopenharmony_ci .dev = { 2778c2ecf20Sopenharmony_ci .platform_data = &ceu1_pdata, 2788c2ecf20Sopenharmony_ci }, 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci/* FSI */ 2828c2ecf20Sopenharmony_ci/* change J20, J21, J22 pin to 1-2 connection to use slave mode */ 2838c2ecf20Sopenharmony_cistatic struct resource fsi_resources[] = { 2848c2ecf20Sopenharmony_ci [0] = { 2858c2ecf20Sopenharmony_ci .name = "FSI", 2868c2ecf20Sopenharmony_ci .start = 0xFE3C0000, 2878c2ecf20Sopenharmony_ci .end = 0xFE3C021d, 2888c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2898c2ecf20Sopenharmony_ci }, 2908c2ecf20Sopenharmony_ci [1] = { 2918c2ecf20Sopenharmony_ci .start = evt2irq(0xf80), 2928c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2938c2ecf20Sopenharmony_ci }, 2948c2ecf20Sopenharmony_ci}; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_cistatic struct platform_device fsi_device = { 2978c2ecf20Sopenharmony_ci .name = "sh_fsi", 2988c2ecf20Sopenharmony_ci .id = 0, 2998c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(fsi_resources), 3008c2ecf20Sopenharmony_ci .resource = fsi_resources, 3018c2ecf20Sopenharmony_ci}; 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_cistatic struct asoc_simple_card_info fsi_ak4642_info = { 3048c2ecf20Sopenharmony_ci .name = "AK4642", 3058c2ecf20Sopenharmony_ci .card = "FSIA-AK4642", 3068c2ecf20Sopenharmony_ci .codec = "ak4642-codec.0-0012", 3078c2ecf20Sopenharmony_ci .platform = "sh_fsi.0", 3088c2ecf20Sopenharmony_ci .daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBM_CFM, 3098c2ecf20Sopenharmony_ci .cpu_dai = { 3108c2ecf20Sopenharmony_ci .name = "fsia-dai", 3118c2ecf20Sopenharmony_ci }, 3128c2ecf20Sopenharmony_ci .codec_dai = { 3138c2ecf20Sopenharmony_ci .name = "ak4642-hifi", 3148c2ecf20Sopenharmony_ci .sysclk = 11289600, 3158c2ecf20Sopenharmony_ci }, 3168c2ecf20Sopenharmony_ci}; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_cistatic struct platform_device fsi_ak4642_device = { 3198c2ecf20Sopenharmony_ci .name = "asoc-simple-card", 3208c2ecf20Sopenharmony_ci .dev = { 3218c2ecf20Sopenharmony_ci .platform_data = &fsi_ak4642_info, 3228c2ecf20Sopenharmony_ci }, 3238c2ecf20Sopenharmony_ci}; 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci/* KEYSC in SoC (Needs SW33-2 set to ON) */ 3268c2ecf20Sopenharmony_cistatic struct sh_keysc_info keysc_info = { 3278c2ecf20Sopenharmony_ci .mode = SH_KEYSC_MODE_1, 3288c2ecf20Sopenharmony_ci .scan_timing = 3, 3298c2ecf20Sopenharmony_ci .delay = 50, 3308c2ecf20Sopenharmony_ci .keycodes = { 3318c2ecf20Sopenharmony_ci KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, 3328c2ecf20Sopenharmony_ci KEY_6, KEY_7, KEY_8, KEY_9, KEY_A, 3338c2ecf20Sopenharmony_ci KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, 3348c2ecf20Sopenharmony_ci KEY_G, KEY_H, KEY_I, KEY_K, KEY_L, 3358c2ecf20Sopenharmony_ci KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, 3368c2ecf20Sopenharmony_ci KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, 3378c2ecf20Sopenharmony_ci }, 3388c2ecf20Sopenharmony_ci}; 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_cistatic struct resource keysc_resources[] = { 3418c2ecf20Sopenharmony_ci [0] = { 3428c2ecf20Sopenharmony_ci .name = "KEYSC", 3438c2ecf20Sopenharmony_ci .start = 0x044b0000, 3448c2ecf20Sopenharmony_ci .end = 0x044b000f, 3458c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3468c2ecf20Sopenharmony_ci }, 3478c2ecf20Sopenharmony_ci [1] = { 3488c2ecf20Sopenharmony_ci .start = evt2irq(0xbe0), 3498c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3508c2ecf20Sopenharmony_ci }, 3518c2ecf20Sopenharmony_ci}; 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_cistatic struct platform_device keysc_device = { 3548c2ecf20Sopenharmony_ci .name = "sh_keysc", 3558c2ecf20Sopenharmony_ci .id = 0, /* "keysc0" clock */ 3568c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(keysc_resources), 3578c2ecf20Sopenharmony_ci .resource = keysc_resources, 3588c2ecf20Sopenharmony_ci .dev = { 3598c2ecf20Sopenharmony_ci .platform_data = &keysc_info, 3608c2ecf20Sopenharmony_ci }, 3618c2ecf20Sopenharmony_ci}; 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci/* SH Eth */ 3648c2ecf20Sopenharmony_cistatic struct resource sh_eth_resources[] = { 3658c2ecf20Sopenharmony_ci [0] = { 3668c2ecf20Sopenharmony_ci .start = SH_ETH_ADDR, 3678c2ecf20Sopenharmony_ci .end = SH_ETH_ADDR + 0x1FC - 1, 3688c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3698c2ecf20Sopenharmony_ci }, 3708c2ecf20Sopenharmony_ci [1] = { 3718c2ecf20Sopenharmony_ci .start = evt2irq(0xd60), 3728c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 3738c2ecf20Sopenharmony_ci }, 3748c2ecf20Sopenharmony_ci}; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_cistatic struct sh_eth_plat_data sh_eth_plat = { 3778c2ecf20Sopenharmony_ci .phy = 0x1f, /* SMSC LAN8187 */ 3788c2ecf20Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 3798c2ecf20Sopenharmony_ci}; 3808c2ecf20Sopenharmony_ci 3818c2ecf20Sopenharmony_cistatic struct platform_device sh_eth_device = { 3828c2ecf20Sopenharmony_ci .name = "sh7724-ether", 3838c2ecf20Sopenharmony_ci .id = 0, 3848c2ecf20Sopenharmony_ci .dev = { 3858c2ecf20Sopenharmony_ci .platform_data = &sh_eth_plat, 3868c2ecf20Sopenharmony_ci }, 3878c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth_resources), 3888c2ecf20Sopenharmony_ci .resource = sh_eth_resources, 3898c2ecf20Sopenharmony_ci}; 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_cistatic struct r8a66597_platdata sh7724_usb0_host_data = { 3928c2ecf20Sopenharmony_ci .on_chip = 1, 3938c2ecf20Sopenharmony_ci}; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_cistatic struct resource sh7724_usb0_host_resources[] = { 3968c2ecf20Sopenharmony_ci [0] = { 3978c2ecf20Sopenharmony_ci .start = 0xa4d80000, 3988c2ecf20Sopenharmony_ci .end = 0xa4d80124 - 1, 3998c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4008c2ecf20Sopenharmony_ci }, 4018c2ecf20Sopenharmony_ci [1] = { 4028c2ecf20Sopenharmony_ci .start = evt2irq(0xa20), 4038c2ecf20Sopenharmony_ci .end = evt2irq(0xa20), 4048c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 4058c2ecf20Sopenharmony_ci }, 4068c2ecf20Sopenharmony_ci}; 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_cistatic struct platform_device sh7724_usb0_host_device = { 4098c2ecf20Sopenharmony_ci .name = "r8a66597_hcd", 4108c2ecf20Sopenharmony_ci .id = 0, 4118c2ecf20Sopenharmony_ci .dev = { 4128c2ecf20Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 4138c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 4148c2ecf20Sopenharmony_ci .platform_data = &sh7724_usb0_host_data, 4158c2ecf20Sopenharmony_ci }, 4168c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh7724_usb0_host_resources), 4178c2ecf20Sopenharmony_ci .resource = sh7724_usb0_host_resources, 4188c2ecf20Sopenharmony_ci}; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_cistatic struct r8a66597_platdata sh7724_usb1_gadget_data = { 4218c2ecf20Sopenharmony_ci .on_chip = 1, 4228c2ecf20Sopenharmony_ci}; 4238c2ecf20Sopenharmony_ci 4248c2ecf20Sopenharmony_cistatic struct resource sh7724_usb1_gadget_resources[] = { 4258c2ecf20Sopenharmony_ci [0] = { 4268c2ecf20Sopenharmony_ci .start = 0xa4d90000, 4278c2ecf20Sopenharmony_ci .end = 0xa4d90123, 4288c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4298c2ecf20Sopenharmony_ci }, 4308c2ecf20Sopenharmony_ci [1] = { 4318c2ecf20Sopenharmony_ci .start = evt2irq(0xa40), 4328c2ecf20Sopenharmony_ci .end = evt2irq(0xa40), 4338c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 4348c2ecf20Sopenharmony_ci }, 4358c2ecf20Sopenharmony_ci}; 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_cistatic struct platform_device sh7724_usb1_gadget_device = { 4388c2ecf20Sopenharmony_ci .name = "r8a66597_udc", 4398c2ecf20Sopenharmony_ci .id = 1, /* USB1 */ 4408c2ecf20Sopenharmony_ci .dev = { 4418c2ecf20Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 4428c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 4438c2ecf20Sopenharmony_ci .platform_data = &sh7724_usb1_gadget_data, 4448c2ecf20Sopenharmony_ci }, 4458c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh7724_usb1_gadget_resources), 4468c2ecf20Sopenharmony_ci .resource = sh7724_usb1_gadget_resources, 4478c2ecf20Sopenharmony_ci}; 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci/* Fixed 3.3V regulator to be used by SDHI0, SDHI1 */ 4508c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply fixed3v3_power_consumers[] = 4518c2ecf20Sopenharmony_ci{ 4528c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 4538c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 4548c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 4558c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 4568c2ecf20Sopenharmony_ci}; 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_cistatic struct resource sdhi0_cn7_resources[] = { 4598c2ecf20Sopenharmony_ci [0] = { 4608c2ecf20Sopenharmony_ci .name = "SDHI0", 4618c2ecf20Sopenharmony_ci .start = 0x04ce0000, 4628c2ecf20Sopenharmony_ci .end = 0x04ce00ff, 4638c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4648c2ecf20Sopenharmony_ci }, 4658c2ecf20Sopenharmony_ci [1] = { 4668c2ecf20Sopenharmony_ci .start = evt2irq(0xe80), 4678c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4688c2ecf20Sopenharmony_ci }, 4698c2ecf20Sopenharmony_ci}; 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_cistatic struct tmio_mmc_data sh7724_sdhi0_data = { 4728c2ecf20Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX, 4738c2ecf20Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX, 4748c2ecf20Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ, 4758c2ecf20Sopenharmony_ci}; 4768c2ecf20Sopenharmony_ci 4778c2ecf20Sopenharmony_cistatic struct platform_device sdhi0_cn7_device = { 4788c2ecf20Sopenharmony_ci .name = "sh_mobile_sdhi", 4798c2ecf20Sopenharmony_ci .id = 0, 4808c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi0_cn7_resources), 4818c2ecf20Sopenharmony_ci .resource = sdhi0_cn7_resources, 4828c2ecf20Sopenharmony_ci .dev = { 4838c2ecf20Sopenharmony_ci .platform_data = &sh7724_sdhi0_data, 4848c2ecf20Sopenharmony_ci }, 4858c2ecf20Sopenharmony_ci}; 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_cistatic struct resource sdhi1_cn8_resources[] = { 4888c2ecf20Sopenharmony_ci [0] = { 4898c2ecf20Sopenharmony_ci .name = "SDHI1", 4908c2ecf20Sopenharmony_ci .start = 0x04cf0000, 4918c2ecf20Sopenharmony_ci .end = 0x04cf00ff, 4928c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4938c2ecf20Sopenharmony_ci }, 4948c2ecf20Sopenharmony_ci [1] = { 4958c2ecf20Sopenharmony_ci .start = evt2irq(0x4e0), 4968c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4978c2ecf20Sopenharmony_ci }, 4988c2ecf20Sopenharmony_ci}; 4998c2ecf20Sopenharmony_ci 5008c2ecf20Sopenharmony_cistatic struct tmio_mmc_data sh7724_sdhi1_data = { 5018c2ecf20Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI1_TX, 5028c2ecf20Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX, 5038c2ecf20Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ, 5048c2ecf20Sopenharmony_ci}; 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_cistatic struct platform_device sdhi1_cn8_device = { 5078c2ecf20Sopenharmony_ci .name = "sh_mobile_sdhi", 5088c2ecf20Sopenharmony_ci .id = 1, 5098c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi1_cn8_resources), 5108c2ecf20Sopenharmony_ci .resource = sdhi1_cn8_resources, 5118c2ecf20Sopenharmony_ci .dev = { 5128c2ecf20Sopenharmony_ci .platform_data = &sh7724_sdhi1_data, 5138c2ecf20Sopenharmony_ci }, 5148c2ecf20Sopenharmony_ci}; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci/* IrDA */ 5178c2ecf20Sopenharmony_cistatic struct resource irda_resources[] = { 5188c2ecf20Sopenharmony_ci [0] = { 5198c2ecf20Sopenharmony_ci .name = "IrDA", 5208c2ecf20Sopenharmony_ci .start = 0xA45D0000, 5218c2ecf20Sopenharmony_ci .end = 0xA45D0049, 5228c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 5238c2ecf20Sopenharmony_ci }, 5248c2ecf20Sopenharmony_ci [1] = { 5258c2ecf20Sopenharmony_ci .start = evt2irq(0x480), 5268c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 5278c2ecf20Sopenharmony_ci }, 5288c2ecf20Sopenharmony_ci}; 5298c2ecf20Sopenharmony_ci 5308c2ecf20Sopenharmony_cistatic struct platform_device irda_device = { 5318c2ecf20Sopenharmony_ci .name = "sh_sir", 5328c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(irda_resources), 5338c2ecf20Sopenharmony_ci .resource = irda_resources, 5348c2ecf20Sopenharmony_ci}; 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci#include <media/i2c/ak881x.h> 5378c2ecf20Sopenharmony_ci#include <media/drv-intf/sh_vou.h> 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_cistatic struct ak881x_pdata ak881x_pdata = { 5408c2ecf20Sopenharmony_ci .flags = AK881X_IF_MODE_SLAVE, 5418c2ecf20Sopenharmony_ci}; 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_cistatic struct i2c_board_info ak8813 = { 5448c2ecf20Sopenharmony_ci /* With open J18 jumper address is 0x21 */ 5458c2ecf20Sopenharmony_ci I2C_BOARD_INFO("ak8813", 0x20), 5468c2ecf20Sopenharmony_ci .platform_data = &ak881x_pdata, 5478c2ecf20Sopenharmony_ci}; 5488c2ecf20Sopenharmony_ci 5498c2ecf20Sopenharmony_cistatic struct sh_vou_pdata sh_vou_pdata = { 5508c2ecf20Sopenharmony_ci .bus_fmt = SH_VOU_BUS_8BIT, 5518c2ecf20Sopenharmony_ci .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 5528c2ecf20Sopenharmony_ci .board_info = &ak8813, 5538c2ecf20Sopenharmony_ci .i2c_adap = 0, 5548c2ecf20Sopenharmony_ci}; 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_cistatic struct resource sh_vou_resources[] = { 5578c2ecf20Sopenharmony_ci [0] = { 5588c2ecf20Sopenharmony_ci .start = 0xfe960000, 5598c2ecf20Sopenharmony_ci .end = 0xfe962043, 5608c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 5618c2ecf20Sopenharmony_ci }, 5628c2ecf20Sopenharmony_ci [1] = { 5638c2ecf20Sopenharmony_ci .start = evt2irq(0x8e0), 5648c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 5658c2ecf20Sopenharmony_ci }, 5668c2ecf20Sopenharmony_ci}; 5678c2ecf20Sopenharmony_ci 5688c2ecf20Sopenharmony_cistatic struct platform_device vou_device = { 5698c2ecf20Sopenharmony_ci .name = "sh-vou", 5708c2ecf20Sopenharmony_ci .id = -1, 5718c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_vou_resources), 5728c2ecf20Sopenharmony_ci .resource = sh_vou_resources, 5738c2ecf20Sopenharmony_ci .dev = { 5748c2ecf20Sopenharmony_ci .platform_data = &sh_vou_pdata, 5758c2ecf20Sopenharmony_ci }, 5768c2ecf20Sopenharmony_ci}; 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_cistatic struct platform_device *ms7724se_ceu_devices[] __initdata = { 5798c2ecf20Sopenharmony_ci &ceu0_device, 5808c2ecf20Sopenharmony_ci &ceu1_device, 5818c2ecf20Sopenharmony_ci}; 5828c2ecf20Sopenharmony_ci 5838c2ecf20Sopenharmony_cistatic struct platform_device *ms7724se_devices[] __initdata = { 5848c2ecf20Sopenharmony_ci &heartbeat_device, 5858c2ecf20Sopenharmony_ci &smc91x_eth_device, 5868c2ecf20Sopenharmony_ci &lcdc_device, 5878c2ecf20Sopenharmony_ci &nor_flash_device, 5888c2ecf20Sopenharmony_ci &keysc_device, 5898c2ecf20Sopenharmony_ci &sh_eth_device, 5908c2ecf20Sopenharmony_ci &sh7724_usb0_host_device, 5918c2ecf20Sopenharmony_ci &sh7724_usb1_gadget_device, 5928c2ecf20Sopenharmony_ci &fsi_device, 5938c2ecf20Sopenharmony_ci &fsi_ak4642_device, 5948c2ecf20Sopenharmony_ci &sdhi0_cn7_device, 5958c2ecf20Sopenharmony_ci &sdhi1_cn8_device, 5968c2ecf20Sopenharmony_ci &irda_device, 5978c2ecf20Sopenharmony_ci &vou_device, 5988c2ecf20Sopenharmony_ci}; 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_ci/* I2C device */ 6018c2ecf20Sopenharmony_cistatic struct i2c_board_info i2c0_devices[] = { 6028c2ecf20Sopenharmony_ci { 6038c2ecf20Sopenharmony_ci I2C_BOARD_INFO("ak4642", 0x12), 6048c2ecf20Sopenharmony_ci }, 6058c2ecf20Sopenharmony_ci}; 6068c2ecf20Sopenharmony_ci 6078c2ecf20Sopenharmony_ci#define EEPROM_OP 0xBA206000 6088c2ecf20Sopenharmony_ci#define EEPROM_ADR 0xBA206004 6098c2ecf20Sopenharmony_ci#define EEPROM_DATA 0xBA20600C 6108c2ecf20Sopenharmony_ci#define EEPROM_STAT 0xBA206010 6118c2ecf20Sopenharmony_ci#define EEPROM_STRT 0xBA206014 6128c2ecf20Sopenharmony_ci 6138c2ecf20Sopenharmony_cistatic int __init sh_eth_is_eeprom_ready(void) 6148c2ecf20Sopenharmony_ci{ 6158c2ecf20Sopenharmony_ci int t = 10000; 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci while (t--) { 6188c2ecf20Sopenharmony_ci if (!__raw_readw(EEPROM_STAT)) 6198c2ecf20Sopenharmony_ci return 1; 6208c2ecf20Sopenharmony_ci udelay(1); 6218c2ecf20Sopenharmony_ci } 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci printk(KERN_ERR "ms7724se can not access to eeprom\n"); 6248c2ecf20Sopenharmony_ci return 0; 6258c2ecf20Sopenharmony_ci} 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_cistatic void __init sh_eth_init(void) 6288c2ecf20Sopenharmony_ci{ 6298c2ecf20Sopenharmony_ci int i; 6308c2ecf20Sopenharmony_ci u16 mac; 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci /* check EEPROM status */ 6338c2ecf20Sopenharmony_ci if (!sh_eth_is_eeprom_ready()) 6348c2ecf20Sopenharmony_ci return; 6358c2ecf20Sopenharmony_ci 6368c2ecf20Sopenharmony_ci /* read MAC addr from EEPROM */ 6378c2ecf20Sopenharmony_ci for (i = 0 ; i < 3 ; i++) { 6388c2ecf20Sopenharmony_ci __raw_writew(0x0, EEPROM_OP); /* read */ 6398c2ecf20Sopenharmony_ci __raw_writew(i*2, EEPROM_ADR); 6408c2ecf20Sopenharmony_ci __raw_writew(0x1, EEPROM_STRT); 6418c2ecf20Sopenharmony_ci if (!sh_eth_is_eeprom_ready()) 6428c2ecf20Sopenharmony_ci return; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_ci mac = __raw_readw(EEPROM_DATA); 6458c2ecf20Sopenharmony_ci sh_eth_plat.mac_addr[i << 1] = mac & 0xff; 6468c2ecf20Sopenharmony_ci sh_eth_plat.mac_addr[(i << 1) + 1] = mac >> 8; 6478c2ecf20Sopenharmony_ci } 6488c2ecf20Sopenharmony_ci} 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci#define SW4140 0xBA201000 6518c2ecf20Sopenharmony_ci#define FPGA_OUT 0xBA200400 6528c2ecf20Sopenharmony_ci#define PORT_HIZA 0xA4050158 6538c2ecf20Sopenharmony_ci#define PORT_MSELCRB 0xA4050182 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci#define SW41_A 0x0100 6568c2ecf20Sopenharmony_ci#define SW41_B 0x0200 6578c2ecf20Sopenharmony_ci#define SW41_C 0x0400 6588c2ecf20Sopenharmony_ci#define SW41_D 0x0800 6598c2ecf20Sopenharmony_ci#define SW41_E 0x1000 6608c2ecf20Sopenharmony_ci#define SW41_F 0x2000 6618c2ecf20Sopenharmony_ci#define SW41_G 0x4000 6628c2ecf20Sopenharmony_ci#define SW41_H 0x8000 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_ciextern char ms7724se_sdram_enter_start; 6658c2ecf20Sopenharmony_ciextern char ms7724se_sdram_enter_end; 6668c2ecf20Sopenharmony_ciextern char ms7724se_sdram_leave_start; 6678c2ecf20Sopenharmony_ciextern char ms7724se_sdram_leave_end; 6688c2ecf20Sopenharmony_ci 6698c2ecf20Sopenharmony_cistatic int __init arch_setup(void) 6708c2ecf20Sopenharmony_ci{ 6718c2ecf20Sopenharmony_ci /* enable I2C device */ 6728c2ecf20Sopenharmony_ci i2c_register_board_info(0, i2c0_devices, 6738c2ecf20Sopenharmony_ci ARRAY_SIZE(i2c0_devices)); 6748c2ecf20Sopenharmony_ci return 0; 6758c2ecf20Sopenharmony_ci} 6768c2ecf20Sopenharmony_ciarch_initcall(arch_setup); 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_cistatic int __init devices_setup(void) 6798c2ecf20Sopenharmony_ci{ 6808c2ecf20Sopenharmony_ci u16 sw = __raw_readw(SW4140); /* select camera, monitor */ 6818c2ecf20Sopenharmony_ci struct clk *clk; 6828c2ecf20Sopenharmony_ci u16 fpga_out; 6838c2ecf20Sopenharmony_ci 6848c2ecf20Sopenharmony_ci /* register board specific self-refresh code */ 6858c2ecf20Sopenharmony_ci sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 6868c2ecf20Sopenharmony_ci SUSP_SH_RSTANDBY, 6878c2ecf20Sopenharmony_ci &ms7724se_sdram_enter_start, 6888c2ecf20Sopenharmony_ci &ms7724se_sdram_enter_end, 6898c2ecf20Sopenharmony_ci &ms7724se_sdram_leave_start, 6908c2ecf20Sopenharmony_ci &ms7724se_sdram_leave_end); 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, 6938c2ecf20Sopenharmony_ci ARRAY_SIZE(fixed3v3_power_consumers), 3300000); 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci /* Reset Release */ 6968c2ecf20Sopenharmony_ci fpga_out = __raw_readw(FPGA_OUT); 6978c2ecf20Sopenharmony_ci /* bit4: NTSC_PDN, bit5: NTSC_RESET */ 6988c2ecf20Sopenharmony_ci fpga_out &= ~((1 << 1) | /* LAN */ 6998c2ecf20Sopenharmony_ci (1 << 4) | /* AK8813 PDN */ 7008c2ecf20Sopenharmony_ci (1 << 5) | /* AK8813 RESET */ 7018c2ecf20Sopenharmony_ci (1 << 6) | /* VIDEO DAC */ 7028c2ecf20Sopenharmony_ci (1 << 7) | /* AK4643 */ 7038c2ecf20Sopenharmony_ci (1 << 8) | /* IrDA */ 7048c2ecf20Sopenharmony_ci (1 << 12) | /* USB0 */ 7058c2ecf20Sopenharmony_ci (1 << 14)); /* RMII */ 7068c2ecf20Sopenharmony_ci __raw_writew(fpga_out | (1 << 4), FPGA_OUT); 7078c2ecf20Sopenharmony_ci 7088c2ecf20Sopenharmony_ci udelay(10); 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci /* AK8813 RESET */ 7118c2ecf20Sopenharmony_ci __raw_writew(fpga_out | (1 << 5), FPGA_OUT); 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ci udelay(10); 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci __raw_writew(fpga_out, FPGA_OUT); 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci /* turn on USB clocks, use external clock */ 7188c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_ci /* Let LED9 show STATUS2 */ 7218c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_STATUS2, NULL); 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_ci /* Lit LED10 show STATUS0 */ 7248c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_STATUS0, NULL); 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci /* Lit LED11 show PDSTATUS */ 7278c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_PDSTATUS, NULL); 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ci /* enable USB0 port */ 7308c2ecf20Sopenharmony_ci __raw_writew(0x0600, 0xa40501d4); 7318c2ecf20Sopenharmony_ci 7328c2ecf20Sopenharmony_ci /* enable USB1 port */ 7338c2ecf20Sopenharmony_ci __raw_writew(0x0600, 0xa4050192); 7348c2ecf20Sopenharmony_ci 7358c2ecf20Sopenharmony_ci /* enable IRQ 0,1,2 */ 7368c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 7378c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ1, NULL); 7388c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ2, NULL); 7398c2ecf20Sopenharmony_ci 7408c2ecf20Sopenharmony_ci /* enable SCIFA3 */ 7418c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_SCK, NULL); 7428c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_RXD, NULL); 7438c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_TXD, NULL); 7448c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_CTS, NULL); 7458c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_RTS, NULL); 7468c2ecf20Sopenharmony_ci 7478c2ecf20Sopenharmony_ci /* enable LCDC */ 7488c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD23, NULL); 7498c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD22, NULL); 7508c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD21, NULL); 7518c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD20, NULL); 7528c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD19, NULL); 7538c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD18, NULL); 7548c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD17, NULL); 7558c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD16, NULL); 7568c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD15, NULL); 7578c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD14, NULL); 7588c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD13, NULL); 7598c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD12, NULL); 7608c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD11, NULL); 7618c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD10, NULL); 7628c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD9, NULL); 7638c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD8, NULL); 7648c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD7, NULL); 7658c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD6, NULL); 7668c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD5, NULL); 7678c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD4, NULL); 7688c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD3, NULL); 7698c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD2, NULL); 7708c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD1, NULL); 7718c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD0, NULL); 7728c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDISP, NULL); 7738c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDHSYN, NULL); 7748c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDCK, NULL); 7758c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDVSYN, NULL); 7768c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDON, NULL); 7778c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDVEPWC, NULL); 7788c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDVCPWC, NULL); 7798c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDRD, NULL); 7808c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDLCLK, NULL); 7818c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 7828c2ecf20Sopenharmony_ci 7838c2ecf20Sopenharmony_ci /* enable CEU0 */ 7848c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D15, NULL); 7858c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D14, NULL); 7868c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D13, NULL); 7878c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D12, NULL); 7888c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D11, NULL); 7898c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D10, NULL); 7908c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D9, NULL); 7918c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D8, NULL); 7928c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D7, NULL); 7938c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D6, NULL); 7948c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D5, NULL); 7958c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D4, NULL); 7968c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D3, NULL); 7978c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D2, NULL); 7988c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D1, NULL); 7998c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D0, NULL); 8008c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_VD, NULL); 8018c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_CLK, NULL); 8028c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_FLD, NULL); 8038c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_HD, NULL); 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_ci /* enable CEU1 */ 8068c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D7, NULL); 8078c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D6, NULL); 8088c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D5, NULL); 8098c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D4, NULL); 8108c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D3, NULL); 8118c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D2, NULL); 8128c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D1, NULL); 8138c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D0, NULL); 8148c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_FLD, NULL); 8158c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_HD, NULL); 8168c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_VD, NULL); 8178c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_CLK, NULL); 8188c2ecf20Sopenharmony_ci 8198c2ecf20Sopenharmony_ci /* KEYSC */ 8208c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 8218c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 8228c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN4, NULL); 8238c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN3, NULL); 8248c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN2, NULL); 8258c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN1, NULL); 8268c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN0, NULL); 8278c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT3, NULL); 8288c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT2, NULL); 8298c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT1, NULL); 8308c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT0, NULL); 8318c2ecf20Sopenharmony_ci 8328c2ecf20Sopenharmony_ci /* enable FSI */ 8338c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIMCKA, NULL); 8348c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIASD, NULL); 8358c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOASD, NULL); 8368c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIABCK, NULL); 8378c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIALRCK, NULL); 8388c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOABCK, NULL); 8398c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOALRCK, NULL); 8408c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_CLKAUDIOAO, NULL); 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci /* set SPU2 clock to 83.4 MHz */ 8438c2ecf20Sopenharmony_ci clk = clk_get(NULL, "spu_clk"); 8448c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 8458c2ecf20Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 83333333)); 8468c2ecf20Sopenharmony_ci clk_put(clk); 8478c2ecf20Sopenharmony_ci } 8488c2ecf20Sopenharmony_ci 8498c2ecf20Sopenharmony_ci /* change parent of FSI A */ 8508c2ecf20Sopenharmony_ci clk = clk_get(NULL, "fsia_clk"); 8518c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 8528c2ecf20Sopenharmony_ci /* 48kHz dummy clock was used to make sure 1/1 divide */ 8538c2ecf20Sopenharmony_ci clk_set_rate(&sh7724_fsimcka_clk, 48000); 8548c2ecf20Sopenharmony_ci clk_set_parent(clk, &sh7724_fsimcka_clk); 8558c2ecf20Sopenharmony_ci clk_set_rate(clk, 48000); 8568c2ecf20Sopenharmony_ci clk_put(clk); 8578c2ecf20Sopenharmony_ci } 8588c2ecf20Sopenharmony_ci 8598c2ecf20Sopenharmony_ci /* SDHI0 connected to cn7 */ 8608c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CD, NULL); 8618c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0WP, NULL); 8628c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D3, NULL); 8638c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D2, NULL); 8648c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D1, NULL); 8658c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D0, NULL); 8668c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CMD, NULL); 8678c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CLK, NULL); 8688c2ecf20Sopenharmony_ci 8698c2ecf20Sopenharmony_ci /* SDHI1 connected to cn8 */ 8708c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CD, NULL); 8718c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1WP, NULL); 8728c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D3, NULL); 8738c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D2, NULL); 8748c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D1, NULL); 8758c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D0, NULL); 8768c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CMD, NULL); 8778c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CLK, NULL); 8788c2ecf20Sopenharmony_ci 8798c2ecf20Sopenharmony_ci /* enable IrDA */ 8808c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_IRDA_OUT, NULL); 8818c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_IRDA_IN, NULL); 8828c2ecf20Sopenharmony_ci 8838c2ecf20Sopenharmony_ci /* 8848c2ecf20Sopenharmony_ci * enable SH-Eth 8858c2ecf20Sopenharmony_ci * 8868c2ecf20Sopenharmony_ci * please remove J33 pin from your board !! 8878c2ecf20Sopenharmony_ci * 8888c2ecf20Sopenharmony_ci * ms7724 board should not use GPIO_FN_LNKSTA pin 8898c2ecf20Sopenharmony_ci * So, This time PTX5 is set to input pin 8908c2ecf20Sopenharmony_ci */ 8918c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD0, NULL); 8928c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD1, NULL); 8938c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD0, NULL); 8948c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD1, NULL); 8958c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 8968c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TX_EN, NULL); 8978c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RX_ER, NULL); 8988c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 8998c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MDIO, NULL); 9008c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MDC, NULL); 9018c2ecf20Sopenharmony_ci gpio_request(GPIO_PTX5, NULL); 9028c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTX5); 9038c2ecf20Sopenharmony_ci sh_eth_init(); 9048c2ecf20Sopenharmony_ci 9058c2ecf20Sopenharmony_ci if (sw & SW41_B) { 9068c2ecf20Sopenharmony_ci /* 720p */ 9078c2ecf20Sopenharmony_ci lcdc_info.ch[0].lcd_modes = lcdc_720p_modes; 9088c2ecf20Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_720p_modes); 9098c2ecf20Sopenharmony_ci } else { 9108c2ecf20Sopenharmony_ci /* VGA */ 9118c2ecf20Sopenharmony_ci lcdc_info.ch[0].lcd_modes = lcdc_vga_modes; 9128c2ecf20Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_vga_modes); 9138c2ecf20Sopenharmony_ci } 9148c2ecf20Sopenharmony_ci 9158c2ecf20Sopenharmony_ci if (sw & SW41_A) { 9168c2ecf20Sopenharmony_ci /* Digital monitor */ 9178c2ecf20Sopenharmony_ci lcdc_info.ch[0].interface_type = RGB18; 9188c2ecf20Sopenharmony_ci lcdc_info.ch[0].flags = 0; 9198c2ecf20Sopenharmony_ci } else { 9208c2ecf20Sopenharmony_ci /* Analog monitor */ 9218c2ecf20Sopenharmony_ci lcdc_info.ch[0].interface_type = RGB24; 9228c2ecf20Sopenharmony_ci lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL; 9238c2ecf20Sopenharmony_ci } 9248c2ecf20Sopenharmony_ci 9258c2ecf20Sopenharmony_ci /* VOU */ 9268c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D15, NULL); 9278c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D14, NULL); 9288c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D13, NULL); 9298c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D12, NULL); 9308c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D11, NULL); 9318c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D10, NULL); 9328c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D9, NULL); 9338c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D8, NULL); 9348c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_CLKI, NULL); 9358c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_CLK, NULL); 9368c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_VSYNC, NULL); 9378c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_HSYNC, NULL); 9388c2ecf20Sopenharmony_ci 9398c2ecf20Sopenharmony_ci /* Initialize CEU platform devices separately to map memory first */ 9408c2ecf20Sopenharmony_ci device_initialize(&ms7724se_ceu_devices[0]->dev); 9418c2ecf20Sopenharmony_ci dma_declare_coherent_memory(&ms7724se_ceu_devices[0]->dev, 9428c2ecf20Sopenharmony_ci ceu0_dma_membase, ceu0_dma_membase, 9438c2ecf20Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 9448c2ecf20Sopenharmony_ci platform_device_add(ms7724se_ceu_devices[0]); 9458c2ecf20Sopenharmony_ci 9468c2ecf20Sopenharmony_ci device_initialize(&ms7724se_ceu_devices[1]->dev); 9478c2ecf20Sopenharmony_ci dma_declare_coherent_memory(&ms7724se_ceu_devices[1]->dev, 9488c2ecf20Sopenharmony_ci ceu1_dma_membase, ceu1_dma_membase, 9498c2ecf20Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 9508c2ecf20Sopenharmony_ci platform_device_add(ms7724se_ceu_devices[1]); 9518c2ecf20Sopenharmony_ci 9528c2ecf20Sopenharmony_ci return platform_add_devices(ms7724se_devices, 9538c2ecf20Sopenharmony_ci ARRAY_SIZE(ms7724se_devices)); 9548c2ecf20Sopenharmony_ci} 9558c2ecf20Sopenharmony_cidevice_initcall(devices_setup); 9568c2ecf20Sopenharmony_ci 9578c2ecf20Sopenharmony_ci/* Reserve a portion of memory for CEU 0 and CEU 1 buffers */ 9588c2ecf20Sopenharmony_cistatic void __init ms7724se_mv_mem_reserve(void) 9598c2ecf20Sopenharmony_ci{ 9608c2ecf20Sopenharmony_ci phys_addr_t phys; 9618c2ecf20Sopenharmony_ci phys_addr_t size = CEU_BUFFER_MEMORY_SIZE; 9628c2ecf20Sopenharmony_ci 9638c2ecf20Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 9648c2ecf20Sopenharmony_ci if (!phys) 9658c2ecf20Sopenharmony_ci panic("Failed to allocate CEU0 memory\n"); 9668c2ecf20Sopenharmony_ci 9678c2ecf20Sopenharmony_ci memblock_free(phys, size); 9688c2ecf20Sopenharmony_ci memblock_remove(phys, size); 9698c2ecf20Sopenharmony_ci ceu0_dma_membase = phys; 9708c2ecf20Sopenharmony_ci 9718c2ecf20Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 9728c2ecf20Sopenharmony_ci if (!phys) 9738c2ecf20Sopenharmony_ci panic("Failed to allocate CEU1 memory\n"); 9748c2ecf20Sopenharmony_ci 9758c2ecf20Sopenharmony_ci memblock_free(phys, size); 9768c2ecf20Sopenharmony_ci memblock_remove(phys, size); 9778c2ecf20Sopenharmony_ci ceu1_dma_membase = phys; 9788c2ecf20Sopenharmony_ci} 9798c2ecf20Sopenharmony_ci 9808c2ecf20Sopenharmony_cistatic struct sh_machine_vector mv_ms7724se __initmv = { 9818c2ecf20Sopenharmony_ci .mv_name = "ms7724se", 9828c2ecf20Sopenharmony_ci .mv_init_irq = init_se7724_IRQ, 9838c2ecf20Sopenharmony_ci .mv_mem_reserve = ms7724se_mv_mem_reserve, 9848c2ecf20Sopenharmony_ci}; 985