18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2009 Renesas Solutions Corp. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Kuninori Morimoto <morimoto.kuninori@renesas.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <asm/clock.h> 88c2ecf20Sopenharmony_ci#include <asm/heartbeat.h> 98c2ecf20Sopenharmony_ci#include <asm/suspend.h> 108c2ecf20Sopenharmony_ci#include <cpu/sh7724.h> 118c2ecf20Sopenharmony_ci#include <linux/delay.h> 128c2ecf20Sopenharmony_ci#include <linux/device.h> 138c2ecf20Sopenharmony_ci#include <linux/i2c.h> 148c2ecf20Sopenharmony_ci#include <linux/io.h> 158c2ecf20Sopenharmony_ci#include <linux/init.h> 168c2ecf20Sopenharmony_ci#include <linux/input.h> 178c2ecf20Sopenharmony_ci#include <linux/input/sh_keysc.h> 188c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 198c2ecf20Sopenharmony_ci#include <linux/memblock.h> 208c2ecf20Sopenharmony_ci#include <linux/mfd/tmio.h> 218c2ecf20Sopenharmony_ci#include <linux/mmc/host.h> 228c2ecf20Sopenharmony_ci#include <linux/mmc/sh_mmcif.h> 238c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 248c2ecf20Sopenharmony_ci#include <linux/gpio.h> 258c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h> 268c2ecf20Sopenharmony_ci#include <linux/platform_data/gpio_backlight.h> 278c2ecf20Sopenharmony_ci#include <linux/platform_data/tsc2007.h> 288c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 298c2ecf20Sopenharmony_ci#include <linux/regulator/fixed.h> 308c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h> 318c2ecf20Sopenharmony_ci#include <linux/sh_eth.h> 328c2ecf20Sopenharmony_ci#include <linux/sh_intc.h> 338c2ecf20Sopenharmony_ci#include <linux/spi/mmc_spi.h> 348c2ecf20Sopenharmony_ci#include <linux/spi/sh_msiof.h> 358c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 368c2ecf20Sopenharmony_ci#include <linux/usb/r8a66597.h> 378c2ecf20Sopenharmony_ci#include <linux/usb/renesas_usbhs.h> 388c2ecf20Sopenharmony_ci#include <linux/videodev2.h> 398c2ecf20Sopenharmony_ci#include <linux/dma-map-ops.h> 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci#include <media/drv-intf/renesas-ceu.h> 428c2ecf20Sopenharmony_ci#include <media/i2c/mt9t112.h> 438c2ecf20Sopenharmony_ci#include <media/i2c/tw9910.h> 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#include <sound/sh_fsi.h> 468c2ecf20Sopenharmony_ci#include <sound/simple_card.h> 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#include <video/sh_mobile_lcdc.h> 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci/* 518c2ecf20Sopenharmony_ci * Address Interface BusWidth 528c2ecf20Sopenharmony_ci *----------------------------------------- 538c2ecf20Sopenharmony_ci * 0x0000_0000 uboot 16bit 548c2ecf20Sopenharmony_ci * 0x0004_0000 Linux romImage 16bit 558c2ecf20Sopenharmony_ci * 0x0014_0000 MTD for Linux 16bit 568c2ecf20Sopenharmony_ci * 0x0400_0000 Internal I/O 16/32bit 578c2ecf20Sopenharmony_ci * 0x0800_0000 DRAM 32bit 588c2ecf20Sopenharmony_ci * 0x1800_0000 MFI 16bit 598c2ecf20Sopenharmony_ci */ 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* SWITCH 628c2ecf20Sopenharmony_ci *------------------------------ 638c2ecf20Sopenharmony_ci * DS2[1] = FlashROM write protect ON : write protect 648c2ecf20Sopenharmony_ci * OFF : No write protect 658c2ecf20Sopenharmony_ci * DS2[2] = RMII / TS, SCIF ON : RMII 668c2ecf20Sopenharmony_ci * OFF : TS, SCIF3 678c2ecf20Sopenharmony_ci * DS2[3] = Camera / Video ON : Camera 688c2ecf20Sopenharmony_ci * OFF : NTSC/PAL (IN) 698c2ecf20Sopenharmony_ci * DS2[5] = NTSC_OUT Clock ON : On board OSC 708c2ecf20Sopenharmony_ci * OFF : SH7724 DV_CLK 718c2ecf20Sopenharmony_ci * DS2[6-7] = MMC / SD ON-OFF : SD 728c2ecf20Sopenharmony_ci * OFF-ON : MMC 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci/* 768c2ecf20Sopenharmony_ci * FSI - DA7210 778c2ecf20Sopenharmony_ci * 788c2ecf20Sopenharmony_ci * it needs amixer settings for playing 798c2ecf20Sopenharmony_ci * 808c2ecf20Sopenharmony_ci * amixer set 'HeadPhone' 80 818c2ecf20Sopenharmony_ci * amixer set 'Out Mixer Left DAC Left' on 828c2ecf20Sopenharmony_ci * amixer set 'Out Mixer Right DAC Right' on 838c2ecf20Sopenharmony_ci */ 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci#define CEU_BUFFER_MEMORY_SIZE (4 << 20) 868c2ecf20Sopenharmony_cistatic phys_addr_t ceu0_dma_membase; 878c2ecf20Sopenharmony_cistatic phys_addr_t ceu1_dma_membase; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/* Heartbeat */ 908c2ecf20Sopenharmony_cistatic unsigned char led_pos[] = { 0, 1, 2, 3 }; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cistatic struct heartbeat_data heartbeat_data = { 938c2ecf20Sopenharmony_ci .nr_bits = 4, 948c2ecf20Sopenharmony_ci .bit_pos = led_pos, 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistatic struct resource heartbeat_resource = { 988c2ecf20Sopenharmony_ci .start = 0xA405012C, /* PTG */ 998c2ecf20Sopenharmony_ci .end = 0xA405012E - 1, 1008c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic struct platform_device heartbeat_device = { 1048c2ecf20Sopenharmony_ci .name = "heartbeat", 1058c2ecf20Sopenharmony_ci .id = -1, 1068c2ecf20Sopenharmony_ci .dev = { 1078c2ecf20Sopenharmony_ci .platform_data = &heartbeat_data, 1088c2ecf20Sopenharmony_ci }, 1098c2ecf20Sopenharmony_ci .num_resources = 1, 1108c2ecf20Sopenharmony_ci .resource = &heartbeat_resource, 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci/* MTD */ 1148c2ecf20Sopenharmony_cistatic struct mtd_partition nor_flash_partitions[] = { 1158c2ecf20Sopenharmony_ci { 1168c2ecf20Sopenharmony_ci .name = "boot loader", 1178c2ecf20Sopenharmony_ci .offset = 0, 1188c2ecf20Sopenharmony_ci .size = (5 * 1024 * 1024), 1198c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* force read-only */ 1208c2ecf20Sopenharmony_ci }, { 1218c2ecf20Sopenharmony_ci .name = "free-area", 1228c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1238c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL, 1248c2ecf20Sopenharmony_ci }, 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cistatic struct physmap_flash_data nor_flash_data = { 1288c2ecf20Sopenharmony_ci .width = 2, 1298c2ecf20Sopenharmony_ci .parts = nor_flash_partitions, 1308c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(nor_flash_partitions), 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic struct resource nor_flash_resources[] = { 1348c2ecf20Sopenharmony_ci [0] = { 1358c2ecf20Sopenharmony_ci .name = "NOR Flash", 1368c2ecf20Sopenharmony_ci .start = 0x00000000, 1378c2ecf20Sopenharmony_ci .end = 0x03ffffff, 1388c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1398c2ecf20Sopenharmony_ci } 1408c2ecf20Sopenharmony_ci}; 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_cistatic struct platform_device nor_flash_device = { 1438c2ecf20Sopenharmony_ci .name = "physmap-flash", 1448c2ecf20Sopenharmony_ci .resource = nor_flash_resources, 1458c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(nor_flash_resources), 1468c2ecf20Sopenharmony_ci .dev = { 1478c2ecf20Sopenharmony_ci .platform_data = &nor_flash_data, 1488c2ecf20Sopenharmony_ci }, 1498c2ecf20Sopenharmony_ci}; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci/* SH Eth */ 1528c2ecf20Sopenharmony_ci#define SH_ETH_ADDR (0xA4600000) 1538c2ecf20Sopenharmony_cistatic struct resource sh_eth_resources[] = { 1548c2ecf20Sopenharmony_ci [0] = { 1558c2ecf20Sopenharmony_ci .start = SH_ETH_ADDR, 1568c2ecf20Sopenharmony_ci .end = SH_ETH_ADDR + 0x1FC, 1578c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1588c2ecf20Sopenharmony_ci }, 1598c2ecf20Sopenharmony_ci [1] = { 1608c2ecf20Sopenharmony_ci .start = evt2irq(0xd60), 1618c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 1628c2ecf20Sopenharmony_ci }, 1638c2ecf20Sopenharmony_ci}; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_cistatic struct sh_eth_plat_data sh_eth_plat = { 1668c2ecf20Sopenharmony_ci .phy = 0x1f, /* SMSC LAN8700 */ 1678c2ecf20Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 1688c2ecf20Sopenharmony_ci .ether_link_active_low = 1 1698c2ecf20Sopenharmony_ci}; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_cistatic struct platform_device sh_eth_device = { 1728c2ecf20Sopenharmony_ci .name = "sh7724-ether", 1738c2ecf20Sopenharmony_ci .id = 0, 1748c2ecf20Sopenharmony_ci .dev = { 1758c2ecf20Sopenharmony_ci .platform_data = &sh_eth_plat, 1768c2ecf20Sopenharmony_ci }, 1778c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth_resources), 1788c2ecf20Sopenharmony_ci .resource = sh_eth_resources, 1798c2ecf20Sopenharmony_ci}; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci/* USB0 host */ 1828c2ecf20Sopenharmony_cistatic void usb0_port_power(int port, int power) 1838c2ecf20Sopenharmony_ci{ 1848c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTB4, power); 1858c2ecf20Sopenharmony_ci} 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_cistatic struct r8a66597_platdata usb0_host_data = { 1888c2ecf20Sopenharmony_ci .on_chip = 1, 1898c2ecf20Sopenharmony_ci .port_power = usb0_port_power, 1908c2ecf20Sopenharmony_ci}; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_cistatic struct resource usb0_host_resources[] = { 1938c2ecf20Sopenharmony_ci [0] = { 1948c2ecf20Sopenharmony_ci .start = 0xa4d80000, 1958c2ecf20Sopenharmony_ci .end = 0xa4d80124 - 1, 1968c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1978c2ecf20Sopenharmony_ci }, 1988c2ecf20Sopenharmony_ci [1] = { 1998c2ecf20Sopenharmony_ci .start = evt2irq(0xa20), 2008c2ecf20Sopenharmony_ci .end = evt2irq(0xa20), 2018c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 2028c2ecf20Sopenharmony_ci }, 2038c2ecf20Sopenharmony_ci}; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cistatic struct platform_device usb0_host_device = { 2068c2ecf20Sopenharmony_ci .name = "r8a66597_hcd", 2078c2ecf20Sopenharmony_ci .id = 0, 2088c2ecf20Sopenharmony_ci .dev = { 2098c2ecf20Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 2108c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 2118c2ecf20Sopenharmony_ci .platform_data = &usb0_host_data, 2128c2ecf20Sopenharmony_ci }, 2138c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(usb0_host_resources), 2148c2ecf20Sopenharmony_ci .resource = usb0_host_resources, 2158c2ecf20Sopenharmony_ci}; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci/* USB1 host/function */ 2188c2ecf20Sopenharmony_cistatic void usb1_port_power(int port, int power) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTB5, power); 2218c2ecf20Sopenharmony_ci} 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistatic struct r8a66597_platdata usb1_common_data = { 2248c2ecf20Sopenharmony_ci .on_chip = 1, 2258c2ecf20Sopenharmony_ci .port_power = usb1_port_power, 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistatic struct resource usb1_common_resources[] = { 2298c2ecf20Sopenharmony_ci [0] = { 2308c2ecf20Sopenharmony_ci .start = 0xa4d90000, 2318c2ecf20Sopenharmony_ci .end = 0xa4d90124 - 1, 2328c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2338c2ecf20Sopenharmony_ci }, 2348c2ecf20Sopenharmony_ci [1] = { 2358c2ecf20Sopenharmony_ci .start = evt2irq(0xa40), 2368c2ecf20Sopenharmony_ci .end = evt2irq(0xa40), 2378c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 2388c2ecf20Sopenharmony_ci }, 2398c2ecf20Sopenharmony_ci}; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_cistatic struct platform_device usb1_common_device = { 2428c2ecf20Sopenharmony_ci /* .name will be added in arch_setup */ 2438c2ecf20Sopenharmony_ci .id = 1, 2448c2ecf20Sopenharmony_ci .dev = { 2458c2ecf20Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 2468c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 2478c2ecf20Sopenharmony_ci .platform_data = &usb1_common_data, 2488c2ecf20Sopenharmony_ci }, 2498c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(usb1_common_resources), 2508c2ecf20Sopenharmony_ci .resource = usb1_common_resources, 2518c2ecf20Sopenharmony_ci}; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci/* 2548c2ecf20Sopenharmony_ci * USBHS 2558c2ecf20Sopenharmony_ci */ 2568c2ecf20Sopenharmony_cistatic int usbhs_get_id(struct platform_device *pdev) 2578c2ecf20Sopenharmony_ci{ 2588c2ecf20Sopenharmony_ci return gpio_get_value(GPIO_PTB3); 2598c2ecf20Sopenharmony_ci} 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_cistatic int usbhs_phy_reset(struct platform_device *pdev) 2628c2ecf20Sopenharmony_ci{ 2638c2ecf20Sopenharmony_ci /* enable vbus if HOST */ 2648c2ecf20Sopenharmony_ci if (!gpio_get_value(GPIO_PTB3)) 2658c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTB5, 1); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci return 0; 2688c2ecf20Sopenharmony_ci} 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cistatic struct renesas_usbhs_platform_info usbhs_info = { 2718c2ecf20Sopenharmony_ci .platform_callback = { 2728c2ecf20Sopenharmony_ci .get_id = usbhs_get_id, 2738c2ecf20Sopenharmony_ci .phy_reset = usbhs_phy_reset, 2748c2ecf20Sopenharmony_ci }, 2758c2ecf20Sopenharmony_ci .driver_param = { 2768c2ecf20Sopenharmony_ci .buswait_bwait = 4, 2778c2ecf20Sopenharmony_ci .detection_delay = 5, 2788c2ecf20Sopenharmony_ci .d0_tx_id = SHDMA_SLAVE_USB1D0_TX, 2798c2ecf20Sopenharmony_ci .d0_rx_id = SHDMA_SLAVE_USB1D0_RX, 2808c2ecf20Sopenharmony_ci .d1_tx_id = SHDMA_SLAVE_USB1D1_TX, 2818c2ecf20Sopenharmony_ci .d1_rx_id = SHDMA_SLAVE_USB1D1_RX, 2828c2ecf20Sopenharmony_ci }, 2838c2ecf20Sopenharmony_ci}; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_cistatic struct resource usbhs_resources[] = { 2868c2ecf20Sopenharmony_ci [0] = { 2878c2ecf20Sopenharmony_ci .start = 0xa4d90000, 2888c2ecf20Sopenharmony_ci .end = 0xa4d90124 - 1, 2898c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2908c2ecf20Sopenharmony_ci }, 2918c2ecf20Sopenharmony_ci [1] = { 2928c2ecf20Sopenharmony_ci .start = evt2irq(0xa40), 2938c2ecf20Sopenharmony_ci .end = evt2irq(0xa40), 2948c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci}; 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_cistatic struct platform_device usbhs_device = { 2998c2ecf20Sopenharmony_ci .name = "renesas_usbhs", 3008c2ecf20Sopenharmony_ci .id = 1, 3018c2ecf20Sopenharmony_ci .dev = { 3028c2ecf20Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 3038c2ecf20Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 3048c2ecf20Sopenharmony_ci .platform_data = &usbhs_info, 3058c2ecf20Sopenharmony_ci }, 3068c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(usbhs_resources), 3078c2ecf20Sopenharmony_ci .resource = usbhs_resources, 3088c2ecf20Sopenharmony_ci}; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci/* LCDC and backlight */ 3118c2ecf20Sopenharmony_cistatic const struct fb_videomode ecovec_lcd_modes[] = { 3128c2ecf20Sopenharmony_ci { 3138c2ecf20Sopenharmony_ci .name = "Panel", 3148c2ecf20Sopenharmony_ci .xres = 800, 3158c2ecf20Sopenharmony_ci .yres = 480, 3168c2ecf20Sopenharmony_ci .left_margin = 220, 3178c2ecf20Sopenharmony_ci .right_margin = 110, 3188c2ecf20Sopenharmony_ci .hsync_len = 70, 3198c2ecf20Sopenharmony_ci .upper_margin = 20, 3208c2ecf20Sopenharmony_ci .lower_margin = 5, 3218c2ecf20Sopenharmony_ci .vsync_len = 5, 3228c2ecf20Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 3238c2ecf20Sopenharmony_ci }, 3248c2ecf20Sopenharmony_ci}; 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_cistatic const struct fb_videomode ecovec_dvi_modes[] = { 3278c2ecf20Sopenharmony_ci { 3288c2ecf20Sopenharmony_ci .name = "DVI", 3298c2ecf20Sopenharmony_ci .xres = 1280, 3308c2ecf20Sopenharmony_ci .yres = 720, 3318c2ecf20Sopenharmony_ci .left_margin = 220, 3328c2ecf20Sopenharmony_ci .right_margin = 110, 3338c2ecf20Sopenharmony_ci .hsync_len = 40, 3348c2ecf20Sopenharmony_ci .upper_margin = 20, 3358c2ecf20Sopenharmony_ci .lower_margin = 5, 3368c2ecf20Sopenharmony_ci .vsync_len = 5, 3378c2ecf20Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 3388c2ecf20Sopenharmony_ci }, 3398c2ecf20Sopenharmony_ci}; 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_cistatic struct sh_mobile_lcdc_info lcdc_info = { 3428c2ecf20Sopenharmony_ci .ch[0] = { 3438c2ecf20Sopenharmony_ci .interface_type = RGB18, 3448c2ecf20Sopenharmony_ci .chan = LCDC_CHAN_MAINLCD, 3458c2ecf20Sopenharmony_ci .fourcc = V4L2_PIX_FMT_RGB565, 3468c2ecf20Sopenharmony_ci .panel_cfg = { /* 7.0 inch */ 3478c2ecf20Sopenharmony_ci .width = 152, 3488c2ecf20Sopenharmony_ci .height = 91, 3498c2ecf20Sopenharmony_ci }, 3508c2ecf20Sopenharmony_ci } 3518c2ecf20Sopenharmony_ci}; 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_cistatic struct resource lcdc_resources[] = { 3548c2ecf20Sopenharmony_ci [0] = { 3558c2ecf20Sopenharmony_ci .name = "LCDC", 3568c2ecf20Sopenharmony_ci .start = 0xfe940000, 3578c2ecf20Sopenharmony_ci .end = 0xfe942fff, 3588c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 3598c2ecf20Sopenharmony_ci }, 3608c2ecf20Sopenharmony_ci [1] = { 3618c2ecf20Sopenharmony_ci .start = evt2irq(0xf40), 3628c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 3638c2ecf20Sopenharmony_ci }, 3648c2ecf20Sopenharmony_ci}; 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_cistatic struct platform_device lcdc_device = { 3678c2ecf20Sopenharmony_ci .name = "sh_mobile_lcdc_fb", 3688c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(lcdc_resources), 3698c2ecf20Sopenharmony_ci .resource = lcdc_resources, 3708c2ecf20Sopenharmony_ci .dev = { 3718c2ecf20Sopenharmony_ci .platform_data = &lcdc_info, 3728c2ecf20Sopenharmony_ci }, 3738c2ecf20Sopenharmony_ci}; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table gpio_backlight_lookup = { 3768c2ecf20Sopenharmony_ci .dev_id = "gpio-backlight.0", 3778c2ecf20Sopenharmony_ci .table = { 3788c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTR1, NULL, GPIO_ACTIVE_HIGH), 3798c2ecf20Sopenharmony_ci { } 3808c2ecf20Sopenharmony_ci }, 3818c2ecf20Sopenharmony_ci}; 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_cistatic struct property_entry gpio_backlight_props[] = { 3848c2ecf20Sopenharmony_ci PROPERTY_ENTRY_BOOL("default-on"), 3858c2ecf20Sopenharmony_ci { } 3868c2ecf20Sopenharmony_ci}; 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistatic struct gpio_backlight_platform_data gpio_backlight_data = { 3898c2ecf20Sopenharmony_ci .fbdev = &lcdc_device.dev, 3908c2ecf20Sopenharmony_ci}; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_cistatic const struct platform_device_info gpio_backlight_device_info = { 3938c2ecf20Sopenharmony_ci .name = "gpio-backlight", 3948c2ecf20Sopenharmony_ci .data = &gpio_backlight_data, 3958c2ecf20Sopenharmony_ci .size_data = sizeof(gpio_backlight_data), 3968c2ecf20Sopenharmony_ci .properties = gpio_backlight_props, 3978c2ecf20Sopenharmony_ci}; 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_cistatic struct platform_device *gpio_backlight_device; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_ci/* CEU0 */ 4028c2ecf20Sopenharmony_cistatic struct ceu_platform_data ceu0_pdata = { 4038c2ecf20Sopenharmony_ci .num_subdevs = 2, 4048c2ecf20Sopenharmony_ci .subdevs = { 4058c2ecf20Sopenharmony_ci { /* [0] = mt9t112 */ 4068c2ecf20Sopenharmony_ci .flags = 0, 4078c2ecf20Sopenharmony_ci .bus_width = 8, 4088c2ecf20Sopenharmony_ci .bus_shift = 0, 4098c2ecf20Sopenharmony_ci .i2c_adapter_id = 0, 4108c2ecf20Sopenharmony_ci .i2c_address = 0x3c, 4118c2ecf20Sopenharmony_ci }, 4128c2ecf20Sopenharmony_ci { /* [1] = tw9910 */ 4138c2ecf20Sopenharmony_ci .flags = 0, 4148c2ecf20Sopenharmony_ci .bus_width = 8, 4158c2ecf20Sopenharmony_ci .bus_shift = 0, 4168c2ecf20Sopenharmony_ci .i2c_adapter_id = 0, 4178c2ecf20Sopenharmony_ci .i2c_address = 0x45, 4188c2ecf20Sopenharmony_ci }, 4198c2ecf20Sopenharmony_ci }, 4208c2ecf20Sopenharmony_ci}; 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_cistatic struct resource ceu0_resources[] = { 4238c2ecf20Sopenharmony_ci [0] = { 4248c2ecf20Sopenharmony_ci .name = "CEU0", 4258c2ecf20Sopenharmony_ci .start = 0xfe910000, 4268c2ecf20Sopenharmony_ci .end = 0xfe91009f, 4278c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4288c2ecf20Sopenharmony_ci }, 4298c2ecf20Sopenharmony_ci [1] = { 4308c2ecf20Sopenharmony_ci .start = evt2irq(0x880), 4318c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4328c2ecf20Sopenharmony_ci }, 4338c2ecf20Sopenharmony_ci}; 4348c2ecf20Sopenharmony_ci 4358c2ecf20Sopenharmony_cistatic struct platform_device ceu0_device = { 4368c2ecf20Sopenharmony_ci .name = "renesas-ceu", 4378c2ecf20Sopenharmony_ci .id = 0, /* ceu.0 */ 4388c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu0_resources), 4398c2ecf20Sopenharmony_ci .resource = ceu0_resources, 4408c2ecf20Sopenharmony_ci .dev = { 4418c2ecf20Sopenharmony_ci .platform_data = &ceu0_pdata, 4428c2ecf20Sopenharmony_ci }, 4438c2ecf20Sopenharmony_ci}; 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci/* CEU1 */ 4468c2ecf20Sopenharmony_cistatic struct ceu_platform_data ceu1_pdata = { 4478c2ecf20Sopenharmony_ci .num_subdevs = 1, 4488c2ecf20Sopenharmony_ci .subdevs = { 4498c2ecf20Sopenharmony_ci { /* [0] = mt9t112 */ 4508c2ecf20Sopenharmony_ci .flags = 0, 4518c2ecf20Sopenharmony_ci .bus_width = 8, 4528c2ecf20Sopenharmony_ci .bus_shift = 0, 4538c2ecf20Sopenharmony_ci .i2c_adapter_id = 1, 4548c2ecf20Sopenharmony_ci .i2c_address = 0x3c, 4558c2ecf20Sopenharmony_ci }, 4568c2ecf20Sopenharmony_ci }, 4578c2ecf20Sopenharmony_ci}; 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_cistatic struct resource ceu1_resources[] = { 4608c2ecf20Sopenharmony_ci [0] = { 4618c2ecf20Sopenharmony_ci .name = "CEU1", 4628c2ecf20Sopenharmony_ci .start = 0xfe914000, 4638c2ecf20Sopenharmony_ci .end = 0xfe91409f, 4648c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 4658c2ecf20Sopenharmony_ci }, 4668c2ecf20Sopenharmony_ci [1] = { 4678c2ecf20Sopenharmony_ci .start = evt2irq(0x9e0), 4688c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 4698c2ecf20Sopenharmony_ci }, 4708c2ecf20Sopenharmony_ci}; 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_cistatic struct platform_device ceu1_device = { 4738c2ecf20Sopenharmony_ci .name = "renesas-ceu", 4748c2ecf20Sopenharmony_ci .id = 1, /* ceu.1 */ 4758c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu1_resources), 4768c2ecf20Sopenharmony_ci .resource = ceu1_resources, 4778c2ecf20Sopenharmony_ci .dev = { 4788c2ecf20Sopenharmony_ci .platform_data = &ceu1_pdata, 4798c2ecf20Sopenharmony_ci }, 4808c2ecf20Sopenharmony_ci}; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci/* Power up/down GPIOs for camera devices and video decoder */ 4838c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table tw9910_gpios = { 4848c2ecf20Sopenharmony_ci .dev_id = "0-0045", 4858c2ecf20Sopenharmony_ci .table = { 4868c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTU2, "pdn", GPIO_ACTIVE_HIGH), 4878c2ecf20Sopenharmony_ci }, 4888c2ecf20Sopenharmony_ci}; 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table mt9t112_0_gpios = { 4918c2ecf20Sopenharmony_ci .dev_id = "0-003c", 4928c2ecf20Sopenharmony_ci .table = { 4938c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTA3, "standby", 4948c2ecf20Sopenharmony_ci GPIO_ACTIVE_HIGH), 4958c2ecf20Sopenharmony_ci }, 4968c2ecf20Sopenharmony_ci}; 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table mt9t112_1_gpios = { 4998c2ecf20Sopenharmony_ci .dev_id = "1-003c", 5008c2ecf20Sopenharmony_ci .table = { 5018c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTA4, "standby", 5028c2ecf20Sopenharmony_ci GPIO_ACTIVE_HIGH), 5038c2ecf20Sopenharmony_ci }, 5048c2ecf20Sopenharmony_ci}; 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_ci/* I2C device */ 5078c2ecf20Sopenharmony_cistatic struct tw9910_video_info tw9910_info = { 5088c2ecf20Sopenharmony_ci .buswidth = 8, 5098c2ecf20Sopenharmony_ci .mpout = TW9910_MPO_FIELD, 5108c2ecf20Sopenharmony_ci}; 5118c2ecf20Sopenharmony_ci 5128c2ecf20Sopenharmony_cistatic struct mt9t112_platform_data mt9t112_0_pdata = { 5138c2ecf20Sopenharmony_ci .flags = MT9T112_FLAG_PCLK_RISING_EDGE, 5148c2ecf20Sopenharmony_ci .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 5158c2ecf20Sopenharmony_ci}; 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_cistatic struct mt9t112_platform_data mt9t112_1_pdata = { 5188c2ecf20Sopenharmony_ci .flags = MT9T112_FLAG_PCLK_RISING_EDGE, 5198c2ecf20Sopenharmony_ci .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 5208c2ecf20Sopenharmony_ci}; 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_cistatic struct i2c_board_info i2c0_devices[] = { 5238c2ecf20Sopenharmony_ci { 5248c2ecf20Sopenharmony_ci I2C_BOARD_INFO("da7210", 0x1a), 5258c2ecf20Sopenharmony_ci }, 5268c2ecf20Sopenharmony_ci { 5278c2ecf20Sopenharmony_ci I2C_BOARD_INFO("tw9910", 0x45), 5288c2ecf20Sopenharmony_ci .platform_data = &tw9910_info, 5298c2ecf20Sopenharmony_ci }, 5308c2ecf20Sopenharmony_ci { 5318c2ecf20Sopenharmony_ci /* 1st camera */ 5328c2ecf20Sopenharmony_ci I2C_BOARD_INFO("mt9t112", 0x3c), 5338c2ecf20Sopenharmony_ci .platform_data = &mt9t112_0_pdata, 5348c2ecf20Sopenharmony_ci }, 5358c2ecf20Sopenharmony_ci}; 5368c2ecf20Sopenharmony_ci 5378c2ecf20Sopenharmony_cistatic struct i2c_board_info i2c1_devices[] = { 5388c2ecf20Sopenharmony_ci { 5398c2ecf20Sopenharmony_ci I2C_BOARD_INFO("r2025sd", 0x32), 5408c2ecf20Sopenharmony_ci }, 5418c2ecf20Sopenharmony_ci { 5428c2ecf20Sopenharmony_ci I2C_BOARD_INFO("lis3lv02d", 0x1c), 5438c2ecf20Sopenharmony_ci .irq = evt2irq(0x620), 5448c2ecf20Sopenharmony_ci }, 5458c2ecf20Sopenharmony_ci { 5468c2ecf20Sopenharmony_ci /* 2nd camera */ 5478c2ecf20Sopenharmony_ci I2C_BOARD_INFO("mt9t112", 0x3c), 5488c2ecf20Sopenharmony_ci .platform_data = &mt9t112_1_pdata, 5498c2ecf20Sopenharmony_ci }, 5508c2ecf20Sopenharmony_ci}; 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci/* KEYSC */ 5538c2ecf20Sopenharmony_cistatic struct sh_keysc_info keysc_info = { 5548c2ecf20Sopenharmony_ci .mode = SH_KEYSC_MODE_1, 5558c2ecf20Sopenharmony_ci .scan_timing = 3, 5568c2ecf20Sopenharmony_ci .delay = 50, 5578c2ecf20Sopenharmony_ci .kycr2_delay = 100, 5588c2ecf20Sopenharmony_ci .keycodes = { KEY_1, 0, 0, 0, 0, 5598c2ecf20Sopenharmony_ci KEY_2, 0, 0, 0, 0, 5608c2ecf20Sopenharmony_ci KEY_3, 0, 0, 0, 0, 5618c2ecf20Sopenharmony_ci KEY_4, 0, 0, 0, 0, 5628c2ecf20Sopenharmony_ci KEY_5, 0, 0, 0, 0, 5638c2ecf20Sopenharmony_ci KEY_6, 0, 0, 0, 0, }, 5648c2ecf20Sopenharmony_ci}; 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_cistatic struct resource keysc_resources[] = { 5678c2ecf20Sopenharmony_ci [0] = { 5688c2ecf20Sopenharmony_ci .name = "KEYSC", 5698c2ecf20Sopenharmony_ci .start = 0x044b0000, 5708c2ecf20Sopenharmony_ci .end = 0x044b000f, 5718c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 5728c2ecf20Sopenharmony_ci }, 5738c2ecf20Sopenharmony_ci [1] = { 5748c2ecf20Sopenharmony_ci .start = evt2irq(0xbe0), 5758c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 5768c2ecf20Sopenharmony_ci }, 5778c2ecf20Sopenharmony_ci}; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_cistatic struct platform_device keysc_device = { 5808c2ecf20Sopenharmony_ci .name = "sh_keysc", 5818c2ecf20Sopenharmony_ci .id = 0, /* keysc0 clock */ 5828c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(keysc_resources), 5838c2ecf20Sopenharmony_ci .resource = keysc_resources, 5848c2ecf20Sopenharmony_ci .dev = { 5858c2ecf20Sopenharmony_ci .platform_data = &keysc_info, 5868c2ecf20Sopenharmony_ci }, 5878c2ecf20Sopenharmony_ci}; 5888c2ecf20Sopenharmony_ci 5898c2ecf20Sopenharmony_ci/* TouchScreen */ 5908c2ecf20Sopenharmony_ci#define IRQ0 evt2irq(0x600) 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_cistatic int ts_get_pendown_state(struct device *dev) 5938c2ecf20Sopenharmony_ci{ 5948c2ecf20Sopenharmony_ci int val = 0; 5958c2ecf20Sopenharmony_ci gpio_free(GPIO_FN_INTC_IRQ0); 5968c2ecf20Sopenharmony_ci gpio_request(GPIO_PTZ0, NULL); 5978c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTZ0); 5988c2ecf20Sopenharmony_ci 5998c2ecf20Sopenharmony_ci val = gpio_get_value(GPIO_PTZ0); 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci gpio_free(GPIO_PTZ0); 6028c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_ci return val ? 0 : 1; 6058c2ecf20Sopenharmony_ci} 6068c2ecf20Sopenharmony_ci 6078c2ecf20Sopenharmony_cistatic int ts_init(void) 6088c2ecf20Sopenharmony_ci{ 6098c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 6108c2ecf20Sopenharmony_ci return 0; 6118c2ecf20Sopenharmony_ci} 6128c2ecf20Sopenharmony_ci 6138c2ecf20Sopenharmony_cistatic struct tsc2007_platform_data tsc2007_info = { 6148c2ecf20Sopenharmony_ci .model = 2007, 6158c2ecf20Sopenharmony_ci .x_plate_ohms = 180, 6168c2ecf20Sopenharmony_ci .get_pendown_state = ts_get_pendown_state, 6178c2ecf20Sopenharmony_ci .init_platform_hw = ts_init, 6188c2ecf20Sopenharmony_ci}; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_cistatic struct i2c_board_info ts_i2c_clients = { 6218c2ecf20Sopenharmony_ci I2C_BOARD_INFO("tsc2007", 0x48), 6228c2ecf20Sopenharmony_ci .type = "tsc2007", 6238c2ecf20Sopenharmony_ci .platform_data = &tsc2007_info, 6248c2ecf20Sopenharmony_ci .irq = IRQ0, 6258c2ecf20Sopenharmony_ci}; 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply cn12_power_consumers[] = 6288c2ecf20Sopenharmony_ci{ 6298c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), 6308c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), 6318c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 6328c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 6338c2ecf20Sopenharmony_ci}; 6348c2ecf20Sopenharmony_ci 6358c2ecf20Sopenharmony_cistatic struct regulator_init_data cn12_power_init_data = { 6368c2ecf20Sopenharmony_ci .constraints = { 6378c2ecf20Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_STATUS, 6388c2ecf20Sopenharmony_ci }, 6398c2ecf20Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(cn12_power_consumers), 6408c2ecf20Sopenharmony_ci .consumer_supplies = cn12_power_consumers, 6418c2ecf20Sopenharmony_ci}; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_cistatic struct fixed_voltage_config cn12_power_info = { 6448c2ecf20Sopenharmony_ci .supply_name = "CN12 SD/MMC Vdd", 6458c2ecf20Sopenharmony_ci .microvolts = 3300000, 6468c2ecf20Sopenharmony_ci .init_data = &cn12_power_init_data, 6478c2ecf20Sopenharmony_ci}; 6488c2ecf20Sopenharmony_ci 6498c2ecf20Sopenharmony_cistatic struct platform_device cn12_power = { 6508c2ecf20Sopenharmony_ci .name = "reg-fixed-voltage", 6518c2ecf20Sopenharmony_ci .id = 0, 6528c2ecf20Sopenharmony_ci .dev = { 6538c2ecf20Sopenharmony_ci .platform_data = &cn12_power_info, 6548c2ecf20Sopenharmony_ci }, 6558c2ecf20Sopenharmony_ci}; 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table cn12_power_gpiod_table = { 6588c2ecf20Sopenharmony_ci .dev_id = "reg-fixed-voltage.0", 6598c2ecf20Sopenharmony_ci .table = { 6608c2ecf20Sopenharmony_ci /* Offset 7 on port B */ 6618c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7, 6628c2ecf20Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 6638c2ecf20Sopenharmony_ci { }, 6648c2ecf20Sopenharmony_ci }, 6658c2ecf20Sopenharmony_ci}; 6668c2ecf20Sopenharmony_ci 6678c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 6688c2ecf20Sopenharmony_ci/* SDHI0 */ 6698c2ecf20Sopenharmony_cistatic struct regulator_consumer_supply sdhi0_power_consumers[] = 6708c2ecf20Sopenharmony_ci{ 6718c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 6728c2ecf20Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 6738c2ecf20Sopenharmony_ci}; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_cistatic struct regulator_init_data sdhi0_power_init_data = { 6768c2ecf20Sopenharmony_ci .constraints = { 6778c2ecf20Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_STATUS, 6788c2ecf20Sopenharmony_ci }, 6798c2ecf20Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(sdhi0_power_consumers), 6808c2ecf20Sopenharmony_ci .consumer_supplies = sdhi0_power_consumers, 6818c2ecf20Sopenharmony_ci}; 6828c2ecf20Sopenharmony_ci 6838c2ecf20Sopenharmony_cistatic struct fixed_voltage_config sdhi0_power_info = { 6848c2ecf20Sopenharmony_ci .supply_name = "CN11 SD/MMC Vdd", 6858c2ecf20Sopenharmony_ci .microvolts = 3300000, 6868c2ecf20Sopenharmony_ci .init_data = &sdhi0_power_init_data, 6878c2ecf20Sopenharmony_ci}; 6888c2ecf20Sopenharmony_ci 6898c2ecf20Sopenharmony_cistatic struct platform_device sdhi0_power = { 6908c2ecf20Sopenharmony_ci .name = "reg-fixed-voltage", 6918c2ecf20Sopenharmony_ci .id = 1, 6928c2ecf20Sopenharmony_ci .dev = { 6938c2ecf20Sopenharmony_ci .platform_data = &sdhi0_power_info, 6948c2ecf20Sopenharmony_ci }, 6958c2ecf20Sopenharmony_ci}; 6968c2ecf20Sopenharmony_ci 6978c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table sdhi0_power_gpiod_table = { 6988c2ecf20Sopenharmony_ci .dev_id = "reg-fixed-voltage.1", 6998c2ecf20Sopenharmony_ci .table = { 7008c2ecf20Sopenharmony_ci /* Offset 6 on port B */ 7018c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTB6, 7028c2ecf20Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 7038c2ecf20Sopenharmony_ci { }, 7048c2ecf20Sopenharmony_ci }, 7058c2ecf20Sopenharmony_ci}; 7068c2ecf20Sopenharmony_ci 7078c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table sdhi0_gpio_table = { 7088c2ecf20Sopenharmony_ci .dev_id = "sh_mobile_sdhi.0", 7098c2ecf20Sopenharmony_ci .table = { 7108c2ecf20Sopenharmony_ci /* Card detect */ 7118c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTY7, "cd", GPIO_ACTIVE_LOW), 7128c2ecf20Sopenharmony_ci { }, 7138c2ecf20Sopenharmony_ci }, 7148c2ecf20Sopenharmony_ci}; 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_cistatic struct tmio_mmc_data sdhi0_info = { 7178c2ecf20Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX, 7188c2ecf20Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX, 7198c2ecf20Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 7208c2ecf20Sopenharmony_ci MMC_CAP_NEEDS_POLL, 7218c2ecf20Sopenharmony_ci}; 7228c2ecf20Sopenharmony_ci 7238c2ecf20Sopenharmony_cistatic struct resource sdhi0_resources[] = { 7248c2ecf20Sopenharmony_ci [0] = { 7258c2ecf20Sopenharmony_ci .name = "SDHI0", 7268c2ecf20Sopenharmony_ci .start = 0x04ce0000, 7278c2ecf20Sopenharmony_ci .end = 0x04ce00ff, 7288c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 7298c2ecf20Sopenharmony_ci }, 7308c2ecf20Sopenharmony_ci [1] = { 7318c2ecf20Sopenharmony_ci .start = evt2irq(0xe80), 7328c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 7338c2ecf20Sopenharmony_ci }, 7348c2ecf20Sopenharmony_ci}; 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_cistatic struct platform_device sdhi0_device = { 7378c2ecf20Sopenharmony_ci .name = "sh_mobile_sdhi", 7388c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi0_resources), 7398c2ecf20Sopenharmony_ci .resource = sdhi0_resources, 7408c2ecf20Sopenharmony_ci .id = 0, 7418c2ecf20Sopenharmony_ci .dev = { 7428c2ecf20Sopenharmony_ci .platform_data = &sdhi0_info, 7438c2ecf20Sopenharmony_ci }, 7448c2ecf20Sopenharmony_ci}; 7458c2ecf20Sopenharmony_ci 7468c2ecf20Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 7478c2ecf20Sopenharmony_ci/* SDHI1 */ 7488c2ecf20Sopenharmony_cistatic struct tmio_mmc_data sdhi1_info = { 7498c2ecf20Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI1_TX, 7508c2ecf20Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX, 7518c2ecf20Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 7528c2ecf20Sopenharmony_ci MMC_CAP_NEEDS_POLL, 7538c2ecf20Sopenharmony_ci}; 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table sdhi1_gpio_table = { 7568c2ecf20Sopenharmony_ci .dev_id = "sh_mobile_sdhi.1", 7578c2ecf20Sopenharmony_ci .table = { 7588c2ecf20Sopenharmony_ci /* Card detect */ 7598c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTW7, "cd", GPIO_ACTIVE_LOW), 7608c2ecf20Sopenharmony_ci { }, 7618c2ecf20Sopenharmony_ci }, 7628c2ecf20Sopenharmony_ci}; 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_cistatic struct resource sdhi1_resources[] = { 7658c2ecf20Sopenharmony_ci [0] = { 7668c2ecf20Sopenharmony_ci .name = "SDHI1", 7678c2ecf20Sopenharmony_ci .start = 0x04cf0000, 7688c2ecf20Sopenharmony_ci .end = 0x04cf00ff, 7698c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 7708c2ecf20Sopenharmony_ci }, 7718c2ecf20Sopenharmony_ci [1] = { 7728c2ecf20Sopenharmony_ci .start = evt2irq(0x4e0), 7738c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 7748c2ecf20Sopenharmony_ci }, 7758c2ecf20Sopenharmony_ci}; 7768c2ecf20Sopenharmony_ci 7778c2ecf20Sopenharmony_cistatic struct platform_device sdhi1_device = { 7788c2ecf20Sopenharmony_ci .name = "sh_mobile_sdhi", 7798c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi1_resources), 7808c2ecf20Sopenharmony_ci .resource = sdhi1_resources, 7818c2ecf20Sopenharmony_ci .id = 1, 7828c2ecf20Sopenharmony_ci .dev = { 7838c2ecf20Sopenharmony_ci .platform_data = &sdhi1_info, 7848c2ecf20Sopenharmony_ci }, 7858c2ecf20Sopenharmony_ci}; 7868c2ecf20Sopenharmony_ci#endif /* CONFIG_MMC_SH_MMCIF */ 7878c2ecf20Sopenharmony_ci 7888c2ecf20Sopenharmony_ci#else 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_ci/* MMC SPI */ 7918c2ecf20Sopenharmony_cistatic void mmc_spi_setpower(struct device *dev, unsigned int maskval) 7928c2ecf20Sopenharmony_ci{ 7938c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); 7948c2ecf20Sopenharmony_ci} 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_cistatic struct mmc_spi_platform_data mmc_spi_info = { 7978c2ecf20Sopenharmony_ci .caps = MMC_CAP_NEEDS_POLL, 7988c2ecf20Sopenharmony_ci .caps2 = MMC_CAP2_RO_ACTIVE_HIGH, 7998c2ecf20Sopenharmony_ci .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ 8008c2ecf20Sopenharmony_ci .setpower = mmc_spi_setpower, 8018c2ecf20Sopenharmony_ci}; 8028c2ecf20Sopenharmony_ci 8038c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table mmc_spi_gpio_table = { 8048c2ecf20Sopenharmony_ci .dev_id = "mmc_spi.0", /* device "mmc_spi" @ CS0 */ 8058c2ecf20Sopenharmony_ci .table = { 8068c2ecf20Sopenharmony_ci /* Card detect */ 8078c2ecf20Sopenharmony_ci GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY7, NULL, 0, 8088c2ecf20Sopenharmony_ci GPIO_ACTIVE_LOW), 8098c2ecf20Sopenharmony_ci /* Write protect */ 8108c2ecf20Sopenharmony_ci GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY6, NULL, 1, 8118c2ecf20Sopenharmony_ci GPIO_ACTIVE_HIGH), 8128c2ecf20Sopenharmony_ci { }, 8138c2ecf20Sopenharmony_ci }, 8148c2ecf20Sopenharmony_ci}; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_cistatic struct spi_board_info spi_bus[] = { 8178c2ecf20Sopenharmony_ci { 8188c2ecf20Sopenharmony_ci .modalias = "mmc_spi", 8198c2ecf20Sopenharmony_ci .platform_data = &mmc_spi_info, 8208c2ecf20Sopenharmony_ci .max_speed_hz = 5000000, 8218c2ecf20Sopenharmony_ci .mode = SPI_MODE_0, 8228c2ecf20Sopenharmony_ci }, 8238c2ecf20Sopenharmony_ci}; 8248c2ecf20Sopenharmony_ci 8258c2ecf20Sopenharmony_ci/* MSIOF0 */ 8268c2ecf20Sopenharmony_cistatic struct sh_msiof_spi_info msiof0_data = { 8278c2ecf20Sopenharmony_ci .num_chipselect = 1, 8288c2ecf20Sopenharmony_ci}; 8298c2ecf20Sopenharmony_ci 8308c2ecf20Sopenharmony_cistatic struct resource msiof0_resources[] = { 8318c2ecf20Sopenharmony_ci [0] = { 8328c2ecf20Sopenharmony_ci .name = "MSIOF0", 8338c2ecf20Sopenharmony_ci .start = 0xa4c40000, 8348c2ecf20Sopenharmony_ci .end = 0xa4c40063, 8358c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 8368c2ecf20Sopenharmony_ci }, 8378c2ecf20Sopenharmony_ci [1] = { 8388c2ecf20Sopenharmony_ci .start = evt2irq(0xc80), 8398c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 8408c2ecf20Sopenharmony_ci }, 8418c2ecf20Sopenharmony_ci}; 8428c2ecf20Sopenharmony_ci 8438c2ecf20Sopenharmony_cistatic struct platform_device msiof0_device = { 8448c2ecf20Sopenharmony_ci .name = "spi_sh_msiof", 8458c2ecf20Sopenharmony_ci .id = 0, /* MSIOF0 */ 8468c2ecf20Sopenharmony_ci .dev = { 8478c2ecf20Sopenharmony_ci .platform_data = &msiof0_data, 8488c2ecf20Sopenharmony_ci }, 8498c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(msiof0_resources), 8508c2ecf20Sopenharmony_ci .resource = msiof0_resources, 8518c2ecf20Sopenharmony_ci}; 8528c2ecf20Sopenharmony_ci 8538c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table msiof_gpio_table = { 8548c2ecf20Sopenharmony_ci .dev_id = "spi_sh_msiof.0", 8558c2ecf20Sopenharmony_ci .table = { 8568c2ecf20Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTM4, "cs", GPIO_ACTIVE_HIGH), 8578c2ecf20Sopenharmony_ci { }, 8588c2ecf20Sopenharmony_ci }, 8598c2ecf20Sopenharmony_ci}; 8608c2ecf20Sopenharmony_ci 8618c2ecf20Sopenharmony_ci#endif 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_ci/* FSI */ 8648c2ecf20Sopenharmony_cistatic struct resource fsi_resources[] = { 8658c2ecf20Sopenharmony_ci [0] = { 8668c2ecf20Sopenharmony_ci .name = "FSI", 8678c2ecf20Sopenharmony_ci .start = 0xFE3C0000, 8688c2ecf20Sopenharmony_ci .end = 0xFE3C021d, 8698c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 8708c2ecf20Sopenharmony_ci }, 8718c2ecf20Sopenharmony_ci [1] = { 8728c2ecf20Sopenharmony_ci .start = evt2irq(0xf80), 8738c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 8748c2ecf20Sopenharmony_ci }, 8758c2ecf20Sopenharmony_ci}; 8768c2ecf20Sopenharmony_ci 8778c2ecf20Sopenharmony_cistatic struct platform_device fsi_device = { 8788c2ecf20Sopenharmony_ci .name = "sh_fsi", 8798c2ecf20Sopenharmony_ci .id = 0, 8808c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(fsi_resources), 8818c2ecf20Sopenharmony_ci .resource = fsi_resources, 8828c2ecf20Sopenharmony_ci}; 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_cistatic struct asoc_simple_card_info fsi_da7210_info = { 8858c2ecf20Sopenharmony_ci .name = "DA7210", 8868c2ecf20Sopenharmony_ci .card = "FSIB-DA7210", 8878c2ecf20Sopenharmony_ci .codec = "da7210.0-001a", 8888c2ecf20Sopenharmony_ci .platform = "sh_fsi.0", 8898c2ecf20Sopenharmony_ci .daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, 8908c2ecf20Sopenharmony_ci .cpu_dai = { 8918c2ecf20Sopenharmony_ci .name = "fsib-dai", 8928c2ecf20Sopenharmony_ci }, 8938c2ecf20Sopenharmony_ci .codec_dai = { 8948c2ecf20Sopenharmony_ci .name = "da7210-hifi", 8958c2ecf20Sopenharmony_ci }, 8968c2ecf20Sopenharmony_ci}; 8978c2ecf20Sopenharmony_ci 8988c2ecf20Sopenharmony_cistatic struct platform_device fsi_da7210_device = { 8998c2ecf20Sopenharmony_ci .name = "asoc-simple-card", 9008c2ecf20Sopenharmony_ci .dev = { 9018c2ecf20Sopenharmony_ci .platform_data = &fsi_da7210_info, 9028c2ecf20Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 9038c2ecf20Sopenharmony_ci .dma_mask = &fsi_da7210_device.dev.coherent_dma_mask, 9048c2ecf20Sopenharmony_ci }, 9058c2ecf20Sopenharmony_ci}; 9068c2ecf20Sopenharmony_ci 9078c2ecf20Sopenharmony_ci 9088c2ecf20Sopenharmony_ci/* IrDA */ 9098c2ecf20Sopenharmony_cistatic struct resource irda_resources[] = { 9108c2ecf20Sopenharmony_ci [0] = { 9118c2ecf20Sopenharmony_ci .name = "IrDA", 9128c2ecf20Sopenharmony_ci .start = 0xA45D0000, 9138c2ecf20Sopenharmony_ci .end = 0xA45D0049, 9148c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 9158c2ecf20Sopenharmony_ci }, 9168c2ecf20Sopenharmony_ci [1] = { 9178c2ecf20Sopenharmony_ci .start = evt2irq(0x480), 9188c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 9198c2ecf20Sopenharmony_ci }, 9208c2ecf20Sopenharmony_ci}; 9218c2ecf20Sopenharmony_ci 9228c2ecf20Sopenharmony_cistatic struct platform_device irda_device = { 9238c2ecf20Sopenharmony_ci .name = "sh_sir", 9248c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(irda_resources), 9258c2ecf20Sopenharmony_ci .resource = irda_resources, 9268c2ecf20Sopenharmony_ci}; 9278c2ecf20Sopenharmony_ci 9288c2ecf20Sopenharmony_ci#include <media/i2c/ak881x.h> 9298c2ecf20Sopenharmony_ci#include <media/drv-intf/sh_vou.h> 9308c2ecf20Sopenharmony_ci 9318c2ecf20Sopenharmony_cistatic struct ak881x_pdata ak881x_pdata = { 9328c2ecf20Sopenharmony_ci .flags = AK881X_IF_MODE_SLAVE, 9338c2ecf20Sopenharmony_ci}; 9348c2ecf20Sopenharmony_ci 9358c2ecf20Sopenharmony_cistatic struct i2c_board_info ak8813 = { 9368c2ecf20Sopenharmony_ci I2C_BOARD_INFO("ak8813", 0x20), 9378c2ecf20Sopenharmony_ci .platform_data = &ak881x_pdata, 9388c2ecf20Sopenharmony_ci}; 9398c2ecf20Sopenharmony_ci 9408c2ecf20Sopenharmony_cistatic struct sh_vou_pdata sh_vou_pdata = { 9418c2ecf20Sopenharmony_ci .bus_fmt = SH_VOU_BUS_8BIT, 9428c2ecf20Sopenharmony_ci .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 9438c2ecf20Sopenharmony_ci .board_info = &ak8813, 9448c2ecf20Sopenharmony_ci .i2c_adap = 0, 9458c2ecf20Sopenharmony_ci}; 9468c2ecf20Sopenharmony_ci 9478c2ecf20Sopenharmony_cistatic struct resource sh_vou_resources[] = { 9488c2ecf20Sopenharmony_ci [0] = { 9498c2ecf20Sopenharmony_ci .start = 0xfe960000, 9508c2ecf20Sopenharmony_ci .end = 0xfe962043, 9518c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 9528c2ecf20Sopenharmony_ci }, 9538c2ecf20Sopenharmony_ci [1] = { 9548c2ecf20Sopenharmony_ci .start = evt2irq(0x8e0), 9558c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 9568c2ecf20Sopenharmony_ci }, 9578c2ecf20Sopenharmony_ci}; 9588c2ecf20Sopenharmony_ci 9598c2ecf20Sopenharmony_cistatic struct platform_device vou_device = { 9608c2ecf20Sopenharmony_ci .name = "sh-vou", 9618c2ecf20Sopenharmony_ci .id = -1, 9628c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_vou_resources), 9638c2ecf20Sopenharmony_ci .resource = sh_vou_resources, 9648c2ecf20Sopenharmony_ci .dev = { 9658c2ecf20Sopenharmony_ci .platform_data = &sh_vou_pdata, 9668c2ecf20Sopenharmony_ci }, 9678c2ecf20Sopenharmony_ci}; 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 9708c2ecf20Sopenharmony_ci/* SH_MMCIF */ 9718c2ecf20Sopenharmony_cistatic struct resource sh_mmcif_resources[] = { 9728c2ecf20Sopenharmony_ci [0] = { 9738c2ecf20Sopenharmony_ci .name = "SH_MMCIF", 9748c2ecf20Sopenharmony_ci .start = 0xA4CA0000, 9758c2ecf20Sopenharmony_ci .end = 0xA4CA00FF, 9768c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 9778c2ecf20Sopenharmony_ci }, 9788c2ecf20Sopenharmony_ci [1] = { 9798c2ecf20Sopenharmony_ci /* MMC2I */ 9808c2ecf20Sopenharmony_ci .start = evt2irq(0x5a0), 9818c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 9828c2ecf20Sopenharmony_ci }, 9838c2ecf20Sopenharmony_ci [2] = { 9848c2ecf20Sopenharmony_ci /* MMC3I */ 9858c2ecf20Sopenharmony_ci .start = evt2irq(0x5c0), 9868c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 9878c2ecf20Sopenharmony_ci }, 9888c2ecf20Sopenharmony_ci}; 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_cistatic struct sh_mmcif_plat_data sh_mmcif_plat = { 9918c2ecf20Sopenharmony_ci .sup_pclk = 0, /* SH7724: Max Pclk/2 */ 9928c2ecf20Sopenharmony_ci .caps = MMC_CAP_4_BIT_DATA | 9938c2ecf20Sopenharmony_ci MMC_CAP_8_BIT_DATA | 9948c2ecf20Sopenharmony_ci MMC_CAP_NEEDS_POLL, 9958c2ecf20Sopenharmony_ci .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, 9968c2ecf20Sopenharmony_ci}; 9978c2ecf20Sopenharmony_ci 9988c2ecf20Sopenharmony_cistatic struct platform_device sh_mmcif_device = { 9998c2ecf20Sopenharmony_ci .name = "sh_mmcif", 10008c2ecf20Sopenharmony_ci .id = 0, 10018c2ecf20Sopenharmony_ci .dev = { 10028c2ecf20Sopenharmony_ci .platform_data = &sh_mmcif_plat, 10038c2ecf20Sopenharmony_ci }, 10048c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_mmcif_resources), 10058c2ecf20Sopenharmony_ci .resource = sh_mmcif_resources, 10068c2ecf20Sopenharmony_ci}; 10078c2ecf20Sopenharmony_ci#endif 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_cistatic struct platform_device *ecovec_ceu_devices[] __initdata = { 10108c2ecf20Sopenharmony_ci &ceu0_device, 10118c2ecf20Sopenharmony_ci &ceu1_device, 10128c2ecf20Sopenharmony_ci}; 10138c2ecf20Sopenharmony_ci 10148c2ecf20Sopenharmony_cistatic struct platform_device *ecovec_devices[] __initdata = { 10158c2ecf20Sopenharmony_ci &heartbeat_device, 10168c2ecf20Sopenharmony_ci &nor_flash_device, 10178c2ecf20Sopenharmony_ci &sh_eth_device, 10188c2ecf20Sopenharmony_ci &usb0_host_device, 10198c2ecf20Sopenharmony_ci &usb1_common_device, 10208c2ecf20Sopenharmony_ci &usbhs_device, 10218c2ecf20Sopenharmony_ci &lcdc_device, 10228c2ecf20Sopenharmony_ci &keysc_device, 10238c2ecf20Sopenharmony_ci &cn12_power, 10248c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 10258c2ecf20Sopenharmony_ci &sdhi0_power, 10268c2ecf20Sopenharmony_ci &sdhi0_device, 10278c2ecf20Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 10288c2ecf20Sopenharmony_ci &sdhi1_device, 10298c2ecf20Sopenharmony_ci#endif 10308c2ecf20Sopenharmony_ci#else 10318c2ecf20Sopenharmony_ci &msiof0_device, 10328c2ecf20Sopenharmony_ci#endif 10338c2ecf20Sopenharmony_ci &fsi_device, 10348c2ecf20Sopenharmony_ci &fsi_da7210_device, 10358c2ecf20Sopenharmony_ci &irda_device, 10368c2ecf20Sopenharmony_ci &vou_device, 10378c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 10388c2ecf20Sopenharmony_ci &sh_mmcif_device, 10398c2ecf20Sopenharmony_ci#endif 10408c2ecf20Sopenharmony_ci}; 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_ci#ifdef CONFIG_I2C 10438c2ecf20Sopenharmony_ci#define EEPROM_ADDR 0x50 10448c2ecf20Sopenharmony_cistatic u8 mac_read(struct i2c_adapter *a, u8 command) 10458c2ecf20Sopenharmony_ci{ 10468c2ecf20Sopenharmony_ci struct i2c_msg msg[2]; 10478c2ecf20Sopenharmony_ci u8 buf; 10488c2ecf20Sopenharmony_ci int ret; 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_ci msg[0].addr = EEPROM_ADDR; 10518c2ecf20Sopenharmony_ci msg[0].flags = 0; 10528c2ecf20Sopenharmony_ci msg[0].len = 1; 10538c2ecf20Sopenharmony_ci msg[0].buf = &command; 10548c2ecf20Sopenharmony_ci 10558c2ecf20Sopenharmony_ci msg[1].addr = EEPROM_ADDR; 10568c2ecf20Sopenharmony_ci msg[1].flags = I2C_M_RD; 10578c2ecf20Sopenharmony_ci msg[1].len = 1; 10588c2ecf20Sopenharmony_ci msg[1].buf = &buf; 10598c2ecf20Sopenharmony_ci 10608c2ecf20Sopenharmony_ci ret = i2c_transfer(a, msg, 2); 10618c2ecf20Sopenharmony_ci if (ret < 0) { 10628c2ecf20Sopenharmony_ci printk(KERN_ERR "error %d\n", ret); 10638c2ecf20Sopenharmony_ci buf = 0xff; 10648c2ecf20Sopenharmony_ci } 10658c2ecf20Sopenharmony_ci 10668c2ecf20Sopenharmony_ci return buf; 10678c2ecf20Sopenharmony_ci} 10688c2ecf20Sopenharmony_ci 10698c2ecf20Sopenharmony_cistatic void __init sh_eth_init(struct sh_eth_plat_data *pd) 10708c2ecf20Sopenharmony_ci{ 10718c2ecf20Sopenharmony_ci struct i2c_adapter *a = i2c_get_adapter(1); 10728c2ecf20Sopenharmony_ci int i; 10738c2ecf20Sopenharmony_ci 10748c2ecf20Sopenharmony_ci if (!a) { 10758c2ecf20Sopenharmony_ci pr_err("can not get I2C 1\n"); 10768c2ecf20Sopenharmony_ci return; 10778c2ecf20Sopenharmony_ci } 10788c2ecf20Sopenharmony_ci 10798c2ecf20Sopenharmony_ci /* read MAC address from EEPROM */ 10808c2ecf20Sopenharmony_ci for (i = 0; i < sizeof(pd->mac_addr); i++) { 10818c2ecf20Sopenharmony_ci pd->mac_addr[i] = mac_read(a, 0x10 + i); 10828c2ecf20Sopenharmony_ci msleep(10); 10838c2ecf20Sopenharmony_ci } 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_ci i2c_put_adapter(a); 10868c2ecf20Sopenharmony_ci} 10878c2ecf20Sopenharmony_ci#else 10888c2ecf20Sopenharmony_cistatic void __init sh_eth_init(struct sh_eth_plat_data *pd) 10898c2ecf20Sopenharmony_ci{ 10908c2ecf20Sopenharmony_ci pr_err("unable to read sh_eth MAC address\n"); 10918c2ecf20Sopenharmony_ci} 10928c2ecf20Sopenharmony_ci#endif 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci#define PORT_HIZA 0xA4050158 10958c2ecf20Sopenharmony_ci#define IODRIVEA 0xA405018A 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_ciextern char ecovec24_sdram_enter_start; 10988c2ecf20Sopenharmony_ciextern char ecovec24_sdram_enter_end; 10998c2ecf20Sopenharmony_ciextern char ecovec24_sdram_leave_start; 11008c2ecf20Sopenharmony_ciextern char ecovec24_sdram_leave_end; 11018c2ecf20Sopenharmony_ci 11028c2ecf20Sopenharmony_cistatic int __init arch_setup(void) 11038c2ecf20Sopenharmony_ci{ 11048c2ecf20Sopenharmony_ci struct clk *clk; 11058c2ecf20Sopenharmony_ci bool cn12_enabled = false; 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_ci /* register board specific self-refresh code */ 11088c2ecf20Sopenharmony_ci sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 11098c2ecf20Sopenharmony_ci SUSP_SH_RSTANDBY, 11108c2ecf20Sopenharmony_ci &ecovec24_sdram_enter_start, 11118c2ecf20Sopenharmony_ci &ecovec24_sdram_enter_end, 11128c2ecf20Sopenharmony_ci &ecovec24_sdram_leave_start, 11138c2ecf20Sopenharmony_ci &ecovec24_sdram_leave_end); 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ci /* enable STATUS0, STATUS2 and PDSTATUS */ 11168c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_STATUS0, NULL); 11178c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_STATUS2, NULL); 11188c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_PDSTATUS, NULL); 11198c2ecf20Sopenharmony_ci 11208c2ecf20Sopenharmony_ci /* enable SCIFA0 */ 11218c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF0_TXD, NULL); 11228c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SCIF0_RXD, NULL); 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci /* enable debug LED */ 11258c2ecf20Sopenharmony_ci gpio_request(GPIO_PTG0, NULL); 11268c2ecf20Sopenharmony_ci gpio_request(GPIO_PTG1, NULL); 11278c2ecf20Sopenharmony_ci gpio_request(GPIO_PTG2, NULL); 11288c2ecf20Sopenharmony_ci gpio_request(GPIO_PTG3, NULL); 11298c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTG0, 0); 11308c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTG1, 0); 11318c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTG2, 0); 11328c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTG3, 0); 11338c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); 11348c2ecf20Sopenharmony_ci 11358c2ecf20Sopenharmony_ci /* enable SH-Eth */ 11368c2ecf20Sopenharmony_ci gpio_request(GPIO_PTA1, NULL); 11378c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTA1, 1); 11388c2ecf20Sopenharmony_ci mdelay(20); 11398c2ecf20Sopenharmony_ci 11408c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD0, NULL); 11418c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD1, NULL); 11428c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD0, NULL); 11438c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD1, NULL); 11448c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 11458c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_TX_EN, NULL); 11468c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_RX_ER, NULL); 11478c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 11488c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MDIO, NULL); 11498c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MDC, NULL); 11508c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LNKSTA, NULL); 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci /* enable USB */ 11538c2ecf20Sopenharmony_ci __raw_writew(0x0000, 0xA4D80000); 11548c2ecf20Sopenharmony_ci __raw_writew(0x0000, 0xA4D90000); 11558c2ecf20Sopenharmony_ci gpio_request(GPIO_PTB3, NULL); 11568c2ecf20Sopenharmony_ci gpio_request(GPIO_PTB4, NULL); 11578c2ecf20Sopenharmony_ci gpio_request(GPIO_PTB5, NULL); 11588c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTB3); 11598c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTB4, 0); 11608c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTB5, 0); 11618c2ecf20Sopenharmony_ci __raw_writew(0x0600, 0xa40501d4); 11628c2ecf20Sopenharmony_ci __raw_writew(0x0600, 0xa4050192); 11638c2ecf20Sopenharmony_ci 11648c2ecf20Sopenharmony_ci if (gpio_get_value(GPIO_PTB3)) { 11658c2ecf20Sopenharmony_ci printk(KERN_INFO "USB1 function is selected\n"); 11668c2ecf20Sopenharmony_ci usb1_common_device.name = "r8a66597_udc"; 11678c2ecf20Sopenharmony_ci } else { 11688c2ecf20Sopenharmony_ci printk(KERN_INFO "USB1 host is selected\n"); 11698c2ecf20Sopenharmony_ci usb1_common_device.name = "r8a66597_hcd"; 11708c2ecf20Sopenharmony_ci } 11718c2ecf20Sopenharmony_ci 11728c2ecf20Sopenharmony_ci /* enable LCDC */ 11738c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD23, NULL); 11748c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD22, NULL); 11758c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD21, NULL); 11768c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD20, NULL); 11778c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD19, NULL); 11788c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD18, NULL); 11798c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD17, NULL); 11808c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD16, NULL); 11818c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD15, NULL); 11828c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD14, NULL); 11838c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD13, NULL); 11848c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD12, NULL); 11858c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD11, NULL); 11868c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD10, NULL); 11878c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD9, NULL); 11888c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD8, NULL); 11898c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD7, NULL); 11908c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD6, NULL); 11918c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD5, NULL); 11928c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD4, NULL); 11938c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD3, NULL); 11948c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD2, NULL); 11958c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD1, NULL); 11968c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDD0, NULL); 11978c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDISP, NULL); 11988c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDHSYN, NULL); 11998c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDCK, NULL); 12008c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDVSYN, NULL); 12018c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDDON, NULL); 12028c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_LCDLCLK, NULL); 12038c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 12048c2ecf20Sopenharmony_ci 12058c2ecf20Sopenharmony_ci gpio_request(GPIO_PTE6, NULL); 12068c2ecf20Sopenharmony_ci gpio_request(GPIO_PTU1, NULL); 12078c2ecf20Sopenharmony_ci gpio_request(GPIO_PTA2, NULL); 12088c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTE6); 12098c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTU1, 0); 12108c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTA2, 0); 12118c2ecf20Sopenharmony_ci 12128c2ecf20Sopenharmony_ci /* I/O buffer drive ability is high */ 12138c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); 12148c2ecf20Sopenharmony_ci 12158c2ecf20Sopenharmony_ci if (gpio_get_value(GPIO_PTE6)) { 12168c2ecf20Sopenharmony_ci /* DVI */ 12178c2ecf20Sopenharmony_ci lcdc_info.clock_source = LCDC_CLK_EXTERNAL; 12188c2ecf20Sopenharmony_ci lcdc_info.ch[0].clock_divider = 1; 12198c2ecf20Sopenharmony_ci lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes; 12208c2ecf20Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes); 12218c2ecf20Sopenharmony_ci 12228c2ecf20Sopenharmony_ci /* No backlight */ 12238c2ecf20Sopenharmony_ci gpio_backlight_data.fbdev = NULL; 12248c2ecf20Sopenharmony_ci 12258c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTA2, 1); 12268c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTU1, 1); 12278c2ecf20Sopenharmony_ci } else { 12288c2ecf20Sopenharmony_ci /* Panel */ 12298c2ecf20Sopenharmony_ci lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; 12308c2ecf20Sopenharmony_ci lcdc_info.ch[0].clock_divider = 2; 12318c2ecf20Sopenharmony_ci lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes; 12328c2ecf20Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes); 12338c2ecf20Sopenharmony_ci 12348c2ecf20Sopenharmony_ci /* FIXME 12358c2ecf20Sopenharmony_ci * 12368c2ecf20Sopenharmony_ci * LCDDON control is needed for Panel, 12378c2ecf20Sopenharmony_ci * but current sh_mobile_lcdc driver doesn't control it. 12388c2ecf20Sopenharmony_ci * It is temporary correspondence 12398c2ecf20Sopenharmony_ci */ 12408c2ecf20Sopenharmony_ci gpio_request(GPIO_PTF4, NULL); 12418c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTF4, 1); 12428c2ecf20Sopenharmony_ci 12438c2ecf20Sopenharmony_ci /* enable TouchScreen */ 12448c2ecf20Sopenharmony_ci i2c_register_board_info(0, &ts_i2c_clients, 1); 12458c2ecf20Sopenharmony_ci irq_set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); 12468c2ecf20Sopenharmony_ci } 12478c2ecf20Sopenharmony_ci 12488c2ecf20Sopenharmony_ci /* enable CEU0 */ 12498c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D15, NULL); 12508c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D14, NULL); 12518c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D13, NULL); 12528c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D12, NULL); 12538c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D11, NULL); 12548c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D10, NULL); 12558c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D9, NULL); 12568c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D8, NULL); 12578c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D7, NULL); 12588c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D6, NULL); 12598c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D5, NULL); 12608c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D4, NULL); 12618c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D3, NULL); 12628c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D2, NULL); 12638c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D1, NULL); 12648c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D0, NULL); 12658c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_VD, NULL); 12668c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_CLK, NULL); 12678c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_FLD, NULL); 12688c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO0_HD, NULL); 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_ci /* enable CEU1 */ 12718c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D7, NULL); 12728c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D6, NULL); 12738c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D5, NULL); 12748c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D4, NULL); 12758c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D3, NULL); 12768c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D2, NULL); 12778c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D1, NULL); 12788c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D0, NULL); 12798c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_FLD, NULL); 12808c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_HD, NULL); 12818c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_VD, NULL); 12828c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_VIO1_CLK, NULL); 12838c2ecf20Sopenharmony_ci 12848c2ecf20Sopenharmony_ci /* enable KEYSC */ 12858c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 12868c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 12878c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT3, NULL); 12888c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT2, NULL); 12898c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT1, NULL); 12908c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT0, NULL); 12918c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_KEYIN0, NULL); 12928c2ecf20Sopenharmony_ci 12938c2ecf20Sopenharmony_ci /* enable user debug switch */ 12948c2ecf20Sopenharmony_ci gpio_request(GPIO_PTR0, NULL); 12958c2ecf20Sopenharmony_ci gpio_request(GPIO_PTR4, NULL); 12968c2ecf20Sopenharmony_ci gpio_request(GPIO_PTR5, NULL); 12978c2ecf20Sopenharmony_ci gpio_request(GPIO_PTR6, NULL); 12988c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTR0); 12998c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTR4); 13008c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTR5); 13018c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_PTR6); 13028c2ecf20Sopenharmony_ci 13038c2ecf20Sopenharmony_ci /* SD-card slot CN11 */ 13048c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 13058c2ecf20Sopenharmony_ci /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ 13068c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0WP, NULL); 13078c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CMD, NULL); 13088c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CLK, NULL); 13098c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D3, NULL); 13108c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D2, NULL); 13118c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D1, NULL); 13128c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D0, NULL); 13138c2ecf20Sopenharmony_ci#else 13148c2ecf20Sopenharmony_ci /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ 13158c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_TXD, NULL); 13168c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_RXD, NULL); 13178c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_TSCK, NULL); 13188c2ecf20Sopenharmony_ci gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ 13198c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&mmc_spi_gpio_table); 13228c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&msiof_gpio_table); 13238c2ecf20Sopenharmony_ci spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); 13248c2ecf20Sopenharmony_ci#endif 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_ci /* MMC/SD-card slot CN12 */ 13278c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 13288c2ecf20Sopenharmony_ci /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */ 13298c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D7, NULL); 13308c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D6, NULL); 13318c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D5, NULL); 13328c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D4, NULL); 13338c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D3, NULL); 13348c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D2, NULL); 13358c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D1, NULL); 13368c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_D0, NULL); 13378c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_CLK, NULL); 13388c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_MMC_CMD, NULL); 13398c2ecf20Sopenharmony_ci 13408c2ecf20Sopenharmony_ci cn12_enabled = true; 13418c2ecf20Sopenharmony_ci#elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 13428c2ecf20Sopenharmony_ci /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */ 13438c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1WP, NULL); 13448c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CMD, NULL); 13458c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CLK, NULL); 13468c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D3, NULL); 13478c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D2, NULL); 13488c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D1, NULL); 13498c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D0, NULL); 13508c2ecf20Sopenharmony_ci 13518c2ecf20Sopenharmony_ci cn12_enabled = true; 13528c2ecf20Sopenharmony_ci#endif 13538c2ecf20Sopenharmony_ci 13548c2ecf20Sopenharmony_ci if (cn12_enabled) 13558c2ecf20Sopenharmony_ci /* I/O buffer drive ability is high for CN12 */ 13568c2ecf20Sopenharmony_ci __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000, 13578c2ecf20Sopenharmony_ci IODRIVEA); 13588c2ecf20Sopenharmony_ci 13598c2ecf20Sopenharmony_ci /* enable FSI */ 13608c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIMCKB, NULL); 13618c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIBSD, NULL); 13628c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOBSD, NULL); 13638c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIBBCK, NULL); 13648c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIIBLRCK, NULL); 13658c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOBBCK, NULL); 13668c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_FSIOBLRCK, NULL); 13678c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_CLKAUDIOBO, NULL); 13688c2ecf20Sopenharmony_ci 13698c2ecf20Sopenharmony_ci /* set SPU2 clock to 83.4 MHz */ 13708c2ecf20Sopenharmony_ci clk = clk_get(NULL, "spu_clk"); 13718c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 13728c2ecf20Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 83333333)); 13738c2ecf20Sopenharmony_ci clk_put(clk); 13748c2ecf20Sopenharmony_ci } 13758c2ecf20Sopenharmony_ci 13768c2ecf20Sopenharmony_ci /* change parent of FSI B */ 13778c2ecf20Sopenharmony_ci clk = clk_get(NULL, "fsib_clk"); 13788c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 13798c2ecf20Sopenharmony_ci /* 48kHz dummy clock was used to make sure 1/1 divide */ 13808c2ecf20Sopenharmony_ci clk_set_rate(&sh7724_fsimckb_clk, 48000); 13818c2ecf20Sopenharmony_ci clk_set_parent(clk, &sh7724_fsimckb_clk); 13828c2ecf20Sopenharmony_ci clk_set_rate(clk, 48000); 13838c2ecf20Sopenharmony_ci clk_put(clk); 13848c2ecf20Sopenharmony_ci } 13858c2ecf20Sopenharmony_ci 13868c2ecf20Sopenharmony_ci gpio_request(GPIO_PTU0, NULL); 13878c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTU0, 0); 13888c2ecf20Sopenharmony_ci mdelay(20); 13898c2ecf20Sopenharmony_ci 13908c2ecf20Sopenharmony_ci /* enable motion sensor */ 13918c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ1, NULL); 13928c2ecf20Sopenharmony_ci gpio_direction_input(GPIO_FN_INTC_IRQ1); 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_ci /* set VPU clock to 166 MHz */ 13958c2ecf20Sopenharmony_ci clk = clk_get(NULL, "vpu_clk"); 13968c2ecf20Sopenharmony_ci if (!IS_ERR(clk)) { 13978c2ecf20Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 166000000)); 13988c2ecf20Sopenharmony_ci clk_put(clk); 13998c2ecf20Sopenharmony_ci } 14008c2ecf20Sopenharmony_ci 14018c2ecf20Sopenharmony_ci /* enable IrDA */ 14028c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_IRDA_OUT, NULL); 14038c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_IRDA_IN, NULL); 14048c2ecf20Sopenharmony_ci gpio_request(GPIO_PTU5, NULL); 14058c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTU5, 0); 14068c2ecf20Sopenharmony_ci 14078c2ecf20Sopenharmony_ci /* Register gpio lookup tables for cameras and video decoder */ 14088c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&tw9910_gpios); 14098c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&mt9t112_0_gpios); 14108c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&mt9t112_1_gpios); 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_ci /* enable I2C device */ 14138c2ecf20Sopenharmony_ci i2c_register_board_info(0, i2c0_devices, 14148c2ecf20Sopenharmony_ci ARRAY_SIZE(i2c0_devices)); 14158c2ecf20Sopenharmony_ci 14168c2ecf20Sopenharmony_ci i2c_register_board_info(1, i2c1_devices, 14178c2ecf20Sopenharmony_ci ARRAY_SIZE(i2c1_devices)); 14188c2ecf20Sopenharmony_ci 14198c2ecf20Sopenharmony_ci#if defined(CONFIG_VIDEO_SH_VOU) || defined(CONFIG_VIDEO_SH_VOU_MODULE) 14208c2ecf20Sopenharmony_ci /* VOU */ 14218c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D15, NULL); 14228c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D14, NULL); 14238c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D13, NULL); 14248c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D12, NULL); 14258c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D11, NULL); 14268c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D10, NULL); 14278c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D9, NULL); 14288c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_D8, NULL); 14298c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_CLKI, NULL); 14308c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_CLK, NULL); 14318c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_VSYNC, NULL); 14328c2ecf20Sopenharmony_ci gpio_request(GPIO_FN_DV_HSYNC, NULL); 14338c2ecf20Sopenharmony_ci 14348c2ecf20Sopenharmony_ci /* AK8813 power / reset sequence */ 14358c2ecf20Sopenharmony_ci gpio_request(GPIO_PTG4, NULL); 14368c2ecf20Sopenharmony_ci gpio_request(GPIO_PTU3, NULL); 14378c2ecf20Sopenharmony_ci /* Reset */ 14388c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTG4, 0); 14398c2ecf20Sopenharmony_ci /* Power down */ 14408c2ecf20Sopenharmony_ci gpio_direction_output(GPIO_PTU3, 1); 14418c2ecf20Sopenharmony_ci 14428c2ecf20Sopenharmony_ci udelay(10); 14438c2ecf20Sopenharmony_ci 14448c2ecf20Sopenharmony_ci /* Power up, reset */ 14458c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTU3, 0); 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci udelay(10); 14488c2ecf20Sopenharmony_ci 14498c2ecf20Sopenharmony_ci /* Remove reset */ 14508c2ecf20Sopenharmony_ci gpio_set_value(GPIO_PTG4, 1); 14518c2ecf20Sopenharmony_ci#endif 14528c2ecf20Sopenharmony_ci 14538c2ecf20Sopenharmony_ci /* Initialize CEU platform devices separately to map memory first */ 14548c2ecf20Sopenharmony_ci device_initialize(&ecovec_ceu_devices[0]->dev); 14558c2ecf20Sopenharmony_ci dma_declare_coherent_memory(&ecovec_ceu_devices[0]->dev, 14568c2ecf20Sopenharmony_ci ceu0_dma_membase, ceu0_dma_membase, 14578c2ecf20Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 14588c2ecf20Sopenharmony_ci platform_device_add(ecovec_ceu_devices[0]); 14598c2ecf20Sopenharmony_ci 14608c2ecf20Sopenharmony_ci device_initialize(&ecovec_ceu_devices[1]->dev); 14618c2ecf20Sopenharmony_ci dma_declare_coherent_memory(&ecovec_ceu_devices[1]->dev, 14628c2ecf20Sopenharmony_ci ceu1_dma_membase, ceu1_dma_membase, 14638c2ecf20Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 14648c2ecf20Sopenharmony_ci platform_device_add(ecovec_ceu_devices[1]); 14658c2ecf20Sopenharmony_ci 14668c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&cn12_power_gpiod_table); 14678c2ecf20Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 14688c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&sdhi0_power_gpiod_table); 14698c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&sdhi0_gpio_table); 14708c2ecf20Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 14718c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&sdhi1_gpio_table); 14728c2ecf20Sopenharmony_ci#endif 14738c2ecf20Sopenharmony_ci#endif 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&gpio_backlight_lookup); 14768c2ecf20Sopenharmony_ci gpio_backlight_device = platform_device_register_full( 14778c2ecf20Sopenharmony_ci &gpio_backlight_device_info); 14788c2ecf20Sopenharmony_ci if (IS_ERR(gpio_backlight_device)) 14798c2ecf20Sopenharmony_ci return PTR_ERR(gpio_backlight_device); 14808c2ecf20Sopenharmony_ci 14818c2ecf20Sopenharmony_ci return platform_add_devices(ecovec_devices, 14828c2ecf20Sopenharmony_ci ARRAY_SIZE(ecovec_devices)); 14838c2ecf20Sopenharmony_ci} 14848c2ecf20Sopenharmony_ciarch_initcall(arch_setup); 14858c2ecf20Sopenharmony_ci 14868c2ecf20Sopenharmony_cistatic int __init devices_setup(void) 14878c2ecf20Sopenharmony_ci{ 14888c2ecf20Sopenharmony_ci sh_eth_init(&sh_eth_plat); 14898c2ecf20Sopenharmony_ci return 0; 14908c2ecf20Sopenharmony_ci} 14918c2ecf20Sopenharmony_cidevice_initcall(devices_setup); 14928c2ecf20Sopenharmony_ci 14938c2ecf20Sopenharmony_ci/* Reserve a portion of memory for CEU 0 and CEU 1 buffers */ 14948c2ecf20Sopenharmony_cistatic void __init ecovec_mv_mem_reserve(void) 14958c2ecf20Sopenharmony_ci{ 14968c2ecf20Sopenharmony_ci phys_addr_t phys; 14978c2ecf20Sopenharmony_ci phys_addr_t size = CEU_BUFFER_MEMORY_SIZE; 14988c2ecf20Sopenharmony_ci 14998c2ecf20Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 15008c2ecf20Sopenharmony_ci if (!phys) 15018c2ecf20Sopenharmony_ci panic("Failed to allocate CEU0 memory\n"); 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci memblock_free(phys, size); 15048c2ecf20Sopenharmony_ci memblock_remove(phys, size); 15058c2ecf20Sopenharmony_ci ceu0_dma_membase = phys; 15068c2ecf20Sopenharmony_ci 15078c2ecf20Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 15088c2ecf20Sopenharmony_ci if (!phys) 15098c2ecf20Sopenharmony_ci panic("Failed to allocate CEU1 memory\n"); 15108c2ecf20Sopenharmony_ci 15118c2ecf20Sopenharmony_ci memblock_free(phys, size); 15128c2ecf20Sopenharmony_ci memblock_remove(phys, size); 15138c2ecf20Sopenharmony_ci ceu1_dma_membase = phys; 15148c2ecf20Sopenharmony_ci} 15158c2ecf20Sopenharmony_ci 15168c2ecf20Sopenharmony_cistatic struct sh_machine_vector mv_ecovec __initmv = { 15178c2ecf20Sopenharmony_ci .mv_name = "R0P7724 (EcoVec)", 15188c2ecf20Sopenharmony_ci .mv_mem_reserve = ecovec_mv_mem_reserve, 15198c2ecf20Sopenharmony_ci}; 1520