162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2009 Renesas Solutions Corp. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Kuninori Morimoto <morimoto.kuninori@renesas.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <asm/clock.h> 862306a36Sopenharmony_ci#include <asm/heartbeat.h> 962306a36Sopenharmony_ci#include <asm/suspend.h> 1062306a36Sopenharmony_ci#include <cpu/sh7724.h> 1162306a36Sopenharmony_ci#include <linux/delay.h> 1262306a36Sopenharmony_ci#include <linux/device.h> 1362306a36Sopenharmony_ci#include <linux/i2c.h> 1462306a36Sopenharmony_ci#include <linux/io.h> 1562306a36Sopenharmony_ci#include <linux/init.h> 1662306a36Sopenharmony_ci#include <linux/input.h> 1762306a36Sopenharmony_ci#include <linux/input/sh_keysc.h> 1862306a36Sopenharmony_ci#include <linux/interrupt.h> 1962306a36Sopenharmony_ci#include <linux/memblock.h> 2062306a36Sopenharmony_ci#include <linux/mfd/tmio.h> 2162306a36Sopenharmony_ci#include <linux/mmc/host.h> 2262306a36Sopenharmony_ci#include <linux/platform_data/sh_mmcif.h> 2362306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 2462306a36Sopenharmony_ci#include <linux/gpio.h> 2562306a36Sopenharmony_ci#include <linux/gpio/machine.h> 2662306a36Sopenharmony_ci#include <linux/platform_data/gpio_backlight.h> 2762306a36Sopenharmony_ci#include <linux/platform_data/tsc2007.h> 2862306a36Sopenharmony_ci#include <linux/platform_device.h> 2962306a36Sopenharmony_ci#include <linux/regulator/fixed.h> 3062306a36Sopenharmony_ci#include <linux/regulator/machine.h> 3162306a36Sopenharmony_ci#include <linux/sh_eth.h> 3262306a36Sopenharmony_ci#include <linux/sh_intc.h> 3362306a36Sopenharmony_ci#include <linux/spi/mmc_spi.h> 3462306a36Sopenharmony_ci#include <linux/spi/sh_msiof.h> 3562306a36Sopenharmony_ci#include <linux/spi/spi.h> 3662306a36Sopenharmony_ci#include <linux/usb/r8a66597.h> 3762306a36Sopenharmony_ci#include <linux/usb/renesas_usbhs.h> 3862306a36Sopenharmony_ci#include <linux/videodev2.h> 3962306a36Sopenharmony_ci#include <linux/dma-map-ops.h> 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#include <media/drv-intf/renesas-ceu.h> 4262306a36Sopenharmony_ci#include <media/i2c/mt9t112.h> 4362306a36Sopenharmony_ci#include <media/i2c/tw9910.h> 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#include <sound/sh_fsi.h> 4662306a36Sopenharmony_ci#include <sound/simple_card.h> 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#include <video/sh_mobile_lcdc.h> 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * Address Interface BusWidth 5262306a36Sopenharmony_ci *----------------------------------------- 5362306a36Sopenharmony_ci * 0x0000_0000 uboot 16bit 5462306a36Sopenharmony_ci * 0x0004_0000 Linux romImage 16bit 5562306a36Sopenharmony_ci * 0x0014_0000 MTD for Linux 16bit 5662306a36Sopenharmony_ci * 0x0400_0000 Internal I/O 16/32bit 5762306a36Sopenharmony_ci * 0x0800_0000 DRAM 32bit 5862306a36Sopenharmony_ci * 0x1800_0000 MFI 16bit 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* SWITCH 6262306a36Sopenharmony_ci *------------------------------ 6362306a36Sopenharmony_ci * DS2[1] = FlashROM write protect ON : write protect 6462306a36Sopenharmony_ci * OFF : No write protect 6562306a36Sopenharmony_ci * DS2[2] = RMII / TS, SCIF ON : RMII 6662306a36Sopenharmony_ci * OFF : TS, SCIF3 6762306a36Sopenharmony_ci * DS2[3] = Camera / Video ON : Camera 6862306a36Sopenharmony_ci * OFF : NTSC/PAL (IN) 6962306a36Sopenharmony_ci * DS2[5] = NTSC_OUT Clock ON : On board OSC 7062306a36Sopenharmony_ci * OFF : SH7724 DV_CLK 7162306a36Sopenharmony_ci * DS2[6-7] = MMC / SD ON-OFF : SD 7262306a36Sopenharmony_ci * OFF-ON : MMC 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* 7662306a36Sopenharmony_ci * FSI - DA7210 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * it needs amixer settings for playing 7962306a36Sopenharmony_ci * 8062306a36Sopenharmony_ci * amixer set 'HeadPhone' 80 8162306a36Sopenharmony_ci * amixer set 'Out Mixer Left DAC Left' on 8262306a36Sopenharmony_ci * amixer set 'Out Mixer Right DAC Right' on 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define CEU_BUFFER_MEMORY_SIZE (4 << 20) 8662306a36Sopenharmony_cistatic phys_addr_t ceu0_dma_membase; 8762306a36Sopenharmony_cistatic phys_addr_t ceu1_dma_membase; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* Heartbeat */ 9062306a36Sopenharmony_cistatic unsigned char led_pos[] = { 0, 1, 2, 3 }; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic struct heartbeat_data heartbeat_data = { 9362306a36Sopenharmony_ci .nr_bits = 4, 9462306a36Sopenharmony_ci .bit_pos = led_pos, 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic struct resource heartbeat_resource = { 9862306a36Sopenharmony_ci .start = 0xA405012C, /* PTG */ 9962306a36Sopenharmony_ci .end = 0xA405012E - 1, 10062306a36Sopenharmony_ci .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic struct platform_device heartbeat_device = { 10462306a36Sopenharmony_ci .name = "heartbeat", 10562306a36Sopenharmony_ci .id = -1, 10662306a36Sopenharmony_ci .dev = { 10762306a36Sopenharmony_ci .platform_data = &heartbeat_data, 10862306a36Sopenharmony_ci }, 10962306a36Sopenharmony_ci .num_resources = 1, 11062306a36Sopenharmony_ci .resource = &heartbeat_resource, 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* MTD */ 11462306a36Sopenharmony_cistatic struct mtd_partition nor_flash_partitions[] = { 11562306a36Sopenharmony_ci { 11662306a36Sopenharmony_ci .name = "boot loader", 11762306a36Sopenharmony_ci .offset = 0, 11862306a36Sopenharmony_ci .size = (5 * 1024 * 1024), 11962306a36Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* force read-only */ 12062306a36Sopenharmony_ci }, { 12162306a36Sopenharmony_ci .name = "free-area", 12262306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 12362306a36Sopenharmony_ci .size = MTDPART_SIZ_FULL, 12462306a36Sopenharmony_ci }, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic struct physmap_flash_data nor_flash_data = { 12862306a36Sopenharmony_ci .width = 2, 12962306a36Sopenharmony_ci .parts = nor_flash_partitions, 13062306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(nor_flash_partitions), 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic struct resource nor_flash_resources[] = { 13462306a36Sopenharmony_ci [0] = { 13562306a36Sopenharmony_ci .name = "NOR Flash", 13662306a36Sopenharmony_ci .start = 0x00000000, 13762306a36Sopenharmony_ci .end = 0x03ffffff, 13862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 13962306a36Sopenharmony_ci } 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistatic struct platform_device nor_flash_device = { 14362306a36Sopenharmony_ci .name = "physmap-flash", 14462306a36Sopenharmony_ci .resource = nor_flash_resources, 14562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(nor_flash_resources), 14662306a36Sopenharmony_ci .dev = { 14762306a36Sopenharmony_ci .platform_data = &nor_flash_data, 14862306a36Sopenharmony_ci }, 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* SH Eth */ 15262306a36Sopenharmony_ci#define SH_ETH_ADDR (0xA4600000) 15362306a36Sopenharmony_cistatic struct resource sh_eth_resources[] = { 15462306a36Sopenharmony_ci [0] = { 15562306a36Sopenharmony_ci .start = SH_ETH_ADDR, 15662306a36Sopenharmony_ci .end = SH_ETH_ADDR + 0x1FC, 15762306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 15862306a36Sopenharmony_ci }, 15962306a36Sopenharmony_ci [1] = { 16062306a36Sopenharmony_ci .start = evt2irq(0xd60), 16162306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 16262306a36Sopenharmony_ci }, 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic struct sh_eth_plat_data sh_eth_plat = { 16662306a36Sopenharmony_ci .phy = 0x1f, /* SMSC LAN8700 */ 16762306a36Sopenharmony_ci .phy_interface = PHY_INTERFACE_MODE_MII, 16862306a36Sopenharmony_ci .ether_link_active_low = 1 16962306a36Sopenharmony_ci}; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_cistatic struct platform_device sh_eth_device = { 17262306a36Sopenharmony_ci .name = "sh7724-ether", 17362306a36Sopenharmony_ci .id = 0, 17462306a36Sopenharmony_ci .dev = { 17562306a36Sopenharmony_ci .platform_data = &sh_eth_plat, 17662306a36Sopenharmony_ci }, 17762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_eth_resources), 17862306a36Sopenharmony_ci .resource = sh_eth_resources, 17962306a36Sopenharmony_ci}; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/* USB0 host */ 18262306a36Sopenharmony_cistatic void usb0_port_power(int port, int power) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci gpio_set_value(GPIO_PTB4, power); 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistatic struct r8a66597_platdata usb0_host_data = { 18862306a36Sopenharmony_ci .on_chip = 1, 18962306a36Sopenharmony_ci .port_power = usb0_port_power, 19062306a36Sopenharmony_ci}; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic struct resource usb0_host_resources[] = { 19362306a36Sopenharmony_ci [0] = { 19462306a36Sopenharmony_ci .start = 0xa4d80000, 19562306a36Sopenharmony_ci .end = 0xa4d80124 - 1, 19662306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 19762306a36Sopenharmony_ci }, 19862306a36Sopenharmony_ci [1] = { 19962306a36Sopenharmony_ci .start = evt2irq(0xa20), 20062306a36Sopenharmony_ci .end = evt2irq(0xa20), 20162306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 20262306a36Sopenharmony_ci }, 20362306a36Sopenharmony_ci}; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic struct platform_device usb0_host_device = { 20662306a36Sopenharmony_ci .name = "r8a66597_hcd", 20762306a36Sopenharmony_ci .id = 0, 20862306a36Sopenharmony_ci .dev = { 20962306a36Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 21062306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 21162306a36Sopenharmony_ci .platform_data = &usb0_host_data, 21262306a36Sopenharmony_ci }, 21362306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(usb0_host_resources), 21462306a36Sopenharmony_ci .resource = usb0_host_resources, 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci/* USB1 host/function */ 21862306a36Sopenharmony_cistatic void usb1_port_power(int port, int power) 21962306a36Sopenharmony_ci{ 22062306a36Sopenharmony_ci gpio_set_value(GPIO_PTB5, power); 22162306a36Sopenharmony_ci} 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistatic struct r8a66597_platdata usb1_common_data = { 22462306a36Sopenharmony_ci .on_chip = 1, 22562306a36Sopenharmony_ci .port_power = usb1_port_power, 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistatic struct resource usb1_common_resources[] = { 22962306a36Sopenharmony_ci [0] = { 23062306a36Sopenharmony_ci .start = 0xa4d90000, 23162306a36Sopenharmony_ci .end = 0xa4d90124 - 1, 23262306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 23362306a36Sopenharmony_ci }, 23462306a36Sopenharmony_ci [1] = { 23562306a36Sopenharmony_ci .start = evt2irq(0xa40), 23662306a36Sopenharmony_ci .end = evt2irq(0xa40), 23762306a36Sopenharmony_ci .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 23862306a36Sopenharmony_ci }, 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic struct platform_device usb1_common_device = { 24262306a36Sopenharmony_ci /* .name will be added in arch_setup */ 24362306a36Sopenharmony_ci .id = 1, 24462306a36Sopenharmony_ci .dev = { 24562306a36Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 24662306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 24762306a36Sopenharmony_ci .platform_data = &usb1_common_data, 24862306a36Sopenharmony_ci }, 24962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(usb1_common_resources), 25062306a36Sopenharmony_ci .resource = usb1_common_resources, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* 25462306a36Sopenharmony_ci * USBHS 25562306a36Sopenharmony_ci */ 25662306a36Sopenharmony_cistatic int usbhs_get_id(struct platform_device *pdev) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci return gpio_get_value(GPIO_PTB3); 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic int usbhs_phy_reset(struct platform_device *pdev) 26262306a36Sopenharmony_ci{ 26362306a36Sopenharmony_ci /* enable vbus if HOST */ 26462306a36Sopenharmony_ci if (!gpio_get_value(GPIO_PTB3)) 26562306a36Sopenharmony_ci gpio_set_value(GPIO_PTB5, 1); 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci return 0; 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistatic struct renesas_usbhs_platform_info usbhs_info = { 27162306a36Sopenharmony_ci .platform_callback = { 27262306a36Sopenharmony_ci .get_id = usbhs_get_id, 27362306a36Sopenharmony_ci .phy_reset = usbhs_phy_reset, 27462306a36Sopenharmony_ci }, 27562306a36Sopenharmony_ci .driver_param = { 27662306a36Sopenharmony_ci .buswait_bwait = 4, 27762306a36Sopenharmony_ci .detection_delay = 5, 27862306a36Sopenharmony_ci .d0_tx_id = SHDMA_SLAVE_USB1D0_TX, 27962306a36Sopenharmony_ci .d0_rx_id = SHDMA_SLAVE_USB1D0_RX, 28062306a36Sopenharmony_ci .d1_tx_id = SHDMA_SLAVE_USB1D1_TX, 28162306a36Sopenharmony_ci .d1_rx_id = SHDMA_SLAVE_USB1D1_RX, 28262306a36Sopenharmony_ci }, 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic struct resource usbhs_resources[] = { 28662306a36Sopenharmony_ci [0] = { 28762306a36Sopenharmony_ci .start = 0xa4d90000, 28862306a36Sopenharmony_ci .end = 0xa4d90124 - 1, 28962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 29062306a36Sopenharmony_ci }, 29162306a36Sopenharmony_ci [1] = { 29262306a36Sopenharmony_ci .start = evt2irq(0xa40), 29362306a36Sopenharmony_ci .end = evt2irq(0xa40), 29462306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 29562306a36Sopenharmony_ci }, 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic struct platform_device usbhs_device = { 29962306a36Sopenharmony_ci .name = "renesas_usbhs", 30062306a36Sopenharmony_ci .id = 1, 30162306a36Sopenharmony_ci .dev = { 30262306a36Sopenharmony_ci .dma_mask = NULL, /* not use dma */ 30362306a36Sopenharmony_ci .coherent_dma_mask = 0xffffffff, 30462306a36Sopenharmony_ci .platform_data = &usbhs_info, 30562306a36Sopenharmony_ci }, 30662306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(usbhs_resources), 30762306a36Sopenharmony_ci .resource = usbhs_resources, 30862306a36Sopenharmony_ci}; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci/* LCDC and backlight */ 31162306a36Sopenharmony_cistatic const struct fb_videomode ecovec_lcd_modes[] = { 31262306a36Sopenharmony_ci { 31362306a36Sopenharmony_ci .name = "Panel", 31462306a36Sopenharmony_ci .xres = 800, 31562306a36Sopenharmony_ci .yres = 480, 31662306a36Sopenharmony_ci .left_margin = 220, 31762306a36Sopenharmony_ci .right_margin = 110, 31862306a36Sopenharmony_ci .hsync_len = 70, 31962306a36Sopenharmony_ci .upper_margin = 20, 32062306a36Sopenharmony_ci .lower_margin = 5, 32162306a36Sopenharmony_ci .vsync_len = 5, 32262306a36Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 32362306a36Sopenharmony_ci }, 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cistatic const struct fb_videomode ecovec_dvi_modes[] = { 32762306a36Sopenharmony_ci { 32862306a36Sopenharmony_ci .name = "DVI", 32962306a36Sopenharmony_ci .xres = 1280, 33062306a36Sopenharmony_ci .yres = 720, 33162306a36Sopenharmony_ci .left_margin = 220, 33262306a36Sopenharmony_ci .right_margin = 110, 33362306a36Sopenharmony_ci .hsync_len = 40, 33462306a36Sopenharmony_ci .upper_margin = 20, 33562306a36Sopenharmony_ci .lower_margin = 5, 33662306a36Sopenharmony_ci .vsync_len = 5, 33762306a36Sopenharmony_ci .sync = 0, /* hsync and vsync are active low */ 33862306a36Sopenharmony_ci }, 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_cistatic struct sh_mobile_lcdc_info lcdc_info = { 34262306a36Sopenharmony_ci .ch[0] = { 34362306a36Sopenharmony_ci .interface_type = RGB18, 34462306a36Sopenharmony_ci .chan = LCDC_CHAN_MAINLCD, 34562306a36Sopenharmony_ci .fourcc = V4L2_PIX_FMT_RGB565, 34662306a36Sopenharmony_ci .panel_cfg = { /* 7.0 inch */ 34762306a36Sopenharmony_ci .width = 152, 34862306a36Sopenharmony_ci .height = 91, 34962306a36Sopenharmony_ci }, 35062306a36Sopenharmony_ci } 35162306a36Sopenharmony_ci}; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic struct resource lcdc_resources[] = { 35462306a36Sopenharmony_ci [0] = { 35562306a36Sopenharmony_ci .name = "LCDC", 35662306a36Sopenharmony_ci .start = 0xfe940000, 35762306a36Sopenharmony_ci .end = 0xfe942fff, 35862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 35962306a36Sopenharmony_ci }, 36062306a36Sopenharmony_ci [1] = { 36162306a36Sopenharmony_ci .start = evt2irq(0xf40), 36262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 36362306a36Sopenharmony_ci }, 36462306a36Sopenharmony_ci}; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistatic struct platform_device lcdc_device = { 36762306a36Sopenharmony_ci .name = "sh_mobile_lcdc_fb", 36862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(lcdc_resources), 36962306a36Sopenharmony_ci .resource = lcdc_resources, 37062306a36Sopenharmony_ci .dev = { 37162306a36Sopenharmony_ci .platform_data = &lcdc_info, 37262306a36Sopenharmony_ci }, 37362306a36Sopenharmony_ci}; 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic struct gpiod_lookup_table gpio_backlight_lookup = { 37662306a36Sopenharmony_ci .dev_id = "gpio-backlight.0", 37762306a36Sopenharmony_ci .table = { 37862306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTR1, NULL, GPIO_ACTIVE_HIGH), 37962306a36Sopenharmony_ci { } 38062306a36Sopenharmony_ci }, 38162306a36Sopenharmony_ci}; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic struct property_entry gpio_backlight_props[] = { 38462306a36Sopenharmony_ci PROPERTY_ENTRY_BOOL("default-on"), 38562306a36Sopenharmony_ci { } 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistatic struct gpio_backlight_platform_data gpio_backlight_data = { 38962306a36Sopenharmony_ci .dev = &lcdc_device.dev, 39062306a36Sopenharmony_ci}; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_cistatic const struct platform_device_info gpio_backlight_device_info = { 39362306a36Sopenharmony_ci .name = "gpio-backlight", 39462306a36Sopenharmony_ci .data = &gpio_backlight_data, 39562306a36Sopenharmony_ci .size_data = sizeof(gpio_backlight_data), 39662306a36Sopenharmony_ci .properties = gpio_backlight_props, 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_cistatic struct platform_device *gpio_backlight_device; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci/* CEU0 */ 40262306a36Sopenharmony_cistatic struct ceu_platform_data ceu0_pdata = { 40362306a36Sopenharmony_ci .num_subdevs = 2, 40462306a36Sopenharmony_ci .subdevs = { 40562306a36Sopenharmony_ci { /* [0] = mt9t112 */ 40662306a36Sopenharmony_ci .flags = 0, 40762306a36Sopenharmony_ci .bus_width = 8, 40862306a36Sopenharmony_ci .bus_shift = 0, 40962306a36Sopenharmony_ci .i2c_adapter_id = 0, 41062306a36Sopenharmony_ci .i2c_address = 0x3c, 41162306a36Sopenharmony_ci }, 41262306a36Sopenharmony_ci { /* [1] = tw9910 */ 41362306a36Sopenharmony_ci .flags = 0, 41462306a36Sopenharmony_ci .bus_width = 8, 41562306a36Sopenharmony_ci .bus_shift = 0, 41662306a36Sopenharmony_ci .i2c_adapter_id = 0, 41762306a36Sopenharmony_ci .i2c_address = 0x45, 41862306a36Sopenharmony_ci }, 41962306a36Sopenharmony_ci }, 42062306a36Sopenharmony_ci}; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistatic struct resource ceu0_resources[] = { 42362306a36Sopenharmony_ci [0] = { 42462306a36Sopenharmony_ci .name = "CEU0", 42562306a36Sopenharmony_ci .start = 0xfe910000, 42662306a36Sopenharmony_ci .end = 0xfe91009f, 42762306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 42862306a36Sopenharmony_ci }, 42962306a36Sopenharmony_ci [1] = { 43062306a36Sopenharmony_ci .start = evt2irq(0x880), 43162306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 43262306a36Sopenharmony_ci }, 43362306a36Sopenharmony_ci}; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_cistatic struct platform_device ceu0_device = { 43662306a36Sopenharmony_ci .name = "renesas-ceu", 43762306a36Sopenharmony_ci .id = 0, /* ceu.0 */ 43862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu0_resources), 43962306a36Sopenharmony_ci .resource = ceu0_resources, 44062306a36Sopenharmony_ci .dev = { 44162306a36Sopenharmony_ci .platform_data = &ceu0_pdata, 44262306a36Sopenharmony_ci }, 44362306a36Sopenharmony_ci}; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci/* CEU1 */ 44662306a36Sopenharmony_cistatic struct ceu_platform_data ceu1_pdata = { 44762306a36Sopenharmony_ci .num_subdevs = 1, 44862306a36Sopenharmony_ci .subdevs = { 44962306a36Sopenharmony_ci { /* [0] = mt9t112 */ 45062306a36Sopenharmony_ci .flags = 0, 45162306a36Sopenharmony_ci .bus_width = 8, 45262306a36Sopenharmony_ci .bus_shift = 0, 45362306a36Sopenharmony_ci .i2c_adapter_id = 1, 45462306a36Sopenharmony_ci .i2c_address = 0x3c, 45562306a36Sopenharmony_ci }, 45662306a36Sopenharmony_ci }, 45762306a36Sopenharmony_ci}; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistatic struct resource ceu1_resources[] = { 46062306a36Sopenharmony_ci [0] = { 46162306a36Sopenharmony_ci .name = "CEU1", 46262306a36Sopenharmony_ci .start = 0xfe914000, 46362306a36Sopenharmony_ci .end = 0xfe91409f, 46462306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 46562306a36Sopenharmony_ci }, 46662306a36Sopenharmony_ci [1] = { 46762306a36Sopenharmony_ci .start = evt2irq(0x9e0), 46862306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 46962306a36Sopenharmony_ci }, 47062306a36Sopenharmony_ci}; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistatic struct platform_device ceu1_device = { 47362306a36Sopenharmony_ci .name = "renesas-ceu", 47462306a36Sopenharmony_ci .id = 1, /* ceu.1 */ 47562306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(ceu1_resources), 47662306a36Sopenharmony_ci .resource = ceu1_resources, 47762306a36Sopenharmony_ci .dev = { 47862306a36Sopenharmony_ci .platform_data = &ceu1_pdata, 47962306a36Sopenharmony_ci }, 48062306a36Sopenharmony_ci}; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci/* Power up/down GPIOs for camera devices and video decoder */ 48362306a36Sopenharmony_cistatic struct gpiod_lookup_table tw9910_gpios = { 48462306a36Sopenharmony_ci .dev_id = "0-0045", 48562306a36Sopenharmony_ci .table = { 48662306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTU2, "pdn", GPIO_ACTIVE_HIGH), 48762306a36Sopenharmony_ci }, 48862306a36Sopenharmony_ci}; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_cistatic struct gpiod_lookup_table mt9t112_0_gpios = { 49162306a36Sopenharmony_ci .dev_id = "0-003c", 49262306a36Sopenharmony_ci .table = { 49362306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTA3, "standby", 49462306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 49562306a36Sopenharmony_ci }, 49662306a36Sopenharmony_ci}; 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_cistatic struct gpiod_lookup_table mt9t112_1_gpios = { 49962306a36Sopenharmony_ci .dev_id = "1-003c", 50062306a36Sopenharmony_ci .table = { 50162306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTA4, "standby", 50262306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 50362306a36Sopenharmony_ci }, 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci/* I2C device */ 50762306a36Sopenharmony_cistatic struct tw9910_video_info tw9910_info = { 50862306a36Sopenharmony_ci .buswidth = 8, 50962306a36Sopenharmony_ci .mpout = TW9910_MPO_FIELD, 51062306a36Sopenharmony_ci}; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_cistatic struct mt9t112_platform_data mt9t112_0_pdata = { 51362306a36Sopenharmony_ci .flags = MT9T112_FLAG_PCLK_RISING_EDGE, 51462306a36Sopenharmony_ci .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 51562306a36Sopenharmony_ci}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic struct mt9t112_platform_data mt9t112_1_pdata = { 51862306a36Sopenharmony_ci .flags = MT9T112_FLAG_PCLK_RISING_EDGE, 51962306a36Sopenharmony_ci .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 52062306a36Sopenharmony_ci}; 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_cistatic struct i2c_board_info i2c0_devices[] = { 52362306a36Sopenharmony_ci { 52462306a36Sopenharmony_ci I2C_BOARD_INFO("da7210", 0x1a), 52562306a36Sopenharmony_ci }, 52662306a36Sopenharmony_ci { 52762306a36Sopenharmony_ci I2C_BOARD_INFO("tw9910", 0x45), 52862306a36Sopenharmony_ci .platform_data = &tw9910_info, 52962306a36Sopenharmony_ci }, 53062306a36Sopenharmony_ci { 53162306a36Sopenharmony_ci /* 1st camera */ 53262306a36Sopenharmony_ci I2C_BOARD_INFO("mt9t112", 0x3c), 53362306a36Sopenharmony_ci .platform_data = &mt9t112_0_pdata, 53462306a36Sopenharmony_ci }, 53562306a36Sopenharmony_ci}; 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_cistatic struct i2c_board_info i2c1_devices[] = { 53862306a36Sopenharmony_ci { 53962306a36Sopenharmony_ci I2C_BOARD_INFO("r2025sd", 0x32), 54062306a36Sopenharmony_ci }, 54162306a36Sopenharmony_ci { 54262306a36Sopenharmony_ci I2C_BOARD_INFO("lis3lv02d", 0x1c), 54362306a36Sopenharmony_ci .irq = evt2irq(0x620), 54462306a36Sopenharmony_ci }, 54562306a36Sopenharmony_ci { 54662306a36Sopenharmony_ci /* 2nd camera */ 54762306a36Sopenharmony_ci I2C_BOARD_INFO("mt9t112", 0x3c), 54862306a36Sopenharmony_ci .platform_data = &mt9t112_1_pdata, 54962306a36Sopenharmony_ci }, 55062306a36Sopenharmony_ci}; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci/* KEYSC */ 55362306a36Sopenharmony_cistatic struct sh_keysc_info keysc_info = { 55462306a36Sopenharmony_ci .mode = SH_KEYSC_MODE_1, 55562306a36Sopenharmony_ci .scan_timing = 3, 55662306a36Sopenharmony_ci .delay = 50, 55762306a36Sopenharmony_ci .kycr2_delay = 100, 55862306a36Sopenharmony_ci .keycodes = { KEY_1, 0, 0, 0, 0, 55962306a36Sopenharmony_ci KEY_2, 0, 0, 0, 0, 56062306a36Sopenharmony_ci KEY_3, 0, 0, 0, 0, 56162306a36Sopenharmony_ci KEY_4, 0, 0, 0, 0, 56262306a36Sopenharmony_ci KEY_5, 0, 0, 0, 0, 56362306a36Sopenharmony_ci KEY_6, 0, 0, 0, 0, }, 56462306a36Sopenharmony_ci}; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_cistatic struct resource keysc_resources[] = { 56762306a36Sopenharmony_ci [0] = { 56862306a36Sopenharmony_ci .name = "KEYSC", 56962306a36Sopenharmony_ci .start = 0x044b0000, 57062306a36Sopenharmony_ci .end = 0x044b000f, 57162306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 57262306a36Sopenharmony_ci }, 57362306a36Sopenharmony_ci [1] = { 57462306a36Sopenharmony_ci .start = evt2irq(0xbe0), 57562306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 57662306a36Sopenharmony_ci }, 57762306a36Sopenharmony_ci}; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cistatic struct platform_device keysc_device = { 58062306a36Sopenharmony_ci .name = "sh_keysc", 58162306a36Sopenharmony_ci .id = 0, /* keysc0 clock */ 58262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(keysc_resources), 58362306a36Sopenharmony_ci .resource = keysc_resources, 58462306a36Sopenharmony_ci .dev = { 58562306a36Sopenharmony_ci .platform_data = &keysc_info, 58662306a36Sopenharmony_ci }, 58762306a36Sopenharmony_ci}; 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci/* TouchScreen */ 59062306a36Sopenharmony_ci#define IRQ0 evt2irq(0x600) 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic int ts_get_pendown_state(struct device *dev) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci int val = 0; 59562306a36Sopenharmony_ci gpio_free(GPIO_FN_INTC_IRQ0); 59662306a36Sopenharmony_ci gpio_request(GPIO_PTZ0, NULL); 59762306a36Sopenharmony_ci gpio_direction_input(GPIO_PTZ0); 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci val = gpio_get_value(GPIO_PTZ0); 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci gpio_free(GPIO_PTZ0); 60262306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci return val ? 0 : 1; 60562306a36Sopenharmony_ci} 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic int ts_init(void) 60862306a36Sopenharmony_ci{ 60962306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ0, NULL); 61062306a36Sopenharmony_ci return 0; 61162306a36Sopenharmony_ci} 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistatic struct tsc2007_platform_data tsc2007_info = { 61462306a36Sopenharmony_ci .model = 2007, 61562306a36Sopenharmony_ci .x_plate_ohms = 180, 61662306a36Sopenharmony_ci .get_pendown_state = ts_get_pendown_state, 61762306a36Sopenharmony_ci .init_platform_hw = ts_init, 61862306a36Sopenharmony_ci}; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_cistatic struct i2c_board_info ts_i2c_clients = { 62162306a36Sopenharmony_ci I2C_BOARD_INFO("tsc2007", 0x48), 62262306a36Sopenharmony_ci .type = "tsc2007", 62362306a36Sopenharmony_ci .platform_data = &tsc2007_info, 62462306a36Sopenharmony_ci .irq = IRQ0, 62562306a36Sopenharmony_ci}; 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_cistatic struct regulator_consumer_supply cn12_power_consumers[] = 62862306a36Sopenharmony_ci{ 62962306a36Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), 63062306a36Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), 63162306a36Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 63262306a36Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 63362306a36Sopenharmony_ci}; 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_cistatic struct regulator_init_data cn12_power_init_data = { 63662306a36Sopenharmony_ci .constraints = { 63762306a36Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_STATUS, 63862306a36Sopenharmony_ci }, 63962306a36Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(cn12_power_consumers), 64062306a36Sopenharmony_ci .consumer_supplies = cn12_power_consumers, 64162306a36Sopenharmony_ci}; 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_cistatic struct fixed_voltage_config cn12_power_info = { 64462306a36Sopenharmony_ci .supply_name = "CN12 SD/MMC Vdd", 64562306a36Sopenharmony_ci .microvolts = 3300000, 64662306a36Sopenharmony_ci .init_data = &cn12_power_init_data, 64762306a36Sopenharmony_ci}; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_cistatic struct platform_device cn12_power = { 65062306a36Sopenharmony_ci .name = "reg-fixed-voltage", 65162306a36Sopenharmony_ci .id = 0, 65262306a36Sopenharmony_ci .dev = { 65362306a36Sopenharmony_ci .platform_data = &cn12_power_info, 65462306a36Sopenharmony_ci }, 65562306a36Sopenharmony_ci}; 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_cistatic struct gpiod_lookup_table cn12_power_gpiod_table = { 65862306a36Sopenharmony_ci .dev_id = "reg-fixed-voltage.0", 65962306a36Sopenharmony_ci .table = { 66062306a36Sopenharmony_ci /* Offset 7 on port B */ 66162306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTB7, 66262306a36Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 66362306a36Sopenharmony_ci { }, 66462306a36Sopenharmony_ci }, 66562306a36Sopenharmony_ci}; 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 66862306a36Sopenharmony_ci/* SDHI0 */ 66962306a36Sopenharmony_cistatic struct regulator_consumer_supply sdhi0_power_consumers[] = 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 67262306a36Sopenharmony_ci REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 67362306a36Sopenharmony_ci}; 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_cistatic struct regulator_init_data sdhi0_power_init_data = { 67662306a36Sopenharmony_ci .constraints = { 67762306a36Sopenharmony_ci .valid_ops_mask = REGULATOR_CHANGE_STATUS, 67862306a36Sopenharmony_ci }, 67962306a36Sopenharmony_ci .num_consumer_supplies = ARRAY_SIZE(sdhi0_power_consumers), 68062306a36Sopenharmony_ci .consumer_supplies = sdhi0_power_consumers, 68162306a36Sopenharmony_ci}; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_cistatic struct fixed_voltage_config sdhi0_power_info = { 68462306a36Sopenharmony_ci .supply_name = "CN11 SD/MMC Vdd", 68562306a36Sopenharmony_ci .microvolts = 3300000, 68662306a36Sopenharmony_ci .init_data = &sdhi0_power_init_data, 68762306a36Sopenharmony_ci}; 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_cistatic struct platform_device sdhi0_power = { 69062306a36Sopenharmony_ci .name = "reg-fixed-voltage", 69162306a36Sopenharmony_ci .id = 1, 69262306a36Sopenharmony_ci .dev = { 69362306a36Sopenharmony_ci .platform_data = &sdhi0_power_info, 69462306a36Sopenharmony_ci }, 69562306a36Sopenharmony_ci}; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistatic struct gpiod_lookup_table sdhi0_power_gpiod_table = { 69862306a36Sopenharmony_ci .dev_id = "reg-fixed-voltage.1", 69962306a36Sopenharmony_ci .table = { 70062306a36Sopenharmony_ci /* Offset 6 on port B */ 70162306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTB6, 70262306a36Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 70362306a36Sopenharmony_ci { }, 70462306a36Sopenharmony_ci }, 70562306a36Sopenharmony_ci}; 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_cistatic struct gpiod_lookup_table sdhi0_gpio_table = { 70862306a36Sopenharmony_ci .dev_id = "sh_mobile_sdhi.0", 70962306a36Sopenharmony_ci .table = { 71062306a36Sopenharmony_ci /* Card detect */ 71162306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTY7, "cd", GPIO_ACTIVE_LOW), 71262306a36Sopenharmony_ci { }, 71362306a36Sopenharmony_ci }, 71462306a36Sopenharmony_ci}; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_cistatic struct tmio_mmc_data sdhi0_info = { 71762306a36Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI0_TX, 71862306a36Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI0_RX, 71962306a36Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 72062306a36Sopenharmony_ci MMC_CAP_NEEDS_POLL, 72162306a36Sopenharmony_ci}; 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_cistatic struct resource sdhi0_resources[] = { 72462306a36Sopenharmony_ci [0] = { 72562306a36Sopenharmony_ci .name = "SDHI0", 72662306a36Sopenharmony_ci .start = 0x04ce0000, 72762306a36Sopenharmony_ci .end = 0x04ce00ff, 72862306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 72962306a36Sopenharmony_ci }, 73062306a36Sopenharmony_ci [1] = { 73162306a36Sopenharmony_ci .start = evt2irq(0xe80), 73262306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 73362306a36Sopenharmony_ci }, 73462306a36Sopenharmony_ci}; 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_cistatic struct platform_device sdhi0_device = { 73762306a36Sopenharmony_ci .name = "sh_mobile_sdhi", 73862306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi0_resources), 73962306a36Sopenharmony_ci .resource = sdhi0_resources, 74062306a36Sopenharmony_ci .id = 0, 74162306a36Sopenharmony_ci .dev = { 74262306a36Sopenharmony_ci .platform_data = &sdhi0_info, 74362306a36Sopenharmony_ci }, 74462306a36Sopenharmony_ci}; 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 74762306a36Sopenharmony_ci/* SDHI1 */ 74862306a36Sopenharmony_cistatic struct tmio_mmc_data sdhi1_info = { 74962306a36Sopenharmony_ci .chan_priv_tx = (void *)SHDMA_SLAVE_SDHI1_TX, 75062306a36Sopenharmony_ci .chan_priv_rx = (void *)SHDMA_SLAVE_SDHI1_RX, 75162306a36Sopenharmony_ci .capabilities = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 75262306a36Sopenharmony_ci MMC_CAP_NEEDS_POLL, 75362306a36Sopenharmony_ci}; 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_cistatic struct gpiod_lookup_table sdhi1_gpio_table = { 75662306a36Sopenharmony_ci .dev_id = "sh_mobile_sdhi.1", 75762306a36Sopenharmony_ci .table = { 75862306a36Sopenharmony_ci /* Card detect */ 75962306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTW7, "cd", GPIO_ACTIVE_LOW), 76062306a36Sopenharmony_ci { }, 76162306a36Sopenharmony_ci }, 76262306a36Sopenharmony_ci}; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cistatic struct resource sdhi1_resources[] = { 76562306a36Sopenharmony_ci [0] = { 76662306a36Sopenharmony_ci .name = "SDHI1", 76762306a36Sopenharmony_ci .start = 0x04cf0000, 76862306a36Sopenharmony_ci .end = 0x04cf00ff, 76962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 77062306a36Sopenharmony_ci }, 77162306a36Sopenharmony_ci [1] = { 77262306a36Sopenharmony_ci .start = evt2irq(0x4e0), 77362306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 77462306a36Sopenharmony_ci }, 77562306a36Sopenharmony_ci}; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_cistatic struct platform_device sdhi1_device = { 77862306a36Sopenharmony_ci .name = "sh_mobile_sdhi", 77962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sdhi1_resources), 78062306a36Sopenharmony_ci .resource = sdhi1_resources, 78162306a36Sopenharmony_ci .id = 1, 78262306a36Sopenharmony_ci .dev = { 78362306a36Sopenharmony_ci .platform_data = &sdhi1_info, 78462306a36Sopenharmony_ci }, 78562306a36Sopenharmony_ci}; 78662306a36Sopenharmony_ci#endif /* CONFIG_MMC_SH_MMCIF */ 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci#else 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci/* MMC SPI */ 79162306a36Sopenharmony_cistatic void mmc_spi_setpower(struct device *dev, unsigned int maskval) 79262306a36Sopenharmony_ci{ 79362306a36Sopenharmony_ci gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); 79462306a36Sopenharmony_ci} 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cistatic struct mmc_spi_platform_data mmc_spi_info = { 79762306a36Sopenharmony_ci .caps = MMC_CAP_NEEDS_POLL, 79862306a36Sopenharmony_ci .caps2 = MMC_CAP2_RO_ACTIVE_HIGH, 79962306a36Sopenharmony_ci .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ 80062306a36Sopenharmony_ci .setpower = mmc_spi_setpower, 80162306a36Sopenharmony_ci}; 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_cistatic struct gpiod_lookup_table mmc_spi_gpio_table = { 80462306a36Sopenharmony_ci .dev_id = "mmc_spi.0", /* device "mmc_spi" @ CS0 */ 80562306a36Sopenharmony_ci .table = { 80662306a36Sopenharmony_ci /* Card detect */ 80762306a36Sopenharmony_ci GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY7, NULL, 0, 80862306a36Sopenharmony_ci GPIO_ACTIVE_LOW), 80962306a36Sopenharmony_ci /* Write protect */ 81062306a36Sopenharmony_ci GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY6, NULL, 1, 81162306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 81262306a36Sopenharmony_ci { }, 81362306a36Sopenharmony_ci }, 81462306a36Sopenharmony_ci}; 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_cistatic struct spi_board_info spi_bus[] = { 81762306a36Sopenharmony_ci { 81862306a36Sopenharmony_ci .modalias = "mmc_spi", 81962306a36Sopenharmony_ci .platform_data = &mmc_spi_info, 82062306a36Sopenharmony_ci .max_speed_hz = 5000000, 82162306a36Sopenharmony_ci .mode = SPI_MODE_0, 82262306a36Sopenharmony_ci }, 82362306a36Sopenharmony_ci}; 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci/* MSIOF0 */ 82662306a36Sopenharmony_cistatic struct sh_msiof_spi_info msiof0_data = { 82762306a36Sopenharmony_ci .num_chipselect = 1, 82862306a36Sopenharmony_ci}; 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_cistatic struct resource msiof0_resources[] = { 83162306a36Sopenharmony_ci [0] = { 83262306a36Sopenharmony_ci .name = "MSIOF0", 83362306a36Sopenharmony_ci .start = 0xa4c40000, 83462306a36Sopenharmony_ci .end = 0xa4c40063, 83562306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 83662306a36Sopenharmony_ci }, 83762306a36Sopenharmony_ci [1] = { 83862306a36Sopenharmony_ci .start = evt2irq(0xc80), 83962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 84062306a36Sopenharmony_ci }, 84162306a36Sopenharmony_ci}; 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistatic struct platform_device msiof0_device = { 84462306a36Sopenharmony_ci .name = "spi_sh_msiof", 84562306a36Sopenharmony_ci .id = 0, /* MSIOF0 */ 84662306a36Sopenharmony_ci .dev = { 84762306a36Sopenharmony_ci .platform_data = &msiof0_data, 84862306a36Sopenharmony_ci }, 84962306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(msiof0_resources), 85062306a36Sopenharmony_ci .resource = msiof0_resources, 85162306a36Sopenharmony_ci}; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_cistatic struct gpiod_lookup_table msiof_gpio_table = { 85462306a36Sopenharmony_ci .dev_id = "spi_sh_msiof.0", 85562306a36Sopenharmony_ci .table = { 85662306a36Sopenharmony_ci GPIO_LOOKUP("sh7724_pfc", GPIO_PTM4, "cs", GPIO_ACTIVE_HIGH), 85762306a36Sopenharmony_ci { }, 85862306a36Sopenharmony_ci }, 85962306a36Sopenharmony_ci}; 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_ci#endif 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci/* FSI */ 86462306a36Sopenharmony_cistatic struct resource fsi_resources[] = { 86562306a36Sopenharmony_ci [0] = { 86662306a36Sopenharmony_ci .name = "FSI", 86762306a36Sopenharmony_ci .start = 0xFE3C0000, 86862306a36Sopenharmony_ci .end = 0xFE3C021d, 86962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 87062306a36Sopenharmony_ci }, 87162306a36Sopenharmony_ci [1] = { 87262306a36Sopenharmony_ci .start = evt2irq(0xf80), 87362306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 87462306a36Sopenharmony_ci }, 87562306a36Sopenharmony_ci}; 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_cistatic struct platform_device fsi_device = { 87862306a36Sopenharmony_ci .name = "sh_fsi", 87962306a36Sopenharmony_ci .id = 0, 88062306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(fsi_resources), 88162306a36Sopenharmony_ci .resource = fsi_resources, 88262306a36Sopenharmony_ci}; 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_cistatic struct asoc_simple_card_info fsi_da7210_info = { 88562306a36Sopenharmony_ci .name = "DA7210", 88662306a36Sopenharmony_ci .card = "FSIB-DA7210", 88762306a36Sopenharmony_ci .codec = "da7210.0-001a", 88862306a36Sopenharmony_ci .platform = "sh_fsi.0", 88962306a36Sopenharmony_ci .daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBP_CFP, 89062306a36Sopenharmony_ci .cpu_dai = { 89162306a36Sopenharmony_ci .name = "fsib-dai", 89262306a36Sopenharmony_ci }, 89362306a36Sopenharmony_ci .codec_dai = { 89462306a36Sopenharmony_ci .name = "da7210-hifi", 89562306a36Sopenharmony_ci }, 89662306a36Sopenharmony_ci}; 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_cistatic struct platform_device fsi_da7210_device = { 89962306a36Sopenharmony_ci .name = "asoc-simple-card", 90062306a36Sopenharmony_ci .dev = { 90162306a36Sopenharmony_ci .platform_data = &fsi_da7210_info, 90262306a36Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 90362306a36Sopenharmony_ci .dma_mask = &fsi_da7210_device.dev.coherent_dma_mask, 90462306a36Sopenharmony_ci }, 90562306a36Sopenharmony_ci}; 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci/* IrDA */ 90962306a36Sopenharmony_cistatic struct resource irda_resources[] = { 91062306a36Sopenharmony_ci [0] = { 91162306a36Sopenharmony_ci .name = "IrDA", 91262306a36Sopenharmony_ci .start = 0xA45D0000, 91362306a36Sopenharmony_ci .end = 0xA45D0049, 91462306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 91562306a36Sopenharmony_ci }, 91662306a36Sopenharmony_ci [1] = { 91762306a36Sopenharmony_ci .start = evt2irq(0x480), 91862306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 91962306a36Sopenharmony_ci }, 92062306a36Sopenharmony_ci}; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_cistatic struct platform_device irda_device = { 92362306a36Sopenharmony_ci .name = "sh_sir", 92462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(irda_resources), 92562306a36Sopenharmony_ci .resource = irda_resources, 92662306a36Sopenharmony_ci}; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci#include <media/i2c/ak881x.h> 92962306a36Sopenharmony_ci#include <media/drv-intf/sh_vou.h> 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_cistatic struct ak881x_pdata ak881x_pdata = { 93262306a36Sopenharmony_ci .flags = AK881X_IF_MODE_SLAVE, 93362306a36Sopenharmony_ci}; 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_cistatic struct i2c_board_info ak8813 = { 93662306a36Sopenharmony_ci I2C_BOARD_INFO("ak8813", 0x20), 93762306a36Sopenharmony_ci .platform_data = &ak881x_pdata, 93862306a36Sopenharmony_ci}; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_cistatic struct sh_vou_pdata sh_vou_pdata = { 94162306a36Sopenharmony_ci .bus_fmt = SH_VOU_BUS_8BIT, 94262306a36Sopenharmony_ci .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 94362306a36Sopenharmony_ci .board_info = &ak8813, 94462306a36Sopenharmony_ci .i2c_adap = 0, 94562306a36Sopenharmony_ci}; 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_cistatic struct resource sh_vou_resources[] = { 94862306a36Sopenharmony_ci [0] = { 94962306a36Sopenharmony_ci .start = 0xfe960000, 95062306a36Sopenharmony_ci .end = 0xfe962043, 95162306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 95262306a36Sopenharmony_ci }, 95362306a36Sopenharmony_ci [1] = { 95462306a36Sopenharmony_ci .start = evt2irq(0x8e0), 95562306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 95662306a36Sopenharmony_ci }, 95762306a36Sopenharmony_ci}; 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_cistatic struct platform_device vou_device = { 96062306a36Sopenharmony_ci .name = "sh-vou", 96162306a36Sopenharmony_ci .id = -1, 96262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_vou_resources), 96362306a36Sopenharmony_ci .resource = sh_vou_resources, 96462306a36Sopenharmony_ci .dev = { 96562306a36Sopenharmony_ci .platform_data = &sh_vou_pdata, 96662306a36Sopenharmony_ci }, 96762306a36Sopenharmony_ci}; 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 97062306a36Sopenharmony_ci/* SH_MMCIF */ 97162306a36Sopenharmony_cistatic struct resource sh_mmcif_resources[] = { 97262306a36Sopenharmony_ci [0] = { 97362306a36Sopenharmony_ci .name = "SH_MMCIF", 97462306a36Sopenharmony_ci .start = 0xA4CA0000, 97562306a36Sopenharmony_ci .end = 0xA4CA00FF, 97662306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 97762306a36Sopenharmony_ci }, 97862306a36Sopenharmony_ci [1] = { 97962306a36Sopenharmony_ci /* MMC2I */ 98062306a36Sopenharmony_ci .start = evt2irq(0x5a0), 98162306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 98262306a36Sopenharmony_ci }, 98362306a36Sopenharmony_ci [2] = { 98462306a36Sopenharmony_ci /* MMC3I */ 98562306a36Sopenharmony_ci .start = evt2irq(0x5c0), 98662306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 98762306a36Sopenharmony_ci }, 98862306a36Sopenharmony_ci}; 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_cistatic struct sh_mmcif_plat_data sh_mmcif_plat = { 99162306a36Sopenharmony_ci .sup_pclk = 0, /* SH7724: Max Pclk/2 */ 99262306a36Sopenharmony_ci .caps = MMC_CAP_4_BIT_DATA | 99362306a36Sopenharmony_ci MMC_CAP_8_BIT_DATA | 99462306a36Sopenharmony_ci MMC_CAP_NEEDS_POLL, 99562306a36Sopenharmony_ci .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, 99662306a36Sopenharmony_ci}; 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cistatic struct platform_device sh_mmcif_device = { 99962306a36Sopenharmony_ci .name = "sh_mmcif", 100062306a36Sopenharmony_ci .id = 0, 100162306a36Sopenharmony_ci .dev = { 100262306a36Sopenharmony_ci .platform_data = &sh_mmcif_plat, 100362306a36Sopenharmony_ci }, 100462306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sh_mmcif_resources), 100562306a36Sopenharmony_ci .resource = sh_mmcif_resources, 100662306a36Sopenharmony_ci}; 100762306a36Sopenharmony_ci#endif 100862306a36Sopenharmony_ci 100962306a36Sopenharmony_cistatic struct platform_device *ecovec_ceu_devices[] __initdata = { 101062306a36Sopenharmony_ci &ceu0_device, 101162306a36Sopenharmony_ci &ceu1_device, 101262306a36Sopenharmony_ci}; 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_cistatic struct platform_device *ecovec_devices[] __initdata = { 101562306a36Sopenharmony_ci &heartbeat_device, 101662306a36Sopenharmony_ci &nor_flash_device, 101762306a36Sopenharmony_ci &sh_eth_device, 101862306a36Sopenharmony_ci &usb0_host_device, 101962306a36Sopenharmony_ci &usb1_common_device, 102062306a36Sopenharmony_ci &usbhs_device, 102162306a36Sopenharmony_ci &lcdc_device, 102262306a36Sopenharmony_ci &keysc_device, 102362306a36Sopenharmony_ci &cn12_power, 102462306a36Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 102562306a36Sopenharmony_ci &sdhi0_power, 102662306a36Sopenharmony_ci &sdhi0_device, 102762306a36Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 102862306a36Sopenharmony_ci &sdhi1_device, 102962306a36Sopenharmony_ci#endif 103062306a36Sopenharmony_ci#else 103162306a36Sopenharmony_ci &msiof0_device, 103262306a36Sopenharmony_ci#endif 103362306a36Sopenharmony_ci &fsi_device, 103462306a36Sopenharmony_ci &fsi_da7210_device, 103562306a36Sopenharmony_ci &irda_device, 103662306a36Sopenharmony_ci &vou_device, 103762306a36Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 103862306a36Sopenharmony_ci &sh_mmcif_device, 103962306a36Sopenharmony_ci#endif 104062306a36Sopenharmony_ci}; 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci#ifdef CONFIG_I2C 104362306a36Sopenharmony_ci#define EEPROM_ADDR 0x50 104462306a36Sopenharmony_cistatic u8 mac_read(struct i2c_adapter *a, u8 command) 104562306a36Sopenharmony_ci{ 104662306a36Sopenharmony_ci struct i2c_msg msg[2]; 104762306a36Sopenharmony_ci u8 buf; 104862306a36Sopenharmony_ci int ret; 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_ci msg[0].addr = EEPROM_ADDR; 105162306a36Sopenharmony_ci msg[0].flags = 0; 105262306a36Sopenharmony_ci msg[0].len = 1; 105362306a36Sopenharmony_ci msg[0].buf = &command; 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci msg[1].addr = EEPROM_ADDR; 105662306a36Sopenharmony_ci msg[1].flags = I2C_M_RD; 105762306a36Sopenharmony_ci msg[1].len = 1; 105862306a36Sopenharmony_ci msg[1].buf = &buf; 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci ret = i2c_transfer(a, msg, 2); 106162306a36Sopenharmony_ci if (ret < 0) { 106262306a36Sopenharmony_ci printk(KERN_ERR "error %d\n", ret); 106362306a36Sopenharmony_ci buf = 0xff; 106462306a36Sopenharmony_ci } 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_ci return buf; 106762306a36Sopenharmony_ci} 106862306a36Sopenharmony_ci 106962306a36Sopenharmony_cistatic void __init sh_eth_init(struct sh_eth_plat_data *pd) 107062306a36Sopenharmony_ci{ 107162306a36Sopenharmony_ci struct i2c_adapter *a = i2c_get_adapter(1); 107262306a36Sopenharmony_ci int i; 107362306a36Sopenharmony_ci 107462306a36Sopenharmony_ci if (!a) { 107562306a36Sopenharmony_ci pr_err("can not get I2C 1\n"); 107662306a36Sopenharmony_ci return; 107762306a36Sopenharmony_ci } 107862306a36Sopenharmony_ci 107962306a36Sopenharmony_ci /* read MAC address from EEPROM */ 108062306a36Sopenharmony_ci for (i = 0; i < sizeof(pd->mac_addr); i++) { 108162306a36Sopenharmony_ci pd->mac_addr[i] = mac_read(a, 0x10 + i); 108262306a36Sopenharmony_ci msleep(10); 108362306a36Sopenharmony_ci } 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci i2c_put_adapter(a); 108662306a36Sopenharmony_ci} 108762306a36Sopenharmony_ci#else 108862306a36Sopenharmony_cistatic void __init sh_eth_init(struct sh_eth_plat_data *pd) 108962306a36Sopenharmony_ci{ 109062306a36Sopenharmony_ci pr_err("unable to read sh_eth MAC address\n"); 109162306a36Sopenharmony_ci} 109262306a36Sopenharmony_ci#endif 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci#define PORT_HIZA 0xA4050158 109562306a36Sopenharmony_ci#define IODRIVEA 0xA405018A 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ciextern char ecovec24_sdram_enter_start; 109862306a36Sopenharmony_ciextern char ecovec24_sdram_enter_end; 109962306a36Sopenharmony_ciextern char ecovec24_sdram_leave_start; 110062306a36Sopenharmony_ciextern char ecovec24_sdram_leave_end; 110162306a36Sopenharmony_ci 110262306a36Sopenharmony_cistatic int __init arch_setup(void) 110362306a36Sopenharmony_ci{ 110462306a36Sopenharmony_ci struct clk *clk; 110562306a36Sopenharmony_ci bool cn12_enabled = false; 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci /* register board specific self-refresh code */ 110862306a36Sopenharmony_ci sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 110962306a36Sopenharmony_ci SUSP_SH_RSTANDBY, 111062306a36Sopenharmony_ci &ecovec24_sdram_enter_start, 111162306a36Sopenharmony_ci &ecovec24_sdram_enter_end, 111262306a36Sopenharmony_ci &ecovec24_sdram_leave_start, 111362306a36Sopenharmony_ci &ecovec24_sdram_leave_end); 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci /* enable STATUS0, STATUS2 and PDSTATUS */ 111662306a36Sopenharmony_ci gpio_request(GPIO_FN_STATUS0, NULL); 111762306a36Sopenharmony_ci gpio_request(GPIO_FN_STATUS2, NULL); 111862306a36Sopenharmony_ci gpio_request(GPIO_FN_PDSTATUS, NULL); 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_ci /* enable SCIFA0 */ 112162306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF0_TXD, NULL); 112262306a36Sopenharmony_ci gpio_request(GPIO_FN_SCIF0_RXD, NULL); 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_ci /* enable debug LED */ 112562306a36Sopenharmony_ci gpio_request(GPIO_PTG0, NULL); 112662306a36Sopenharmony_ci gpio_request(GPIO_PTG1, NULL); 112762306a36Sopenharmony_ci gpio_request(GPIO_PTG2, NULL); 112862306a36Sopenharmony_ci gpio_request(GPIO_PTG3, NULL); 112962306a36Sopenharmony_ci gpio_direction_output(GPIO_PTG0, 0); 113062306a36Sopenharmony_ci gpio_direction_output(GPIO_PTG1, 0); 113162306a36Sopenharmony_ci gpio_direction_output(GPIO_PTG2, 0); 113262306a36Sopenharmony_ci gpio_direction_output(GPIO_PTG3, 0); 113362306a36Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci /* enable SH-Eth */ 113662306a36Sopenharmony_ci gpio_request(GPIO_PTA1, NULL); 113762306a36Sopenharmony_ci gpio_direction_output(GPIO_PTA1, 1); 113862306a36Sopenharmony_ci mdelay(20); 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD0, NULL); 114162306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RXD1, NULL); 114262306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD0, NULL); 114362306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TXD1, NULL); 114462306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 114562306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_TX_EN, NULL); 114662306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_RX_ER, NULL); 114762306a36Sopenharmony_ci gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 114862306a36Sopenharmony_ci gpio_request(GPIO_FN_MDIO, NULL); 114962306a36Sopenharmony_ci gpio_request(GPIO_FN_MDC, NULL); 115062306a36Sopenharmony_ci gpio_request(GPIO_FN_LNKSTA, NULL); 115162306a36Sopenharmony_ci 115262306a36Sopenharmony_ci /* enable USB */ 115362306a36Sopenharmony_ci __raw_writew(0x0000, 0xA4D80000); 115462306a36Sopenharmony_ci __raw_writew(0x0000, 0xA4D90000); 115562306a36Sopenharmony_ci gpio_request(GPIO_PTB3, NULL); 115662306a36Sopenharmony_ci gpio_request(GPIO_PTB4, NULL); 115762306a36Sopenharmony_ci gpio_request(GPIO_PTB5, NULL); 115862306a36Sopenharmony_ci gpio_direction_input(GPIO_PTB3); 115962306a36Sopenharmony_ci gpio_direction_output(GPIO_PTB4, 0); 116062306a36Sopenharmony_ci gpio_direction_output(GPIO_PTB5, 0); 116162306a36Sopenharmony_ci __raw_writew(0x0600, 0xa40501d4); 116262306a36Sopenharmony_ci __raw_writew(0x0600, 0xa4050192); 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_ci if (gpio_get_value(GPIO_PTB3)) { 116562306a36Sopenharmony_ci printk(KERN_INFO "USB1 function is selected\n"); 116662306a36Sopenharmony_ci usb1_common_device.name = "r8a66597_udc"; 116762306a36Sopenharmony_ci } else { 116862306a36Sopenharmony_ci printk(KERN_INFO "USB1 host is selected\n"); 116962306a36Sopenharmony_ci usb1_common_device.name = "r8a66597_hcd"; 117062306a36Sopenharmony_ci } 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci /* enable LCDC */ 117362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD23, NULL); 117462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD22, NULL); 117562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD21, NULL); 117662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD20, NULL); 117762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD19, NULL); 117862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD18, NULL); 117962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD17, NULL); 118062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD16, NULL); 118162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD15, NULL); 118262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD14, NULL); 118362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD13, NULL); 118462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD12, NULL); 118562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD11, NULL); 118662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD10, NULL); 118762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD9, NULL); 118862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD8, NULL); 118962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD7, NULL); 119062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD6, NULL); 119162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD5, NULL); 119262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD4, NULL); 119362306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD3, NULL); 119462306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD2, NULL); 119562306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD1, NULL); 119662306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDD0, NULL); 119762306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDISP, NULL); 119862306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDHSYN, NULL); 119962306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDCK, NULL); 120062306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDVSYN, NULL); 120162306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDDON, NULL); 120262306a36Sopenharmony_ci gpio_request(GPIO_FN_LCDLCLK, NULL); 120362306a36Sopenharmony_ci __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci gpio_request(GPIO_PTE6, NULL); 120662306a36Sopenharmony_ci gpio_request(GPIO_PTU1, NULL); 120762306a36Sopenharmony_ci gpio_request(GPIO_PTA2, NULL); 120862306a36Sopenharmony_ci gpio_direction_input(GPIO_PTE6); 120962306a36Sopenharmony_ci gpio_direction_output(GPIO_PTU1, 0); 121062306a36Sopenharmony_ci gpio_direction_output(GPIO_PTA2, 0); 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci /* I/O buffer drive ability is high */ 121362306a36Sopenharmony_ci __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci if (gpio_get_value(GPIO_PTE6)) { 121662306a36Sopenharmony_ci /* DVI */ 121762306a36Sopenharmony_ci lcdc_info.clock_source = LCDC_CLK_EXTERNAL; 121862306a36Sopenharmony_ci lcdc_info.ch[0].clock_divider = 1; 121962306a36Sopenharmony_ci lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes; 122062306a36Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes); 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci /* No backlight */ 122362306a36Sopenharmony_ci gpio_backlight_data.dev = NULL; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci gpio_set_value(GPIO_PTA2, 1); 122662306a36Sopenharmony_ci gpio_set_value(GPIO_PTU1, 1); 122762306a36Sopenharmony_ci } else { 122862306a36Sopenharmony_ci /* Panel */ 122962306a36Sopenharmony_ci lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; 123062306a36Sopenharmony_ci lcdc_info.ch[0].clock_divider = 2; 123162306a36Sopenharmony_ci lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes; 123262306a36Sopenharmony_ci lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes); 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci /* FIXME 123562306a36Sopenharmony_ci * 123662306a36Sopenharmony_ci * LCDDON control is needed for Panel, 123762306a36Sopenharmony_ci * but current sh_mobile_lcdc driver doesn't control it. 123862306a36Sopenharmony_ci * It is temporary correspondence 123962306a36Sopenharmony_ci */ 124062306a36Sopenharmony_ci gpio_request(GPIO_PTF4, NULL); 124162306a36Sopenharmony_ci gpio_direction_output(GPIO_PTF4, 1); 124262306a36Sopenharmony_ci 124362306a36Sopenharmony_ci /* enable TouchScreen */ 124462306a36Sopenharmony_ci i2c_register_board_info(0, &ts_i2c_clients, 1); 124562306a36Sopenharmony_ci irq_set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); 124662306a36Sopenharmony_ci } 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci /* enable CEU0 */ 124962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D15, NULL); 125062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D14, NULL); 125162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D13, NULL); 125262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D12, NULL); 125362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D11, NULL); 125462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D10, NULL); 125562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D9, NULL); 125662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D8, NULL); 125762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D7, NULL); 125862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D6, NULL); 125962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D5, NULL); 126062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D4, NULL); 126162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D3, NULL); 126262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D2, NULL); 126362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D1, NULL); 126462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_D0, NULL); 126562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_VD, NULL); 126662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_CLK, NULL); 126762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_FLD, NULL); 126862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO0_HD, NULL); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_ci /* enable CEU1 */ 127162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D7, NULL); 127262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D6, NULL); 127362306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D5, NULL); 127462306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D4, NULL); 127562306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D3, NULL); 127662306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D2, NULL); 127762306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D1, NULL); 127862306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_D0, NULL); 127962306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_FLD, NULL); 128062306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_HD, NULL); 128162306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_VD, NULL); 128262306a36Sopenharmony_ci gpio_request(GPIO_FN_VIO1_CLK, NULL); 128362306a36Sopenharmony_ci 128462306a36Sopenharmony_ci /* enable KEYSC */ 128562306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 128662306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 128762306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT3, NULL); 128862306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT2, NULL); 128962306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT1, NULL); 129062306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYOUT0, NULL); 129162306a36Sopenharmony_ci gpio_request(GPIO_FN_KEYIN0, NULL); 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_ci /* enable user debug switch */ 129462306a36Sopenharmony_ci gpio_request(GPIO_PTR0, NULL); 129562306a36Sopenharmony_ci gpio_request(GPIO_PTR4, NULL); 129662306a36Sopenharmony_ci gpio_request(GPIO_PTR5, NULL); 129762306a36Sopenharmony_ci gpio_request(GPIO_PTR6, NULL); 129862306a36Sopenharmony_ci gpio_direction_input(GPIO_PTR0); 129962306a36Sopenharmony_ci gpio_direction_input(GPIO_PTR4); 130062306a36Sopenharmony_ci gpio_direction_input(GPIO_PTR5); 130162306a36Sopenharmony_ci gpio_direction_input(GPIO_PTR6); 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_ci /* SD-card slot CN11 */ 130462306a36Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 130562306a36Sopenharmony_ci /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ 130662306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0WP, NULL); 130762306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CMD, NULL); 130862306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0CLK, NULL); 130962306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D3, NULL); 131062306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D2, NULL); 131162306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D1, NULL); 131262306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI0D0, NULL); 131362306a36Sopenharmony_ci#else 131462306a36Sopenharmony_ci /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ 131562306a36Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_TXD, NULL); 131662306a36Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_RXD, NULL); 131762306a36Sopenharmony_ci gpio_request(GPIO_FN_MSIOF0_TSCK, NULL); 131862306a36Sopenharmony_ci gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ 131962306a36Sopenharmony_ci gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_ci gpiod_add_lookup_table(&mmc_spi_gpio_table); 132262306a36Sopenharmony_ci gpiod_add_lookup_table(&msiof_gpio_table); 132362306a36Sopenharmony_ci spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); 132462306a36Sopenharmony_ci#endif 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_ci /* MMC/SD-card slot CN12 */ 132762306a36Sopenharmony_ci#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 132862306a36Sopenharmony_ci /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */ 132962306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D7, NULL); 133062306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D6, NULL); 133162306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D5, NULL); 133262306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D4, NULL); 133362306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D3, NULL); 133462306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D2, NULL); 133562306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D1, NULL); 133662306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_D0, NULL); 133762306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_CLK, NULL); 133862306a36Sopenharmony_ci gpio_request(GPIO_FN_MMC_CMD, NULL); 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci cn12_enabled = true; 134162306a36Sopenharmony_ci#elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 134262306a36Sopenharmony_ci /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */ 134362306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1WP, NULL); 134462306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CMD, NULL); 134562306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1CLK, NULL); 134662306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D3, NULL); 134762306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D2, NULL); 134862306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D1, NULL); 134962306a36Sopenharmony_ci gpio_request(GPIO_FN_SDHI1D0, NULL); 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci cn12_enabled = true; 135262306a36Sopenharmony_ci#endif 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci if (cn12_enabled) 135562306a36Sopenharmony_ci /* I/O buffer drive ability is high for CN12 */ 135662306a36Sopenharmony_ci __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000, 135762306a36Sopenharmony_ci IODRIVEA); 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci /* enable FSI */ 136062306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIMCKB, NULL); 136162306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIBSD, NULL); 136262306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOBSD, NULL); 136362306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIBBCK, NULL); 136462306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIIBLRCK, NULL); 136562306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOBBCK, NULL); 136662306a36Sopenharmony_ci gpio_request(GPIO_FN_FSIOBLRCK, NULL); 136762306a36Sopenharmony_ci gpio_request(GPIO_FN_CLKAUDIOBO, NULL); 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci /* set SPU2 clock to 83.4 MHz */ 137062306a36Sopenharmony_ci clk = clk_get(NULL, "spu_clk"); 137162306a36Sopenharmony_ci if (!IS_ERR(clk)) { 137262306a36Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 83333333)); 137362306a36Sopenharmony_ci clk_put(clk); 137462306a36Sopenharmony_ci } 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci /* change parent of FSI B */ 137762306a36Sopenharmony_ci clk = clk_get(NULL, "fsib_clk"); 137862306a36Sopenharmony_ci if (!IS_ERR(clk)) { 137962306a36Sopenharmony_ci /* 48kHz dummy clock was used to make sure 1/1 divide */ 138062306a36Sopenharmony_ci clk_set_rate(&sh7724_fsimckb_clk, 48000); 138162306a36Sopenharmony_ci clk_set_parent(clk, &sh7724_fsimckb_clk); 138262306a36Sopenharmony_ci clk_set_rate(clk, 48000); 138362306a36Sopenharmony_ci clk_put(clk); 138462306a36Sopenharmony_ci } 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci gpio_request(GPIO_PTU0, NULL); 138762306a36Sopenharmony_ci gpio_direction_output(GPIO_PTU0, 0); 138862306a36Sopenharmony_ci mdelay(20); 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_ci /* enable motion sensor */ 139162306a36Sopenharmony_ci gpio_request(GPIO_FN_INTC_IRQ1, NULL); 139262306a36Sopenharmony_ci gpio_direction_input(GPIO_FN_INTC_IRQ1); 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_ci /* set VPU clock to 166 MHz */ 139562306a36Sopenharmony_ci clk = clk_get(NULL, "vpu_clk"); 139662306a36Sopenharmony_ci if (!IS_ERR(clk)) { 139762306a36Sopenharmony_ci clk_set_rate(clk, clk_round_rate(clk, 166000000)); 139862306a36Sopenharmony_ci clk_put(clk); 139962306a36Sopenharmony_ci } 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci /* enable IrDA */ 140262306a36Sopenharmony_ci gpio_request(GPIO_FN_IRDA_OUT, NULL); 140362306a36Sopenharmony_ci gpio_request(GPIO_FN_IRDA_IN, NULL); 140462306a36Sopenharmony_ci gpio_request(GPIO_PTU5, NULL); 140562306a36Sopenharmony_ci gpio_direction_output(GPIO_PTU5, 0); 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci /* Register gpio lookup tables for cameras and video decoder */ 140862306a36Sopenharmony_ci gpiod_add_lookup_table(&tw9910_gpios); 140962306a36Sopenharmony_ci gpiod_add_lookup_table(&mt9t112_0_gpios); 141062306a36Sopenharmony_ci gpiod_add_lookup_table(&mt9t112_1_gpios); 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_ci /* enable I2C device */ 141362306a36Sopenharmony_ci i2c_register_board_info(0, i2c0_devices, 141462306a36Sopenharmony_ci ARRAY_SIZE(i2c0_devices)); 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci i2c_register_board_info(1, i2c1_devices, 141762306a36Sopenharmony_ci ARRAY_SIZE(i2c1_devices)); 141862306a36Sopenharmony_ci 141962306a36Sopenharmony_ci#if defined(CONFIG_VIDEO_SH_VOU) || defined(CONFIG_VIDEO_SH_VOU_MODULE) 142062306a36Sopenharmony_ci /* VOU */ 142162306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D15, NULL); 142262306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D14, NULL); 142362306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D13, NULL); 142462306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D12, NULL); 142562306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D11, NULL); 142662306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D10, NULL); 142762306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D9, NULL); 142862306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_D8, NULL); 142962306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_CLKI, NULL); 143062306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_CLK, NULL); 143162306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_VSYNC, NULL); 143262306a36Sopenharmony_ci gpio_request(GPIO_FN_DV_HSYNC, NULL); 143362306a36Sopenharmony_ci 143462306a36Sopenharmony_ci /* AK8813 power / reset sequence */ 143562306a36Sopenharmony_ci gpio_request(GPIO_PTG4, NULL); 143662306a36Sopenharmony_ci gpio_request(GPIO_PTU3, NULL); 143762306a36Sopenharmony_ci /* Reset */ 143862306a36Sopenharmony_ci gpio_direction_output(GPIO_PTG4, 0); 143962306a36Sopenharmony_ci /* Power down */ 144062306a36Sopenharmony_ci gpio_direction_output(GPIO_PTU3, 1); 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci udelay(10); 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci /* Power up, reset */ 144562306a36Sopenharmony_ci gpio_set_value(GPIO_PTU3, 0); 144662306a36Sopenharmony_ci 144762306a36Sopenharmony_ci udelay(10); 144862306a36Sopenharmony_ci 144962306a36Sopenharmony_ci /* Remove reset */ 145062306a36Sopenharmony_ci gpio_set_value(GPIO_PTG4, 1); 145162306a36Sopenharmony_ci#endif 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci /* Initialize CEU platform devices separately to map memory first */ 145462306a36Sopenharmony_ci device_initialize(&ecovec_ceu_devices[0]->dev); 145562306a36Sopenharmony_ci dma_declare_coherent_memory(&ecovec_ceu_devices[0]->dev, 145662306a36Sopenharmony_ci ceu0_dma_membase, ceu0_dma_membase, 145762306a36Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 145862306a36Sopenharmony_ci platform_device_add(ecovec_ceu_devices[0]); 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_ci device_initialize(&ecovec_ceu_devices[1]->dev); 146162306a36Sopenharmony_ci dma_declare_coherent_memory(&ecovec_ceu_devices[1]->dev, 146262306a36Sopenharmony_ci ceu1_dma_membase, ceu1_dma_membase, 146362306a36Sopenharmony_ci CEU_BUFFER_MEMORY_SIZE); 146462306a36Sopenharmony_ci platform_device_add(ecovec_ceu_devices[1]); 146562306a36Sopenharmony_ci 146662306a36Sopenharmony_ci gpiod_add_lookup_table(&cn12_power_gpiod_table); 146762306a36Sopenharmony_ci#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 146862306a36Sopenharmony_ci gpiod_add_lookup_table(&sdhi0_power_gpiod_table); 146962306a36Sopenharmony_ci gpiod_add_lookup_table(&sdhi0_gpio_table); 147062306a36Sopenharmony_ci#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 147162306a36Sopenharmony_ci gpiod_add_lookup_table(&sdhi1_gpio_table); 147262306a36Sopenharmony_ci#endif 147362306a36Sopenharmony_ci#endif 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ci gpiod_add_lookup_table(&gpio_backlight_lookup); 147662306a36Sopenharmony_ci gpio_backlight_device = platform_device_register_full( 147762306a36Sopenharmony_ci &gpio_backlight_device_info); 147862306a36Sopenharmony_ci if (IS_ERR(gpio_backlight_device)) 147962306a36Sopenharmony_ci return PTR_ERR(gpio_backlight_device); 148062306a36Sopenharmony_ci 148162306a36Sopenharmony_ci return platform_add_devices(ecovec_devices, 148262306a36Sopenharmony_ci ARRAY_SIZE(ecovec_devices)); 148362306a36Sopenharmony_ci} 148462306a36Sopenharmony_ciarch_initcall(arch_setup); 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_cistatic int __init devices_setup(void) 148762306a36Sopenharmony_ci{ 148862306a36Sopenharmony_ci sh_eth_init(&sh_eth_plat); 148962306a36Sopenharmony_ci return 0; 149062306a36Sopenharmony_ci} 149162306a36Sopenharmony_cidevice_initcall(devices_setup); 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci/* Reserve a portion of memory for CEU 0 and CEU 1 buffers */ 149462306a36Sopenharmony_cistatic void __init ecovec_mv_mem_reserve(void) 149562306a36Sopenharmony_ci{ 149662306a36Sopenharmony_ci phys_addr_t phys; 149762306a36Sopenharmony_ci phys_addr_t size = CEU_BUFFER_MEMORY_SIZE; 149862306a36Sopenharmony_ci 149962306a36Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 150062306a36Sopenharmony_ci if (!phys) 150162306a36Sopenharmony_ci panic("Failed to allocate CEU0 memory\n"); 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci memblock_phys_free(phys, size); 150462306a36Sopenharmony_ci memblock_remove(phys, size); 150562306a36Sopenharmony_ci ceu0_dma_membase = phys; 150662306a36Sopenharmony_ci 150762306a36Sopenharmony_ci phys = memblock_phys_alloc(size, PAGE_SIZE); 150862306a36Sopenharmony_ci if (!phys) 150962306a36Sopenharmony_ci panic("Failed to allocate CEU1 memory\n"); 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci memblock_phys_free(phys, size); 151262306a36Sopenharmony_ci memblock_remove(phys, size); 151362306a36Sopenharmony_ci ceu1_dma_membase = phys; 151462306a36Sopenharmony_ci} 151562306a36Sopenharmony_ci 151662306a36Sopenharmony_cistatic struct sh_machine_vector mv_ecovec __initmv = { 151762306a36Sopenharmony_ci .mv_name = "R0P7724 (EcoVec)", 151862306a36Sopenharmony_ci .mv_mem_reserve = ecovec_mv_mem_reserve, 151962306a36Sopenharmony_ci}; 1520