14138b740SKuninori Morimoto /* 24138b740SKuninori Morimoto * Copyright (C) 2009 Renesas Solutions Corp. 34138b740SKuninori Morimoto * 44138b740SKuninori Morimoto * Kuninori Morimoto <morimoto.kuninori@renesas.com> 54138b740SKuninori Morimoto * 64138b740SKuninori Morimoto * This file is subject to the terms and conditions of the GNU General Public 74138b740SKuninori Morimoto * License. See the file "COPYING" in the main directory of this archive 84138b740SKuninori Morimoto * for more details. 94138b740SKuninori Morimoto */ 104138b740SKuninori Morimoto 114138b740SKuninori Morimoto #include <linux/init.h> 124138b740SKuninori Morimoto #include <linux/device.h> 134138b740SKuninori Morimoto #include <linux/platform_device.h> 141238c684SYusuke Goda #include <linux/mmc/host.h> 151238c684SYusuke Goda #include <linux/mmc/sh_mmcif.h> 16960b9e7eSGuennadi Liakhovetski #include <linux/mmc/sh_mobile_sdhi.h> 174138b740SKuninori Morimoto #include <linux/mtd/physmap.h> 18357002b9SKuninori Morimoto #include <linux/mfd/tmio.h> 194138b740SKuninori Morimoto #include <linux/gpio.h> 204138b740SKuninori Morimoto #include <linux/interrupt.h> 2135a35408SKuninori Morimoto #include <linux/io.h> 2235a35408SKuninori Morimoto #include <linux/delay.h> 23d4c191dfSGuennadi Liakhovetski #include <linux/regulator/fixed.h> 24d4c191dfSGuennadi Liakhovetski #include <linux/regulator/machine.h> 25907050a3SKuninori Morimoto #include <linux/usb/r8a66597.h> 26fb2e7394SKuninori Morimoto #include <linux/usb/renesas_usbhs.h> 274907d57fSKuninori Morimoto #include <linux/i2c.h> 288810e055SKuninori Morimoto #include <linux/i2c/tsc2007.h> 291ce4da7aSMagnus Damm #include <linux/spi/spi.h> 301ce4da7aSMagnus Damm #include <linux/spi/sh_msiof.h> 311ce4da7aSMagnus Damm #include <linux/spi/mmc_spi.h> 32e9103e74SKuninori Morimoto #include <linux/input.h> 33fc1d003dSMagnus Damm #include <linux/input/sh_keysc.h> 34fe79f919SLaurent Pinchart #include <linux/platform_data/gpio_backlight.h> 35cf8e56bfSYoshihiro Shimoda #include <linux/sh_eth.h> 369307d115SPaul Mundt #include <linux/sh_intc.h> 37a1ad8033SGuennadi Liakhovetski #include <linux/videodev2.h> 38fa3ba51bSKuninori Morimoto #include <video/sh_mobile_lcdc.h> 391980fdc4SKuninori Morimoto #include <sound/sh_fsi.h> 40064bfadaSKuninori Morimoto #include <sound/simple_card.h> 412153ad32SKuninori Morimoto #include <media/sh_mobile_ceu.h> 42a1ad8033SGuennadi Liakhovetski #include <media/soc_camera.h> 43207efd07SKuninori Morimoto #include <media/tw9910.h> 449aa25d64SKuninori Morimoto #include <media/mt9t112.h> 454138b740SKuninori Morimoto #include <asm/heartbeat.h> 46a991801aSKuninori Morimoto #include <asm/clock.h> 47eb0cd9e8SMagnus Damm #include <asm/suspend.h> 484138b740SKuninori Morimoto #include <cpu/sh7724.h> 494138b740SKuninori Morimoto 504138b740SKuninori Morimoto /* 51b7056bc1SKuninori Morimoto * Address Interface BusWidth 52b7056bc1SKuninori Morimoto *----------------------------------------- 53b7056bc1SKuninori Morimoto * 0x0000_0000 uboot 16bit 54b7056bc1SKuninori Morimoto * 0x0004_0000 Linux romImage 16bit 55b7056bc1SKuninori Morimoto * 0x0014_0000 MTD for Linux 16bit 56b7056bc1SKuninori Morimoto * 0x0400_0000 Internal I/O 16/32bit 57b7056bc1SKuninori Morimoto * 0x0800_0000 DRAM 32bit 58b7056bc1SKuninori Morimoto * 0x1800_0000 MFI 16bit 594138b740SKuninori Morimoto */ 604138b740SKuninori Morimoto 619c472c4dSKuninori Morimoto /* SWITCH 629c472c4dSKuninori Morimoto *------------------------------ 639c472c4dSKuninori Morimoto * DS2[1] = FlashROM write protect ON : write protect 649c472c4dSKuninori Morimoto * OFF : No write protect 659c472c4dSKuninori Morimoto * DS2[2] = RMII / TS, SCIF ON : RMII 669c472c4dSKuninori Morimoto * OFF : TS, SCIF3 679c472c4dSKuninori Morimoto * DS2[3] = Camera / Video ON : Camera 689c472c4dSKuninori Morimoto * OFF : NTSC/PAL (IN) 699c472c4dSKuninori Morimoto * DS2[5] = NTSC_OUT Clock ON : On board OSC 709c472c4dSKuninori Morimoto * OFF : SH7724 DV_CLK 719c472c4dSKuninori Morimoto * DS2[6-7] = MMC / SD ON-OFF : SD 729c472c4dSKuninori Morimoto * OFF-ON : MMC 739c472c4dSKuninori Morimoto */ 749c472c4dSKuninori Morimoto 75035688d9SKuninori Morimoto /* 76035688d9SKuninori Morimoto * FSI - DA7210 77035688d9SKuninori Morimoto * 78035688d9SKuninori Morimoto * it needs amixer settings for playing 79035688d9SKuninori Morimoto * 80035688d9SKuninori Morimoto * amixer set 'HeadPhone' 80 81035688d9SKuninori Morimoto * amixer set 'Out Mixer Left DAC Left' on 82035688d9SKuninori Morimoto * amixer set 'Out Mixer Right DAC Right' on 83035688d9SKuninori Morimoto */ 84035688d9SKuninori Morimoto 854138b740SKuninori Morimoto /* Heartbeat */ 864138b740SKuninori Morimoto static unsigned char led_pos[] = { 0, 1, 2, 3 }; 87a09d2831SPaul Mundt 884138b740SKuninori Morimoto static struct heartbeat_data heartbeat_data = { 894138b740SKuninori Morimoto .nr_bits = 4, 904138b740SKuninori Morimoto .bit_pos = led_pos, 914138b740SKuninori Morimoto }; 924138b740SKuninori Morimoto 93a09d2831SPaul Mundt static struct resource heartbeat_resource = { 944138b740SKuninori Morimoto .start = 0xA405012C, /* PTG */ 954138b740SKuninori Morimoto .end = 0xA405012E - 1, 96a09d2831SPaul Mundt .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, 974138b740SKuninori Morimoto }; 984138b740SKuninori Morimoto 994138b740SKuninori Morimoto static struct platform_device heartbeat_device = { 1004138b740SKuninori Morimoto .name = "heartbeat", 1014138b740SKuninori Morimoto .id = -1, 1024138b740SKuninori Morimoto .dev = { 1034138b740SKuninori Morimoto .platform_data = &heartbeat_data, 1044138b740SKuninori Morimoto }, 105a09d2831SPaul Mundt .num_resources = 1, 106a09d2831SPaul Mundt .resource = &heartbeat_resource, 1074138b740SKuninori Morimoto }; 1084138b740SKuninori Morimoto 1094138b740SKuninori Morimoto /* MTD */ 1104138b740SKuninori Morimoto static struct mtd_partition nor_flash_partitions[] = { 1114138b740SKuninori Morimoto { 112b7056bc1SKuninori Morimoto .name = "boot loader", 1134138b740SKuninori Morimoto .offset = 0, 114b7056bc1SKuninori Morimoto .size = (5 * 1024 * 1024), 115d5ce010cSKuninori Morimoto .mask_flags = MTD_WRITEABLE, /* force read-only */ 1164138b740SKuninori Morimoto }, { 1174138b740SKuninori Morimoto .name = "free-area", 1184138b740SKuninori Morimoto .offset = MTDPART_OFS_APPEND, 1194138b740SKuninori Morimoto .size = MTDPART_SIZ_FULL, 1204138b740SKuninori Morimoto }, 1214138b740SKuninori Morimoto }; 1224138b740SKuninori Morimoto 1234138b740SKuninori Morimoto static struct physmap_flash_data nor_flash_data = { 1244138b740SKuninori Morimoto .width = 2, 1254138b740SKuninori Morimoto .parts = nor_flash_partitions, 1264138b740SKuninori Morimoto .nr_parts = ARRAY_SIZE(nor_flash_partitions), 1274138b740SKuninori Morimoto }; 1284138b740SKuninori Morimoto 1294138b740SKuninori Morimoto static struct resource nor_flash_resources[] = { 1304138b740SKuninori Morimoto [0] = { 1314138b740SKuninori Morimoto .name = "NOR Flash", 1324138b740SKuninori Morimoto .start = 0x00000000, 1334138b740SKuninori Morimoto .end = 0x03ffffff, 1344138b740SKuninori Morimoto .flags = IORESOURCE_MEM, 1354138b740SKuninori Morimoto } 1364138b740SKuninori Morimoto }; 1374138b740SKuninori Morimoto 1384138b740SKuninori Morimoto static struct platform_device nor_flash_device = { 1394138b740SKuninori Morimoto .name = "physmap-flash", 1404138b740SKuninori Morimoto .resource = nor_flash_resources, 1414138b740SKuninori Morimoto .num_resources = ARRAY_SIZE(nor_flash_resources), 1424138b740SKuninori Morimoto .dev = { 1434138b740SKuninori Morimoto .platform_data = &nor_flash_data, 1444138b740SKuninori Morimoto }, 1454138b740SKuninori Morimoto }; 1464138b740SKuninori Morimoto 14735a35408SKuninori Morimoto /* SH Eth */ 14835a35408SKuninori Morimoto #define SH_ETH_ADDR (0xA4600000) 14935a35408SKuninori Morimoto static struct resource sh_eth_resources[] = { 15035a35408SKuninori Morimoto [0] = { 15135a35408SKuninori Morimoto .start = SH_ETH_ADDR, 15235a35408SKuninori Morimoto .end = SH_ETH_ADDR + 0x1FC, 15335a35408SKuninori Morimoto .flags = IORESOURCE_MEM, 15435a35408SKuninori Morimoto }, 15535a35408SKuninori Morimoto [1] = { 1569307d115SPaul Mundt .start = evt2irq(0xd60), 15735a35408SKuninori Morimoto .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 15835a35408SKuninori Morimoto }, 15935a35408SKuninori Morimoto }; 16035a35408SKuninori Morimoto 1613ce09334SKuninori Morimoto static struct sh_eth_plat_data sh_eth_plat = { 16235a35408SKuninori Morimoto .phy = 0x1f, /* SMSC LAN8700 */ 16335a35408SKuninori Morimoto .edmac_endian = EDMAC_LITTLE_ENDIAN, 1649055f895SYoshihiro Shimoda .phy_interface = PHY_INTERFACE_MODE_MII, 165acf3cc28SKuninori Morimoto .ether_link_active_low = 1 16635a35408SKuninori Morimoto }; 16735a35408SKuninori Morimoto 16835a35408SKuninori Morimoto static struct platform_device sh_eth_device = { 1699c3beaabSSergei Shtylyov .name = "sh7724-ether", 17035a35408SKuninori Morimoto .id = 0, 17135a35408SKuninori Morimoto .dev = { 17235a35408SKuninori Morimoto .platform_data = &sh_eth_plat, 17335a35408SKuninori Morimoto }, 17435a35408SKuninori Morimoto .num_resources = ARRAY_SIZE(sh_eth_resources), 17535a35408SKuninori Morimoto .resource = sh_eth_resources, 17635a35408SKuninori Morimoto }; 17735a35408SKuninori Morimoto 178907050a3SKuninori Morimoto /* USB0 host */ 1793ce09334SKuninori Morimoto static void usb0_port_power(int port, int power) 180907050a3SKuninori Morimoto { 181907050a3SKuninori Morimoto gpio_set_value(GPIO_PTB4, power); 182907050a3SKuninori Morimoto } 183907050a3SKuninori Morimoto 184907050a3SKuninori Morimoto static struct r8a66597_platdata usb0_host_data = { 185907050a3SKuninori Morimoto .on_chip = 1, 186907050a3SKuninori Morimoto .port_power = usb0_port_power, 187907050a3SKuninori Morimoto }; 188907050a3SKuninori Morimoto 189907050a3SKuninori Morimoto static struct resource usb0_host_resources[] = { 190907050a3SKuninori Morimoto [0] = { 191907050a3SKuninori Morimoto .start = 0xa4d80000, 192907050a3SKuninori Morimoto .end = 0xa4d80124 - 1, 193907050a3SKuninori Morimoto .flags = IORESOURCE_MEM, 194907050a3SKuninori Morimoto }, 195907050a3SKuninori Morimoto [1] = { 1969307d115SPaul Mundt .start = evt2irq(0xa20), 1979307d115SPaul Mundt .end = evt2irq(0xa20), 198907050a3SKuninori Morimoto .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 199907050a3SKuninori Morimoto }, 200907050a3SKuninori Morimoto }; 201907050a3SKuninori Morimoto 202907050a3SKuninori Morimoto static struct platform_device usb0_host_device = { 203907050a3SKuninori Morimoto .name = "r8a66597_hcd", 204907050a3SKuninori Morimoto .id = 0, 205907050a3SKuninori Morimoto .dev = { 206907050a3SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 207907050a3SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 208907050a3SKuninori Morimoto .platform_data = &usb0_host_data, 209907050a3SKuninori Morimoto }, 210907050a3SKuninori Morimoto .num_resources = ARRAY_SIZE(usb0_host_resources), 211907050a3SKuninori Morimoto .resource = usb0_host_resources, 212907050a3SKuninori Morimoto }; 213907050a3SKuninori Morimoto 2143714a9a0SKuninori Morimoto /* USB1 host/function */ 2153ce09334SKuninori Morimoto static void usb1_port_power(int port, int power) 216907050a3SKuninori Morimoto { 217907050a3SKuninori Morimoto gpio_set_value(GPIO_PTB5, power); 218907050a3SKuninori Morimoto } 219907050a3SKuninori Morimoto 2203714a9a0SKuninori Morimoto static struct r8a66597_platdata usb1_common_data = { 221907050a3SKuninori Morimoto .on_chip = 1, 222907050a3SKuninori Morimoto .port_power = usb1_port_power, 223907050a3SKuninori Morimoto }; 224907050a3SKuninori Morimoto 2253714a9a0SKuninori Morimoto static struct resource usb1_common_resources[] = { 226907050a3SKuninori Morimoto [0] = { 227907050a3SKuninori Morimoto .start = 0xa4d90000, 228907050a3SKuninori Morimoto .end = 0xa4d90124 - 1, 229907050a3SKuninori Morimoto .flags = IORESOURCE_MEM, 230907050a3SKuninori Morimoto }, 231907050a3SKuninori Morimoto [1] = { 2329307d115SPaul Mundt .start = evt2irq(0xa40), 2339307d115SPaul Mundt .end = evt2irq(0xa40), 234907050a3SKuninori Morimoto .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 235907050a3SKuninori Morimoto }, 236907050a3SKuninori Morimoto }; 237907050a3SKuninori Morimoto 2383714a9a0SKuninori Morimoto static struct platform_device usb1_common_device = { 2393714a9a0SKuninori Morimoto /* .name will be added in arch_setup */ 240907050a3SKuninori Morimoto .id = 1, 241907050a3SKuninori Morimoto .dev = { 242907050a3SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 243907050a3SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 2443714a9a0SKuninori Morimoto .platform_data = &usb1_common_data, 245907050a3SKuninori Morimoto }, 2463714a9a0SKuninori Morimoto .num_resources = ARRAY_SIZE(usb1_common_resources), 2473714a9a0SKuninori Morimoto .resource = usb1_common_resources, 248907050a3SKuninori Morimoto }; 249907050a3SKuninori Morimoto 250fb2e7394SKuninori Morimoto /* 251fb2e7394SKuninori Morimoto * USBHS 252fb2e7394SKuninori Morimoto */ 253fb2e7394SKuninori Morimoto static int usbhs_get_id(struct platform_device *pdev) 254fb2e7394SKuninori Morimoto { 255fb2e7394SKuninori Morimoto return gpio_get_value(GPIO_PTB3); 256fb2e7394SKuninori Morimoto } 257fb2e7394SKuninori Morimoto 258225da3e3SKuninori Morimoto static int usbhs_phy_reset(struct platform_device *pdev) 2591ca8fe38SKuninori Morimoto { 2601ca8fe38SKuninori Morimoto /* enable vbus if HOST */ 2611ca8fe38SKuninori Morimoto if (!gpio_get_value(GPIO_PTB3)) 2621ca8fe38SKuninori Morimoto gpio_set_value(GPIO_PTB5, 1); 263225da3e3SKuninori Morimoto 264225da3e3SKuninori Morimoto return 0; 2651ca8fe38SKuninori Morimoto } 2661ca8fe38SKuninori Morimoto 267fb2e7394SKuninori Morimoto static struct renesas_usbhs_platform_info usbhs_info = { 268fb2e7394SKuninori Morimoto .platform_callback = { 269fb2e7394SKuninori Morimoto .get_id = usbhs_get_id, 2701ca8fe38SKuninori Morimoto .phy_reset = usbhs_phy_reset, 271fb2e7394SKuninori Morimoto }, 272fb2e7394SKuninori Morimoto .driver_param = { 273fb2e7394SKuninori Morimoto .buswait_bwait = 4, 274fb2e7394SKuninori Morimoto .detection_delay = 5, 2759f0fa799SKuninori Morimoto .d0_tx_id = SHDMA_SLAVE_USB1D0_TX, 2769f0fa799SKuninori Morimoto .d0_rx_id = SHDMA_SLAVE_USB1D0_RX, 2779f0fa799SKuninori Morimoto .d1_tx_id = SHDMA_SLAVE_USB1D1_TX, 2789f0fa799SKuninori Morimoto .d1_rx_id = SHDMA_SLAVE_USB1D1_RX, 279fb2e7394SKuninori Morimoto }, 280fb2e7394SKuninori Morimoto }; 281fb2e7394SKuninori Morimoto 282fb2e7394SKuninori Morimoto static struct resource usbhs_resources[] = { 283fb2e7394SKuninori Morimoto [0] = { 284fb2e7394SKuninori Morimoto .start = 0xa4d90000, 285fb2e7394SKuninori Morimoto .end = 0xa4d90124 - 1, 286fb2e7394SKuninori Morimoto .flags = IORESOURCE_MEM, 287fb2e7394SKuninori Morimoto }, 288fb2e7394SKuninori Morimoto [1] = { 2899307d115SPaul Mundt .start = evt2irq(0xa40), 2909307d115SPaul Mundt .end = evt2irq(0xa40), 291fb2e7394SKuninori Morimoto .flags = IORESOURCE_IRQ, 292fb2e7394SKuninori Morimoto }, 293fb2e7394SKuninori Morimoto }; 294fb2e7394SKuninori Morimoto 295fb2e7394SKuninori Morimoto static struct platform_device usbhs_device = { 296fb2e7394SKuninori Morimoto .name = "renesas_usbhs", 297fb2e7394SKuninori Morimoto .id = 1, 298fb2e7394SKuninori Morimoto .dev = { 299fb2e7394SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 300fb2e7394SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 301fb2e7394SKuninori Morimoto .platform_data = &usbhs_info, 302fb2e7394SKuninori Morimoto }, 303fb2e7394SKuninori Morimoto .num_resources = ARRAY_SIZE(usbhs_resources), 304fb2e7394SKuninori Morimoto .resource = usbhs_resources, 305fb2e7394SKuninori Morimoto }; 306fb2e7394SKuninori Morimoto 307fe79f919SLaurent Pinchart /* LCDC and backlight */ 308e04008ebSJesper Juhl static const struct fb_videomode ecovec_lcd_modes[] = { 30944432407SGuennadi Liakhovetski { 31044432407SGuennadi Liakhovetski .name = "Panel", 31144432407SGuennadi Liakhovetski .xres = 800, 31244432407SGuennadi Liakhovetski .yres = 480, 31344432407SGuennadi Liakhovetski .left_margin = 220, 31444432407SGuennadi Liakhovetski .right_margin = 110, 31544432407SGuennadi Liakhovetski .hsync_len = 70, 31644432407SGuennadi Liakhovetski .upper_margin = 20, 31744432407SGuennadi Liakhovetski .lower_margin = 5, 31844432407SGuennadi Liakhovetski .vsync_len = 5, 31944432407SGuennadi Liakhovetski .sync = 0, /* hsync and vsync are active low */ 32044432407SGuennadi Liakhovetski }, 32144432407SGuennadi Liakhovetski }; 32244432407SGuennadi Liakhovetski 323e04008ebSJesper Juhl static const struct fb_videomode ecovec_dvi_modes[] = { 32444432407SGuennadi Liakhovetski { 32544432407SGuennadi Liakhovetski .name = "DVI", 32644432407SGuennadi Liakhovetski .xres = 1280, 32744432407SGuennadi Liakhovetski .yres = 720, 32844432407SGuennadi Liakhovetski .left_margin = 220, 32944432407SGuennadi Liakhovetski .right_margin = 110, 33044432407SGuennadi Liakhovetski .hsync_len = 40, 33144432407SGuennadi Liakhovetski .upper_margin = 20, 33244432407SGuennadi Liakhovetski .lower_margin = 5, 33344432407SGuennadi Liakhovetski .vsync_len = 5, 33444432407SGuennadi Liakhovetski .sync = 0, /* hsync and vsync are active low */ 33544432407SGuennadi Liakhovetski }, 33644432407SGuennadi Liakhovetski }; 33744432407SGuennadi Liakhovetski 338fa3ba51bSKuninori Morimoto static struct sh_mobile_lcdc_info lcdc_info = { 339fa3ba51bSKuninori Morimoto .ch[0] = { 340fa3ba51bSKuninori Morimoto .interface_type = RGB18, 341fa3ba51bSKuninori Morimoto .chan = LCDC_CHAN_MAINLCD, 342edd153a3SLaurent Pinchart .fourcc = V4L2_PIX_FMT_RGB565, 343afaad83bSLaurent Pinchart .panel_cfg = { /* 7.0 inch */ 344fa3ba51bSKuninori Morimoto .width = 152, 345fa3ba51bSKuninori Morimoto .height = 91, 346fa3ba51bSKuninori Morimoto }, 347fa3ba51bSKuninori Morimoto } 348fa3ba51bSKuninori Morimoto }; 349fa3ba51bSKuninori Morimoto 350fa3ba51bSKuninori Morimoto static struct resource lcdc_resources[] = { 351fa3ba51bSKuninori Morimoto [0] = { 352fa3ba51bSKuninori Morimoto .name = "LCDC", 353fa3ba51bSKuninori Morimoto .start = 0xfe940000, 354a6f15adeSPhil Edworthy .end = 0xfe942fff, 355fa3ba51bSKuninori Morimoto .flags = IORESOURCE_MEM, 356fa3ba51bSKuninori Morimoto }, 357fa3ba51bSKuninori Morimoto [1] = { 3589307d115SPaul Mundt .start = evt2irq(0xf40), 359fa3ba51bSKuninori Morimoto .flags = IORESOURCE_IRQ, 360fa3ba51bSKuninori Morimoto }, 361fa3ba51bSKuninori Morimoto }; 362fa3ba51bSKuninori Morimoto 363fa3ba51bSKuninori Morimoto static struct platform_device lcdc_device = { 364fa3ba51bSKuninori Morimoto .name = "sh_mobile_lcdc_fb", 365fa3ba51bSKuninori Morimoto .num_resources = ARRAY_SIZE(lcdc_resources), 366fa3ba51bSKuninori Morimoto .resource = lcdc_resources, 367fa3ba51bSKuninori Morimoto .dev = { 368fa3ba51bSKuninori Morimoto .platform_data = &lcdc_info, 369fa3ba51bSKuninori Morimoto }, 370fa3ba51bSKuninori Morimoto }; 371fa3ba51bSKuninori Morimoto 372fe79f919SLaurent Pinchart static struct gpio_backlight_platform_data gpio_backlight_data = { 373fe79f919SLaurent Pinchart .fbdev = &lcdc_device.dev, 374fe79f919SLaurent Pinchart .gpio = GPIO_PTR1, 375fe79f919SLaurent Pinchart .def_value = 1, 376fe79f919SLaurent Pinchart .name = "backlight", 377fe79f919SLaurent Pinchart }; 378fe79f919SLaurent Pinchart 379fe79f919SLaurent Pinchart static struct platform_device gpio_backlight_device = { 380fe79f919SLaurent Pinchart .name = "gpio-backlight", 381fe79f919SLaurent Pinchart .dev = { 382fe79f919SLaurent Pinchart .platform_data = &gpio_backlight_data, 383fe79f919SLaurent Pinchart }, 384fe79f919SLaurent Pinchart }; 385fe79f919SLaurent Pinchart 3862153ad32SKuninori Morimoto /* CEU0 */ 3872153ad32SKuninori Morimoto static struct sh_mobile_ceu_info sh_mobile_ceu0_info = { 3882153ad32SKuninori Morimoto .flags = SH_CEU_FLAG_USE_8BIT_BUS, 3892153ad32SKuninori Morimoto }; 3902153ad32SKuninori Morimoto 3912153ad32SKuninori Morimoto static struct resource ceu0_resources[] = { 3922153ad32SKuninori Morimoto [0] = { 3932153ad32SKuninori Morimoto .name = "CEU0", 3942153ad32SKuninori Morimoto .start = 0xfe910000, 3952153ad32SKuninori Morimoto .end = 0xfe91009f, 3962153ad32SKuninori Morimoto .flags = IORESOURCE_MEM, 3972153ad32SKuninori Morimoto }, 3982153ad32SKuninori Morimoto [1] = { 3999307d115SPaul Mundt .start = evt2irq(0x880), 4002153ad32SKuninori Morimoto .flags = IORESOURCE_IRQ, 4012153ad32SKuninori Morimoto }, 4022153ad32SKuninori Morimoto [2] = { 4032153ad32SKuninori Morimoto /* place holder for contiguous memory */ 4042153ad32SKuninori Morimoto }, 4052153ad32SKuninori Morimoto }; 4062153ad32SKuninori Morimoto 4072153ad32SKuninori Morimoto static struct platform_device ceu0_device = { 4082153ad32SKuninori Morimoto .name = "sh_mobile_ceu", 4092153ad32SKuninori Morimoto .id = 0, /* "ceu0" clock */ 4102153ad32SKuninori Morimoto .num_resources = ARRAY_SIZE(ceu0_resources), 4112153ad32SKuninori Morimoto .resource = ceu0_resources, 4122153ad32SKuninori Morimoto .dev = { 4132153ad32SKuninori Morimoto .platform_data = &sh_mobile_ceu0_info, 4142153ad32SKuninori Morimoto }, 4152153ad32SKuninori Morimoto }; 4162153ad32SKuninori Morimoto 4172153ad32SKuninori Morimoto /* CEU1 */ 4182153ad32SKuninori Morimoto static struct sh_mobile_ceu_info sh_mobile_ceu1_info = { 4192153ad32SKuninori Morimoto .flags = SH_CEU_FLAG_USE_8BIT_BUS, 4202153ad32SKuninori Morimoto }; 4212153ad32SKuninori Morimoto 4222153ad32SKuninori Morimoto static struct resource ceu1_resources[] = { 4232153ad32SKuninori Morimoto [0] = { 4242153ad32SKuninori Morimoto .name = "CEU1", 4252153ad32SKuninori Morimoto .start = 0xfe914000, 4262153ad32SKuninori Morimoto .end = 0xfe91409f, 4272153ad32SKuninori Morimoto .flags = IORESOURCE_MEM, 4282153ad32SKuninori Morimoto }, 4292153ad32SKuninori Morimoto [1] = { 4309307d115SPaul Mundt .start = evt2irq(0x9e0), 4312153ad32SKuninori Morimoto .flags = IORESOURCE_IRQ, 4322153ad32SKuninori Morimoto }, 4332153ad32SKuninori Morimoto [2] = { 4342153ad32SKuninori Morimoto /* place holder for contiguous memory */ 4352153ad32SKuninori Morimoto }, 4362153ad32SKuninori Morimoto }; 4372153ad32SKuninori Morimoto 4382153ad32SKuninori Morimoto static struct platform_device ceu1_device = { 4392153ad32SKuninori Morimoto .name = "sh_mobile_ceu", 4402153ad32SKuninori Morimoto .id = 1, /* "ceu1" clock */ 4412153ad32SKuninori Morimoto .num_resources = ARRAY_SIZE(ceu1_resources), 4422153ad32SKuninori Morimoto .resource = ceu1_resources, 4432153ad32SKuninori Morimoto .dev = { 4442153ad32SKuninori Morimoto .platform_data = &sh_mobile_ceu1_info, 4452153ad32SKuninori Morimoto }, 4462153ad32SKuninori Morimoto }; 4472153ad32SKuninori Morimoto 448125ecce6SKuninori Morimoto /* I2C device */ 4491980fdc4SKuninori Morimoto static struct i2c_board_info i2c0_devices[] = { 4501980fdc4SKuninori Morimoto { 4511980fdc4SKuninori Morimoto I2C_BOARD_INFO("da7210", 0x1a), 4521980fdc4SKuninori Morimoto }, 4531980fdc4SKuninori Morimoto }; 4541980fdc4SKuninori Morimoto 455125ecce6SKuninori Morimoto static struct i2c_board_info i2c1_devices[] = { 456125ecce6SKuninori Morimoto { 457125ecce6SKuninori Morimoto I2C_BOARD_INFO("r2025sd", 0x32), 458125ecce6SKuninori Morimoto }, 459ea440783SNISHIMOTO Hiroki { 460ea440783SNISHIMOTO Hiroki I2C_BOARD_INFO("lis3lv02d", 0x1c), 4619307d115SPaul Mundt .irq = evt2irq(0x620), 462ea440783SNISHIMOTO Hiroki } 463125ecce6SKuninori Morimoto }; 464125ecce6SKuninori Morimoto 465e9103e74SKuninori Morimoto /* KEYSC */ 466e9103e74SKuninori Morimoto static struct sh_keysc_info keysc_info = { 467e9103e74SKuninori Morimoto .mode = SH_KEYSC_MODE_1, 468e9103e74SKuninori Morimoto .scan_timing = 3, 469e9103e74SKuninori Morimoto .delay = 50, 470e9103e74SKuninori Morimoto .kycr2_delay = 100, 471e9103e74SKuninori Morimoto .keycodes = { KEY_1, 0, 0, 0, 0, 472e9103e74SKuninori Morimoto KEY_2, 0, 0, 0, 0, 473e9103e74SKuninori Morimoto KEY_3, 0, 0, 0, 0, 474e9103e74SKuninori Morimoto KEY_4, 0, 0, 0, 0, 475e9103e74SKuninori Morimoto KEY_5, 0, 0, 0, 0, 476e9103e74SKuninori Morimoto KEY_6, 0, 0, 0, 0, }, 477e9103e74SKuninori Morimoto }; 478e9103e74SKuninori Morimoto 479e9103e74SKuninori Morimoto static struct resource keysc_resources[] = { 480e9103e74SKuninori Morimoto [0] = { 481e9103e74SKuninori Morimoto .name = "KEYSC", 482e9103e74SKuninori Morimoto .start = 0x044b0000, 483e9103e74SKuninori Morimoto .end = 0x044b000f, 484e9103e74SKuninori Morimoto .flags = IORESOURCE_MEM, 485e9103e74SKuninori Morimoto }, 486e9103e74SKuninori Morimoto [1] = { 4879307d115SPaul Mundt .start = evt2irq(0xbe0), 488e9103e74SKuninori Morimoto .flags = IORESOURCE_IRQ, 489e9103e74SKuninori Morimoto }, 490e9103e74SKuninori Morimoto }; 491e9103e74SKuninori Morimoto 492e9103e74SKuninori Morimoto static struct platform_device keysc_device = { 493e9103e74SKuninori Morimoto .name = "sh_keysc", 494e9103e74SKuninori Morimoto .id = 0, /* keysc0 clock */ 495e9103e74SKuninori Morimoto .num_resources = ARRAY_SIZE(keysc_resources), 496e9103e74SKuninori Morimoto .resource = keysc_resources, 497e9103e74SKuninori Morimoto .dev = { 498e9103e74SKuninori Morimoto .platform_data = &keysc_info, 499e9103e74SKuninori Morimoto }, 500e9103e74SKuninori Morimoto }; 501e9103e74SKuninori Morimoto 5028810e055SKuninori Morimoto /* TouchScreen */ 5039307d115SPaul Mundt #define IRQ0 evt2irq(0x600) 5049307d115SPaul Mundt 50507f9e5cfSDenis Carikli static int ts_get_pendown_state(struct device *dev) 5065d75b3a2SPaul Mundt { 5075d75b3a2SPaul Mundt int val = 0; 5085d75b3a2SPaul Mundt gpio_free(GPIO_FN_INTC_IRQ0); 5095d75b3a2SPaul Mundt gpio_request(GPIO_PTZ0, NULL); 5105d75b3a2SPaul Mundt gpio_direction_input(GPIO_PTZ0); 5115d75b3a2SPaul Mundt 5125d75b3a2SPaul Mundt val = gpio_get_value(GPIO_PTZ0); 5135d75b3a2SPaul Mundt 5145d75b3a2SPaul Mundt gpio_free(GPIO_PTZ0); 5155d75b3a2SPaul Mundt gpio_request(GPIO_FN_INTC_IRQ0, NULL); 5165d75b3a2SPaul Mundt 5175d75b3a2SPaul Mundt return val ? 0 : 1; 5185d75b3a2SPaul Mundt } 5195d75b3a2SPaul Mundt 5205d75b3a2SPaul Mundt static int ts_init(void) 5215d75b3a2SPaul Mundt { 5225d75b3a2SPaul Mundt gpio_request(GPIO_FN_INTC_IRQ0, NULL); 5235d75b3a2SPaul Mundt return 0; 5245d75b3a2SPaul Mundt } 5255d75b3a2SPaul Mundt 5263ce09334SKuninori Morimoto static struct tsc2007_platform_data tsc2007_info = { 5278810e055SKuninori Morimoto .model = 2007, 5285d75b3a2SPaul Mundt .x_plate_ohms = 180, 5295d75b3a2SPaul Mundt .get_pendown_state = ts_get_pendown_state, 5305d75b3a2SPaul Mundt .init_platform_hw = ts_init, 5318810e055SKuninori Morimoto }; 5328810e055SKuninori Morimoto 5338810e055SKuninori Morimoto static struct i2c_board_info ts_i2c_clients = { 5348810e055SKuninori Morimoto I2C_BOARD_INFO("tsc2007", 0x48), 5358810e055SKuninori Morimoto .type = "tsc2007", 5368810e055SKuninori Morimoto .platform_data = &tsc2007_info, 5378810e055SKuninori Morimoto .irq = IRQ0, 5388810e055SKuninori Morimoto }; 5398810e055SKuninori Morimoto 540d4c191dfSGuennadi Liakhovetski static struct regulator_consumer_supply cn12_power_consumers[] = 541d4c191dfSGuennadi Liakhovetski { 542d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), 543d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), 544d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 545d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 546d4c191dfSGuennadi Liakhovetski }; 547d4c191dfSGuennadi Liakhovetski 548d4c191dfSGuennadi Liakhovetski static struct regulator_init_data cn12_power_init_data = { 549d4c191dfSGuennadi Liakhovetski .constraints = { 550d4c191dfSGuennadi Liakhovetski .valid_ops_mask = REGULATOR_CHANGE_STATUS, 551d4c191dfSGuennadi Liakhovetski }, 552d4c191dfSGuennadi Liakhovetski .num_consumer_supplies = ARRAY_SIZE(cn12_power_consumers), 553d4c191dfSGuennadi Liakhovetski .consumer_supplies = cn12_power_consumers, 554d4c191dfSGuennadi Liakhovetski }; 555d4c191dfSGuennadi Liakhovetski 556d4c191dfSGuennadi Liakhovetski static struct fixed_voltage_config cn12_power_info = { 557d4c191dfSGuennadi Liakhovetski .supply_name = "CN12 SD/MMC Vdd", 558d4c191dfSGuennadi Liakhovetski .microvolts = 3300000, 559d4c191dfSGuennadi Liakhovetski .gpio = GPIO_PTB7, 560d4c191dfSGuennadi Liakhovetski .enable_high = 1, 561d4c191dfSGuennadi Liakhovetski .init_data = &cn12_power_init_data, 562d4c191dfSGuennadi Liakhovetski }; 563d4c191dfSGuennadi Liakhovetski 564d4c191dfSGuennadi Liakhovetski static struct platform_device cn12_power = { 565d4c191dfSGuennadi Liakhovetski .name = "reg-fixed-voltage", 566d4c191dfSGuennadi Liakhovetski .id = 0, 567d4c191dfSGuennadi Liakhovetski .dev = { 568d4c191dfSGuennadi Liakhovetski .platform_data = &cn12_power_info, 569d4c191dfSGuennadi Liakhovetski }, 570d4c191dfSGuennadi Liakhovetski }; 571d4c191dfSGuennadi Liakhovetski 5725744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 5731238c684SYusuke Goda /* SDHI0 */ 574d4c191dfSGuennadi Liakhovetski static struct regulator_consumer_supply sdhi0_power_consumers[] = 575d4c191dfSGuennadi Liakhovetski { 576d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 577d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 578d4c191dfSGuennadi Liakhovetski }; 579d4c191dfSGuennadi Liakhovetski 580d4c191dfSGuennadi Liakhovetski static struct regulator_init_data sdhi0_power_init_data = { 581d4c191dfSGuennadi Liakhovetski .constraints = { 582d4c191dfSGuennadi Liakhovetski .valid_ops_mask = REGULATOR_CHANGE_STATUS, 583d4c191dfSGuennadi Liakhovetski }, 584d4c191dfSGuennadi Liakhovetski .num_consumer_supplies = ARRAY_SIZE(sdhi0_power_consumers), 585d4c191dfSGuennadi Liakhovetski .consumer_supplies = sdhi0_power_consumers, 586d4c191dfSGuennadi Liakhovetski }; 587d4c191dfSGuennadi Liakhovetski 588d4c191dfSGuennadi Liakhovetski static struct fixed_voltage_config sdhi0_power_info = { 589d4c191dfSGuennadi Liakhovetski .supply_name = "CN11 SD/MMC Vdd", 590d4c191dfSGuennadi Liakhovetski .microvolts = 3300000, 591d4c191dfSGuennadi Liakhovetski .gpio = GPIO_PTB6, 592d4c191dfSGuennadi Liakhovetski .enable_high = 1, 593d4c191dfSGuennadi Liakhovetski .init_data = &sdhi0_power_init_data, 594d4c191dfSGuennadi Liakhovetski }; 595d4c191dfSGuennadi Liakhovetski 596d4c191dfSGuennadi Liakhovetski static struct platform_device sdhi0_power = { 597d4c191dfSGuennadi Liakhovetski .name = "reg-fixed-voltage", 598d4c191dfSGuennadi Liakhovetski .id = 1, 599d4c191dfSGuennadi Liakhovetski .dev = { 600d4c191dfSGuennadi Liakhovetski .platform_data = &sdhi0_power_info, 601d4c191dfSGuennadi Liakhovetski }, 602d4c191dfSGuennadi Liakhovetski }; 603d4c191dfSGuennadi Liakhovetski 60498779ad8SMagnus Damm static struct sh_mobile_sdhi_info sdhi0_info = { 605815f1995SGuennadi Liakhovetski .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, 606815f1995SGuennadi Liakhovetski .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, 6074eb80146SGuennadi Liakhovetski .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 6084eb80146SGuennadi Liakhovetski MMC_CAP_NEEDS_POLL, 609afa2c940SLaurent Pinchart .tmio_flags = TMIO_MMC_USE_GPIO_CD, 610afa2c940SLaurent Pinchart .cd_gpio = GPIO_PTY7, 61198779ad8SMagnus Damm }; 61298779ad8SMagnus Damm 61396987d96SKuninori Morimoto static struct resource sdhi0_resources[] = { 61496987d96SKuninori Morimoto [0] = { 61596987d96SKuninori Morimoto .name = "SDHI0", 61696987d96SKuninori Morimoto .start = 0x04ce0000, 617d80e9221SGuennadi Liakhovetski .end = 0x04ce00ff, 61896987d96SKuninori Morimoto .flags = IORESOURCE_MEM, 61996987d96SKuninori Morimoto }, 62096987d96SKuninori Morimoto [1] = { 6219307d115SPaul Mundt .start = evt2irq(0xe80), 62296987d96SKuninori Morimoto .flags = IORESOURCE_IRQ, 62396987d96SKuninori Morimoto }, 62496987d96SKuninori Morimoto }; 62596987d96SKuninori Morimoto 62696987d96SKuninori Morimoto static struct platform_device sdhi0_device = { 62796987d96SKuninori Morimoto .name = "sh_mobile_sdhi", 62896987d96SKuninori Morimoto .num_resources = ARRAY_SIZE(sdhi0_resources), 62996987d96SKuninori Morimoto .resource = sdhi0_resources, 63096987d96SKuninori Morimoto .id = 0, 63198779ad8SMagnus Damm .dev = { 63298779ad8SMagnus Damm .platform_data = &sdhi0_info, 63398779ad8SMagnus Damm }, 63496987d96SKuninori Morimoto }; 63596987d96SKuninori Morimoto 636d4c191dfSGuennadi Liakhovetski #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 637d4c191dfSGuennadi Liakhovetski /* SDHI1 */ 63898779ad8SMagnus Damm static struct sh_mobile_sdhi_info sdhi1_info = { 639815f1995SGuennadi Liakhovetski .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, 640815f1995SGuennadi Liakhovetski .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX, 6414eb80146SGuennadi Liakhovetski .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 6424eb80146SGuennadi Liakhovetski MMC_CAP_NEEDS_POLL, 643afa2c940SLaurent Pinchart .tmio_flags = TMIO_MMC_USE_GPIO_CD, 644afa2c940SLaurent Pinchart .cd_gpio = GPIO_PTW7, 64598779ad8SMagnus Damm }; 64698779ad8SMagnus Damm 64796987d96SKuninori Morimoto static struct resource sdhi1_resources[] = { 64896987d96SKuninori Morimoto [0] = { 64996987d96SKuninori Morimoto .name = "SDHI1", 65096987d96SKuninori Morimoto .start = 0x04cf0000, 651d80e9221SGuennadi Liakhovetski .end = 0x04cf00ff, 65296987d96SKuninori Morimoto .flags = IORESOURCE_MEM, 65396987d96SKuninori Morimoto }, 65496987d96SKuninori Morimoto [1] = { 6559307d115SPaul Mundt .start = evt2irq(0x4e0), 65696987d96SKuninori Morimoto .flags = IORESOURCE_IRQ, 65796987d96SKuninori Morimoto }, 65896987d96SKuninori Morimoto }; 65996987d96SKuninori Morimoto 66096987d96SKuninori Morimoto static struct platform_device sdhi1_device = { 66196987d96SKuninori Morimoto .name = "sh_mobile_sdhi", 66296987d96SKuninori Morimoto .num_resources = ARRAY_SIZE(sdhi1_resources), 66396987d96SKuninori Morimoto .resource = sdhi1_resources, 66496987d96SKuninori Morimoto .id = 1, 66598779ad8SMagnus Damm .dev = { 66698779ad8SMagnus Damm .platform_data = &sdhi1_info, 66798779ad8SMagnus Damm }, 66896987d96SKuninori Morimoto }; 6691238c684SYusuke Goda #endif /* CONFIG_MMC_SH_MMCIF */ 67096987d96SKuninori Morimoto 6711ce4da7aSMagnus Damm #else 6721ce4da7aSMagnus Damm 6739503e891SKuninori Morimoto /* MMC SPI */ 6741ce4da7aSMagnus Damm static void mmc_spi_setpower(struct device *dev, unsigned int maskval) 6751ce4da7aSMagnus Damm { 6761ce4da7aSMagnus Damm gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); 6771ce4da7aSMagnus Damm } 6781ce4da7aSMagnus Damm 6791ce4da7aSMagnus Damm static struct mmc_spi_platform_data mmc_spi_info = { 6801ce4da7aSMagnus Damm .caps = MMC_CAP_NEEDS_POLL, 681afa2c940SLaurent Pinchart .caps2 = MMC_CAP2_RO_ACTIVE_HIGH, 6821ce4da7aSMagnus Damm .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ 6831ce4da7aSMagnus Damm .setpower = mmc_spi_setpower, 684afa2c940SLaurent Pinchart .flags = MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO, 685afa2c940SLaurent Pinchart .cd_gpio = GPIO_PTY7, 686afa2c940SLaurent Pinchart .ro_gpio = GPIO_PTY6, 6871ce4da7aSMagnus Damm }; 6881ce4da7aSMagnus Damm 6891ce4da7aSMagnus Damm static struct spi_board_info spi_bus[] = { 6901ce4da7aSMagnus Damm { 6911ce4da7aSMagnus Damm .modalias = "mmc_spi", 6921ce4da7aSMagnus Damm .platform_data = &mmc_spi_info, 6931ce4da7aSMagnus Damm .max_speed_hz = 5000000, 6941ce4da7aSMagnus Damm .mode = SPI_MODE_0, 6951ce4da7aSMagnus Damm .controller_data = (void *) GPIO_PTM4, 6961ce4da7aSMagnus Damm }, 6971ce4da7aSMagnus Damm }; 6981ce4da7aSMagnus Damm 6999503e891SKuninori Morimoto /* MSIOF0 */ 7001ce4da7aSMagnus Damm static struct sh_msiof_spi_info msiof0_data = { 7011ce4da7aSMagnus Damm .num_chipselect = 1, 7021ce4da7aSMagnus Damm }; 7031ce4da7aSMagnus Damm 7041ce4da7aSMagnus Damm static struct resource msiof0_resources[] = { 7051ce4da7aSMagnus Damm [0] = { 7061ce4da7aSMagnus Damm .name = "MSIOF0", 7071ce4da7aSMagnus Damm .start = 0xa4c40000, 7081ce4da7aSMagnus Damm .end = 0xa4c40063, 7091ce4da7aSMagnus Damm .flags = IORESOURCE_MEM, 7101ce4da7aSMagnus Damm }, 7111ce4da7aSMagnus Damm [1] = { 7129307d115SPaul Mundt .start = evt2irq(0xc80), 7131ce4da7aSMagnus Damm .flags = IORESOURCE_IRQ, 7141ce4da7aSMagnus Damm }, 7151ce4da7aSMagnus Damm }; 7161ce4da7aSMagnus Damm 7171ce4da7aSMagnus Damm static struct platform_device msiof0_device = { 7181ce4da7aSMagnus Damm .name = "spi_sh_msiof", 7191ce4da7aSMagnus Damm .id = 0, /* MSIOF0 */ 7201ce4da7aSMagnus Damm .dev = { 7211ce4da7aSMagnus Damm .platform_data = &msiof0_data, 7221ce4da7aSMagnus Damm }, 7231ce4da7aSMagnus Damm .num_resources = ARRAY_SIZE(msiof0_resources), 7241ce4da7aSMagnus Damm .resource = msiof0_resources, 7251ce4da7aSMagnus Damm }; 7261ce4da7aSMagnus Damm 7271ce4da7aSMagnus Damm #endif 7281ce4da7aSMagnus Damm 7299aa25d64SKuninori Morimoto /* I2C Video/Camera */ 730207efd07SKuninori Morimoto static struct i2c_board_info i2c_camera[] = { 731207efd07SKuninori Morimoto { 732207efd07SKuninori Morimoto I2C_BOARD_INFO("tw9910", 0x45), 733207efd07SKuninori Morimoto }, 7349aa25d64SKuninori Morimoto { 7359aa25d64SKuninori Morimoto /* 1st camera */ 7369aa25d64SKuninori Morimoto I2C_BOARD_INFO("mt9t112", 0x3c), 7379aa25d64SKuninori Morimoto }, 7389aa25d64SKuninori Morimoto { 7399aa25d64SKuninori Morimoto /* 2nd camera */ 7409aa25d64SKuninori Morimoto I2C_BOARD_INFO("mt9t112", 0x3c), 7419aa25d64SKuninori Morimoto }, 742207efd07SKuninori Morimoto }; 743207efd07SKuninori Morimoto 744207efd07SKuninori Morimoto /* tw9910 */ 745207efd07SKuninori Morimoto static int tw9910_power(struct device *dev, int mode) 746207efd07SKuninori Morimoto { 747207efd07SKuninori Morimoto int val = mode ? 0 : 1; 748207efd07SKuninori Morimoto 749207efd07SKuninori Morimoto gpio_set_value(GPIO_PTU2, val); 750207efd07SKuninori Morimoto if (mode) 751207efd07SKuninori Morimoto mdelay(100); 752207efd07SKuninori Morimoto 753207efd07SKuninori Morimoto return 0; 754207efd07SKuninori Morimoto } 755207efd07SKuninori Morimoto 756207efd07SKuninori Morimoto static struct tw9910_video_info tw9910_info = { 757207efd07SKuninori Morimoto .buswidth = SOCAM_DATAWIDTH_8, 758207efd07SKuninori Morimoto .mpout = TW9910_MPO_FIELD, 759207efd07SKuninori Morimoto }; 760207efd07SKuninori Morimoto 761207efd07SKuninori Morimoto static struct soc_camera_link tw9910_link = { 762207efd07SKuninori Morimoto .i2c_adapter_id = 0, 763207efd07SKuninori Morimoto .bus_id = 1, 764207efd07SKuninori Morimoto .power = tw9910_power, 765207efd07SKuninori Morimoto .board_info = &i2c_camera[0], 766207efd07SKuninori Morimoto .priv = &tw9910_info, 767207efd07SKuninori Morimoto }; 768207efd07SKuninori Morimoto 7699aa25d64SKuninori Morimoto /* mt9t112 */ 7709aa25d64SKuninori Morimoto static int mt9t112_power1(struct device *dev, int mode) 7719aa25d64SKuninori Morimoto { 7729aa25d64SKuninori Morimoto gpio_set_value(GPIO_PTA3, mode); 7739aa25d64SKuninori Morimoto if (mode) 7749aa25d64SKuninori Morimoto mdelay(100); 7759aa25d64SKuninori Morimoto 7769aa25d64SKuninori Morimoto return 0; 7779aa25d64SKuninori Morimoto } 7789aa25d64SKuninori Morimoto 7799aa25d64SKuninori Morimoto static struct mt9t112_camera_info mt9t112_info1 = { 7809aa25d64SKuninori Morimoto .flags = MT9T112_FLAG_PCLK_RISING_EDGE | MT9T112_FLAG_DATAWIDTH_8, 7819aa25d64SKuninori Morimoto .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 7829aa25d64SKuninori Morimoto }; 7839aa25d64SKuninori Morimoto 7849aa25d64SKuninori Morimoto static struct soc_camera_link mt9t112_link1 = { 7859aa25d64SKuninori Morimoto .i2c_adapter_id = 0, 7869aa25d64SKuninori Morimoto .power = mt9t112_power1, 7879aa25d64SKuninori Morimoto .bus_id = 0, 7889aa25d64SKuninori Morimoto .board_info = &i2c_camera[1], 7899aa25d64SKuninori Morimoto .priv = &mt9t112_info1, 7909aa25d64SKuninori Morimoto }; 7919aa25d64SKuninori Morimoto 7929aa25d64SKuninori Morimoto static int mt9t112_power2(struct device *dev, int mode) 7939aa25d64SKuninori Morimoto { 7949aa25d64SKuninori Morimoto gpio_set_value(GPIO_PTA4, mode); 7959aa25d64SKuninori Morimoto if (mode) 7969aa25d64SKuninori Morimoto mdelay(100); 7979aa25d64SKuninori Morimoto 7989aa25d64SKuninori Morimoto return 0; 7999aa25d64SKuninori Morimoto } 8009aa25d64SKuninori Morimoto 8019aa25d64SKuninori Morimoto static struct mt9t112_camera_info mt9t112_info2 = { 8029aa25d64SKuninori Morimoto .flags = MT9T112_FLAG_PCLK_RISING_EDGE | MT9T112_FLAG_DATAWIDTH_8, 8039aa25d64SKuninori Morimoto .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 8049aa25d64SKuninori Morimoto }; 8059aa25d64SKuninori Morimoto 8069aa25d64SKuninori Morimoto static struct soc_camera_link mt9t112_link2 = { 8079aa25d64SKuninori Morimoto .i2c_adapter_id = 1, 8089aa25d64SKuninori Morimoto .power = mt9t112_power2, 8099aa25d64SKuninori Morimoto .bus_id = 1, 8109aa25d64SKuninori Morimoto .board_info = &i2c_camera[2], 8119aa25d64SKuninori Morimoto .priv = &mt9t112_info2, 8129aa25d64SKuninori Morimoto }; 813207efd07SKuninori Morimoto 814207efd07SKuninori Morimoto static struct platform_device camera_devices[] = { 815207efd07SKuninori Morimoto { 816207efd07SKuninori Morimoto .name = "soc-camera-pdrv", 817207efd07SKuninori Morimoto .id = 0, 818207efd07SKuninori Morimoto .dev = { 819207efd07SKuninori Morimoto .platform_data = &tw9910_link, 820207efd07SKuninori Morimoto }, 821207efd07SKuninori Morimoto }, 8229aa25d64SKuninori Morimoto { 8239aa25d64SKuninori Morimoto .name = "soc-camera-pdrv", 8249aa25d64SKuninori Morimoto .id = 1, 8259aa25d64SKuninori Morimoto .dev = { 8269aa25d64SKuninori Morimoto .platform_data = &mt9t112_link1, 8279aa25d64SKuninori Morimoto }, 8289aa25d64SKuninori Morimoto }, 8299aa25d64SKuninori Morimoto { 8309aa25d64SKuninori Morimoto .name = "soc-camera-pdrv", 8319aa25d64SKuninori Morimoto .id = 2, 8329aa25d64SKuninori Morimoto .dev = { 8339aa25d64SKuninori Morimoto .platform_data = &mt9t112_link2, 8349aa25d64SKuninori Morimoto }, 8359aa25d64SKuninori Morimoto }, 836207efd07SKuninori Morimoto }; 837207efd07SKuninori Morimoto 8381980fdc4SKuninori Morimoto /* FSI */ 8391980fdc4SKuninori Morimoto static struct resource fsi_resources[] = { 8401980fdc4SKuninori Morimoto [0] = { 8411980fdc4SKuninori Morimoto .name = "FSI", 8421980fdc4SKuninori Morimoto .start = 0xFE3C0000, 8431980fdc4SKuninori Morimoto .end = 0xFE3C021d, 8441980fdc4SKuninori Morimoto .flags = IORESOURCE_MEM, 8451980fdc4SKuninori Morimoto }, 8461980fdc4SKuninori Morimoto [1] = { 8479307d115SPaul Mundt .start = evt2irq(0xf80), 8481980fdc4SKuninori Morimoto .flags = IORESOURCE_IRQ, 8491980fdc4SKuninori Morimoto }, 8501980fdc4SKuninori Morimoto }; 8511980fdc4SKuninori Morimoto 8521980fdc4SKuninori Morimoto static struct platform_device fsi_device = { 8531980fdc4SKuninori Morimoto .name = "sh_fsi", 8541980fdc4SKuninori Morimoto .id = 0, 8551980fdc4SKuninori Morimoto .num_resources = ARRAY_SIZE(fsi_resources), 8561980fdc4SKuninori Morimoto .resource = fsi_resources, 8571980fdc4SKuninori Morimoto }; 8581980fdc4SKuninori Morimoto 859064bfadaSKuninori Morimoto static struct asoc_simple_card_info fsi_da7210_info = { 860064bfadaSKuninori Morimoto .name = "DA7210", 861064bfadaSKuninori Morimoto .card = "FSIB-DA7210", 862064bfadaSKuninori Morimoto .codec = "da7210.0-001a", 863064bfadaSKuninori Morimoto .platform = "sh_fsi.0", 864*c7a507eeSKuninori Morimoto .daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, 865a4a2992cSKuninori Morimoto .cpu_dai = { 866a4a2992cSKuninori Morimoto .name = "fsib-dai", 867a4a2992cSKuninori Morimoto }, 868a4a2992cSKuninori Morimoto .codec_dai = { 869a4a2992cSKuninori Morimoto .name = "da7210-hifi", 870a4a2992cSKuninori Morimoto }, 871064bfadaSKuninori Morimoto }; 872064bfadaSKuninori Morimoto 873064bfadaSKuninori Morimoto static struct platform_device fsi_da7210_device = { 874064bfadaSKuninori Morimoto .name = "asoc-simple-card", 875064bfadaSKuninori Morimoto .dev = { 876064bfadaSKuninori Morimoto .platform_data = &fsi_da7210_info, 877064bfadaSKuninori Morimoto }, 878064bfadaSKuninori Morimoto }; 879064bfadaSKuninori Morimoto 880064bfadaSKuninori Morimoto 88126365716SKuninori Morimoto /* IrDA */ 88226365716SKuninori Morimoto static struct resource irda_resources[] = { 88326365716SKuninori Morimoto [0] = { 88426365716SKuninori Morimoto .name = "IrDA", 88526365716SKuninori Morimoto .start = 0xA45D0000, 88626365716SKuninori Morimoto .end = 0xA45D0049, 88726365716SKuninori Morimoto .flags = IORESOURCE_MEM, 88826365716SKuninori Morimoto }, 88926365716SKuninori Morimoto [1] = { 8909307d115SPaul Mundt .start = evt2irq(0x480), 89126365716SKuninori Morimoto .flags = IORESOURCE_IRQ, 89226365716SKuninori Morimoto }, 89326365716SKuninori Morimoto }; 89426365716SKuninori Morimoto 89526365716SKuninori Morimoto static struct platform_device irda_device = { 89626365716SKuninori Morimoto .name = "sh_sir", 89726365716SKuninori Morimoto .num_resources = ARRAY_SIZE(irda_resources), 89826365716SKuninori Morimoto .resource = irda_resources, 89926365716SKuninori Morimoto }; 90026365716SKuninori Morimoto 901aee5ab0bSGuennadi Liakhovetski #include <media/ak881x.h> 902aee5ab0bSGuennadi Liakhovetski #include <media/sh_vou.h> 903aee5ab0bSGuennadi Liakhovetski 9043ce09334SKuninori Morimoto static struct ak881x_pdata ak881x_pdata = { 905aee5ab0bSGuennadi Liakhovetski .flags = AK881X_IF_MODE_SLAVE, 906aee5ab0bSGuennadi Liakhovetski }; 907aee5ab0bSGuennadi Liakhovetski 908aee5ab0bSGuennadi Liakhovetski static struct i2c_board_info ak8813 = { 909aee5ab0bSGuennadi Liakhovetski I2C_BOARD_INFO("ak8813", 0x20), 910aee5ab0bSGuennadi Liakhovetski .platform_data = &ak881x_pdata, 911aee5ab0bSGuennadi Liakhovetski }; 912aee5ab0bSGuennadi Liakhovetski 9133ce09334SKuninori Morimoto static struct sh_vou_pdata sh_vou_pdata = { 914aee5ab0bSGuennadi Liakhovetski .bus_fmt = SH_VOU_BUS_8BIT, 915aee5ab0bSGuennadi Liakhovetski .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 916aee5ab0bSGuennadi Liakhovetski .board_info = &ak8813, 917aee5ab0bSGuennadi Liakhovetski .i2c_adap = 0, 918aee5ab0bSGuennadi Liakhovetski }; 919aee5ab0bSGuennadi Liakhovetski 920aee5ab0bSGuennadi Liakhovetski static struct resource sh_vou_resources[] = { 921aee5ab0bSGuennadi Liakhovetski [0] = { 922aee5ab0bSGuennadi Liakhovetski .start = 0xfe960000, 923aee5ab0bSGuennadi Liakhovetski .end = 0xfe962043, 924aee5ab0bSGuennadi Liakhovetski .flags = IORESOURCE_MEM, 925aee5ab0bSGuennadi Liakhovetski }, 926aee5ab0bSGuennadi Liakhovetski [1] = { 9279307d115SPaul Mundt .start = evt2irq(0x8e0), 928aee5ab0bSGuennadi Liakhovetski .flags = IORESOURCE_IRQ, 929aee5ab0bSGuennadi Liakhovetski }, 930aee5ab0bSGuennadi Liakhovetski }; 931aee5ab0bSGuennadi Liakhovetski 932aee5ab0bSGuennadi Liakhovetski static struct platform_device vou_device = { 933aee5ab0bSGuennadi Liakhovetski .name = "sh-vou", 934aee5ab0bSGuennadi Liakhovetski .id = -1, 935aee5ab0bSGuennadi Liakhovetski .num_resources = ARRAY_SIZE(sh_vou_resources), 936aee5ab0bSGuennadi Liakhovetski .resource = sh_vou_resources, 937aee5ab0bSGuennadi Liakhovetski .dev = { 938aee5ab0bSGuennadi Liakhovetski .platform_data = &sh_vou_pdata, 939aee5ab0bSGuennadi Liakhovetski }, 940aee5ab0bSGuennadi Liakhovetski }; 941aee5ab0bSGuennadi Liakhovetski 9425744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 9431238c684SYusuke Goda /* SH_MMCIF */ 9441238c684SYusuke Goda static struct resource sh_mmcif_resources[] = { 9451238c684SYusuke Goda [0] = { 9461238c684SYusuke Goda .name = "SH_MMCIF", 9471238c684SYusuke Goda .start = 0xA4CA0000, 9481238c684SYusuke Goda .end = 0xA4CA00FF, 9491238c684SYusuke Goda .flags = IORESOURCE_MEM, 9501238c684SYusuke Goda }, 9511238c684SYusuke Goda [1] = { 9521238c684SYusuke Goda /* MMC2I */ 9539307d115SPaul Mundt .start = evt2irq(0x5a0), 9541238c684SYusuke Goda .flags = IORESOURCE_IRQ, 9551238c684SYusuke Goda }, 9561238c684SYusuke Goda [2] = { 9571238c684SYusuke Goda /* MMC3I */ 9589307d115SPaul Mundt .start = evt2irq(0x5c0), 9591238c684SYusuke Goda .flags = IORESOURCE_IRQ, 9601238c684SYusuke Goda }, 9611238c684SYusuke Goda }; 9621238c684SYusuke Goda 9633ce09334SKuninori Morimoto static struct sh_mmcif_plat_data sh_mmcif_plat = { 9641238c684SYusuke Goda .sup_pclk = 0, /* SH7724: Max Pclk/2 */ 9651238c684SYusuke Goda .caps = MMC_CAP_4_BIT_DATA | 9661238c684SYusuke Goda MMC_CAP_8_BIT_DATA | 9671238c684SYusuke Goda MMC_CAP_NEEDS_POLL, 9681238c684SYusuke Goda .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, 9691238c684SYusuke Goda }; 9701238c684SYusuke Goda 9711238c684SYusuke Goda static struct platform_device sh_mmcif_device = { 9721238c684SYusuke Goda .name = "sh_mmcif", 9731238c684SYusuke Goda .id = 0, 9741238c684SYusuke Goda .dev = { 9751238c684SYusuke Goda .platform_data = &sh_mmcif_plat, 9761238c684SYusuke Goda }, 9771238c684SYusuke Goda .num_resources = ARRAY_SIZE(sh_mmcif_resources), 9781238c684SYusuke Goda .resource = sh_mmcif_resources, 9791238c684SYusuke Goda }; 9801238c684SYusuke Goda #endif 9811238c684SYusuke Goda 9824138b740SKuninori Morimoto static struct platform_device *ecovec_devices[] __initdata = { 9834138b740SKuninori Morimoto &heartbeat_device, 9844138b740SKuninori Morimoto &nor_flash_device, 98535a35408SKuninori Morimoto &sh_eth_device, 986907050a3SKuninori Morimoto &usb0_host_device, 9873714a9a0SKuninori Morimoto &usb1_common_device, 988fb2e7394SKuninori Morimoto &usbhs_device, 989fa3ba51bSKuninori Morimoto &lcdc_device, 990fe79f919SLaurent Pinchart &gpio_backlight_device, 9912153ad32SKuninori Morimoto &ceu0_device, 9922153ad32SKuninori Morimoto &ceu1_device, 993e9103e74SKuninori Morimoto &keysc_device, 994d4c191dfSGuennadi Liakhovetski &cn12_power, 9955744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 996d4c191dfSGuennadi Liakhovetski &sdhi0_power, 99796987d96SKuninori Morimoto &sdhi0_device, 9985744c881SGuennadi Liakhovetski #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 99996987d96SKuninori Morimoto &sdhi1_device, 10001238c684SYusuke Goda #endif 10011ce4da7aSMagnus Damm #else 10021ce4da7aSMagnus Damm &msiof0_device, 10031ce4da7aSMagnus Damm #endif 1004207efd07SKuninori Morimoto &camera_devices[0], 10059aa25d64SKuninori Morimoto &camera_devices[1], 10069aa25d64SKuninori Morimoto &camera_devices[2], 10071980fdc4SKuninori Morimoto &fsi_device, 1008064bfadaSKuninori Morimoto &fsi_da7210_device, 100926365716SKuninori Morimoto &irda_device, 1010aee5ab0bSGuennadi Liakhovetski &vou_device, 10115744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 10121238c684SYusuke Goda &sh_mmcif_device, 10131238c684SYusuke Goda #endif 10144138b740SKuninori Morimoto }; 10154138b740SKuninori Morimoto 10166b3b5575SMagnus Damm #ifdef CONFIG_I2C 10174907d57fSKuninori Morimoto #define EEPROM_ADDR 0x50 10184907d57fSKuninori Morimoto static u8 mac_read(struct i2c_adapter *a, u8 command) 10194907d57fSKuninori Morimoto { 10204907d57fSKuninori Morimoto struct i2c_msg msg[2]; 10214907d57fSKuninori Morimoto u8 buf; 10224907d57fSKuninori Morimoto int ret; 10234907d57fSKuninori Morimoto 10244907d57fSKuninori Morimoto msg[0].addr = EEPROM_ADDR; 10254907d57fSKuninori Morimoto msg[0].flags = 0; 10264907d57fSKuninori Morimoto msg[0].len = 1; 10274907d57fSKuninori Morimoto msg[0].buf = &command; 10284907d57fSKuninori Morimoto 10294907d57fSKuninori Morimoto msg[1].addr = EEPROM_ADDR; 10304907d57fSKuninori Morimoto msg[1].flags = I2C_M_RD; 10314907d57fSKuninori Morimoto msg[1].len = 1; 10324907d57fSKuninori Morimoto msg[1].buf = &buf; 10334907d57fSKuninori Morimoto 10344907d57fSKuninori Morimoto ret = i2c_transfer(a, msg, 2); 10354907d57fSKuninori Morimoto if (ret < 0) { 10364907d57fSKuninori Morimoto printk(KERN_ERR "error %d\n", ret); 10374907d57fSKuninori Morimoto buf = 0xff; 10384907d57fSKuninori Morimoto } 10394907d57fSKuninori Morimoto 10404907d57fSKuninori Morimoto return buf; 10414907d57fSKuninori Morimoto } 10424907d57fSKuninori Morimoto 1043376abbb4SMagnus Damm static void __init sh_eth_init(struct sh_eth_plat_data *pd) 10444907d57fSKuninori Morimoto { 10454907d57fSKuninori Morimoto struct i2c_adapter *a = i2c_get_adapter(1); 10464907d57fSKuninori Morimoto int i; 10474907d57fSKuninori Morimoto 10484907d57fSKuninori Morimoto if (!a) { 10494907d57fSKuninori Morimoto pr_err("can not get I2C 1\n"); 10504907d57fSKuninori Morimoto return; 10514907d57fSKuninori Morimoto } 10524907d57fSKuninori Morimoto 105325985edcSLucas De Marchi /* read MAC address from EEPROM */ 1054376abbb4SMagnus Damm for (i = 0; i < sizeof(pd->mac_addr); i++) { 1055376abbb4SMagnus Damm pd->mac_addr[i] = mac_read(a, 0x10 + i); 10564907d57fSKuninori Morimoto msleep(10); 10574907d57fSKuninori Morimoto } 1058b230eb32SKuninori Morimoto 1059b230eb32SKuninori Morimoto i2c_put_adapter(a); 10604907d57fSKuninori Morimoto } 10616b3b5575SMagnus Damm #else 10626b3b5575SMagnus Damm static void __init sh_eth_init(struct sh_eth_plat_data *pd) 10636b3b5575SMagnus Damm { 10646b3b5575SMagnus Damm pr_err("unable to read sh_eth MAC address\n"); 10656b3b5575SMagnus Damm } 10666b3b5575SMagnus Damm #endif 10674907d57fSKuninori Morimoto 1068fa3ba51bSKuninori Morimoto #define PORT_HIZA 0xA4050158 1069ea15edb2SKuninori Morimoto #define IODRIVEA 0xA405018A 1070eb0cd9e8SMagnus Damm 1071eb0cd9e8SMagnus Damm extern char ecovec24_sdram_enter_start; 1072eb0cd9e8SMagnus Damm extern char ecovec24_sdram_enter_end; 1073eb0cd9e8SMagnus Damm extern char ecovec24_sdram_leave_start; 1074eb0cd9e8SMagnus Damm extern char ecovec24_sdram_leave_end; 1075eb0cd9e8SMagnus Damm 10764907d57fSKuninori Morimoto static int __init arch_setup(void) 10774138b740SKuninori Morimoto { 10781980fdc4SKuninori Morimoto struct clk *clk; 10794eb80146SGuennadi Liakhovetski bool cn12_enabled = false; 10801980fdc4SKuninori Morimoto 1081eb0cd9e8SMagnus Damm /* register board specific self-refresh code */ 10822839bd61SMagnus Damm sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 10832839bd61SMagnus Damm SUSP_SH_RSTANDBY, 1084eb0cd9e8SMagnus Damm &ecovec24_sdram_enter_start, 1085eb0cd9e8SMagnus Damm &ecovec24_sdram_enter_end, 1086eb0cd9e8SMagnus Damm &ecovec24_sdram_leave_start, 1087eb0cd9e8SMagnus Damm &ecovec24_sdram_leave_end); 1088eb0cd9e8SMagnus Damm 1089f78bab30SMagnus Damm /* enable STATUS0, STATUS2 and PDSTATUS */ 1090f78bab30SMagnus Damm gpio_request(GPIO_FN_STATUS0, NULL); 1091f78bab30SMagnus Damm gpio_request(GPIO_FN_STATUS2, NULL); 1092f78bab30SMagnus Damm gpio_request(GPIO_FN_PDSTATUS, NULL); 1093f78bab30SMagnus Damm 10944138b740SKuninori Morimoto /* enable SCIFA0 */ 10954138b740SKuninori Morimoto gpio_request(GPIO_FN_SCIF0_TXD, NULL); 10964138b740SKuninori Morimoto gpio_request(GPIO_FN_SCIF0_RXD, NULL); 10974138b740SKuninori Morimoto 10984138b740SKuninori Morimoto /* enable debug LED */ 10994138b740SKuninori Morimoto gpio_request(GPIO_PTG0, NULL); 11004138b740SKuninori Morimoto gpio_request(GPIO_PTG1, NULL); 11014138b740SKuninori Morimoto gpio_request(GPIO_PTG2, NULL); 11024138b740SKuninori Morimoto gpio_request(GPIO_PTG3, NULL); 1103b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG0, 0); 1104b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG1, 0); 1105b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG2, 0); 1106b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG3, 0); 11079d56dd3bSPaul Mundt __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); 11084138b740SKuninori Morimoto 110935a35408SKuninori Morimoto /* enable SH-Eth */ 111035a35408SKuninori Morimoto gpio_request(GPIO_PTA1, NULL); 111135a35408SKuninori Morimoto gpio_direction_output(GPIO_PTA1, 1); 111235a35408SKuninori Morimoto mdelay(20); 111335a35408SKuninori Morimoto 111435a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RXD0, NULL); 111535a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RXD1, NULL); 111635a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TXD0, NULL); 111735a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TXD1, NULL); 111835a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 111935a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TX_EN, NULL); 112035a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RX_ER, NULL); 112135a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 112235a35408SKuninori Morimoto gpio_request(GPIO_FN_MDIO, NULL); 112335a35408SKuninori Morimoto gpio_request(GPIO_FN_MDC, NULL); 112435a35408SKuninori Morimoto gpio_request(GPIO_FN_LNKSTA, NULL); 112535a35408SKuninori Morimoto 1126907050a3SKuninori Morimoto /* enable USB */ 11279d56dd3bSPaul Mundt __raw_writew(0x0000, 0xA4D80000); 11289d56dd3bSPaul Mundt __raw_writew(0x0000, 0xA4D90000); 1129907050a3SKuninori Morimoto gpio_request(GPIO_PTB3, NULL); 1130907050a3SKuninori Morimoto gpio_request(GPIO_PTB4, NULL); 1131907050a3SKuninori Morimoto gpio_request(GPIO_PTB5, NULL); 1132907050a3SKuninori Morimoto gpio_direction_input(GPIO_PTB3); 1133907050a3SKuninori Morimoto gpio_direction_output(GPIO_PTB4, 0); 1134907050a3SKuninori Morimoto gpio_direction_output(GPIO_PTB5, 0); 11359d56dd3bSPaul Mundt __raw_writew(0x0600, 0xa40501d4); 11369d56dd3bSPaul Mundt __raw_writew(0x0600, 0xa4050192); 1137907050a3SKuninori Morimoto 11383714a9a0SKuninori Morimoto if (gpio_get_value(GPIO_PTB3)) { 11393714a9a0SKuninori Morimoto printk(KERN_INFO "USB1 function is selected\n"); 11403714a9a0SKuninori Morimoto usb1_common_device.name = "r8a66597_udc"; 11413714a9a0SKuninori Morimoto } else { 11423714a9a0SKuninori Morimoto printk(KERN_INFO "USB1 host is selected\n"); 11433714a9a0SKuninori Morimoto usb1_common_device.name = "r8a66597_hcd"; 11443714a9a0SKuninori Morimoto } 11453714a9a0SKuninori Morimoto 1146fa3ba51bSKuninori Morimoto /* enable LCDC */ 1147fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD23, NULL); 1148fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD22, NULL); 1149fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD21, NULL); 1150fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD20, NULL); 1151fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD19, NULL); 1152fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD18, NULL); 1153fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD17, NULL); 1154fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD16, NULL); 1155fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD15, NULL); 1156fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD14, NULL); 1157fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD13, NULL); 1158fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD12, NULL); 1159fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD11, NULL); 1160fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD10, NULL); 1161fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD9, NULL); 1162fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD8, NULL); 1163fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD7, NULL); 1164fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD6, NULL); 1165fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD5, NULL); 1166fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD4, NULL); 1167fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD3, NULL); 1168fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD2, NULL); 1169fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD1, NULL); 1170fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD0, NULL); 1171fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDISP, NULL); 1172fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDHSYN, NULL); 1173fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDCK, NULL); 1174fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDVSYN, NULL); 1175fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDON, NULL); 1176fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDLCLK, NULL); 11779d56dd3bSPaul Mundt __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 1178fa3ba51bSKuninori Morimoto 1179fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTE6, NULL); 1180fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTU1, NULL); 1181fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTA2, NULL); 1182fa3ba51bSKuninori Morimoto gpio_direction_input(GPIO_PTE6); 1183fa3ba51bSKuninori Morimoto gpio_direction_output(GPIO_PTU1, 0); 1184fa3ba51bSKuninori Morimoto gpio_direction_output(GPIO_PTA2, 0); 1185fa3ba51bSKuninori Morimoto 118682b33221SKuninori Morimoto /* I/O buffer drive ability is high */ 11879d56dd3bSPaul Mundt __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); 1188ea15edb2SKuninori Morimoto 1189fa3ba51bSKuninori Morimoto if (gpio_get_value(GPIO_PTE6)) { 1190fa3ba51bSKuninori Morimoto /* DVI */ 1191fa3ba51bSKuninori Morimoto lcdc_info.clock_source = LCDC_CLK_EXTERNAL; 119244432407SGuennadi Liakhovetski lcdc_info.ch[0].clock_divider = 1; 119393ff2598SLaurent Pinchart lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes; 119493ff2598SLaurent Pinchart lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes); 1195fa3ba51bSKuninori Morimoto 1196fe79f919SLaurent Pinchart /* No backlight */ 1197fe79f919SLaurent Pinchart gpio_backlight_data.fbdev = NULL; 1198fe79f919SLaurent Pinchart 1199fa3ba51bSKuninori Morimoto gpio_set_value(GPIO_PTA2, 1); 1200fa3ba51bSKuninori Morimoto gpio_set_value(GPIO_PTU1, 1); 1201fa3ba51bSKuninori Morimoto } else { 1202fa3ba51bSKuninori Morimoto /* Panel */ 1203ea15edb2SKuninori Morimoto lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; 120444432407SGuennadi Liakhovetski lcdc_info.ch[0].clock_divider = 2; 120593ff2598SLaurent Pinchart lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes; 120693ff2598SLaurent Pinchart lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes); 1207ea15edb2SKuninori Morimoto 1208ea15edb2SKuninori Morimoto /* FIXME 1209ea15edb2SKuninori Morimoto * 1210ea15edb2SKuninori Morimoto * LCDDON control is needed for Panel, 1211ea15edb2SKuninori Morimoto * but current sh_mobile_lcdc driver doesn't control it. 1212ea15edb2SKuninori Morimoto * It is temporary correspondence 1213ea15edb2SKuninori Morimoto */ 1214ea15edb2SKuninori Morimoto gpio_request(GPIO_PTF4, NULL); 1215ea15edb2SKuninori Morimoto gpio_direction_output(GPIO_PTF4, 1); 12168810e055SKuninori Morimoto 12178810e055SKuninori Morimoto /* enable TouchScreen */ 12188810e055SKuninori Morimoto i2c_register_board_info(0, &ts_i2c_clients, 1); 1219fcb8918fSThomas Gleixner irq_set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); 1220fa3ba51bSKuninori Morimoto } 1221fa3ba51bSKuninori Morimoto 12222153ad32SKuninori Morimoto /* enable CEU0 */ 12232153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D15, NULL); 12242153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D14, NULL); 12252153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D13, NULL); 12262153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D12, NULL); 12272153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D11, NULL); 12282153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D10, NULL); 12292153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D9, NULL); 12302153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D8, NULL); 12312153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D7, NULL); 12322153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D6, NULL); 12332153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D5, NULL); 12342153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D4, NULL); 12352153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D3, NULL); 12362153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D2, NULL); 12372153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D1, NULL); 12382153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D0, NULL); 12392153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_VD, NULL); 12402153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_CLK, NULL); 12412153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_FLD, NULL); 12422153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_HD, NULL); 12432153ad32SKuninori Morimoto platform_resource_setup_memory(&ceu0_device, "ceu0", 4 << 20); 12442153ad32SKuninori Morimoto 12452153ad32SKuninori Morimoto /* enable CEU1 */ 12462153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D7, NULL); 12472153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D6, NULL); 12482153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D5, NULL); 12492153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D4, NULL); 12502153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D3, NULL); 12512153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D2, NULL); 12522153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D1, NULL); 12532153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D0, NULL); 12542153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_FLD, NULL); 12552153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_HD, NULL); 12562153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_VD, NULL); 12572153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_CLK, NULL); 12582153ad32SKuninori Morimoto platform_resource_setup_memory(&ceu1_device, "ceu1", 4 << 20); 12592153ad32SKuninori Morimoto 1260e9103e74SKuninori Morimoto /* enable KEYSC */ 1261e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 1262e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 1263e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT3, NULL); 1264e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT2, NULL); 1265e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT1, NULL); 1266e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT0, NULL); 1267e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYIN0, NULL); 1268e9103e74SKuninori Morimoto 1269064a16dcSKuninori Morimoto /* enable user debug switch */ 1270064a16dcSKuninori Morimoto gpio_request(GPIO_PTR0, NULL); 1271064a16dcSKuninori Morimoto gpio_request(GPIO_PTR4, NULL); 1272064a16dcSKuninori Morimoto gpio_request(GPIO_PTR5, NULL); 1273064a16dcSKuninori Morimoto gpio_request(GPIO_PTR6, NULL); 1274064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR0); 1275064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR4); 1276064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR5); 1277064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR6); 1278064a16dcSKuninori Morimoto 12794eb80146SGuennadi Liakhovetski /* SD-card slot CN11 */ 12805744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 12811ce4da7aSMagnus Damm /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ 128296987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0WP, NULL); 128396987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0CMD, NULL); 128496987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0CLK, NULL); 128596987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D3, NULL); 128696987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D2, NULL); 128796987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D1, NULL); 128896987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D0, NULL); 12891ce4da7aSMagnus Damm #else 12901ce4da7aSMagnus Damm /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ 12911ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_TXD, NULL); 12921ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_RXD, NULL); 12931ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_TSCK, NULL); 12941ce4da7aSMagnus Damm gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */ 12951ce4da7aSMagnus Damm gpio_direction_output(GPIO_PTM4, 1); /* active low CS */ 12961ce4da7aSMagnus Damm gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ 12971ce4da7aSMagnus Damm gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ 12981ce4da7aSMagnus Damm 12991ce4da7aSMagnus Damm spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); 13001ce4da7aSMagnus Damm #endif 130196987d96SKuninori Morimoto 13024eb80146SGuennadi Liakhovetski /* MMC/SD-card slot CN12 */ 13034eb80146SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 13044eb80146SGuennadi Liakhovetski /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */ 13054eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D7, NULL); 13064eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D6, NULL); 13074eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D5, NULL); 13084eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D4, NULL); 13094eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D3, NULL); 13104eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D2, NULL); 13114eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D1, NULL); 13124eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D0, NULL); 13134eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_CLK, NULL); 13144eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_CMD, NULL); 13154eb80146SGuennadi Liakhovetski 13164eb80146SGuennadi Liakhovetski cn12_enabled = true; 13174eb80146SGuennadi Liakhovetski #elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 13184eb80146SGuennadi Liakhovetski /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */ 13194eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1WP, NULL); 13204eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1CMD, NULL); 13214eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1CLK, NULL); 13224eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D3, NULL); 13234eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D2, NULL); 13244eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D1, NULL); 13254eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D0, NULL); 13264eb80146SGuennadi Liakhovetski 13274eb80146SGuennadi Liakhovetski cn12_enabled = true; 13284eb80146SGuennadi Liakhovetski #endif 13294eb80146SGuennadi Liakhovetski 13304eb80146SGuennadi Liakhovetski if (cn12_enabled) 13314eb80146SGuennadi Liakhovetski /* I/O buffer drive ability is high for CN12 */ 13324eb80146SGuennadi Liakhovetski __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000, 13334eb80146SGuennadi Liakhovetski IODRIVEA); 13344eb80146SGuennadi Liakhovetski 1335207efd07SKuninori Morimoto /* enable Video */ 1336207efd07SKuninori Morimoto gpio_request(GPIO_PTU2, NULL); 1337207efd07SKuninori Morimoto gpio_direction_output(GPIO_PTU2, 1); 1338207efd07SKuninori Morimoto 13399aa25d64SKuninori Morimoto /* enable Camera */ 13409aa25d64SKuninori Morimoto gpio_request(GPIO_PTA3, NULL); 13419aa25d64SKuninori Morimoto gpio_request(GPIO_PTA4, NULL); 13429aa25d64SKuninori Morimoto gpio_direction_output(GPIO_PTA3, 0); 13439aa25d64SKuninori Morimoto gpio_direction_output(GPIO_PTA4, 0); 13449aa25d64SKuninori Morimoto 13451980fdc4SKuninori Morimoto /* enable FSI */ 13461980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIMCKB, NULL); 13471980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBSD, NULL); 13481980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBSD, NULL); 13491980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBBCK, NULL); 13501980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBLRCK, NULL); 13511980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBBCK, NULL); 13521980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBLRCK, NULL); 13531980fdc4SKuninori Morimoto gpio_request(GPIO_FN_CLKAUDIOBO, NULL); 13541980fdc4SKuninori Morimoto 135516afc9fbSKuninori Morimoto /* set SPU2 clock to 83.4 MHz */ 135616afc9fbSKuninori Morimoto clk = clk_get(NULL, "spu_clk"); 135756ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 135816afc9fbSKuninori Morimoto clk_set_rate(clk, clk_round_rate(clk, 83333333)); 135916afc9fbSKuninori Morimoto clk_put(clk); 136010305853SKuninori Morimoto } 136116afc9fbSKuninori Morimoto 13621980fdc4SKuninori Morimoto /* change parent of FSI B */ 13631980fdc4SKuninori Morimoto clk = clk_get(NULL, "fsib_clk"); 136456ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 13654bd5d259SKuninori Morimoto /* 48kHz dummy clock was used to make sure 1/1 divide */ 13664bd5d259SKuninori Morimoto clk_set_rate(&sh7724_fsimckb_clk, 48000); 13674bd5d259SKuninori Morimoto clk_set_parent(clk, &sh7724_fsimckb_clk); 13684bd5d259SKuninori Morimoto clk_set_rate(clk, 48000); 13691980fdc4SKuninori Morimoto clk_put(clk); 137010305853SKuninori Morimoto } 13711980fdc4SKuninori Morimoto 13721980fdc4SKuninori Morimoto gpio_request(GPIO_PTU0, NULL); 13731980fdc4SKuninori Morimoto gpio_direction_output(GPIO_PTU0, 0); 13741980fdc4SKuninori Morimoto mdelay(20); 13751980fdc4SKuninori Morimoto 1376ea440783SNISHIMOTO Hiroki /* enable motion sensor */ 1377ea440783SNISHIMOTO Hiroki gpio_request(GPIO_FN_INTC_IRQ1, NULL); 1378ea440783SNISHIMOTO Hiroki gpio_direction_input(GPIO_FN_INTC_IRQ1); 1379ea440783SNISHIMOTO Hiroki 13806f26d19fSMagnus Damm /* set VPU clock to 166 MHz */ 13816f26d19fSMagnus Damm clk = clk_get(NULL, "vpu_clk"); 138256ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 13836f26d19fSMagnus Damm clk_set_rate(clk, clk_round_rate(clk, 166000000)); 13846f26d19fSMagnus Damm clk_put(clk); 138510305853SKuninori Morimoto } 13866f26d19fSMagnus Damm 138726365716SKuninori Morimoto /* enable IrDA */ 138826365716SKuninori Morimoto gpio_request(GPIO_FN_IRDA_OUT, NULL); 138926365716SKuninori Morimoto gpio_request(GPIO_FN_IRDA_IN, NULL); 139026365716SKuninori Morimoto gpio_request(GPIO_PTU5, NULL); 139126365716SKuninori Morimoto gpio_direction_output(GPIO_PTU5, 0); 139226365716SKuninori Morimoto 1393125ecce6SKuninori Morimoto /* enable I2C device */ 13941980fdc4SKuninori Morimoto i2c_register_board_info(0, i2c0_devices, 13951980fdc4SKuninori Morimoto ARRAY_SIZE(i2c0_devices)); 13961980fdc4SKuninori Morimoto 1397125ecce6SKuninori Morimoto i2c_register_board_info(1, i2c1_devices, 1398125ecce6SKuninori Morimoto ARRAY_SIZE(i2c1_devices)); 1399125ecce6SKuninori Morimoto 140092359a70SGuennadi Liakhovetski #if defined(CONFIG_VIDEO_SH_VOU) || defined(CONFIG_VIDEO_SH_VOU_MODULE) 1401aee5ab0bSGuennadi Liakhovetski /* VOU */ 1402aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D15, NULL); 1403aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D14, NULL); 1404aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D13, NULL); 1405aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D12, NULL); 1406aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D11, NULL); 1407aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D10, NULL); 1408aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D9, NULL); 1409aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D8, NULL); 1410aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_CLKI, NULL); 1411aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_CLK, NULL); 1412aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_VSYNC, NULL); 1413aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_HSYNC, NULL); 1414aee5ab0bSGuennadi Liakhovetski 1415aee5ab0bSGuennadi Liakhovetski /* AK8813 power / reset sequence */ 1416aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_PTG4, NULL); 1417aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_PTU3, NULL); 1418aee5ab0bSGuennadi Liakhovetski /* Reset */ 1419aee5ab0bSGuennadi Liakhovetski gpio_direction_output(GPIO_PTG4, 0); 1420aee5ab0bSGuennadi Liakhovetski /* Power down */ 1421aee5ab0bSGuennadi Liakhovetski gpio_direction_output(GPIO_PTU3, 1); 1422aee5ab0bSGuennadi Liakhovetski 1423aee5ab0bSGuennadi Liakhovetski udelay(10); 1424aee5ab0bSGuennadi Liakhovetski 1425aee5ab0bSGuennadi Liakhovetski /* Power up, reset */ 1426aee5ab0bSGuennadi Liakhovetski gpio_set_value(GPIO_PTU3, 0); 1427aee5ab0bSGuennadi Liakhovetski 1428aee5ab0bSGuennadi Liakhovetski udelay(10); 1429aee5ab0bSGuennadi Liakhovetski 1430aee5ab0bSGuennadi Liakhovetski /* Remove reset */ 1431aee5ab0bSGuennadi Liakhovetski gpio_set_value(GPIO_PTG4, 1); 143292359a70SGuennadi Liakhovetski #endif 1433aee5ab0bSGuennadi Liakhovetski 14344138b740SKuninori Morimoto return platform_add_devices(ecovec_devices, 14354138b740SKuninori Morimoto ARRAY_SIZE(ecovec_devices)); 14364138b740SKuninori Morimoto } 14374907d57fSKuninori Morimoto arch_initcall(arch_setup); 14384907d57fSKuninori Morimoto 14394907d57fSKuninori Morimoto static int __init devices_setup(void) 14404907d57fSKuninori Morimoto { 1441376abbb4SMagnus Damm sh_eth_init(&sh_eth_plat); 14424907d57fSKuninori Morimoto return 0; 14434907d57fSKuninori Morimoto } 14444907d57fSKuninori Morimoto device_initcall(devices_setup); 14454907d57fSKuninori Morimoto 14464138b740SKuninori Morimoto static struct sh_machine_vector mv_ecovec __initmv = { 14474138b740SKuninori Morimoto .mv_name = "R0P7724 (EcoVec)", 14484138b740SKuninori Morimoto }; 1449