162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/sh/boards/se/7724/setup.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2009 Renesas Solutions Corp. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Kuninori Morimoto <morimoto.kuninori@renesas.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <asm/clock.h> 1062306a36Sopenharmony_ci#include <asm/heartbeat.h> 1162306a36Sopenharmony_ci#include <asm/io.h> 1262306a36Sopenharmony_ci#include <asm/suspend.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <cpu/sh7724.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/delay.h> 1762306a36Sopenharmony_ci#include <linux/device.h> 1862306a36Sopenharmony_ci#include <linux/gpio.h> 1962306a36Sopenharmony_ci#include <linux/init.h> 2062306a36Sopenharmony_ci#include <linux/input.h> 2162306a36Sopenharmony_ci#include <linux/input/sh_keysc.h> 2262306a36Sopenharmony_ci#include <linux/interrupt.h> 2362306a36Sopenharmony_ci#include <linux/memblock.h> 2462306a36Sopenharmony_ci#include <linux/mfd/tmio.h> 2562306a36Sopenharmony_ci#include <linux/mmc/host.h> 2662306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 2762306a36Sopenharmony_ci#include <linux/platform_device.h> 2862306a36Sopenharmony_ci#include <linux/regulator/fixed.h> 2962306a36Sopenharmony_ci#include <linux/regulator/machine.h> 3062306a36Sopenharmony_ci#include <linux/sh_eth.h> 3162306a36Sopenharmony_ci#include <linux/sh_intc.h> 3262306a36Sopenharmony_ci#include <linux/smc91x.h> 3362306a36Sopenharmony_ci#include <linux/usb/r8a66597.h> 3462306a36Sopenharmony_ci#include <linux/videodev2.h> 3562306a36Sopenharmony_ci#include <linux/dma-map-ops.h> 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include <mach-se/mach/se7724.h> 3862306a36Sopenharmony_ci#include <media/drv-intf/renesas-ceu.h> 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#include <sound/sh_fsi.h> 4162306a36Sopenharmony_ci#include <sound/simple_card.h> 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#include <video/sh_mobile_lcdc.h> 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define CEU_BUFFER_MEMORY_SIZE (4 << 20) 4662306a36Sopenharmony_cistatic phys_addr_t ceu0_dma_membase; 4762306a36Sopenharmony_cistatic phys_addr_t ceu1_dma_membase; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * SWx 1234 5678 5162306a36Sopenharmony_ci * ------------------------------------ 5262306a36Sopenharmony_ci * SW31 : 1001 1100 : default 5362306a36Sopenharmony_ci * SW32 : 0111 1111 : use on board flash 5462306a36Sopenharmony_ci * 5562306a36Sopenharmony_ci * SW41 : abxx xxxx -> a = 0 : Analog monitor 5662306a36Sopenharmony_ci * 1 : Digital monitor 5762306a36Sopenharmony_ci * b = 0 : VGA 5862306a36Sopenharmony_ci * 1 : 720p 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* 6262306a36Sopenharmony_ci * about 720p 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * When you use 1280 x 720 lcdc output, 6562306a36Sopenharmony_ci * you should change OSC6 lcdc clock from 25.175MHz to 74.25MHz, 6662306a36Sopenharmony_ci * and change SW41 to use 720p 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 7062306a36Sopenharmony_ci * about sound 7162306a36Sopenharmony_ci * 7262306a36Sopenharmony_ci * This setup.c supports FSI slave mode. 7362306a36Sopenharmony_ci * Please change J20, J21, J22 pin to 1-2 connection. 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* Heartbeat */ 7762306a36Sopenharmony_cistatic struct resource heartbeat_resource = { 7862306a36Sopenharmony_ci .start = PA_LED, 7962306a36Sopenharmony_ci .end = PA_LED, 8062306a36Sopenharmony_ci .flags = IORESOURCE_MEM | IORESOURCE_MEM_16BIT, 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic struct platform_device heartbeat_device = { 8462306a36Sopenharmony_ci .name = "heartbeat", 8562306a36Sopenharmony_ci .id = -1, 8662306a36Sopenharmony_ci .num_resources = 1, 8762306a36Sopenharmony_ci .resource = &heartbeat_resource, 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* LAN91C111 */ 9162306a36Sopenharmony_cistatic struct smc91x_platdata smc91x_info = { 9262306a36Sopenharmony_ci .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic struct resource smc91x_eth_resources[] = { 9662306a36Sopenharmony_ci [0] = { 9762306a36Sopenharmony_ci .name = "SMC91C111" , 9862306a36Sopenharmony_ci .start = 0x1a300300, 9962306a36Sopenharmony_ci .end = 0x1a30030f, 10062306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 10162306a36Sopenharmony_ci }, 10262306a36Sopenharmony_ci [1] = { 10362306a36Sopenharmony_ci .start = IRQ0_SMC, 10462306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 10562306a36Sopenharmony_ci }, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic struct platform_device smc91x_eth_device = { 10962306a36Sopenharmony_ci .name = "smc91x", 11062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(smc91x_eth_resources), 11162306a36Sopenharmony_ci .resource = smc91x_eth_resources, 11262306a36Sopenharmony_ci .dev = { 11362306a36Sopenharmony_ci .platform_data = &smc91x_info, 11462306a36Sopenharmony_ci }, 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* MTD */ 11862306a36Sopenharmony_cistatic struct mtd_partition nor_flash_partitions[] = { 11962306a36Sopenharmony_ci { 12062306a36Sopenharmony_ci .name = "uboot", 12162306a36Sopenharmony_ci .offset = 0, 12262306a36Sopenharmony_ci .size = (1 * 1024 * 1024), 12362306a36Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* Read-only */ 12462306a36Sopenharmony_ci }, { 12562306a36Sopenharmony_ci .name = "kernel", 12662306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 12762306a36Sopenharmony_ci .size = (2 * 1024 * 1024), 12862306a36Sopenharmony_ci }, { 12962306a36Sopenharmony_ci .name = "free-area", 13062306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 13162306a36Sopenharmony_ci .size = MTDPART_SIZ_FULL, 13262306a36Sopenharmony_ci }, 13362306a36Sopenharmony_ci}; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistatic struct physmap_flash_data nor_flash_data = { 13662306a36Sopenharmony_ci .width = 2, 13762306a36Sopenharmony_ci .parts = nor_flash_partitions, 13862306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(nor_flash_partitions), 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic struct resource nor_flash_resources[] = { 14262306a36Sopenharmony_ci [0] = { 14362306a36Sopenharmony_ci .name = "NOR Flash", 14462306a36Sopenharmony_ci .start = 0x00000000, 14562306a36Sopenharmony_ci .end = 0x01ffffff, 14662306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic struct platform_device nor_flash_device = { 15162306a36Sopenharmony_ci .name = "physmap-flash", 15262306a36Sopenharmony_ci .resource = nor_flash_resources, 15362306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(nor_flash_resources), 15462306a36Sopenharmony_ci .dev = { 15562306a36Sopenharmony_ci .platform_data = &nor_flash_data, 15662306a36Sopenharmony_ci }, 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci/* LCDC */ 16062306a36Sopenharmony_cistatic const struct fb_videomode lcdc_720p_modes[] = { 16162306a36Sopenharmony_ci { 16262306a36Sopenharmony_ci .name = "LB070WV1", 16362306a36Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 16462306a36Sopenharmony_ci .xres = 1280, 16562306a36Sopenharmony_ci .yres = 720, 16662306a36Sopenharmony_ci .left_margin = 220, 16762306a36Sopenharmony_ci .right_margin = 110, 16862306a36Sopenharmony_ci .hsync_len = 40, 16962306a36Sopenharmony_ci .upper_margin = 20, 17062306a36Sopenharmony_ci .lower_margin = 5, 17162306a36Sopenharmony_ci .vsync_len = 5, 17262306a36Sopenharmony_ci }, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic const struct fb_videomode lcdc_vga_modes[] = { 17662306a36Sopenharmony_ci { 17762306a36Sopenharmony_ci .name = "LB070WV1", 17862306a36Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 17962306a36Sopenharmony_ci .xres = 640, 18062306a36Sopenharmony_ci .yres = 480, 18162306a36Sopenharmony_ci .left_margin = 105, 18262306a36Sopenharmony_ci .right_margin = 50, 18362306a36Sopenharmony_ci .hsync_len = 96, 18462306a36Sopenharmony_ci .upper_margin = 33, 18562306a36Sopenharmony_ci .lower_margin = 10, 18662306a36Sopenharmony_ci .vsync_len = 2, 18762306a36Sopenharmony_ci }, 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic struct sh_mobile_lcdc_info lcdc_info = { 19162306a36Sopenharmony_ci .clock_source = LCDC_CLK_EXTERNAL, 19262306a36Sopenharmony_ci .ch[0] = { 19362306a36Sopenharmony_ci .chan = LCDC_CHAN_MAINLCD, 19462306a36Sopenharmony_ci .fourcc = V4L2_PIX_FMT_RGB565, 19562306a36Sopenharmony_ci .clock_divider = 1, 19662306a36Sopenharmony_ci .panel_cfg = { /* 7.0 inch */ 19762306a36Sopenharmony_ci .width = 152, 19862306a36Sopenharmony_ci .height = 91, 19962306a36Sopenharmony_ci }, 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic struct resource lcdc_resources[] = { 20462306a36Sopenharmony_ci [0] = { 20562306a36Sopenharmony_ci .name = "LCDC", 20662306a36Sopenharmony_ci .start = 0xfe940000, 20762306a36Sopenharmony_ci .end = 0xfe942fff, 20862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 20962306a36Sopenharmony_ci }, 21062306a36Sopenharmony_ci [1] = { 21162306a36Sopenharmony_ci .start = evt2irq(0xf40), 21262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 21362306a36Sopenharmony_ci }, 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic struct platform_device lcdc_device = { 21762306a36Sopenharmony_ci .name = "sh_mobile_lcdc_fb", 21862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(lcdc_resources), 21962306a36Sopenharmony_ci .resource = lcdc_resources, 22062306a36Sopenharmony_ci .dev = { 22162306a36Sopenharmony_ci .platform_data = &lcdc_info, 22262306a36Sopenharmony_ci }, 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/* CEU0 */ 22662306a36Sopenharmony_cistatic struct ceu_platform_data ceu0_pdata = { 22762306a36Sopenharmony_ci .num_subdevs = 0, 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic struct resource ceu0_resources[] = { 23162306a36Sopenharmony_ci [0] = { 23262306a36Sopenharmony_ci .name = "CEU0", 23362306a36Sopenharmony_ci .start = 0xfe910000, 23462306a36Sopenharmony_ci .end = 0xfe91009f, 23562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 23662306a36Sopenharmony_ci }, 23762306a36Sopenharmony_ci [1] = { 23862306a36Sopenharmony_ci .start = evt2irq(0x880), 23962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 24062306a36Sopenharmony_ci }, 24162306a36Sopenharmony_ci}; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic struct platform_device ceu0_device = { 24462306a36Sopenharmony_ci .name = "renesas-ceu", 24562306a36Sopenharmony_ci .id = 0, /* "ceu.0" clock */ 24662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu0_resources), 24762306a36Sopenharmony_ci .resource = ceu0_resources, 24862306a36Sopenharmony_ci .dev = { 24962306a36Sopenharmony_ci .platform_data = &ceu0_pdata, 25062306a36Sopenharmony_ci }, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* CEU1 */ 25462306a36Sopenharmony_cistatic struct ceu_platform_data ceu1_pdata = { 25562306a36Sopenharmony_ci .num_subdevs = 0, 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic struct resource ceu1_resources[] = { 25962306a36Sopenharmony_ci [0] = { 26062306a36Sopenharmony_ci .name = "CEU1", 26162306a36Sopenharmony_ci .start = 0xfe914000, 26262306a36Sopenharmony_ci .end = 0xfe91409f, 26362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 26462306a36Sopenharmony_ci }, 26562306a36Sopenharmony_ci [1] = { 26662306a36Sopenharmony_ci .start = evt2irq(0x9e0), 26762306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 26862306a36Sopenharmony_ci }, 26962306a36Sopenharmony_ci}; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_cistatic struct platform_device ceu1_device = { 27262306a36Sopenharmony_ci .name = "renesas-ceu", 27362306a36Sopenharmony_ci .id = 1, /* "ceu.1" clock */ 27462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu1_resources), 27562306a36Sopenharmony_ci .resource = ceu1_resources, 27662306a36Sopenharmony_ci .dev = { 27762306a36Sopenharmony_ci .platform_data = &ceu1_pdata, 27862306a36Sopenharmony_ci }, 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/* FSI */ 28262306a36Sopenharmony_ci/* change J20, J21, J22 pin to 1-2 connection to use slave mode */ 28362306a36Sopenharmony_cistatic struct resource fsi_resources[] = { 28462306a36Sopenharmony_ci [0] = { 28562306a36Sopenharmony_ci .name = "FSI", 28662306a36Sopenharmony_ci .start = 0xFE3C0000, 28762306a36Sopenharmony_ci .end = 0xFE3C021d, 28862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 28962306a36Sopenharmony_ci }, 29062306a36Sopenharmony_ci [1] = { 29162306a36Sopenharmony_ci .start = evt2irq(0xf80), 29262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 29362306a36Sopenharmony_ci }, 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic struct platform_device fsi_device = { 29762306a36Sopenharmony_ci .name = "sh_fsi", 29862306a36Sopenharmony_ci .id = 0, 29962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(fsi_resources), 30062306a36Sopenharmony_ci .resource = fsi_resources, 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistatic struct asoc_simple_card_info fsi_ak4642_info = { 30462306a36Sopenharmony_ci .name = "AK4642", 30562306a36Sopenharmony_ci .card = "FSIA-AK4642", 30662306a36Sopenharmony_ci .codec = "ak4642-codec.0-0012", 30762306a36Sopenharmony_ci .platform = "sh_fsi.0", 30862306a36Sopenharmony_ci .daifmt = SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBP_CFP, 30962306a36Sopenharmony_ci .cpu_dai = { 31062306a36Sopenharmony_ci .name = "fsia-dai", 31162306a36Sopenharmony_ci }, 31262306a36Sopenharmony_ci .codec_dai = { 31362306a36Sopenharmony_ci .name = "ak4642-hifi", 31462306a36Sopenharmony_ci .sysclk = 11289600, 31562306a36Sopenharmony_ci }, 31662306a36Sopenharmony_ci}; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic struct platform_device fsi_ak4642_device = { 31962306a36Sopenharmony_ci .name = "asoc-simple-card", 32062306a36Sopenharmony_ci .dev = { 32162306a36Sopenharmony_ci .platform_data = &fsi_ak4642_info, 32262306a36Sopenharmony_ci }, 32362306a36Sopenharmony_ci}; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci/* KEYSC in SoC (Needs SW33-2 set to ON) */ 32662306a36Sopenharmony_cistatic struct sh_keysc_info keysc_info = { 32762306a36Sopenharmony_ci .mode = SH_KEYSC_MODE_1, 32862306a36Sopenharmony_ci .scan_timing = 3, 32962306a36Sopenharmony_ci .delay = 50, 33062306a36Sopenharmony_ci .keycodes = { 33162306a36Sopenharmony_ci KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, 33262306a36Sopenharmony_ci KEY_6, KEY_7, KEY_8, KEY_9, KEY_A, 33362306a36Sopenharmony_ci KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, 33462306a36Sopenharmony_ci KEY_G, KEY_H, KEY_I, KEY_K, KEY_L, 33562306a36Sopenharmony_ci KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, 33662306a36Sopenharmony_ci KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, 33762306a36Sopenharmony_ci }, 33862306a36Sopenharmony_ci}; 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic struct resource keysc_resources[] = { 34162306a36Sopenharmony_ci [0] = { 34262306a36Sopenharmony_ci .name = "KEYSC", 34362306a36Sopenharmony_ci .start = 0x044b0000, 34462306a36Sopenharmony_ci .end = 0x044b000f, 34562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 34662306a36Sopenharmony_ci }, 34762306a36Sopenharmony_ci [1] = { 34862306a36Sopenharmony_ci .start = evt2irq(0xbe0), 34962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 35062306a36Sopenharmony_ci }, 35162306a36Sopenharmony_ci}; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic struct platform_device keysc_device = { 35462306a36Sopenharmony_ci .name = "sh_keysc", 35562306a36Sopenharmony_ci .id = 0, /* "keysc0" clock */ 35662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(keysc_resources), 35762306a36Sopenharmony_ci .resource = keysc_resources, 35862306a36Sopenharmony_ci .dev = { 35962306a36Sopenharmony_ci .platform_data = &keysc_info, 36062306a36Sopenharmony_ci }, 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci/* SH Eth */ 36462306a36Sopenharmony_cistatic struct resource sh_eth_resources[] = { 36562306a36Sopenharmony_ci [0] = { 36662306a36Sopenharmony_ci .start = SH_ETH_ADDR, 36762306a36Sopenharmony_ci .end = SH_ETH_ADDR + 0x1FC - 1, 36862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 36962306a36Sopenharmony_ci }, 37062306a36Sopenharmony_ci [1] = { 37162306a36Sopenharmony_ci .start = evt2irq(0xd60), 37262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 37362306a36Sopenharmony_ci }, 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic struct sh_eth_plat_data sh_eth_plat = { 37762306a36Sopenharmony_ci .phy = 0x1f, /* SMSC LAN8187 */ 37862306a36Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 37962306a36Sopenharmony_ci}; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic struct platform_device sh_eth_device = { 38262306a36Sopenharmony_ci .name = "sh7724-ether", 38362306a36Sopenharmony_ci .id = 0, 38462306a36Sopenharmony_ci .dev = { 38562306a36Sopenharmony_ci .platform_data = &sh_eth_plat, 38662306a36Sopenharmony_ci }, 38762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth_resources), 38862306a36Sopenharmony_ci .resource = sh_eth_resources, 38962306a36Sopenharmony_ci}; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistatic struct r8a66597_platdata sh7724_usb0_host_data = { 39262306a36Sopenharmony_ci .on_chip = 1, 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic struct resource sh7724_usb0_host_resources[] = { 39662306a36Sopenharmony_ci [0] = { 39762306a36Sopenharmony_ci .start = 0xa4d80000, 39862306a36Sopenharmony_ci .end = 0xa4d80124 - 1, 39962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 40062306a36Sopenharmony_ci }, 40162306a36Sopenharmony_ci [1] = { 40262306a36Sopenharmony_ci .start = evt2irq(0xa20), 40362306a36Sopenharmony_ci .end = evt2irq(0xa20), 40462306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 40562306a36Sopenharmony_ci }, 40662306a36Sopenharmony_ci}; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic struct platform_device sh7724_usb0_host_device = { 40962306a36Sopenharmony_ci .name = "r8a66597_hcd", 41062306a36Sopenharmony_ci .id = 0, 41162306a36Sopenharmony_ci .dev = { 41262306a36Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 41362306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 41462306a36Sopenharmony_ci .platform_data = &sh7724_usb0_host_data, 41562306a36Sopenharmony_ci }, 41662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh7724_usb0_host_resources), 41762306a36Sopenharmony_ci .resource = sh7724_usb0_host_resources, 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic struct r8a66597_platdata sh7724_usb1_gadget_data = { 42162306a36Sopenharmony_ci .on_chip = 1, 42262306a36Sopenharmony_ci}; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistatic struct resource sh7724_usb1_gadget_resources[] = { 42562306a36Sopenharmony_ci [0] = { 42662306a36Sopenharmony_ci .start = 0xa4d90000, 42762306a36Sopenharmony_ci .end = 0xa4d90123, 42862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 42962306a36Sopenharmony_ci }, 43062306a36Sopenharmony_ci [1] = { 43162306a36Sopenharmony_ci .start = evt2irq(0xa40), 43262306a36Sopenharmony_ci .end = evt2irq(0xa40), 43362306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 43462306a36Sopenharmony_ci }, 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic struct platform_device sh7724_usb1_gadget_device = { 43862306a36Sopenharmony_ci .name = "r8a66597_udc", 43962306a36Sopenharmony_ci .id = 1, /* USB1 */ 44062306a36Sopenharmony_ci .dev = { 44162306a36Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 44262306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 44362306a36Sopenharmony_ci .platform_data = &sh7724_usb1_gadget_data, 44462306a36Sopenharmony_ci }, 44562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh7724_usb1_gadget_resources), 44662306a36Sopenharmony_ci .resource = sh7724_usb1_gadget_resources, 44762306a36Sopenharmony_ci}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci/* Fixed 3.3V regulator to be used by SDHI0, SDHI1 */ 45062306a36Sopenharmony_cistatic struct regulator_consumer_supply fixed3v3_power_consumers[] = 45162306a36Sopenharmony_ci{ 45262306a36Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 45362306a36Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 45462306a36Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 45562306a36Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 45662306a36Sopenharmony_ci}; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistatic struct resource sdhi0_cn7_resources[] = { 45962306a36Sopenharmony_ci [0] = { 46062306a36Sopenharmony_ci .name = "SDHI0", 46162306a36Sopenharmony_ci .start = 0x04ce0000, 46262306a36Sopenharmony_ci .end = 0x04ce00ff, 46362306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 46462306a36Sopenharmony_ci }, 46562306a36Sopenharmony_ci [1] = { 46662306a36Sopenharmony_ci .start = evt2irq(0xe80), 46762306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 46862306a36Sopenharmony_ci }, 46962306a36Sopenharmony_ci}; 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_cistatic struct tmio_mmc_data sh7724_sdhi0_data = { 47262306a36Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX, 47362306a36Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX, 47462306a36Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ, 47562306a36Sopenharmony_ci}; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic struct platform_device sdhi0_cn7_device = { 47862306a36Sopenharmony_ci .name = "sh_mobile_sdhi", 47962306a36Sopenharmony_ci .id = 0, 48062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi0_cn7_resources), 48162306a36Sopenharmony_ci .resource = sdhi0_cn7_resources, 48262306a36Sopenharmony_ci .dev = { 48362306a36Sopenharmony_ci .platform_data = &sh7724_sdhi0_data, 48462306a36Sopenharmony_ci }, 48562306a36Sopenharmony_ci}; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_cistatic struct resource sdhi1_cn8_resources[] = { 48862306a36Sopenharmony_ci [0] = { 48962306a36Sopenharmony_ci .name = "SDHI1", 49062306a36Sopenharmony_ci .start = 0x04cf0000, 49162306a36Sopenharmony_ci .end = 0x04cf00ff, 49262306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 49362306a36Sopenharmony_ci }, 49462306a36Sopenharmony_ci [1] = { 49562306a36Sopenharmony_ci .start = evt2irq(0x4e0), 49662306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 49762306a36Sopenharmony_ci }, 49862306a36Sopenharmony_ci}; 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_cistatic struct tmio_mmc_data sh7724_sdhi1_data = { 50162306a36Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI1_TX, 50262306a36Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX, 50362306a36Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ, 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistatic struct platform_device sdhi1_cn8_device = { 50762306a36Sopenharmony_ci .name = "sh_mobile_sdhi", 50862306a36Sopenharmony_ci .id = 1, 50962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi1_cn8_resources), 51062306a36Sopenharmony_ci .resource = sdhi1_cn8_resources, 51162306a36Sopenharmony_ci .dev = { 51262306a36Sopenharmony_ci .platform_data = &sh7724_sdhi1_data, 51362306a36Sopenharmony_ci }, 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci/* IrDA */ 51762306a36Sopenharmony_cistatic struct resource irda_resources[] = { 51862306a36Sopenharmony_ci [0] = { 51962306a36Sopenharmony_ci .name = "IrDA", 52062306a36Sopenharmony_ci .start = 0xA45D0000, 52162306a36Sopenharmony_ci .end = 0xA45D0049, 52262306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 52362306a36Sopenharmony_ci }, 52462306a36Sopenharmony_ci [1] = { 52562306a36Sopenharmony_ci .start = evt2irq(0x480), 52662306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 52762306a36Sopenharmony_ci }, 52862306a36Sopenharmony_ci}; 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistatic struct platform_device irda_device = { 53162306a36Sopenharmony_ci .name = "sh_sir", 53262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(irda_resources), 53362306a36Sopenharmony_ci .resource = irda_resources, 53462306a36Sopenharmony_ci}; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci#include <media/i2c/ak881x.h> 53762306a36Sopenharmony_ci#include <media/drv-intf/sh_vou.h> 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistatic struct ak881x_pdata ak881x_pdata = { 54062306a36Sopenharmony_ci .flags = AK881X_IF_MODE_SLAVE, 54162306a36Sopenharmony_ci}; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_cistatic struct i2c_board_info ak8813 = { 54462306a36Sopenharmony_ci /* With open J18 jumper address is 0x21 */ 54562306a36Sopenharmony_ci I2C_BOARD_INFO("ak8813", 0x20), 54662306a36Sopenharmony_ci .platform_data = &ak881x_pdata, 54762306a36Sopenharmony_ci}; 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_cistatic struct sh_vou_pdata sh_vou_pdata = { 55062306a36Sopenharmony_ci .bus_fmt = SH_VOU_BUS_8BIT, 55162306a36Sopenharmony_ci .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 55262306a36Sopenharmony_ci .board_info = &ak8813, 55362306a36Sopenharmony_ci .i2c_adap = 0, 55462306a36Sopenharmony_ci}; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic struct resource sh_vou_resources[] = { 55762306a36Sopenharmony_ci [0] = { 55862306a36Sopenharmony_ci .start = 0xfe960000, 55962306a36Sopenharmony_ci .end = 0xfe962043, 56062306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 56162306a36Sopenharmony_ci }, 56262306a36Sopenharmony_ci [1] = { 56362306a36Sopenharmony_ci .start = evt2irq(0x8e0), 56462306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 56562306a36Sopenharmony_ci }, 56662306a36Sopenharmony_ci}; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistatic struct platform_device vou_device = { 56962306a36Sopenharmony_ci .name = "sh-vou", 57062306a36Sopenharmony_ci .id = -1, 57162306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_vou_resources), 57262306a36Sopenharmony_ci .resource = sh_vou_resources, 57362306a36Sopenharmony_ci .dev = { 57462306a36Sopenharmony_ci .platform_data = &sh_vou_pdata, 57562306a36Sopenharmony_ci }, 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_cistatic struct platform_device *ms7724se_ceu_devices[] __initdata = { 57962306a36Sopenharmony_ci &ceu0_device, 58062306a36Sopenharmony_ci &ceu1_device, 58162306a36Sopenharmony_ci}; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_cistatic struct platform_device *ms7724se_devices[] __initdata = { 58462306a36Sopenharmony_ci &heartbeat_device, 58562306a36Sopenharmony_ci &smc91x_eth_device, 58662306a36Sopenharmony_ci &lcdc_device, 58762306a36Sopenharmony_ci &nor_flash_device, 58862306a36Sopenharmony_ci &keysc_device, 58962306a36Sopenharmony_ci &sh_eth_device, 59062306a36Sopenharmony_ci &sh7724_usb0_host_device, 59162306a36Sopenharmony_ci &sh7724_usb1_gadget_device, 59262306a36Sopenharmony_ci &fsi_device, 59362306a36Sopenharmony_ci &fsi_ak4642_device, 59462306a36Sopenharmony_ci &sdhi0_cn7_device, 59562306a36Sopenharmony_ci &sdhi1_cn8_device, 59662306a36Sopenharmony_ci &irda_device, 59762306a36Sopenharmony_ci &vou_device, 59862306a36Sopenharmony_ci}; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci/* I2C device */ 60162306a36Sopenharmony_cistatic struct i2c_board_info i2c0_devices[] = { 60262306a36Sopenharmony_ci { 60362306a36Sopenharmony_ci I2C_BOARD_INFO("ak4642", 0x12), 60462306a36Sopenharmony_ci }, 60562306a36Sopenharmony_ci}; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci#define EEPROM_OP 0xBA206000 60862306a36Sopenharmony_ci#define EEPROM_ADR 0xBA206004 60962306a36Sopenharmony_ci#define EEPROM_DATA 0xBA20600C 61062306a36Sopenharmony_ci#define EEPROM_STAT 0xBA206010 61162306a36Sopenharmony_ci#define EEPROM_STRT 0xBA206014 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistatic int __init sh_eth_is_eeprom_ready(void) 61462306a36Sopenharmony_ci{ 61562306a36Sopenharmony_ci int t = 10000; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci while (t--) { 61862306a36Sopenharmony_ci if (!__raw_readw(EEPROM_STAT)) 61962306a36Sopenharmony_ci return 1; 62062306a36Sopenharmony_ci udelay(1); 62162306a36Sopenharmony_ci } 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci printk(KERN_ERR "ms7724se can not access to eeprom\n"); 62462306a36Sopenharmony_ci return 0; 62562306a36Sopenharmony_ci} 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_cistatic void __init sh_eth_init(void) 62862306a36Sopenharmony_ci{ 62962306a36Sopenharmony_ci int i; 63062306a36Sopenharmony_ci u16 mac; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci /* check EEPROM status */ 63362306a36Sopenharmony_ci if (!sh_eth_is_eeprom_ready()) 63462306a36Sopenharmony_ci return; 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci /* read MAC addr from EEPROM */ 63762306a36Sopenharmony_ci for (i = 0 ; i < 3 ; i++) { 63862306a36Sopenharmony_ci __raw_writew(0x0, EEPROM_OP); /* read */ 63962306a36Sopenharmony_ci __raw_writew(i*2, EEPROM_ADR); 64062306a36Sopenharmony_ci __raw_writew(0x1, EEPROM_STRT); 64162306a36Sopenharmony_ci if (!sh_eth_is_eeprom_ready()) 64262306a36Sopenharmony_ci return; 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci mac = __raw_readw(EEPROM_DATA); 64562306a36Sopenharmony_ci sh_eth_plat.mac_addr[i << 1] = mac & 0xff; 64662306a36Sopenharmony_ci sh_eth_plat.mac_addr[(i << 1) + 1] = mac >> 8; 64762306a36Sopenharmony_ci } 64862306a36Sopenharmony_ci} 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci#define SW4140 0xBA201000 65162306a36Sopenharmony_ci#define FPGA_OUT 0xBA200400 65262306a36Sopenharmony_ci#define PORT_HIZA 0xA4050158 65362306a36Sopenharmony_ci#define PORT_MSELCRB 0xA4050182 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci#define SW41_A 0x0100 65662306a36Sopenharmony_ci#define SW41_B 0x0200 65762306a36Sopenharmony_ci#define SW41_C 0x0400 65862306a36Sopenharmony_ci#define SW41_D 0x0800 65962306a36Sopenharmony_ci#define SW41_E 0x1000 66062306a36Sopenharmony_ci#define SW41_F 0x2000 66162306a36Sopenharmony_ci#define SW41_G 0x4000 66262306a36Sopenharmony_ci#define SW41_H 0x8000 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ciextern char ms7724se_sdram_enter_start; 66562306a36Sopenharmony_ciextern char ms7724se_sdram_enter_end; 66662306a36Sopenharmony_ciextern char ms7724se_sdram_leave_start; 66762306a36Sopenharmony_ciextern char ms7724se_sdram_leave_end; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_cistatic int __init arch_setup(void) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci /* enable I2C device */ 67262306a36Sopenharmony_ci i2c_register_board_info(0, i2c0_devices, 67362306a36Sopenharmony_ci ARRAY_SIZE(i2c0_devices)); 67462306a36Sopenharmony_ci return 0; 67562306a36Sopenharmony_ci} 67662306a36Sopenharmony_ciarch_initcall(arch_setup); 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_cistatic int __init devices_setup(void) 67962306a36Sopenharmony_ci{ 68062306a36Sopenharmony_ci u16 sw = __raw_readw(SW4140); /* select camera, monitor */ 68162306a36Sopenharmony_ci struct clk *clk; 68262306a36Sopenharmony_ci u16 fpga_out; 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci /* register board specific self-refresh code */ 68562306a36Sopenharmony_ci sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 68662306a36Sopenharmony_ci SUSP_SH_RSTANDBY, 68762306a36Sopenharmony_ci &ms7724se_sdram_enter_start, 68862306a36Sopenharmony_ci &ms7724se_sdram_enter_end, 68962306a36Sopenharmony_ci &ms7724se_sdram_leave_start, 69062306a36Sopenharmony_ci &ms7724se_sdram_leave_end); 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers, 69362306a36Sopenharmony_ci ARRAY_SIZE(fixed3v3_power_consumers), 3300000); 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci /* Reset Release */ 69662306a36Sopenharmony_ci fpga_out = __raw_readw(FPGA_OUT); 69762306a36Sopenharmony_ci /* bit4: NTSC_PDN, bit5: NTSC_RESET */ 69862306a36Sopenharmony_ci fpga_out &= ~((1 << 1) | /* LAN */ 69962306a36Sopenharmony_ci (1 << 4) | /* AK8813 PDN */ 70062306a36Sopenharmony_ci (1 << 5) | /* AK8813 RESET */ 70162306a36Sopenharmony_ci (1 << 6) | /* VIDEO DAC */ 70262306a36Sopenharmony_ci (1 << 7) | /* AK4643 */ 70362306a36Sopenharmony_ci (1 << 8) | /* IrDA */ 70462306a36Sopenharmony_ci (1 << 12) | /* USB0 */ 70562306a36Sopenharmony_ci (1 << 14)); /* RMII */ 70662306a36Sopenharmony_ci __raw_writew(fpga_out | (1 << 4), FPGA_OUT); 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci udelay(10); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci /* AK8813 RESET */ 71162306a36Sopenharmony_ci __raw_writew(fpga_out | (1 << 5), FPGA_OUT); 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci udelay(10); 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci __raw_writew(fpga_out, FPGA_OUT); 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci /* turn on USB clocks, use external clock */ 71862306a36Sopenharmony_ci __raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB); 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci /* Let LED9 show STATUS2 */ 72162306a36Sopenharmony_ci gpio_request(GPIO_FN_STATUS2, NULL); 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci /* Lit LED10 show STATUS0 */ 72462306a36Sopenharmony_ci gpio_request(GPIO_FN_STATUS0, NULL); 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci /* Lit LED11 show PDSTATUS */ 72762306a36Sopenharmony_ci gpio_request(GPIO_FN_PDSTATUS, NULL); 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci /* enable USB0 port */ 73062306a36Sopenharmony_ci __raw_writew(0x0600, 0xa40501d4); 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci /* enable USB1 port */ 73362306a36Sopenharmony_ci __raw_writew(0x0600, 0xa4050192); 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci /* enable IRQ 0,1,2 */ 73662306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 73762306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ1, NULL); 73862306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ2, NULL); 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci /* enable SCIFA3 */ 74162306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_SCK, NULL); 74262306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_RXD, NULL); 74362306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_TXD, NULL); 74462306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_CTS, NULL); 74562306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF3_I_RTS, NULL); 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci /* enable LCDC */ 74862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD23, NULL); 74962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD22, NULL); 75062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD21, NULL); 75162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD20, NULL); 75262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD19, NULL); 75362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD18, NULL); 75462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD17, NULL); 75562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD16, NULL); 75662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD15, NULL); 75762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD14, NULL); 75862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD13, NULL); 75962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD12, NULL); 76062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD11, NULL); 76162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD10, NULL); 76262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD9, NULL); 76362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD8, NULL); 76462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD7, NULL); 76562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD6, NULL); 76662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD5, NULL); 76762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD4, NULL); 76862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD3, NULL); 76962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD2, NULL); 77062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD1, NULL); 77162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD0, NULL); 77262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDISP, NULL); 77362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDHSYN, NULL); 77462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDCK, NULL); 77562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDVSYN, NULL); 77662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDON, NULL); 77762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDVEPWC, NULL); 77862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDVCPWC, NULL); 77962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDRD, NULL); 78062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDLCLK, NULL); 78162306a36Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci /* enable CEU0 */ 78462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D15, NULL); 78562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D14, NULL); 78662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D13, NULL); 78762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D12, NULL); 78862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D11, NULL); 78962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D10, NULL); 79062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D9, NULL); 79162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D8, NULL); 79262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D7, NULL); 79362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D6, NULL); 79462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D5, NULL); 79562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D4, NULL); 79662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D3, NULL); 79762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D2, NULL); 79862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D1, NULL); 79962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D0, NULL); 80062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_VD, NULL); 80162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_CLK, NULL); 80262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_FLD, NULL); 80362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_HD, NULL); 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci /* enable CEU1 */ 80662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D7, NULL); 80762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D6, NULL); 80862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D5, NULL); 80962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D4, NULL); 81062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D3, NULL); 81162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D2, NULL); 81262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D1, NULL); 81362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D0, NULL); 81462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_FLD, NULL); 81562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_HD, NULL); 81662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_VD, NULL); 81762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_CLK, NULL); 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci /* KEYSC */ 82062306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 82162306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 82262306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN4, NULL); 82362306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN3, NULL); 82462306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN2, NULL); 82562306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN1, NULL); 82662306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN0, NULL); 82762306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT3, NULL); 82862306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT2, NULL); 82962306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT1, NULL); 83062306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT0, NULL); 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci /* enable FSI */ 83362306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIMCKA, NULL); 83462306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIASD, NULL); 83562306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOASD, NULL); 83662306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIABCK, NULL); 83762306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIALRCK, NULL); 83862306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOABCK, NULL); 83962306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOALRCK, NULL); 84062306a36Sopenharmony_ci gpio_request(GPIO_FN_CLKAUDIOAO, NULL); 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_ci /* set SPU2 clock to 83.4 MHz */ 84362306a36Sopenharmony_ci clk = clk_get(NULL, "spu_clk"); 84462306a36Sopenharmony_ci if (!IS_ERR(clk)) { 84562306a36Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 83333333)); 84662306a36Sopenharmony_ci clk_put(clk); 84762306a36Sopenharmony_ci } 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci /* change parent of FSI A */ 85062306a36Sopenharmony_ci clk = clk_get(NULL, "fsia_clk"); 85162306a36Sopenharmony_ci if (!IS_ERR(clk)) { 85262306a36Sopenharmony_ci /* 48kHz dummy clock was used to make sure 1/1 divide */ 85362306a36Sopenharmony_ci clk_set_rate(&sh7724_fsimcka_clk, 48000); 85462306a36Sopenharmony_ci clk_set_parent(clk, &sh7724_fsimcka_clk); 85562306a36Sopenharmony_ci clk_set_rate(clk, 48000); 85662306a36Sopenharmony_ci clk_put(clk); 85762306a36Sopenharmony_ci } 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci /* SDHI0 connected to cn7 */ 86062306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CD, NULL); 86162306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0WP, NULL); 86262306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D3, NULL); 86362306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D2, NULL); 86462306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D1, NULL); 86562306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D0, NULL); 86662306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CMD, NULL); 86762306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CLK, NULL); 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci /* SDHI1 connected to cn8 */ 87062306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CD, NULL); 87162306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1WP, NULL); 87262306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D3, NULL); 87362306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D2, NULL); 87462306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D1, NULL); 87562306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D0, NULL); 87662306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CMD, NULL); 87762306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CLK, NULL); 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci /* enable IrDA */ 88062306a36Sopenharmony_ci gpio_request(GPIO_FN_IRDA_OUT, NULL); 88162306a36Sopenharmony_ci gpio_request(GPIO_FN_IRDA_IN, NULL); 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci /* 88462306a36Sopenharmony_ci * enable SH-Eth 88562306a36Sopenharmony_ci * 88662306a36Sopenharmony_ci * please remove J33 pin from your board !! 88762306a36Sopenharmony_ci * 88862306a36Sopenharmony_ci * ms7724 board should not use GPIO_FN_LNKSTA pin 88962306a36Sopenharmony_ci * So, This time PTX5 is set to input pin 89062306a36Sopenharmony_ci */ 89162306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD0, NULL); 89262306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD1, NULL); 89362306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD0, NULL); 89462306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD1, NULL); 89562306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 89662306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TX_EN, NULL); 89762306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RX_ER, NULL); 89862306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 89962306a36Sopenharmony_ci gpio_request(GPIO_FN_MDIO, NULL); 90062306a36Sopenharmony_ci gpio_request(GPIO_FN_MDC, NULL); 90162306a36Sopenharmony_ci gpio_request(GPIO_PTX5, NULL); 90262306a36Sopenharmony_ci gpio_direction_input(GPIO_PTX5); 90362306a36Sopenharmony_ci sh_eth_init(); 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci if (sw & SW41_B) { 90662306a36Sopenharmony_ci /* 720p */ 90762306a36Sopenharmony_ci lcdc_info.ch[0].lcd_modes = lcdc_720p_modes; 90862306a36Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_720p_modes); 90962306a36Sopenharmony_ci } else { 91062306a36Sopenharmony_ci /* VGA */ 91162306a36Sopenharmony_ci lcdc_info.ch[0].lcd_modes = lcdc_vga_modes; 91262306a36Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(lcdc_vga_modes); 91362306a36Sopenharmony_ci } 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci if (sw & SW41_A) { 91662306a36Sopenharmony_ci /* Digital monitor */ 91762306a36Sopenharmony_ci lcdc_info.ch[0].interface_type = RGB18; 91862306a36Sopenharmony_ci lcdc_info.ch[0].flags = 0; 91962306a36Sopenharmony_ci } else { 92062306a36Sopenharmony_ci /* Analog monitor */ 92162306a36Sopenharmony_ci lcdc_info.ch[0].interface_type = RGB24; 92262306a36Sopenharmony_ci lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL; 92362306a36Sopenharmony_ci } 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci /* VOU */ 92662306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D15, NULL); 92762306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D14, NULL); 92862306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D13, NULL); 92962306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D12, NULL); 93062306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D11, NULL); 93162306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D10, NULL); 93262306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D9, NULL); 93362306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D8, NULL); 93462306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_CLKI, NULL); 93562306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_CLK, NULL); 93662306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_VSYNC, NULL); 93762306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_HSYNC, NULL); 93862306a36Sopenharmony_ci 93962306a36Sopenharmony_ci /* Initialize CEU platform devices separately to map memory first */ 94062306a36Sopenharmony_ci device_initialize(&ms7724se_ceu_devices[0]->dev); 94162306a36Sopenharmony_ci dma_declare_coherent_memory(&ms7724se_ceu_devices[0]->dev, 94262306a36Sopenharmony_ci ceu0_dma_membase, ceu0_dma_membase, 94362306a36Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 94462306a36Sopenharmony_ci platform_device_add(ms7724se_ceu_devices[0]); 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci device_initialize(&ms7724se_ceu_devices[1]->dev); 94762306a36Sopenharmony_ci dma_declare_coherent_memory(&ms7724se_ceu_devices[1]->dev, 94862306a36Sopenharmony_ci ceu1_dma_membase, ceu1_dma_membase, 94962306a36Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 95062306a36Sopenharmony_ci platform_device_add(ms7724se_ceu_devices[1]); 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_ci return platform_add_devices(ms7724se_devices, 95362306a36Sopenharmony_ci ARRAY_SIZE(ms7724se_devices)); 95462306a36Sopenharmony_ci} 95562306a36Sopenharmony_cidevice_initcall(devices_setup); 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_ci/* Reserve a portion of memory for CEU 0 and CEU 1 buffers */ 95862306a36Sopenharmony_cistatic void __init ms7724se_mv_mem_reserve(void) 95962306a36Sopenharmony_ci{ 96062306a36Sopenharmony_ci phys_addr_t phys; 96162306a36Sopenharmony_ci phys_addr_t size = CEU_BUFFER_MEMORY_SIZE; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 96462306a36Sopenharmony_ci if (!phys) 96562306a36Sopenharmony_ci panic("Failed to allocate CEU0 memory\n"); 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci memblock_phys_free(phys, size); 96862306a36Sopenharmony_ci memblock_remove(phys, size); 96962306a36Sopenharmony_ci ceu0_dma_membase = phys; 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 97262306a36Sopenharmony_ci if (!phys) 97362306a36Sopenharmony_ci panic("Failed to allocate CEU1 memory\n"); 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci memblock_phys_free(phys, size); 97662306a36Sopenharmony_ci memblock_remove(phys, size); 97762306a36Sopenharmony_ci ceu1_dma_membase = phys; 97862306a36Sopenharmony_ci} 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_cistatic struct sh_machine_vector mv_ms7724se __initmv = { 98162306a36Sopenharmony_ci .mv_name = "ms7724se", 98262306a36Sopenharmony_ci .mv_init_irq = init_se7724_IRQ, 98362306a36Sopenharmony_ci .mv_mem_reserve = ms7724se_mv_mem_reserve, 98462306a36Sopenharmony_ci}; 985