18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * KFR2R09 board support code
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Magnus Damm
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <asm/clock.h>
98c2ecf20Sopenharmony_ci#include <asm/io.h>
108c2ecf20Sopenharmony_ci#include <asm/machvec.h>
118c2ecf20Sopenharmony_ci#include <asm/suspend.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <cpu/sh7724.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <linux/clkdev.h>
168c2ecf20Sopenharmony_ci#include <linux/delay.h>
178c2ecf20Sopenharmony_ci#include <linux/gpio.h>
188c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h>
198c2ecf20Sopenharmony_ci#include <linux/i2c.h>
208c2ecf20Sopenharmony_ci#include <linux/init.h>
218c2ecf20Sopenharmony_ci#include <linux/input.h>
228c2ecf20Sopenharmony_ci#include <linux/input/sh_keysc.h>
238c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
248c2ecf20Sopenharmony_ci#include <linux/memblock.h>
258c2ecf20Sopenharmony_ci#include <linux/mfd/tmio.h>
268c2ecf20Sopenharmony_ci#include <linux/mmc/host.h>
278c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h>
288c2ecf20Sopenharmony_ci#include <linux/platform_data/lv5207lp.h>
298c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
308c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h>
318c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
328c2ecf20Sopenharmony_ci#include <linux/sh_intc.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/kfr2r09.h>
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#include <media/drv-intf/renesas-ceu.h>
408c2ecf20Sopenharmony_ci#include <media/i2c/rj54n1cb0c.h>
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#include <video/sh_mobile_lcdc.h>
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#define CEU_BUFFER_MEMORY_SIZE		(4 << 20)
458c2ecf20Sopenharmony_cistatic phys_addr_t ceu_dma_membase;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci/* set VIO_CKO clock to 25MHz */
488c2ecf20Sopenharmony_ci#define CEU_MCLK_FREQ			25000000
498c2ecf20Sopenharmony_ci#define DRVCRB				0xA405018C
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic struct mtd_partition kfr2r09_nor_flash_partitions[] =
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	{
548c2ecf20Sopenharmony_ci		.name = "boot",
558c2ecf20Sopenharmony_ci		.offset = 0,
568c2ecf20Sopenharmony_ci		.size = (4 * 1024 * 1024),
578c2ecf20Sopenharmony_ci		.mask_flags = MTD_WRITEABLE,	/* Read-only */
588c2ecf20Sopenharmony_ci	},
598c2ecf20Sopenharmony_ci	{
608c2ecf20Sopenharmony_ci		.name = "other",
618c2ecf20Sopenharmony_ci		.offset = MTDPART_OFS_APPEND,
628c2ecf20Sopenharmony_ci		.size = MTDPART_SIZ_FULL,
638c2ecf20Sopenharmony_ci	},
648c2ecf20Sopenharmony_ci};
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cistatic struct physmap_flash_data kfr2r09_nor_flash_data = {
678c2ecf20Sopenharmony_ci	.width		= 2,
688c2ecf20Sopenharmony_ci	.parts		= kfr2r09_nor_flash_partitions,
698c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(kfr2r09_nor_flash_partitions),
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic struct resource kfr2r09_nor_flash_resources[] = {
738c2ecf20Sopenharmony_ci	[0] = {
748c2ecf20Sopenharmony_ci		.name		= "NOR Flash",
758c2ecf20Sopenharmony_ci		.start		= 0x00000000,
768c2ecf20Sopenharmony_ci		.end		= 0x03ffffff,
778c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_MEM,
788c2ecf20Sopenharmony_ci	}
798c2ecf20Sopenharmony_ci};
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_nor_flash_device = {
828c2ecf20Sopenharmony_ci	.name		= "physmap-flash",
838c2ecf20Sopenharmony_ci	.resource	= kfr2r09_nor_flash_resources,
848c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(kfr2r09_nor_flash_resources),
858c2ecf20Sopenharmony_ci	.dev		= {
868c2ecf20Sopenharmony_ci		.platform_data = &kfr2r09_nor_flash_data,
878c2ecf20Sopenharmony_ci	},
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cistatic struct resource kfr2r09_nand_flash_resources[] = {
918c2ecf20Sopenharmony_ci	[0] = {
928c2ecf20Sopenharmony_ci		.name		= "NAND Flash",
938c2ecf20Sopenharmony_ci		.start		= 0x10000000,
948c2ecf20Sopenharmony_ci		.end		= 0x1001ffff,
958c2ecf20Sopenharmony_ci		.flags		= IORESOURCE_MEM,
968c2ecf20Sopenharmony_ci	}
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_nand_flash_device = {
1008c2ecf20Sopenharmony_ci	.name		= "onenand-flash",
1018c2ecf20Sopenharmony_ci	.resource	= kfr2r09_nand_flash_resources,
1028c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(kfr2r09_nand_flash_resources),
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic struct sh_keysc_info kfr2r09_sh_keysc_info = {
1068c2ecf20Sopenharmony_ci	.mode = SH_KEYSC_MODE_1, /* KEYOUT0->4, KEYIN0->4 */
1078c2ecf20Sopenharmony_ci	.scan_timing = 3,
1088c2ecf20Sopenharmony_ci	.delay = 10,
1098c2ecf20Sopenharmony_ci	.keycodes = {
1108c2ecf20Sopenharmony_ci		KEY_PHONE, KEY_CLEAR, KEY_MAIL, KEY_WWW, KEY_ENTER,
1118c2ecf20Sopenharmony_ci		KEY_1, KEY_2, KEY_3, 0, KEY_UP,
1128c2ecf20Sopenharmony_ci		KEY_4, KEY_5, KEY_6, 0, KEY_LEFT,
1138c2ecf20Sopenharmony_ci		KEY_7, KEY_8, KEY_9, KEY_PROG1, KEY_RIGHT,
1148c2ecf20Sopenharmony_ci		KEY_S, KEY_0, KEY_P, KEY_PROG2, KEY_DOWN,
1158c2ecf20Sopenharmony_ci		0, 0, 0, 0, 0
1168c2ecf20Sopenharmony_ci	},
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cistatic struct resource kfr2r09_sh_keysc_resources[] = {
1208c2ecf20Sopenharmony_ci	[0] = {
1218c2ecf20Sopenharmony_ci		.name	= "KEYSC",
1228c2ecf20Sopenharmony_ci		.start  = 0x044b0000,
1238c2ecf20Sopenharmony_ci		.end    = 0x044b000f,
1248c2ecf20Sopenharmony_ci		.flags  = IORESOURCE_MEM,
1258c2ecf20Sopenharmony_ci	},
1268c2ecf20Sopenharmony_ci	[1] = {
1278c2ecf20Sopenharmony_ci		.start  = evt2irq(0xbe0),
1288c2ecf20Sopenharmony_ci		.flags  = IORESOURCE_IRQ,
1298c2ecf20Sopenharmony_ci	},
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_sh_keysc_device = {
1338c2ecf20Sopenharmony_ci	.name           = "sh_keysc",
1348c2ecf20Sopenharmony_ci	.id             = 0, /* "keysc0" clock */
1358c2ecf20Sopenharmony_ci	.num_resources  = ARRAY_SIZE(kfr2r09_sh_keysc_resources),
1368c2ecf20Sopenharmony_ci	.resource       = kfr2r09_sh_keysc_resources,
1378c2ecf20Sopenharmony_ci	.dev	= {
1388c2ecf20Sopenharmony_ci		.platform_data	= &kfr2r09_sh_keysc_info,
1398c2ecf20Sopenharmony_ci	},
1408c2ecf20Sopenharmony_ci};
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_cistatic const struct fb_videomode kfr2r09_lcdc_modes[] = {
1438c2ecf20Sopenharmony_ci	{
1448c2ecf20Sopenharmony_ci		.name = "TX07D34VM0AAA",
1458c2ecf20Sopenharmony_ci		.xres = 240,
1468c2ecf20Sopenharmony_ci		.yres = 400,
1478c2ecf20Sopenharmony_ci		.left_margin = 0,
1488c2ecf20Sopenharmony_ci		.right_margin = 16,
1498c2ecf20Sopenharmony_ci		.hsync_len = 8,
1508c2ecf20Sopenharmony_ci		.upper_margin = 0,
1518c2ecf20Sopenharmony_ci		.lower_margin = 1,
1528c2ecf20Sopenharmony_ci		.vsync_len = 1,
1538c2ecf20Sopenharmony_ci		.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
1548c2ecf20Sopenharmony_ci	},
1558c2ecf20Sopenharmony_ci};
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cistatic struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = {
1588c2ecf20Sopenharmony_ci	.clock_source = LCDC_CLK_BUS,
1598c2ecf20Sopenharmony_ci	.ch[0] = {
1608c2ecf20Sopenharmony_ci		.chan = LCDC_CHAN_MAINLCD,
1618c2ecf20Sopenharmony_ci		.fourcc = V4L2_PIX_FMT_RGB565,
1628c2ecf20Sopenharmony_ci		.interface_type = SYS18,
1638c2ecf20Sopenharmony_ci		.clock_divider = 6,
1648c2ecf20Sopenharmony_ci		.flags = LCDC_FLAGS_DWPOL,
1658c2ecf20Sopenharmony_ci		.lcd_modes = kfr2r09_lcdc_modes,
1668c2ecf20Sopenharmony_ci		.num_modes = ARRAY_SIZE(kfr2r09_lcdc_modes),
1678c2ecf20Sopenharmony_ci		.panel_cfg = {
1688c2ecf20Sopenharmony_ci			.width = 35,
1698c2ecf20Sopenharmony_ci			.height = 58,
1708c2ecf20Sopenharmony_ci			.setup_sys = kfr2r09_lcd_setup,
1718c2ecf20Sopenharmony_ci			.start_transfer = kfr2r09_lcd_start,
1728c2ecf20Sopenharmony_ci		},
1738c2ecf20Sopenharmony_ci		.sys_bus_cfg = {
1748c2ecf20Sopenharmony_ci			.ldmt2r = 0x07010904,
1758c2ecf20Sopenharmony_ci			.ldmt3r = 0x14012914,
1768c2ecf20Sopenharmony_ci			/* set 1s delay to encourage fsync() */
1778c2ecf20Sopenharmony_ci			.deferred_io_msec = 1000,
1788c2ecf20Sopenharmony_ci		},
1798c2ecf20Sopenharmony_ci	}
1808c2ecf20Sopenharmony_ci};
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_cistatic struct resource kfr2r09_sh_lcdc_resources[] = {
1838c2ecf20Sopenharmony_ci	[0] = {
1848c2ecf20Sopenharmony_ci		.name	= "LCDC",
1858c2ecf20Sopenharmony_ci		.start	= 0xfe940000, /* P4-only space */
1868c2ecf20Sopenharmony_ci		.end	= 0xfe942fff,
1878c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
1888c2ecf20Sopenharmony_ci	},
1898c2ecf20Sopenharmony_ci	[1] = {
1908c2ecf20Sopenharmony_ci		.start	= evt2irq(0xf40),
1918c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ,
1928c2ecf20Sopenharmony_ci	},
1938c2ecf20Sopenharmony_ci};
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_sh_lcdc_device = {
1968c2ecf20Sopenharmony_ci	.name		= "sh_mobile_lcdc_fb",
1978c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(kfr2r09_sh_lcdc_resources),
1988c2ecf20Sopenharmony_ci	.resource	= kfr2r09_sh_lcdc_resources,
1998c2ecf20Sopenharmony_ci	.dev	= {
2008c2ecf20Sopenharmony_ci		.platform_data	= &kfr2r09_sh_lcdc_info,
2018c2ecf20Sopenharmony_ci	},
2028c2ecf20Sopenharmony_ci};
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_cistatic struct lv5207lp_platform_data kfr2r09_backlight_data = {
2058c2ecf20Sopenharmony_ci	.fbdev = &kfr2r09_sh_lcdc_device.dev,
2068c2ecf20Sopenharmony_ci	.def_value = 13,
2078c2ecf20Sopenharmony_ci	.max_value = 13,
2088c2ecf20Sopenharmony_ci};
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistatic struct i2c_board_info kfr2r09_backlight_board_info = {
2118c2ecf20Sopenharmony_ci	I2C_BOARD_INFO("lv5207lp", 0x75),
2128c2ecf20Sopenharmony_ci	.platform_data = &kfr2r09_backlight_data,
2138c2ecf20Sopenharmony_ci};
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_cistatic struct r8a66597_platdata kfr2r09_usb0_gadget_data = {
2168c2ecf20Sopenharmony_ci	.on_chip = 1,
2178c2ecf20Sopenharmony_ci};
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_cistatic struct resource kfr2r09_usb0_gadget_resources[] = {
2208c2ecf20Sopenharmony_ci	[0] = {
2218c2ecf20Sopenharmony_ci		.start	= 0x04d80000,
2228c2ecf20Sopenharmony_ci		.end	= 0x04d80123,
2238c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2248c2ecf20Sopenharmony_ci	},
2258c2ecf20Sopenharmony_ci	[1] = {
2268c2ecf20Sopenharmony_ci		.start	= evt2irq(0xa20),
2278c2ecf20Sopenharmony_ci		.end	= evt2irq(0xa20),
2288c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
2298c2ecf20Sopenharmony_ci	},
2308c2ecf20Sopenharmony_ci};
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_usb0_gadget_device = {
2338c2ecf20Sopenharmony_ci	.name		= "r8a66597_udc",
2348c2ecf20Sopenharmony_ci	.id		= 0,
2358c2ecf20Sopenharmony_ci	.dev = {
2368c2ecf20Sopenharmony_ci		.dma_mask		= NULL,         /*  not use dma */
2378c2ecf20Sopenharmony_ci		.coherent_dma_mask	= 0xffffffff,
2388c2ecf20Sopenharmony_ci		.platform_data	= &kfr2r09_usb0_gadget_data,
2398c2ecf20Sopenharmony_ci	},
2408c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(kfr2r09_usb0_gadget_resources),
2418c2ecf20Sopenharmony_ci	.resource	= kfr2r09_usb0_gadget_resources,
2428c2ecf20Sopenharmony_ci};
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_cistatic struct ceu_platform_data ceu_pdata = {
2458c2ecf20Sopenharmony_ci	.num_subdevs			= 1,
2468c2ecf20Sopenharmony_ci	.subdevs = {
2478c2ecf20Sopenharmony_ci		{ /* [0] = rj54n1cb0c */
2488c2ecf20Sopenharmony_ci			.flags		= 0,
2498c2ecf20Sopenharmony_ci			.bus_width	= 8,
2508c2ecf20Sopenharmony_ci			.bus_shift	= 0,
2518c2ecf20Sopenharmony_ci			.i2c_adapter_id	= 1,
2528c2ecf20Sopenharmony_ci			.i2c_address	= 0x50,
2538c2ecf20Sopenharmony_ci		},
2548c2ecf20Sopenharmony_ci	},
2558c2ecf20Sopenharmony_ci};
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_cistatic struct resource kfr2r09_ceu_resources[] = {
2588c2ecf20Sopenharmony_ci	[0] = {
2598c2ecf20Sopenharmony_ci		.name	= "CEU",
2608c2ecf20Sopenharmony_ci		.start	= 0xfe910000,
2618c2ecf20Sopenharmony_ci		.end	= 0xfe91009f,
2628c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2638c2ecf20Sopenharmony_ci	},
2648c2ecf20Sopenharmony_ci	[1] = {
2658c2ecf20Sopenharmony_ci		.start  = evt2irq(0x880),
2668c2ecf20Sopenharmony_ci		.end	= evt2irq(0x880),
2678c2ecf20Sopenharmony_ci		.flags  = IORESOURCE_IRQ,
2688c2ecf20Sopenharmony_ci	},
2698c2ecf20Sopenharmony_ci};
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_ceu_device = {
2728c2ecf20Sopenharmony_ci	.name		= "renesas-ceu",
2738c2ecf20Sopenharmony_ci	.id             = 0, /* "ceu0" clock */
2748c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(kfr2r09_ceu_resources),
2758c2ecf20Sopenharmony_ci	.resource	= kfr2r09_ceu_resources,
2768c2ecf20Sopenharmony_ci	.dev	= {
2778c2ecf20Sopenharmony_ci		.platform_data	= &ceu_pdata,
2788c2ecf20Sopenharmony_ci	},
2798c2ecf20Sopenharmony_ci};
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_cistatic struct rj54n1_pdata rj54n1_priv = {
2828c2ecf20Sopenharmony_ci	.mclk_freq	= CEU_MCLK_FREQ,
2838c2ecf20Sopenharmony_ci	.ioctl_high	= false,
2848c2ecf20Sopenharmony_ci};
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_cistatic struct i2c_board_info kfr2r09_i2c_camera = {
2878c2ecf20Sopenharmony_ci	I2C_BOARD_INFO("rj54n1cb0c", 0x50),
2888c2ecf20Sopenharmony_ci	.platform_data = &rj54n1_priv,
2898c2ecf20Sopenharmony_ci};
2908c2ecf20Sopenharmony_ci
2918c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table rj54n1_gpios = {
2928c2ecf20Sopenharmony_ci	.dev_id		= "1-0050",
2938c2ecf20Sopenharmony_ci	.table		= {
2948c2ecf20Sopenharmony_ci		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB4, "poweron",
2958c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_HIGH),
2968c2ecf20Sopenharmony_ci		GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7, "enable",
2978c2ecf20Sopenharmony_ci			    GPIO_ACTIVE_HIGH),
2988c2ecf20Sopenharmony_ci	},
2998c2ecf20Sopenharmony_ci};
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci/* Fixed 3.3V regulator to be used by SDHI0 */
3028c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply fixed3v3_power_consumers[] =
3038c2ecf20Sopenharmony_ci{
3048c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
3058c2ecf20Sopenharmony_ci	REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
3068c2ecf20Sopenharmony_ci};
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_cistatic struct resource kfr2r09_sh_sdhi0_resources[] = {
3098c2ecf20Sopenharmony_ci	[0] = {
3108c2ecf20Sopenharmony_ci		.name	= "SDHI0",
3118c2ecf20Sopenharmony_ci		.start  = 0x04ce0000,
3128c2ecf20Sopenharmony_ci		.end    = 0x04ce00ff,
3138c2ecf20Sopenharmony_ci		.flags  = IORESOURCE_MEM,
3148c2ecf20Sopenharmony_ci	},
3158c2ecf20Sopenharmony_ci	[1] = {
3168c2ecf20Sopenharmony_ci		.start  = evt2irq(0xe80),
3178c2ecf20Sopenharmony_ci		.flags  = IORESOURCE_IRQ,
3188c2ecf20Sopenharmony_ci	},
3198c2ecf20Sopenharmony_ci};
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_cistatic struct tmio_mmc_data sh7724_sdhi0_data = {
3228c2ecf20Sopenharmony_ci	.chan_priv_tx	= (void *)SHDMA_SLAVE_SDHI0_TX,
3238c2ecf20Sopenharmony_ci	.chan_priv_rx	= (void *)SHDMA_SLAVE_SDHI0_RX,
3248c2ecf20Sopenharmony_ci	.capabilities	= MMC_CAP_SDIO_IRQ,
3258c2ecf20Sopenharmony_ci	.capabilities2	= MMC_CAP2_NO_WRITE_PROTECT,
3268c2ecf20Sopenharmony_ci};
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_cistatic struct platform_device kfr2r09_sh_sdhi0_device = {
3298c2ecf20Sopenharmony_ci	.name           = "sh_mobile_sdhi",
3308c2ecf20Sopenharmony_ci	.num_resources  = ARRAY_SIZE(kfr2r09_sh_sdhi0_resources),
3318c2ecf20Sopenharmony_ci	.resource       = kfr2r09_sh_sdhi0_resources,
3328c2ecf20Sopenharmony_ci	.dev = {
3338c2ecf20Sopenharmony_ci		.platform_data	= &sh7724_sdhi0_data,
3348c2ecf20Sopenharmony_ci	},
3358c2ecf20Sopenharmony_ci};
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_cistatic struct platform_device *kfr2r09_devices[] __initdata = {
3388c2ecf20Sopenharmony_ci	&kfr2r09_nor_flash_device,
3398c2ecf20Sopenharmony_ci	&kfr2r09_nand_flash_device,
3408c2ecf20Sopenharmony_ci	&kfr2r09_sh_keysc_device,
3418c2ecf20Sopenharmony_ci	&kfr2r09_sh_lcdc_device,
3428c2ecf20Sopenharmony_ci	&kfr2r09_sh_sdhi0_device,
3438c2ecf20Sopenharmony_ci};
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci#define BSC_CS0BCR 0xfec10004
3468c2ecf20Sopenharmony_ci#define BSC_CS0WCR 0xfec10024
3478c2ecf20Sopenharmony_ci#define BSC_CS4BCR 0xfec10010
3488c2ecf20Sopenharmony_ci#define BSC_CS4WCR 0xfec10030
3498c2ecf20Sopenharmony_ci#define PORT_MSELCRB 0xa4050182
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci#ifdef CONFIG_I2C
3528c2ecf20Sopenharmony_cistatic int kfr2r09_usb0_gadget_i2c_setup(void)
3538c2ecf20Sopenharmony_ci{
3548c2ecf20Sopenharmony_ci	struct i2c_adapter *a;
3558c2ecf20Sopenharmony_ci	struct i2c_msg msg;
3568c2ecf20Sopenharmony_ci	unsigned char buf[2];
3578c2ecf20Sopenharmony_ci	int ret;
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	a = i2c_get_adapter(0);
3608c2ecf20Sopenharmony_ci	if (!a)
3618c2ecf20Sopenharmony_ci		return -ENODEV;
3628c2ecf20Sopenharmony_ci
3638c2ecf20Sopenharmony_ci	/* set bit 1 (the second bit) of chip at 0x09, register 0x13 */
3648c2ecf20Sopenharmony_ci	buf[0] = 0x13;
3658c2ecf20Sopenharmony_ci	msg.addr = 0x09;
3668c2ecf20Sopenharmony_ci	msg.buf = buf;
3678c2ecf20Sopenharmony_ci	msg.len = 1;
3688c2ecf20Sopenharmony_ci	msg.flags = 0;
3698c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
3708c2ecf20Sopenharmony_ci	if (ret != 1)
3718c2ecf20Sopenharmony_ci		return -ENODEV;
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	buf[0] = 0;
3748c2ecf20Sopenharmony_ci	msg.addr = 0x09;
3758c2ecf20Sopenharmony_ci	msg.buf = buf;
3768c2ecf20Sopenharmony_ci	msg.len = 1;
3778c2ecf20Sopenharmony_ci	msg.flags = I2C_M_RD;
3788c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
3798c2ecf20Sopenharmony_ci	if (ret != 1)
3808c2ecf20Sopenharmony_ci		return -ENODEV;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci	buf[1] = buf[0] | (1 << 1);
3838c2ecf20Sopenharmony_ci	buf[0] = 0x13;
3848c2ecf20Sopenharmony_ci	msg.addr = 0x09;
3858c2ecf20Sopenharmony_ci	msg.buf = buf;
3868c2ecf20Sopenharmony_ci	msg.len = 2;
3878c2ecf20Sopenharmony_ci	msg.flags = 0;
3888c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
3898c2ecf20Sopenharmony_ci	if (ret != 1)
3908c2ecf20Sopenharmony_ci		return -ENODEV;
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	return 0;
3938c2ecf20Sopenharmony_ci}
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_cistatic int kfr2r09_serial_i2c_setup(void)
3968c2ecf20Sopenharmony_ci{
3978c2ecf20Sopenharmony_ci	struct i2c_adapter *a;
3988c2ecf20Sopenharmony_ci	struct i2c_msg msg;
3998c2ecf20Sopenharmony_ci	unsigned char buf[2];
4008c2ecf20Sopenharmony_ci	int ret;
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ci	a = i2c_get_adapter(0);
4038c2ecf20Sopenharmony_ci	if (!a)
4048c2ecf20Sopenharmony_ci		return -ENODEV;
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	/* set bit 6 (the 7th bit) of chip at 0x09, register 0x13 */
4078c2ecf20Sopenharmony_ci	buf[0] = 0x13;
4088c2ecf20Sopenharmony_ci	msg.addr = 0x09;
4098c2ecf20Sopenharmony_ci	msg.buf = buf;
4108c2ecf20Sopenharmony_ci	msg.len = 1;
4118c2ecf20Sopenharmony_ci	msg.flags = 0;
4128c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
4138c2ecf20Sopenharmony_ci	if (ret != 1)
4148c2ecf20Sopenharmony_ci		return -ENODEV;
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci	buf[0] = 0;
4178c2ecf20Sopenharmony_ci	msg.addr = 0x09;
4188c2ecf20Sopenharmony_ci	msg.buf = buf;
4198c2ecf20Sopenharmony_ci	msg.len = 1;
4208c2ecf20Sopenharmony_ci	msg.flags = I2C_M_RD;
4218c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
4228c2ecf20Sopenharmony_ci	if (ret != 1)
4238c2ecf20Sopenharmony_ci		return -ENODEV;
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci	buf[1] = buf[0] | (1 << 6);
4268c2ecf20Sopenharmony_ci	buf[0] = 0x13;
4278c2ecf20Sopenharmony_ci	msg.addr = 0x09;
4288c2ecf20Sopenharmony_ci	msg.buf = buf;
4298c2ecf20Sopenharmony_ci	msg.len = 2;
4308c2ecf20Sopenharmony_ci	msg.flags = 0;
4318c2ecf20Sopenharmony_ci	ret = i2c_transfer(a, &msg, 1);
4328c2ecf20Sopenharmony_ci	if (ret != 1)
4338c2ecf20Sopenharmony_ci		return -ENODEV;
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_ci	return 0;
4368c2ecf20Sopenharmony_ci}
4378c2ecf20Sopenharmony_ci#else
4388c2ecf20Sopenharmony_cistatic int kfr2r09_usb0_gadget_i2c_setup(void)
4398c2ecf20Sopenharmony_ci{
4408c2ecf20Sopenharmony_ci	return -ENODEV;
4418c2ecf20Sopenharmony_ci}
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_cistatic int kfr2r09_serial_i2c_setup(void)
4448c2ecf20Sopenharmony_ci{
4458c2ecf20Sopenharmony_ci	return -ENODEV;
4468c2ecf20Sopenharmony_ci}
4478c2ecf20Sopenharmony_ci#endif
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_cistatic int kfr2r09_usb0_gadget_setup(void)
4508c2ecf20Sopenharmony_ci{
4518c2ecf20Sopenharmony_ci	int plugged_in;
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTN4, NULL); /* USB_DET */
4548c2ecf20Sopenharmony_ci	gpio_direction_input(GPIO_PTN4);
4558c2ecf20Sopenharmony_ci	plugged_in = gpio_get_value(GPIO_PTN4);
4568c2ecf20Sopenharmony_ci	if (!plugged_in)
4578c2ecf20Sopenharmony_ci		return -ENODEV; /* no cable plugged in */
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci	if (kfr2r09_usb0_gadget_i2c_setup() != 0)
4608c2ecf20Sopenharmony_ci		return -ENODEV; /* unable to configure using i2c */
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci	__raw_writew((__raw_readw(PORT_MSELCRB) & ~0xc000) | 0x8000, PORT_MSELCRB);
4638c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_PDSTATUS, NULL); /* R-standby disables USB clock */
4648c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTV6, NULL); /* USBCLK_ON */
4658c2ecf20Sopenharmony_ci	gpio_direction_output(GPIO_PTV6, 1); /* USBCLK_ON = H */
4668c2ecf20Sopenharmony_ci	msleep(20); /* wait 20ms to let the clock settle */
4678c2ecf20Sopenharmony_ci	clk_enable(clk_get(NULL, "usb0"));
4688c2ecf20Sopenharmony_ci	__raw_writew(0x0600, 0xa40501d4);
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci	return 0;
4718c2ecf20Sopenharmony_ci}
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ciextern char kfr2r09_sdram_enter_start;
4748c2ecf20Sopenharmony_ciextern char kfr2r09_sdram_enter_end;
4758c2ecf20Sopenharmony_ciextern char kfr2r09_sdram_leave_start;
4768c2ecf20Sopenharmony_ciextern char kfr2r09_sdram_leave_end;
4778c2ecf20Sopenharmony_ci
4788c2ecf20Sopenharmony_cistatic int __init kfr2r09_devices_setup(void)
4798c2ecf20Sopenharmony_ci{
4808c2ecf20Sopenharmony_ci	struct clk *camera_clk;
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	/* register board specific self-refresh code */
4838c2ecf20Sopenharmony_ci	sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF |
4848c2ecf20Sopenharmony_ci					SUSP_SH_RSTANDBY,
4858c2ecf20Sopenharmony_ci					&kfr2r09_sdram_enter_start,
4868c2ecf20Sopenharmony_ci					&kfr2r09_sdram_enter_end,
4878c2ecf20Sopenharmony_ci					&kfr2r09_sdram_leave_start,
4888c2ecf20Sopenharmony_ci					&kfr2r09_sdram_leave_end);
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci	regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
4918c2ecf20Sopenharmony_ci				     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
4928c2ecf20Sopenharmony_ci
4938c2ecf20Sopenharmony_ci	/* enable SCIF1 serial port for YC401 console support */
4948c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SCIF1_RXD, NULL);
4958c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SCIF1_TXD, NULL);
4968c2ecf20Sopenharmony_ci	kfr2r09_serial_i2c_setup(); /* ECONTMSK(bit6=L10ONEN) set 1 */
4978c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTG3, NULL); /* HPON_ON */
4988c2ecf20Sopenharmony_ci	gpio_direction_output(GPIO_PTG3, 1); /* HPON_ON = H */
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ci	/* setup NOR flash at CS0 */
5018c2ecf20Sopenharmony_ci	__raw_writel(0x36db0400, BSC_CS0BCR);
5028c2ecf20Sopenharmony_ci	__raw_writel(0x00000500, BSC_CS0WCR);
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci	/* setup NAND flash at CS4 */
5058c2ecf20Sopenharmony_ci	__raw_writel(0x36db0400, BSC_CS4BCR);
5068c2ecf20Sopenharmony_ci	__raw_writel(0x00000500, BSC_CS4WCR);
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	/* setup KEYSC pins */
5098c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT0, NULL);
5108c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT1, NULL);
5118c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT2, NULL);
5128c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT3, NULL);
5138c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT4_IN6, NULL);
5148c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYIN0, NULL);
5158c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYIN1, NULL);
5168c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYIN2, NULL);
5178c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYIN3, NULL);
5188c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYIN4, NULL);
5198c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_KEYOUT5_IN5, NULL);
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci	/* setup LCDC pins for SYS panel */
5228c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD17, NULL);
5238c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD16, NULL);
5248c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD15, NULL);
5258c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD14, NULL);
5268c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD13, NULL);
5278c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD12, NULL);
5288c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD11, NULL);
5298c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD10, NULL);
5308c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD9, NULL);
5318c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD8, NULL);
5328c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD7, NULL);
5338c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD6, NULL);
5348c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD5, NULL);
5358c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD4, NULL);
5368c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD3, NULL);
5378c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD2, NULL);
5388c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD1, NULL);
5398c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDD0, NULL);
5408c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDRS, NULL); /* LCD_RS */
5418c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDCS, NULL); /* LCD_CS/ */
5428c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDRD, NULL); /* LCD_RD/ */
5438c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDWR, NULL); /* LCD_WR/ */
5448c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_LCDVSYN, NULL); /* LCD_VSYNC */
5458c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTE4, NULL); /* LCD_RST/ */
5468c2ecf20Sopenharmony_ci	gpio_direction_output(GPIO_PTE4, 1);
5478c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTF4, NULL); /* PROTECT/ */
5488c2ecf20Sopenharmony_ci	gpio_direction_output(GPIO_PTF4, 1);
5498c2ecf20Sopenharmony_ci	gpio_request(GPIO_PTU0, NULL); /* LEDSTDBY/ */
5508c2ecf20Sopenharmony_ci	gpio_direction_output(GPIO_PTU0, 1);
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ci	/* setup USB function */
5538c2ecf20Sopenharmony_ci	if (kfr2r09_usb0_gadget_setup() == 0)
5548c2ecf20Sopenharmony_ci		platform_device_register(&kfr2r09_usb0_gadget_device);
5558c2ecf20Sopenharmony_ci
5568c2ecf20Sopenharmony_ci	/* CEU */
5578c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO_CKO, NULL);
5588c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_CLK, NULL);
5598c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_VD, NULL);
5608c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_HD, NULL);
5618c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_FLD, NULL);
5628c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D7, NULL);
5638c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D6, NULL);
5648c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D5, NULL);
5658c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D4, NULL);
5668c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D3, NULL);
5678c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D2, NULL);
5688c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D1, NULL);
5698c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_VIO0_D0, NULL);
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci	/* SDHI0 connected to yc304 */
5728c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0CD, NULL);
5738c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0D3, NULL);
5748c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0D2, NULL);
5758c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0D1, NULL);
5768c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0D0, NULL);
5778c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0CMD, NULL);
5788c2ecf20Sopenharmony_ci	gpio_request(GPIO_FN_SDHI0CLK, NULL);
5798c2ecf20Sopenharmony_ci
5808c2ecf20Sopenharmony_ci	i2c_register_board_info(0, &kfr2r09_backlight_board_info, 1);
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_ci	/* Set camera clock frequency and register and alias for rj54n1. */
5838c2ecf20Sopenharmony_ci	camera_clk = clk_get(NULL, "video_clk");
5848c2ecf20Sopenharmony_ci	if (!IS_ERR(camera_clk)) {
5858c2ecf20Sopenharmony_ci		clk_set_rate(camera_clk,
5868c2ecf20Sopenharmony_ci			     clk_round_rate(camera_clk, CEU_MCLK_FREQ));
5878c2ecf20Sopenharmony_ci		clk_put(camera_clk);
5888c2ecf20Sopenharmony_ci	}
5898c2ecf20Sopenharmony_ci	clk_add_alias(NULL, "1-0050", "video_clk", NULL);
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci	/* set DRVCRB
5928c2ecf20Sopenharmony_ci	 *
5938c2ecf20Sopenharmony_ci	 * use 1.8 V for VccQ_VIO
5948c2ecf20Sopenharmony_ci	 * use 2.85V for VccQ_SR
5958c2ecf20Sopenharmony_ci	 */
5968c2ecf20Sopenharmony_ci	__raw_writew((__raw_readw(DRVCRB) & ~0x0003) | 0x0001, DRVCRB);
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_ci	gpiod_add_lookup_table(&rj54n1_gpios);
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_ci	i2c_register_board_info(1, &kfr2r09_i2c_camera, 1);
6018c2ecf20Sopenharmony_ci
6028c2ecf20Sopenharmony_ci	/* Initialize CEU platform device separately to map memory first */
6038c2ecf20Sopenharmony_ci	device_initialize(&kfr2r09_ceu_device.dev);
6048c2ecf20Sopenharmony_ci	dma_declare_coherent_memory(&kfr2r09_ceu_device.dev,
6058c2ecf20Sopenharmony_ci			ceu_dma_membase, ceu_dma_membase,
6068c2ecf20Sopenharmony_ci			CEU_BUFFER_MEMORY_SIZE);
6078c2ecf20Sopenharmony_ci
6088c2ecf20Sopenharmony_ci	platform_device_add(&kfr2r09_ceu_device);
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_ci	return platform_add_devices(kfr2r09_devices,
6118c2ecf20Sopenharmony_ci				    ARRAY_SIZE(kfr2r09_devices));
6128c2ecf20Sopenharmony_ci}
6138c2ecf20Sopenharmony_cidevice_initcall(kfr2r09_devices_setup);
6148c2ecf20Sopenharmony_ci
6158c2ecf20Sopenharmony_ci/* Return the board specific boot mode pin configuration */
6168c2ecf20Sopenharmony_cistatic int kfr2r09_mode_pins(void)
6178c2ecf20Sopenharmony_ci{
6188c2ecf20Sopenharmony_ci	/* MD0=1, MD1=1, MD2=0: Clock Mode 3
6198c2ecf20Sopenharmony_ci	 * MD3=0: 16-bit Area0 Bus Width
6208c2ecf20Sopenharmony_ci	 * MD5=1: Little Endian
6218c2ecf20Sopenharmony_ci	 * MD8=1: Test Mode Disabled
6228c2ecf20Sopenharmony_ci	 */
6238c2ecf20Sopenharmony_ci	return MODE_PIN0 | MODE_PIN1 | MODE_PIN5 | MODE_PIN8;
6248c2ecf20Sopenharmony_ci}
6258c2ecf20Sopenharmony_ci
6268c2ecf20Sopenharmony_ci/* Reserve a portion of memory for CEU buffers */
6278c2ecf20Sopenharmony_cistatic void __init kfr2r09_mv_mem_reserve(void)
6288c2ecf20Sopenharmony_ci{
6298c2ecf20Sopenharmony_ci	phys_addr_t phys;
6308c2ecf20Sopenharmony_ci	phys_addr_t size = CEU_BUFFER_MEMORY_SIZE;
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci	phys = memblock_phys_alloc(size, PAGE_SIZE);
6338c2ecf20Sopenharmony_ci	if (!phys)
6348c2ecf20Sopenharmony_ci		panic("Failed to allocate CEU memory\n");
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci	memblock_free(phys, size);
6378c2ecf20Sopenharmony_ci	memblock_remove(phys, size);
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	ceu_dma_membase = phys;
6408c2ecf20Sopenharmony_ci}
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci/*
6438c2ecf20Sopenharmony_ci * The Machine Vector
6448c2ecf20Sopenharmony_ci */
6458c2ecf20Sopenharmony_cistatic struct sh_machine_vector mv_kfr2r09 __initmv = {
6468c2ecf20Sopenharmony_ci	.mv_name		= "kfr2r09",
6478c2ecf20Sopenharmony_ci	.mv_mode_pins		= kfr2r09_mode_pins,
6488c2ecf20Sopenharmony_ci	.mv_mem_reserve         = kfr2r09_mv_mem_reserve,
6498c2ecf20Sopenharmony_ci};
650