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> 184138b740SKuninori Morimoto #include <linux/gpio.h> 194138b740SKuninori Morimoto #include <linux/interrupt.h> 2035a35408SKuninori Morimoto #include <linux/io.h> 2135a35408SKuninori Morimoto #include <linux/delay.h> 22d4c191dfSGuennadi Liakhovetski #include <linux/regulator/fixed.h> 23d4c191dfSGuennadi Liakhovetski #include <linux/regulator/machine.h> 24907050a3SKuninori Morimoto #include <linux/usb/r8a66597.h> 25fb2e7394SKuninori Morimoto #include <linux/usb/renesas_usbhs.h> 264907d57fSKuninori Morimoto #include <linux/i2c.h> 278810e055SKuninori Morimoto #include <linux/i2c/tsc2007.h> 281ce4da7aSMagnus Damm #include <linux/spi/spi.h> 291ce4da7aSMagnus Damm #include <linux/spi/sh_msiof.h> 301ce4da7aSMagnus Damm #include <linux/spi/mmc_spi.h> 31e9103e74SKuninori Morimoto #include <linux/input.h> 32fc1d003dSMagnus Damm #include <linux/input/sh_keysc.h> 33cf8e56bfSYoshihiro Shimoda #include <linux/sh_eth.h> 349307d115SPaul Mundt #include <linux/sh_intc.h> 35a1ad8033SGuennadi Liakhovetski #include <linux/videodev2.h> 36fa3ba51bSKuninori Morimoto #include <video/sh_mobile_lcdc.h> 371980fdc4SKuninori Morimoto #include <sound/sh_fsi.h> 38064bfadaSKuninori Morimoto #include <sound/simple_card.h> 392153ad32SKuninori Morimoto #include <media/sh_mobile_ceu.h> 40a1ad8033SGuennadi Liakhovetski #include <media/soc_camera.h> 41207efd07SKuninori Morimoto #include <media/tw9910.h> 429aa25d64SKuninori Morimoto #include <media/mt9t112.h> 434138b740SKuninori Morimoto #include <asm/heartbeat.h> 44a991801aSKuninori Morimoto #include <asm/clock.h> 45eb0cd9e8SMagnus Damm #include <asm/suspend.h> 464138b740SKuninori Morimoto #include <cpu/sh7724.h> 474138b740SKuninori Morimoto 484138b740SKuninori Morimoto /* 49b7056bc1SKuninori Morimoto * Address Interface BusWidth 50b7056bc1SKuninori Morimoto *----------------------------------------- 51b7056bc1SKuninori Morimoto * 0x0000_0000 uboot 16bit 52b7056bc1SKuninori Morimoto * 0x0004_0000 Linux romImage 16bit 53b7056bc1SKuninori Morimoto * 0x0014_0000 MTD for Linux 16bit 54b7056bc1SKuninori Morimoto * 0x0400_0000 Internal I/O 16/32bit 55b7056bc1SKuninori Morimoto * 0x0800_0000 DRAM 32bit 56b7056bc1SKuninori Morimoto * 0x1800_0000 MFI 16bit 574138b740SKuninori Morimoto */ 584138b740SKuninori Morimoto 599c472c4dSKuninori Morimoto /* SWITCH 609c472c4dSKuninori Morimoto *------------------------------ 619c472c4dSKuninori Morimoto * DS2[1] = FlashROM write protect ON : write protect 629c472c4dSKuninori Morimoto * OFF : No write protect 639c472c4dSKuninori Morimoto * DS2[2] = RMII / TS, SCIF ON : RMII 649c472c4dSKuninori Morimoto * OFF : TS, SCIF3 659c472c4dSKuninori Morimoto * DS2[3] = Camera / Video ON : Camera 669c472c4dSKuninori Morimoto * OFF : NTSC/PAL (IN) 679c472c4dSKuninori Morimoto * DS2[5] = NTSC_OUT Clock ON : On board OSC 689c472c4dSKuninori Morimoto * OFF : SH7724 DV_CLK 699c472c4dSKuninori Morimoto * DS2[6-7] = MMC / SD ON-OFF : SD 709c472c4dSKuninori Morimoto * OFF-ON : MMC 719c472c4dSKuninori Morimoto */ 729c472c4dSKuninori Morimoto 73*035688d9SKuninori Morimoto /* 74*035688d9SKuninori Morimoto * FSI - DA7210 75*035688d9SKuninori Morimoto * 76*035688d9SKuninori Morimoto * it needs amixer settings for playing 77*035688d9SKuninori Morimoto * 78*035688d9SKuninori Morimoto * amixer set 'HeadPhone' 80 79*035688d9SKuninori Morimoto * amixer set 'Out Mixer Left DAC Left' on 80*035688d9SKuninori Morimoto * amixer set 'Out Mixer Right DAC Right' on 81*035688d9SKuninori Morimoto */ 82*035688d9SKuninori Morimoto 834138b740SKuninori Morimoto /* Heartbeat */ 844138b740SKuninori Morimoto static unsigned char led_pos[] = { 0, 1, 2, 3 }; 85a09d2831SPaul Mundt 864138b740SKuninori Morimoto static struct heartbeat_data heartbeat_data = { 874138b740SKuninori Morimoto .nr_bits = 4, 884138b740SKuninori Morimoto .bit_pos = led_pos, 894138b740SKuninori Morimoto }; 904138b740SKuninori Morimoto 91a09d2831SPaul Mundt static struct resource heartbeat_resource = { 924138b740SKuninori Morimoto .start = 0xA405012C, /* PTG */ 934138b740SKuninori Morimoto .end = 0xA405012E - 1, 94a09d2831SPaul Mundt .flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT, 954138b740SKuninori Morimoto }; 964138b740SKuninori Morimoto 974138b740SKuninori Morimoto static struct platform_device heartbeat_device = { 984138b740SKuninori Morimoto .name = "heartbeat", 994138b740SKuninori Morimoto .id = -1, 1004138b740SKuninori Morimoto .dev = { 1014138b740SKuninori Morimoto .platform_data = &heartbeat_data, 1024138b740SKuninori Morimoto }, 103a09d2831SPaul Mundt .num_resources = 1, 104a09d2831SPaul Mundt .resource = &heartbeat_resource, 1054138b740SKuninori Morimoto }; 1064138b740SKuninori Morimoto 1074138b740SKuninori Morimoto /* MTD */ 1084138b740SKuninori Morimoto static struct mtd_partition nor_flash_partitions[] = { 1094138b740SKuninori Morimoto { 110b7056bc1SKuninori Morimoto .name = "boot loader", 1114138b740SKuninori Morimoto .offset = 0, 112b7056bc1SKuninori Morimoto .size = (5 * 1024 * 1024), 113d5ce010cSKuninori Morimoto .mask_flags = MTD_WRITEABLE, /* force read-only */ 1144138b740SKuninori Morimoto }, { 1154138b740SKuninori Morimoto .name = "free-area", 1164138b740SKuninori Morimoto .offset = MTDPART_OFS_APPEND, 1174138b740SKuninori Morimoto .size = MTDPART_SIZ_FULL, 1184138b740SKuninori Morimoto }, 1194138b740SKuninori Morimoto }; 1204138b740SKuninori Morimoto 1214138b740SKuninori Morimoto static struct physmap_flash_data nor_flash_data = { 1224138b740SKuninori Morimoto .width = 2, 1234138b740SKuninori Morimoto .parts = nor_flash_partitions, 1244138b740SKuninori Morimoto .nr_parts = ARRAY_SIZE(nor_flash_partitions), 1254138b740SKuninori Morimoto }; 1264138b740SKuninori Morimoto 1274138b740SKuninori Morimoto static struct resource nor_flash_resources[] = { 1284138b740SKuninori Morimoto [0] = { 1294138b740SKuninori Morimoto .name = "NOR Flash", 1304138b740SKuninori Morimoto .start = 0x00000000, 1314138b740SKuninori Morimoto .end = 0x03ffffff, 1324138b740SKuninori Morimoto .flags = IORESOURCE_MEM, 1334138b740SKuninori Morimoto } 1344138b740SKuninori Morimoto }; 1354138b740SKuninori Morimoto 1364138b740SKuninori Morimoto static struct platform_device nor_flash_device = { 1374138b740SKuninori Morimoto .name = "physmap-flash", 1384138b740SKuninori Morimoto .resource = nor_flash_resources, 1394138b740SKuninori Morimoto .num_resources = ARRAY_SIZE(nor_flash_resources), 1404138b740SKuninori Morimoto .dev = { 1414138b740SKuninori Morimoto .platform_data = &nor_flash_data, 1424138b740SKuninori Morimoto }, 1434138b740SKuninori Morimoto }; 1444138b740SKuninori Morimoto 14535a35408SKuninori Morimoto /* SH Eth */ 14635a35408SKuninori Morimoto #define SH_ETH_ADDR (0xA4600000) 14735a35408SKuninori Morimoto static struct resource sh_eth_resources[] = { 14835a35408SKuninori Morimoto [0] = { 14935a35408SKuninori Morimoto .start = SH_ETH_ADDR, 15035a35408SKuninori Morimoto .end = SH_ETH_ADDR + 0x1FC, 15135a35408SKuninori Morimoto .flags = IORESOURCE_MEM, 15235a35408SKuninori Morimoto }, 15335a35408SKuninori Morimoto [1] = { 1549307d115SPaul Mundt .start = evt2irq(0xd60), 15535a35408SKuninori Morimoto .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, 15635a35408SKuninori Morimoto }, 15735a35408SKuninori Morimoto }; 15835a35408SKuninori Morimoto 1593ce09334SKuninori Morimoto static struct sh_eth_plat_data sh_eth_plat = { 16035a35408SKuninori Morimoto .phy = 0x1f, /* SMSC LAN8700 */ 16135a35408SKuninori Morimoto .edmac_endian = EDMAC_LITTLE_ENDIAN, 1629055f895SYoshihiro Shimoda .register_type = SH_ETH_REG_FAST_SH4, 1639055f895SYoshihiro Shimoda .phy_interface = PHY_INTERFACE_MODE_MII, 164acf3cc28SKuninori Morimoto .ether_link_active_low = 1 16535a35408SKuninori Morimoto }; 16635a35408SKuninori Morimoto 16735a35408SKuninori Morimoto static struct platform_device sh_eth_device = { 16835a35408SKuninori Morimoto .name = "sh-eth", 16935a35408SKuninori Morimoto .id = 0, 17035a35408SKuninori Morimoto .dev = { 17135a35408SKuninori Morimoto .platform_data = &sh_eth_plat, 17235a35408SKuninori Morimoto }, 17335a35408SKuninori Morimoto .num_resources = ARRAY_SIZE(sh_eth_resources), 17435a35408SKuninori Morimoto .resource = sh_eth_resources, 17535a35408SKuninori Morimoto }; 17635a35408SKuninori Morimoto 177907050a3SKuninori Morimoto /* USB0 host */ 1783ce09334SKuninori Morimoto static void usb0_port_power(int port, int power) 179907050a3SKuninori Morimoto { 180907050a3SKuninori Morimoto gpio_set_value(GPIO_PTB4, power); 181907050a3SKuninori Morimoto } 182907050a3SKuninori Morimoto 183907050a3SKuninori Morimoto static struct r8a66597_platdata usb0_host_data = { 184907050a3SKuninori Morimoto .on_chip = 1, 185907050a3SKuninori Morimoto .port_power = usb0_port_power, 186907050a3SKuninori Morimoto }; 187907050a3SKuninori Morimoto 188907050a3SKuninori Morimoto static struct resource usb0_host_resources[] = { 189907050a3SKuninori Morimoto [0] = { 190907050a3SKuninori Morimoto .start = 0xa4d80000, 191907050a3SKuninori Morimoto .end = 0xa4d80124 - 1, 192907050a3SKuninori Morimoto .flags = IORESOURCE_MEM, 193907050a3SKuninori Morimoto }, 194907050a3SKuninori Morimoto [1] = { 1959307d115SPaul Mundt .start = evt2irq(0xa20), 1969307d115SPaul Mundt .end = evt2irq(0xa20), 197907050a3SKuninori Morimoto .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 198907050a3SKuninori Morimoto }, 199907050a3SKuninori Morimoto }; 200907050a3SKuninori Morimoto 201907050a3SKuninori Morimoto static struct platform_device usb0_host_device = { 202907050a3SKuninori Morimoto .name = "r8a66597_hcd", 203907050a3SKuninori Morimoto .id = 0, 204907050a3SKuninori Morimoto .dev = { 205907050a3SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 206907050a3SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 207907050a3SKuninori Morimoto .platform_data = &usb0_host_data, 208907050a3SKuninori Morimoto }, 209907050a3SKuninori Morimoto .num_resources = ARRAY_SIZE(usb0_host_resources), 210907050a3SKuninori Morimoto .resource = usb0_host_resources, 211907050a3SKuninori Morimoto }; 212907050a3SKuninori Morimoto 2133714a9a0SKuninori Morimoto /* USB1 host/function */ 2143ce09334SKuninori Morimoto static void usb1_port_power(int port, int power) 215907050a3SKuninori Morimoto { 216907050a3SKuninori Morimoto gpio_set_value(GPIO_PTB5, power); 217907050a3SKuninori Morimoto } 218907050a3SKuninori Morimoto 2193714a9a0SKuninori Morimoto static struct r8a66597_platdata usb1_common_data = { 220907050a3SKuninori Morimoto .on_chip = 1, 221907050a3SKuninori Morimoto .port_power = usb1_port_power, 222907050a3SKuninori Morimoto }; 223907050a3SKuninori Morimoto 2243714a9a0SKuninori Morimoto static struct resource usb1_common_resources[] = { 225907050a3SKuninori Morimoto [0] = { 226907050a3SKuninori Morimoto .start = 0xa4d90000, 227907050a3SKuninori Morimoto .end = 0xa4d90124 - 1, 228907050a3SKuninori Morimoto .flags = IORESOURCE_MEM, 229907050a3SKuninori Morimoto }, 230907050a3SKuninori Morimoto [1] = { 2319307d115SPaul Mundt .start = evt2irq(0xa40), 2329307d115SPaul Mundt .end = evt2irq(0xa40), 233907050a3SKuninori Morimoto .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, 234907050a3SKuninori Morimoto }, 235907050a3SKuninori Morimoto }; 236907050a3SKuninori Morimoto 2373714a9a0SKuninori Morimoto static struct platform_device usb1_common_device = { 2383714a9a0SKuninori Morimoto /* .name will be added in arch_setup */ 239907050a3SKuninori Morimoto .id = 1, 240907050a3SKuninori Morimoto .dev = { 241907050a3SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 242907050a3SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 2433714a9a0SKuninori Morimoto .platform_data = &usb1_common_data, 244907050a3SKuninori Morimoto }, 2453714a9a0SKuninori Morimoto .num_resources = ARRAY_SIZE(usb1_common_resources), 2463714a9a0SKuninori Morimoto .resource = usb1_common_resources, 247907050a3SKuninori Morimoto }; 248907050a3SKuninori Morimoto 249fb2e7394SKuninori Morimoto /* 250fb2e7394SKuninori Morimoto * USBHS 251fb2e7394SKuninori Morimoto */ 252fb2e7394SKuninori Morimoto static int usbhs_get_id(struct platform_device *pdev) 253fb2e7394SKuninori Morimoto { 254fb2e7394SKuninori Morimoto return gpio_get_value(GPIO_PTB3); 255fb2e7394SKuninori Morimoto } 256fb2e7394SKuninori Morimoto 2571ca8fe38SKuninori Morimoto static void usbhs_phy_reset(struct platform_device *pdev) 2581ca8fe38SKuninori Morimoto { 2591ca8fe38SKuninori Morimoto /* enable vbus if HOST */ 2601ca8fe38SKuninori Morimoto if (!gpio_get_value(GPIO_PTB3)) 2611ca8fe38SKuninori Morimoto gpio_set_value(GPIO_PTB5, 1); 2621ca8fe38SKuninori Morimoto } 2631ca8fe38SKuninori Morimoto 264fb2e7394SKuninori Morimoto static struct renesas_usbhs_platform_info usbhs_info = { 265fb2e7394SKuninori Morimoto .platform_callback = { 266fb2e7394SKuninori Morimoto .get_id = usbhs_get_id, 2671ca8fe38SKuninori Morimoto .phy_reset = usbhs_phy_reset, 268fb2e7394SKuninori Morimoto }, 269fb2e7394SKuninori Morimoto .driver_param = { 270fb2e7394SKuninori Morimoto .buswait_bwait = 4, 271fb2e7394SKuninori Morimoto .detection_delay = 5, 2729f0fa799SKuninori Morimoto .d0_tx_id = SHDMA_SLAVE_USB1D0_TX, 2739f0fa799SKuninori Morimoto .d0_rx_id = SHDMA_SLAVE_USB1D0_RX, 2749f0fa799SKuninori Morimoto .d1_tx_id = SHDMA_SLAVE_USB1D1_TX, 2759f0fa799SKuninori Morimoto .d1_rx_id = SHDMA_SLAVE_USB1D1_RX, 276fb2e7394SKuninori Morimoto }, 277fb2e7394SKuninori Morimoto }; 278fb2e7394SKuninori Morimoto 279fb2e7394SKuninori Morimoto static struct resource usbhs_resources[] = { 280fb2e7394SKuninori Morimoto [0] = { 281fb2e7394SKuninori Morimoto .start = 0xa4d90000, 282fb2e7394SKuninori Morimoto .end = 0xa4d90124 - 1, 283fb2e7394SKuninori Morimoto .flags = IORESOURCE_MEM, 284fb2e7394SKuninori Morimoto }, 285fb2e7394SKuninori Morimoto [1] = { 2869307d115SPaul Mundt .start = evt2irq(0xa40), 2879307d115SPaul Mundt .end = evt2irq(0xa40), 288fb2e7394SKuninori Morimoto .flags = IORESOURCE_IRQ, 289fb2e7394SKuninori Morimoto }, 290fb2e7394SKuninori Morimoto }; 291fb2e7394SKuninori Morimoto 292fb2e7394SKuninori Morimoto static struct platform_device usbhs_device = { 293fb2e7394SKuninori Morimoto .name = "renesas_usbhs", 294fb2e7394SKuninori Morimoto .id = 1, 295fb2e7394SKuninori Morimoto .dev = { 296fb2e7394SKuninori Morimoto .dma_mask = NULL, /* not use dma */ 297fb2e7394SKuninori Morimoto .coherent_dma_mask = 0xffffffff, 298fb2e7394SKuninori Morimoto .platform_data = &usbhs_info, 299fb2e7394SKuninori Morimoto }, 300fb2e7394SKuninori Morimoto .num_resources = ARRAY_SIZE(usbhs_resources), 301fb2e7394SKuninori Morimoto .resource = usbhs_resources, 302fb2e7394SKuninori Morimoto }; 303fb2e7394SKuninori Morimoto 304fa3ba51bSKuninori Morimoto /* LCDC */ 305e04008ebSJesper Juhl static const struct fb_videomode ecovec_lcd_modes[] = { 30644432407SGuennadi Liakhovetski { 30744432407SGuennadi Liakhovetski .name = "Panel", 30844432407SGuennadi Liakhovetski .xres = 800, 30944432407SGuennadi Liakhovetski .yres = 480, 31044432407SGuennadi Liakhovetski .left_margin = 220, 31144432407SGuennadi Liakhovetski .right_margin = 110, 31244432407SGuennadi Liakhovetski .hsync_len = 70, 31344432407SGuennadi Liakhovetski .upper_margin = 20, 31444432407SGuennadi Liakhovetski .lower_margin = 5, 31544432407SGuennadi Liakhovetski .vsync_len = 5, 31644432407SGuennadi Liakhovetski .sync = 0, /* hsync and vsync are active low */ 31744432407SGuennadi Liakhovetski }, 31844432407SGuennadi Liakhovetski }; 31944432407SGuennadi Liakhovetski 320e04008ebSJesper Juhl static const struct fb_videomode ecovec_dvi_modes[] = { 32144432407SGuennadi Liakhovetski { 32244432407SGuennadi Liakhovetski .name = "DVI", 32344432407SGuennadi Liakhovetski .xres = 1280, 32444432407SGuennadi Liakhovetski .yres = 720, 32544432407SGuennadi Liakhovetski .left_margin = 220, 32644432407SGuennadi Liakhovetski .right_margin = 110, 32744432407SGuennadi Liakhovetski .hsync_len = 40, 32844432407SGuennadi Liakhovetski .upper_margin = 20, 32944432407SGuennadi Liakhovetski .lower_margin = 5, 33044432407SGuennadi Liakhovetski .vsync_len = 5, 33144432407SGuennadi Liakhovetski .sync = 0, /* hsync and vsync are active low */ 33244432407SGuennadi Liakhovetski }, 33344432407SGuennadi Liakhovetski }; 33444432407SGuennadi Liakhovetski 335018882aaSLaurent Pinchart static int ecovec24_set_brightness(int brightness) 3360839d687SAlexandre Courbot { 3370839d687SAlexandre Courbot gpio_set_value(GPIO_PTR1, brightness); 3380839d687SAlexandre Courbot 3390839d687SAlexandre Courbot return 0; 3400839d687SAlexandre Courbot } 3410839d687SAlexandre Courbot 342fa3ba51bSKuninori Morimoto static struct sh_mobile_lcdc_info lcdc_info = { 343fa3ba51bSKuninori Morimoto .ch[0] = { 344fa3ba51bSKuninori Morimoto .interface_type = RGB18, 345fa3ba51bSKuninori Morimoto .chan = LCDC_CHAN_MAINLCD, 346edd153a3SLaurent Pinchart .fourcc = V4L2_PIX_FMT_RGB565, 347afaad83bSLaurent Pinchart .panel_cfg = { /* 7.0 inch */ 348fa3ba51bSKuninori Morimoto .width = 152, 349fa3ba51bSKuninori Morimoto .height = 91, 350fa3ba51bSKuninori Morimoto }, 3510839d687SAlexandre Courbot .bl_info = { 3520839d687SAlexandre Courbot .name = "sh_mobile_lcdc_bl", 3530839d687SAlexandre Courbot .max_brightness = 1, 35443059b0fSLaurent Pinchart .set_brightness = ecovec24_set_brightness, 355fa3ba51bSKuninori Morimoto }, 356fa3ba51bSKuninori Morimoto } 357fa3ba51bSKuninori Morimoto }; 358fa3ba51bSKuninori Morimoto 359fa3ba51bSKuninori Morimoto static struct resource lcdc_resources[] = { 360fa3ba51bSKuninori Morimoto [0] = { 361fa3ba51bSKuninori Morimoto .name = "LCDC", 362fa3ba51bSKuninori Morimoto .start = 0xfe940000, 363a6f15adeSPhil Edworthy .end = 0xfe942fff, 364fa3ba51bSKuninori Morimoto .flags = IORESOURCE_MEM, 365fa3ba51bSKuninori Morimoto }, 366fa3ba51bSKuninori Morimoto [1] = { 3679307d115SPaul Mundt .start = evt2irq(0xf40), 368fa3ba51bSKuninori Morimoto .flags = IORESOURCE_IRQ, 369fa3ba51bSKuninori Morimoto }, 370fa3ba51bSKuninori Morimoto }; 371fa3ba51bSKuninori Morimoto 372fa3ba51bSKuninori Morimoto static struct platform_device lcdc_device = { 373fa3ba51bSKuninori Morimoto .name = "sh_mobile_lcdc_fb", 374fa3ba51bSKuninori Morimoto .num_resources = ARRAY_SIZE(lcdc_resources), 375fa3ba51bSKuninori Morimoto .resource = lcdc_resources, 376fa3ba51bSKuninori Morimoto .dev = { 377fa3ba51bSKuninori Morimoto .platform_data = &lcdc_info, 378fa3ba51bSKuninori Morimoto }, 379fa3ba51bSKuninori Morimoto }; 380fa3ba51bSKuninori Morimoto 3812153ad32SKuninori Morimoto /* CEU0 */ 3822153ad32SKuninori Morimoto static struct sh_mobile_ceu_info sh_mobile_ceu0_info = { 3832153ad32SKuninori Morimoto .flags = SH_CEU_FLAG_USE_8BIT_BUS, 3842153ad32SKuninori Morimoto }; 3852153ad32SKuninori Morimoto 3862153ad32SKuninori Morimoto static struct resource ceu0_resources[] = { 3872153ad32SKuninori Morimoto [0] = { 3882153ad32SKuninori Morimoto .name = "CEU0", 3892153ad32SKuninori Morimoto .start = 0xfe910000, 3902153ad32SKuninori Morimoto .end = 0xfe91009f, 3912153ad32SKuninori Morimoto .flags = IORESOURCE_MEM, 3922153ad32SKuninori Morimoto }, 3932153ad32SKuninori Morimoto [1] = { 3949307d115SPaul Mundt .start = evt2irq(0x880), 3952153ad32SKuninori Morimoto .flags = IORESOURCE_IRQ, 3962153ad32SKuninori Morimoto }, 3972153ad32SKuninori Morimoto [2] = { 3982153ad32SKuninori Morimoto /* place holder for contiguous memory */ 3992153ad32SKuninori Morimoto }, 4002153ad32SKuninori Morimoto }; 4012153ad32SKuninori Morimoto 4022153ad32SKuninori Morimoto static struct platform_device ceu0_device = { 4032153ad32SKuninori Morimoto .name = "sh_mobile_ceu", 4042153ad32SKuninori Morimoto .id = 0, /* "ceu0" clock */ 4052153ad32SKuninori Morimoto .num_resources = ARRAY_SIZE(ceu0_resources), 4062153ad32SKuninori Morimoto .resource = ceu0_resources, 4072153ad32SKuninori Morimoto .dev = { 4082153ad32SKuninori Morimoto .platform_data = &sh_mobile_ceu0_info, 4092153ad32SKuninori Morimoto }, 4102153ad32SKuninori Morimoto }; 4112153ad32SKuninori Morimoto 4122153ad32SKuninori Morimoto /* CEU1 */ 4132153ad32SKuninori Morimoto static struct sh_mobile_ceu_info sh_mobile_ceu1_info = { 4142153ad32SKuninori Morimoto .flags = SH_CEU_FLAG_USE_8BIT_BUS, 4152153ad32SKuninori Morimoto }; 4162153ad32SKuninori Morimoto 4172153ad32SKuninori Morimoto static struct resource ceu1_resources[] = { 4182153ad32SKuninori Morimoto [0] = { 4192153ad32SKuninori Morimoto .name = "CEU1", 4202153ad32SKuninori Morimoto .start = 0xfe914000, 4212153ad32SKuninori Morimoto .end = 0xfe91409f, 4222153ad32SKuninori Morimoto .flags = IORESOURCE_MEM, 4232153ad32SKuninori Morimoto }, 4242153ad32SKuninori Morimoto [1] = { 4259307d115SPaul Mundt .start = evt2irq(0x9e0), 4262153ad32SKuninori Morimoto .flags = IORESOURCE_IRQ, 4272153ad32SKuninori Morimoto }, 4282153ad32SKuninori Morimoto [2] = { 4292153ad32SKuninori Morimoto /* place holder for contiguous memory */ 4302153ad32SKuninori Morimoto }, 4312153ad32SKuninori Morimoto }; 4322153ad32SKuninori Morimoto 4332153ad32SKuninori Morimoto static struct platform_device ceu1_device = { 4342153ad32SKuninori Morimoto .name = "sh_mobile_ceu", 4352153ad32SKuninori Morimoto .id = 1, /* "ceu1" clock */ 4362153ad32SKuninori Morimoto .num_resources = ARRAY_SIZE(ceu1_resources), 4372153ad32SKuninori Morimoto .resource = ceu1_resources, 4382153ad32SKuninori Morimoto .dev = { 4392153ad32SKuninori Morimoto .platform_data = &sh_mobile_ceu1_info, 4402153ad32SKuninori Morimoto }, 4412153ad32SKuninori Morimoto }; 4422153ad32SKuninori Morimoto 443125ecce6SKuninori Morimoto /* I2C device */ 4441980fdc4SKuninori Morimoto static struct i2c_board_info i2c0_devices[] = { 4451980fdc4SKuninori Morimoto { 4461980fdc4SKuninori Morimoto I2C_BOARD_INFO("da7210", 0x1a), 4471980fdc4SKuninori Morimoto }, 4481980fdc4SKuninori Morimoto }; 4491980fdc4SKuninori Morimoto 450125ecce6SKuninori Morimoto static struct i2c_board_info i2c1_devices[] = { 451125ecce6SKuninori Morimoto { 452125ecce6SKuninori Morimoto I2C_BOARD_INFO("r2025sd", 0x32), 453125ecce6SKuninori Morimoto }, 454ea440783SNISHIMOTO Hiroki { 455ea440783SNISHIMOTO Hiroki I2C_BOARD_INFO("lis3lv02d", 0x1c), 4569307d115SPaul Mundt .irq = evt2irq(0x620), 457ea440783SNISHIMOTO Hiroki } 458125ecce6SKuninori Morimoto }; 459125ecce6SKuninori Morimoto 460e9103e74SKuninori Morimoto /* KEYSC */ 461e9103e74SKuninori Morimoto static struct sh_keysc_info keysc_info = { 462e9103e74SKuninori Morimoto .mode = SH_KEYSC_MODE_1, 463e9103e74SKuninori Morimoto .scan_timing = 3, 464e9103e74SKuninori Morimoto .delay = 50, 465e9103e74SKuninori Morimoto .kycr2_delay = 100, 466e9103e74SKuninori Morimoto .keycodes = { KEY_1, 0, 0, 0, 0, 467e9103e74SKuninori Morimoto KEY_2, 0, 0, 0, 0, 468e9103e74SKuninori Morimoto KEY_3, 0, 0, 0, 0, 469e9103e74SKuninori Morimoto KEY_4, 0, 0, 0, 0, 470e9103e74SKuninori Morimoto KEY_5, 0, 0, 0, 0, 471e9103e74SKuninori Morimoto KEY_6, 0, 0, 0, 0, }, 472e9103e74SKuninori Morimoto }; 473e9103e74SKuninori Morimoto 474e9103e74SKuninori Morimoto static struct resource keysc_resources[] = { 475e9103e74SKuninori Morimoto [0] = { 476e9103e74SKuninori Morimoto .name = "KEYSC", 477e9103e74SKuninori Morimoto .start = 0x044b0000, 478e9103e74SKuninori Morimoto .end = 0x044b000f, 479e9103e74SKuninori Morimoto .flags = IORESOURCE_MEM, 480e9103e74SKuninori Morimoto }, 481e9103e74SKuninori Morimoto [1] = { 4829307d115SPaul Mundt .start = evt2irq(0xbe0), 483e9103e74SKuninori Morimoto .flags = IORESOURCE_IRQ, 484e9103e74SKuninori Morimoto }, 485e9103e74SKuninori Morimoto }; 486e9103e74SKuninori Morimoto 487e9103e74SKuninori Morimoto static struct platform_device keysc_device = { 488e9103e74SKuninori Morimoto .name = "sh_keysc", 489e9103e74SKuninori Morimoto .id = 0, /* keysc0 clock */ 490e9103e74SKuninori Morimoto .num_resources = ARRAY_SIZE(keysc_resources), 491e9103e74SKuninori Morimoto .resource = keysc_resources, 492e9103e74SKuninori Morimoto .dev = { 493e9103e74SKuninori Morimoto .platform_data = &keysc_info, 494e9103e74SKuninori Morimoto }, 495e9103e74SKuninori Morimoto }; 496e9103e74SKuninori Morimoto 4978810e055SKuninori Morimoto /* TouchScreen */ 4989307d115SPaul Mundt #define IRQ0 evt2irq(0x600) 4999307d115SPaul Mundt 5005d75b3a2SPaul Mundt static int ts_get_pendown_state(void) 5015d75b3a2SPaul Mundt { 5025d75b3a2SPaul Mundt int val = 0; 5035d75b3a2SPaul Mundt gpio_free(GPIO_FN_INTC_IRQ0); 5045d75b3a2SPaul Mundt gpio_request(GPIO_PTZ0, NULL); 5055d75b3a2SPaul Mundt gpio_direction_input(GPIO_PTZ0); 5065d75b3a2SPaul Mundt 5075d75b3a2SPaul Mundt val = gpio_get_value(GPIO_PTZ0); 5085d75b3a2SPaul Mundt 5095d75b3a2SPaul Mundt gpio_free(GPIO_PTZ0); 5105d75b3a2SPaul Mundt gpio_request(GPIO_FN_INTC_IRQ0, NULL); 5115d75b3a2SPaul Mundt 5125d75b3a2SPaul Mundt return val ? 0 : 1; 5135d75b3a2SPaul Mundt } 5145d75b3a2SPaul Mundt 5155d75b3a2SPaul Mundt static int ts_init(void) 5165d75b3a2SPaul Mundt { 5175d75b3a2SPaul Mundt gpio_request(GPIO_FN_INTC_IRQ0, NULL); 5185d75b3a2SPaul Mundt return 0; 5195d75b3a2SPaul Mundt } 5205d75b3a2SPaul Mundt 5213ce09334SKuninori Morimoto static struct tsc2007_platform_data tsc2007_info = { 5228810e055SKuninori Morimoto .model = 2007, 5235d75b3a2SPaul Mundt .x_plate_ohms = 180, 5245d75b3a2SPaul Mundt .get_pendown_state = ts_get_pendown_state, 5255d75b3a2SPaul Mundt .init_platform_hw = ts_init, 5268810e055SKuninori Morimoto }; 5278810e055SKuninori Morimoto 5288810e055SKuninori Morimoto static struct i2c_board_info ts_i2c_clients = { 5298810e055SKuninori Morimoto I2C_BOARD_INFO("tsc2007", 0x48), 5308810e055SKuninori Morimoto .type = "tsc2007", 5318810e055SKuninori Morimoto .platform_data = &tsc2007_info, 5328810e055SKuninori Morimoto .irq = IRQ0, 5338810e055SKuninori Morimoto }; 5348810e055SKuninori Morimoto 535d4c191dfSGuennadi Liakhovetski static struct regulator_consumer_supply cn12_power_consumers[] = 536d4c191dfSGuennadi Liakhovetski { 537d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"), 538d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"), 539d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"), 540d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"), 541d4c191dfSGuennadi Liakhovetski }; 542d4c191dfSGuennadi Liakhovetski 543d4c191dfSGuennadi Liakhovetski static struct regulator_init_data cn12_power_init_data = { 544d4c191dfSGuennadi Liakhovetski .constraints = { 545d4c191dfSGuennadi Liakhovetski .valid_ops_mask = REGULATOR_CHANGE_STATUS, 546d4c191dfSGuennadi Liakhovetski }, 547d4c191dfSGuennadi Liakhovetski .num_consumer_supplies = ARRAY_SIZE(cn12_power_consumers), 548d4c191dfSGuennadi Liakhovetski .consumer_supplies = cn12_power_consumers, 549d4c191dfSGuennadi Liakhovetski }; 550d4c191dfSGuennadi Liakhovetski 551d4c191dfSGuennadi Liakhovetski static struct fixed_voltage_config cn12_power_info = { 552d4c191dfSGuennadi Liakhovetski .supply_name = "CN12 SD/MMC Vdd", 553d4c191dfSGuennadi Liakhovetski .microvolts = 3300000, 554d4c191dfSGuennadi Liakhovetski .gpio = GPIO_PTB7, 555d4c191dfSGuennadi Liakhovetski .enable_high = 1, 556d4c191dfSGuennadi Liakhovetski .init_data = &cn12_power_init_data, 557d4c191dfSGuennadi Liakhovetski }; 558d4c191dfSGuennadi Liakhovetski 559d4c191dfSGuennadi Liakhovetski static struct platform_device cn12_power = { 560d4c191dfSGuennadi Liakhovetski .name = "reg-fixed-voltage", 561d4c191dfSGuennadi Liakhovetski .id = 0, 562d4c191dfSGuennadi Liakhovetski .dev = { 563d4c191dfSGuennadi Liakhovetski .platform_data = &cn12_power_info, 564d4c191dfSGuennadi Liakhovetski }, 565d4c191dfSGuennadi Liakhovetski }; 566d4c191dfSGuennadi Liakhovetski 5675744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 5681238c684SYusuke Goda /* SDHI0 */ 569d4c191dfSGuennadi Liakhovetski static struct regulator_consumer_supply sdhi0_power_consumers[] = 570d4c191dfSGuennadi Liakhovetski { 571d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"), 572d4c191dfSGuennadi Liakhovetski REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"), 573d4c191dfSGuennadi Liakhovetski }; 574d4c191dfSGuennadi Liakhovetski 575d4c191dfSGuennadi Liakhovetski static struct regulator_init_data sdhi0_power_init_data = { 576d4c191dfSGuennadi Liakhovetski .constraints = { 577d4c191dfSGuennadi Liakhovetski .valid_ops_mask = REGULATOR_CHANGE_STATUS, 578d4c191dfSGuennadi Liakhovetski }, 579d4c191dfSGuennadi Liakhovetski .num_consumer_supplies = ARRAY_SIZE(sdhi0_power_consumers), 580d4c191dfSGuennadi Liakhovetski .consumer_supplies = sdhi0_power_consumers, 581d4c191dfSGuennadi Liakhovetski }; 582d4c191dfSGuennadi Liakhovetski 583d4c191dfSGuennadi Liakhovetski static struct fixed_voltage_config sdhi0_power_info = { 584d4c191dfSGuennadi Liakhovetski .supply_name = "CN11 SD/MMC Vdd", 585d4c191dfSGuennadi Liakhovetski .microvolts = 3300000, 586d4c191dfSGuennadi Liakhovetski .gpio = GPIO_PTB6, 587d4c191dfSGuennadi Liakhovetski .enable_high = 1, 588d4c191dfSGuennadi Liakhovetski .init_data = &sdhi0_power_init_data, 589d4c191dfSGuennadi Liakhovetski }; 590d4c191dfSGuennadi Liakhovetski 591d4c191dfSGuennadi Liakhovetski static struct platform_device sdhi0_power = { 592d4c191dfSGuennadi Liakhovetski .name = "reg-fixed-voltage", 593d4c191dfSGuennadi Liakhovetski .id = 1, 594d4c191dfSGuennadi Liakhovetski .dev = { 595d4c191dfSGuennadi Liakhovetski .platform_data = &sdhi0_power_info, 596d4c191dfSGuennadi Liakhovetski }, 597d4c191dfSGuennadi Liakhovetski }; 598d4c191dfSGuennadi Liakhovetski 59998779ad8SMagnus Damm static void sdhi0_set_pwr(struct platform_device *pdev, int state) 60098779ad8SMagnus Damm { 601d4c191dfSGuennadi Liakhovetski static int power_gpio = -EINVAL; 602d4c191dfSGuennadi Liakhovetski 603d4c191dfSGuennadi Liakhovetski if (power_gpio < 0) { 604d4c191dfSGuennadi Liakhovetski int ret = gpio_request(GPIO_PTB6, NULL); 605d4c191dfSGuennadi Liakhovetski if (!ret) { 606d4c191dfSGuennadi Liakhovetski power_gpio = GPIO_PTB6; 607d4c191dfSGuennadi Liakhovetski gpio_direction_output(power_gpio, 0); 608d4c191dfSGuennadi Liakhovetski } 609d4c191dfSGuennadi Liakhovetski } 610d4c191dfSGuennadi Liakhovetski 611d4c191dfSGuennadi Liakhovetski /* 612d4c191dfSGuennadi Liakhovetski * Toggle the GPIO regardless, whether we managed to grab it above or 613d4c191dfSGuennadi Liakhovetski * the fixed regulator driver did. 614d4c191dfSGuennadi Liakhovetski */ 61598779ad8SMagnus Damm gpio_set_value(GPIO_PTB6, state); 61698779ad8SMagnus Damm } 61798779ad8SMagnus Damm 6184eb80146SGuennadi Liakhovetski static int sdhi0_get_cd(struct platform_device *pdev) 6194eb80146SGuennadi Liakhovetski { 6204eb80146SGuennadi Liakhovetski return !gpio_get_value(GPIO_PTY7); 6214eb80146SGuennadi Liakhovetski } 6224eb80146SGuennadi Liakhovetski 62398779ad8SMagnus Damm static struct sh_mobile_sdhi_info sdhi0_info = { 624815f1995SGuennadi Liakhovetski .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, 625815f1995SGuennadi Liakhovetski .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, 62698779ad8SMagnus Damm .set_pwr = sdhi0_set_pwr, 6274eb80146SGuennadi Liakhovetski .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 6284eb80146SGuennadi Liakhovetski MMC_CAP_NEEDS_POLL, 6294eb80146SGuennadi Liakhovetski .get_cd = sdhi0_get_cd, 63098779ad8SMagnus Damm }; 63198779ad8SMagnus Damm 63296987d96SKuninori Morimoto static struct resource sdhi0_resources[] = { 63396987d96SKuninori Morimoto [0] = { 63496987d96SKuninori Morimoto .name = "SDHI0", 63596987d96SKuninori Morimoto .start = 0x04ce0000, 636d80e9221SGuennadi Liakhovetski .end = 0x04ce00ff, 63796987d96SKuninori Morimoto .flags = IORESOURCE_MEM, 63896987d96SKuninori Morimoto }, 63996987d96SKuninori Morimoto [1] = { 6409307d115SPaul Mundt .start = evt2irq(0xe80), 64196987d96SKuninori Morimoto .flags = IORESOURCE_IRQ, 64296987d96SKuninori Morimoto }, 64396987d96SKuninori Morimoto }; 64496987d96SKuninori Morimoto 64596987d96SKuninori Morimoto static struct platform_device sdhi0_device = { 64696987d96SKuninori Morimoto .name = "sh_mobile_sdhi", 64796987d96SKuninori Morimoto .num_resources = ARRAY_SIZE(sdhi0_resources), 64896987d96SKuninori Morimoto .resource = sdhi0_resources, 64996987d96SKuninori Morimoto .id = 0, 65098779ad8SMagnus Damm .dev = { 65198779ad8SMagnus Damm .platform_data = &sdhi0_info, 65298779ad8SMagnus Damm }, 65396987d96SKuninori Morimoto }; 65496987d96SKuninori Morimoto 655d4c191dfSGuennadi Liakhovetski static void cn12_set_pwr(struct platform_device *pdev, int state) 65698779ad8SMagnus Damm { 657d4c191dfSGuennadi Liakhovetski static int power_gpio = -EINVAL; 658d4c191dfSGuennadi Liakhovetski 659d4c191dfSGuennadi Liakhovetski if (power_gpio < 0) { 660d4c191dfSGuennadi Liakhovetski int ret = gpio_request(GPIO_PTB7, NULL); 661d4c191dfSGuennadi Liakhovetski if (!ret) { 662d4c191dfSGuennadi Liakhovetski power_gpio = GPIO_PTB7; 663d4c191dfSGuennadi Liakhovetski gpio_direction_output(power_gpio, 0); 664d4c191dfSGuennadi Liakhovetski } 665d4c191dfSGuennadi Liakhovetski } 666d4c191dfSGuennadi Liakhovetski 667d4c191dfSGuennadi Liakhovetski /* 668d4c191dfSGuennadi Liakhovetski * Toggle the GPIO regardless, whether we managed to grab it above or 669d4c191dfSGuennadi Liakhovetski * the fixed regulator driver did. 670d4c191dfSGuennadi Liakhovetski */ 67198779ad8SMagnus Damm gpio_set_value(GPIO_PTB7, state); 67298779ad8SMagnus Damm } 67398779ad8SMagnus Damm 674d4c191dfSGuennadi Liakhovetski #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 675d4c191dfSGuennadi Liakhovetski /* SDHI1 */ 6764eb80146SGuennadi Liakhovetski static int sdhi1_get_cd(struct platform_device *pdev) 6774eb80146SGuennadi Liakhovetski { 6784eb80146SGuennadi Liakhovetski return !gpio_get_value(GPIO_PTW7); 6794eb80146SGuennadi Liakhovetski } 6804eb80146SGuennadi Liakhovetski 68198779ad8SMagnus Damm static struct sh_mobile_sdhi_info sdhi1_info = { 682815f1995SGuennadi Liakhovetski .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, 683815f1995SGuennadi Liakhovetski .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX, 6844eb80146SGuennadi Liakhovetski .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 6854eb80146SGuennadi Liakhovetski MMC_CAP_NEEDS_POLL, 686d4c191dfSGuennadi Liakhovetski .set_pwr = cn12_set_pwr, 6874eb80146SGuennadi Liakhovetski .get_cd = sdhi1_get_cd, 68898779ad8SMagnus Damm }; 68998779ad8SMagnus Damm 69096987d96SKuninori Morimoto static struct resource sdhi1_resources[] = { 69196987d96SKuninori Morimoto [0] = { 69296987d96SKuninori Morimoto .name = "SDHI1", 69396987d96SKuninori Morimoto .start = 0x04cf0000, 694d80e9221SGuennadi Liakhovetski .end = 0x04cf00ff, 69596987d96SKuninori Morimoto .flags = IORESOURCE_MEM, 69696987d96SKuninori Morimoto }, 69796987d96SKuninori Morimoto [1] = { 6989307d115SPaul Mundt .start = evt2irq(0x4e0), 69996987d96SKuninori Morimoto .flags = IORESOURCE_IRQ, 70096987d96SKuninori Morimoto }, 70196987d96SKuninori Morimoto }; 70296987d96SKuninori Morimoto 70396987d96SKuninori Morimoto static struct platform_device sdhi1_device = { 70496987d96SKuninori Morimoto .name = "sh_mobile_sdhi", 70596987d96SKuninori Morimoto .num_resources = ARRAY_SIZE(sdhi1_resources), 70696987d96SKuninori Morimoto .resource = sdhi1_resources, 70796987d96SKuninori Morimoto .id = 1, 70898779ad8SMagnus Damm .dev = { 70998779ad8SMagnus Damm .platform_data = &sdhi1_info, 71098779ad8SMagnus Damm }, 71196987d96SKuninori Morimoto }; 7121238c684SYusuke Goda #endif /* CONFIG_MMC_SH_MMCIF */ 71396987d96SKuninori Morimoto 7141ce4da7aSMagnus Damm #else 7151ce4da7aSMagnus Damm 7169503e891SKuninori Morimoto /* MMC SPI */ 7171ce4da7aSMagnus Damm static int mmc_spi_get_ro(struct device *dev) 7181ce4da7aSMagnus Damm { 7191ce4da7aSMagnus Damm return gpio_get_value(GPIO_PTY6); 7201ce4da7aSMagnus Damm } 7211ce4da7aSMagnus Damm 7221ce4da7aSMagnus Damm static int mmc_spi_get_cd(struct device *dev) 7231ce4da7aSMagnus Damm { 7241ce4da7aSMagnus Damm return !gpio_get_value(GPIO_PTY7); 7251ce4da7aSMagnus Damm } 7261ce4da7aSMagnus Damm 7271ce4da7aSMagnus Damm static void mmc_spi_setpower(struct device *dev, unsigned int maskval) 7281ce4da7aSMagnus Damm { 7291ce4da7aSMagnus Damm gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); 7301ce4da7aSMagnus Damm } 7311ce4da7aSMagnus Damm 7321ce4da7aSMagnus Damm static struct mmc_spi_platform_data mmc_spi_info = { 7331ce4da7aSMagnus Damm .get_ro = mmc_spi_get_ro, 7341ce4da7aSMagnus Damm .get_cd = mmc_spi_get_cd, 7351ce4da7aSMagnus Damm .caps = MMC_CAP_NEEDS_POLL, 7361ce4da7aSMagnus Damm .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ 7371ce4da7aSMagnus Damm .setpower = mmc_spi_setpower, 7381ce4da7aSMagnus Damm }; 7391ce4da7aSMagnus Damm 7401ce4da7aSMagnus Damm static struct spi_board_info spi_bus[] = { 7411ce4da7aSMagnus Damm { 7421ce4da7aSMagnus Damm .modalias = "mmc_spi", 7431ce4da7aSMagnus Damm .platform_data = &mmc_spi_info, 7441ce4da7aSMagnus Damm .max_speed_hz = 5000000, 7451ce4da7aSMagnus Damm .mode = SPI_MODE_0, 7461ce4da7aSMagnus Damm .controller_data = (void *) GPIO_PTM4, 7471ce4da7aSMagnus Damm }, 7481ce4da7aSMagnus Damm }; 7491ce4da7aSMagnus Damm 7509503e891SKuninori Morimoto /* MSIOF0 */ 7511ce4da7aSMagnus Damm static struct sh_msiof_spi_info msiof0_data = { 7521ce4da7aSMagnus Damm .num_chipselect = 1, 7531ce4da7aSMagnus Damm }; 7541ce4da7aSMagnus Damm 7551ce4da7aSMagnus Damm static struct resource msiof0_resources[] = { 7561ce4da7aSMagnus Damm [0] = { 7571ce4da7aSMagnus Damm .name = "MSIOF0", 7581ce4da7aSMagnus Damm .start = 0xa4c40000, 7591ce4da7aSMagnus Damm .end = 0xa4c40063, 7601ce4da7aSMagnus Damm .flags = IORESOURCE_MEM, 7611ce4da7aSMagnus Damm }, 7621ce4da7aSMagnus Damm [1] = { 7639307d115SPaul Mundt .start = evt2irq(0xc80), 7641ce4da7aSMagnus Damm .flags = IORESOURCE_IRQ, 7651ce4da7aSMagnus Damm }, 7661ce4da7aSMagnus Damm }; 7671ce4da7aSMagnus Damm 7681ce4da7aSMagnus Damm static struct platform_device msiof0_device = { 7691ce4da7aSMagnus Damm .name = "spi_sh_msiof", 7701ce4da7aSMagnus Damm .id = 0, /* MSIOF0 */ 7711ce4da7aSMagnus Damm .dev = { 7721ce4da7aSMagnus Damm .platform_data = &msiof0_data, 7731ce4da7aSMagnus Damm }, 7741ce4da7aSMagnus Damm .num_resources = ARRAY_SIZE(msiof0_resources), 7751ce4da7aSMagnus Damm .resource = msiof0_resources, 7761ce4da7aSMagnus Damm }; 7771ce4da7aSMagnus Damm 7781ce4da7aSMagnus Damm #endif 7791ce4da7aSMagnus Damm 7809aa25d64SKuninori Morimoto /* I2C Video/Camera */ 781207efd07SKuninori Morimoto static struct i2c_board_info i2c_camera[] = { 782207efd07SKuninori Morimoto { 783207efd07SKuninori Morimoto I2C_BOARD_INFO("tw9910", 0x45), 784207efd07SKuninori Morimoto }, 7859aa25d64SKuninori Morimoto { 7869aa25d64SKuninori Morimoto /* 1st camera */ 7879aa25d64SKuninori Morimoto I2C_BOARD_INFO("mt9t112", 0x3c), 7889aa25d64SKuninori Morimoto }, 7899aa25d64SKuninori Morimoto { 7909aa25d64SKuninori Morimoto /* 2nd camera */ 7919aa25d64SKuninori Morimoto I2C_BOARD_INFO("mt9t112", 0x3c), 7929aa25d64SKuninori Morimoto }, 793207efd07SKuninori Morimoto }; 794207efd07SKuninori Morimoto 795207efd07SKuninori Morimoto /* tw9910 */ 796207efd07SKuninori Morimoto static int tw9910_power(struct device *dev, int mode) 797207efd07SKuninori Morimoto { 798207efd07SKuninori Morimoto int val = mode ? 0 : 1; 799207efd07SKuninori Morimoto 800207efd07SKuninori Morimoto gpio_set_value(GPIO_PTU2, val); 801207efd07SKuninori Morimoto if (mode) 802207efd07SKuninori Morimoto mdelay(100); 803207efd07SKuninori Morimoto 804207efd07SKuninori Morimoto return 0; 805207efd07SKuninori Morimoto } 806207efd07SKuninori Morimoto 807207efd07SKuninori Morimoto static struct tw9910_video_info tw9910_info = { 808207efd07SKuninori Morimoto .buswidth = SOCAM_DATAWIDTH_8, 809207efd07SKuninori Morimoto .mpout = TW9910_MPO_FIELD, 810207efd07SKuninori Morimoto }; 811207efd07SKuninori Morimoto 812207efd07SKuninori Morimoto static struct soc_camera_link tw9910_link = { 813207efd07SKuninori Morimoto .i2c_adapter_id = 0, 814207efd07SKuninori Morimoto .bus_id = 1, 815207efd07SKuninori Morimoto .power = tw9910_power, 816207efd07SKuninori Morimoto .board_info = &i2c_camera[0], 817207efd07SKuninori Morimoto .priv = &tw9910_info, 818207efd07SKuninori Morimoto }; 819207efd07SKuninori Morimoto 8209aa25d64SKuninori Morimoto /* mt9t112 */ 8219aa25d64SKuninori Morimoto static int mt9t112_power1(struct device *dev, int mode) 8229aa25d64SKuninori Morimoto { 8239aa25d64SKuninori Morimoto gpio_set_value(GPIO_PTA3, mode); 8249aa25d64SKuninori Morimoto if (mode) 8259aa25d64SKuninori Morimoto mdelay(100); 8269aa25d64SKuninori Morimoto 8279aa25d64SKuninori Morimoto return 0; 8289aa25d64SKuninori Morimoto } 8299aa25d64SKuninori Morimoto 8309aa25d64SKuninori Morimoto static struct mt9t112_camera_info mt9t112_info1 = { 8319aa25d64SKuninori Morimoto .flags = MT9T112_FLAG_PCLK_RISING_EDGE | MT9T112_FLAG_DATAWIDTH_8, 8329aa25d64SKuninori Morimoto .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 8339aa25d64SKuninori Morimoto }; 8349aa25d64SKuninori Morimoto 8359aa25d64SKuninori Morimoto static struct soc_camera_link mt9t112_link1 = { 8369aa25d64SKuninori Morimoto .i2c_adapter_id = 0, 8379aa25d64SKuninori Morimoto .power = mt9t112_power1, 8389aa25d64SKuninori Morimoto .bus_id = 0, 8399aa25d64SKuninori Morimoto .board_info = &i2c_camera[1], 8409aa25d64SKuninori Morimoto .priv = &mt9t112_info1, 8419aa25d64SKuninori Morimoto }; 8429aa25d64SKuninori Morimoto 8439aa25d64SKuninori Morimoto static int mt9t112_power2(struct device *dev, int mode) 8449aa25d64SKuninori Morimoto { 8459aa25d64SKuninori Morimoto gpio_set_value(GPIO_PTA4, mode); 8469aa25d64SKuninori Morimoto if (mode) 8479aa25d64SKuninori Morimoto mdelay(100); 8489aa25d64SKuninori Morimoto 8499aa25d64SKuninori Morimoto return 0; 8509aa25d64SKuninori Morimoto } 8519aa25d64SKuninori Morimoto 8529aa25d64SKuninori Morimoto static struct mt9t112_camera_info mt9t112_info2 = { 8539aa25d64SKuninori Morimoto .flags = MT9T112_FLAG_PCLK_RISING_EDGE | MT9T112_FLAG_DATAWIDTH_8, 8549aa25d64SKuninori Morimoto .divider = { 0x49, 0x6, 0, 6, 0, 9, 9, 6, 0 }, /* for 24MHz */ 8559aa25d64SKuninori Morimoto }; 8569aa25d64SKuninori Morimoto 8579aa25d64SKuninori Morimoto static struct soc_camera_link mt9t112_link2 = { 8589aa25d64SKuninori Morimoto .i2c_adapter_id = 1, 8599aa25d64SKuninori Morimoto .power = mt9t112_power2, 8609aa25d64SKuninori Morimoto .bus_id = 1, 8619aa25d64SKuninori Morimoto .board_info = &i2c_camera[2], 8629aa25d64SKuninori Morimoto .priv = &mt9t112_info2, 8639aa25d64SKuninori Morimoto }; 864207efd07SKuninori Morimoto 865207efd07SKuninori Morimoto static struct platform_device camera_devices[] = { 866207efd07SKuninori Morimoto { 867207efd07SKuninori Morimoto .name = "soc-camera-pdrv", 868207efd07SKuninori Morimoto .id = 0, 869207efd07SKuninori Morimoto .dev = { 870207efd07SKuninori Morimoto .platform_data = &tw9910_link, 871207efd07SKuninori Morimoto }, 872207efd07SKuninori Morimoto }, 8739aa25d64SKuninori Morimoto { 8749aa25d64SKuninori Morimoto .name = "soc-camera-pdrv", 8759aa25d64SKuninori Morimoto .id = 1, 8769aa25d64SKuninori Morimoto .dev = { 8779aa25d64SKuninori Morimoto .platform_data = &mt9t112_link1, 8789aa25d64SKuninori Morimoto }, 8799aa25d64SKuninori Morimoto }, 8809aa25d64SKuninori Morimoto { 8819aa25d64SKuninori Morimoto .name = "soc-camera-pdrv", 8829aa25d64SKuninori Morimoto .id = 2, 8839aa25d64SKuninori Morimoto .dev = { 8849aa25d64SKuninori Morimoto .platform_data = &mt9t112_link2, 8859aa25d64SKuninori Morimoto }, 8869aa25d64SKuninori Morimoto }, 887207efd07SKuninori Morimoto }; 888207efd07SKuninori Morimoto 8891980fdc4SKuninori Morimoto /* FSI */ 8903ce09334SKuninori Morimoto static struct sh_fsi_platform_info fsi_info = { 891fec691e7SKuninori Morimoto .port_b = { 892fec691e7SKuninori Morimoto .flags = SH_FSI_BRS_INV, 893fec691e7SKuninori Morimoto }, 8941980fdc4SKuninori Morimoto }; 8951980fdc4SKuninori Morimoto 8961980fdc4SKuninori Morimoto static struct resource fsi_resources[] = { 8971980fdc4SKuninori Morimoto [0] = { 8981980fdc4SKuninori Morimoto .name = "FSI", 8991980fdc4SKuninori Morimoto .start = 0xFE3C0000, 9001980fdc4SKuninori Morimoto .end = 0xFE3C021d, 9011980fdc4SKuninori Morimoto .flags = IORESOURCE_MEM, 9021980fdc4SKuninori Morimoto }, 9031980fdc4SKuninori Morimoto [1] = { 9049307d115SPaul Mundt .start = evt2irq(0xf80), 9051980fdc4SKuninori Morimoto .flags = IORESOURCE_IRQ, 9061980fdc4SKuninori Morimoto }, 9071980fdc4SKuninori Morimoto }; 9081980fdc4SKuninori Morimoto 9091980fdc4SKuninori Morimoto static struct platform_device fsi_device = { 9101980fdc4SKuninori Morimoto .name = "sh_fsi", 9111980fdc4SKuninori Morimoto .id = 0, 9121980fdc4SKuninori Morimoto .num_resources = ARRAY_SIZE(fsi_resources), 9131980fdc4SKuninori Morimoto .resource = fsi_resources, 9141980fdc4SKuninori Morimoto .dev = { 9151980fdc4SKuninori Morimoto .platform_data = &fsi_info, 9161980fdc4SKuninori Morimoto }, 9171980fdc4SKuninori Morimoto }; 9181980fdc4SKuninori Morimoto 919064bfadaSKuninori Morimoto static struct asoc_simple_dai_init_info fsi_da7210_init_info = { 920064bfadaSKuninori Morimoto .fmt = SND_SOC_DAIFMT_I2S, 921064bfadaSKuninori Morimoto .codec_daifmt = SND_SOC_DAIFMT_CBM_CFM, 922064bfadaSKuninori Morimoto .cpu_daifmt = SND_SOC_DAIFMT_CBS_CFS, 923064bfadaSKuninori Morimoto }; 924064bfadaSKuninori Morimoto 925064bfadaSKuninori Morimoto static struct asoc_simple_card_info fsi_da7210_info = { 926064bfadaSKuninori Morimoto .name = "DA7210", 927064bfadaSKuninori Morimoto .card = "FSIB-DA7210", 928064bfadaSKuninori Morimoto .cpu_dai = "fsib-dai", 929064bfadaSKuninori Morimoto .codec = "da7210.0-001a", 930064bfadaSKuninori Morimoto .platform = "sh_fsi.0", 931064bfadaSKuninori Morimoto .codec_dai = "da7210-hifi", 932064bfadaSKuninori Morimoto .init = &fsi_da7210_init_info, 933064bfadaSKuninori Morimoto }; 934064bfadaSKuninori Morimoto 935064bfadaSKuninori Morimoto static struct platform_device fsi_da7210_device = { 936064bfadaSKuninori Morimoto .name = "asoc-simple-card", 937064bfadaSKuninori Morimoto .dev = { 938064bfadaSKuninori Morimoto .platform_data = &fsi_da7210_info, 939064bfadaSKuninori Morimoto }, 940064bfadaSKuninori Morimoto }; 941064bfadaSKuninori Morimoto 942064bfadaSKuninori Morimoto 94326365716SKuninori Morimoto /* IrDA */ 94426365716SKuninori Morimoto static struct resource irda_resources[] = { 94526365716SKuninori Morimoto [0] = { 94626365716SKuninori Morimoto .name = "IrDA", 94726365716SKuninori Morimoto .start = 0xA45D0000, 94826365716SKuninori Morimoto .end = 0xA45D0049, 94926365716SKuninori Morimoto .flags = IORESOURCE_MEM, 95026365716SKuninori Morimoto }, 95126365716SKuninori Morimoto [1] = { 9529307d115SPaul Mundt .start = evt2irq(0x480), 95326365716SKuninori Morimoto .flags = IORESOURCE_IRQ, 95426365716SKuninori Morimoto }, 95526365716SKuninori Morimoto }; 95626365716SKuninori Morimoto 95726365716SKuninori Morimoto static struct platform_device irda_device = { 95826365716SKuninori Morimoto .name = "sh_sir", 95926365716SKuninori Morimoto .num_resources = ARRAY_SIZE(irda_resources), 96026365716SKuninori Morimoto .resource = irda_resources, 96126365716SKuninori Morimoto }; 96226365716SKuninori Morimoto 963aee5ab0bSGuennadi Liakhovetski #include <media/ak881x.h> 964aee5ab0bSGuennadi Liakhovetski #include <media/sh_vou.h> 965aee5ab0bSGuennadi Liakhovetski 9663ce09334SKuninori Morimoto static struct ak881x_pdata ak881x_pdata = { 967aee5ab0bSGuennadi Liakhovetski .flags = AK881X_IF_MODE_SLAVE, 968aee5ab0bSGuennadi Liakhovetski }; 969aee5ab0bSGuennadi Liakhovetski 970aee5ab0bSGuennadi Liakhovetski static struct i2c_board_info ak8813 = { 971aee5ab0bSGuennadi Liakhovetski I2C_BOARD_INFO("ak8813", 0x20), 972aee5ab0bSGuennadi Liakhovetski .platform_data = &ak881x_pdata, 973aee5ab0bSGuennadi Liakhovetski }; 974aee5ab0bSGuennadi Liakhovetski 9753ce09334SKuninori Morimoto static struct sh_vou_pdata sh_vou_pdata = { 976aee5ab0bSGuennadi Liakhovetski .bus_fmt = SH_VOU_BUS_8BIT, 977aee5ab0bSGuennadi Liakhovetski .flags = SH_VOU_HSYNC_LOW | SH_VOU_VSYNC_LOW, 978aee5ab0bSGuennadi Liakhovetski .board_info = &ak8813, 979aee5ab0bSGuennadi Liakhovetski .i2c_adap = 0, 980aee5ab0bSGuennadi Liakhovetski }; 981aee5ab0bSGuennadi Liakhovetski 982aee5ab0bSGuennadi Liakhovetski static struct resource sh_vou_resources[] = { 983aee5ab0bSGuennadi Liakhovetski [0] = { 984aee5ab0bSGuennadi Liakhovetski .start = 0xfe960000, 985aee5ab0bSGuennadi Liakhovetski .end = 0xfe962043, 986aee5ab0bSGuennadi Liakhovetski .flags = IORESOURCE_MEM, 987aee5ab0bSGuennadi Liakhovetski }, 988aee5ab0bSGuennadi Liakhovetski [1] = { 9899307d115SPaul Mundt .start = evt2irq(0x8e0), 990aee5ab0bSGuennadi Liakhovetski .flags = IORESOURCE_IRQ, 991aee5ab0bSGuennadi Liakhovetski }, 992aee5ab0bSGuennadi Liakhovetski }; 993aee5ab0bSGuennadi Liakhovetski 994aee5ab0bSGuennadi Liakhovetski static struct platform_device vou_device = { 995aee5ab0bSGuennadi Liakhovetski .name = "sh-vou", 996aee5ab0bSGuennadi Liakhovetski .id = -1, 997aee5ab0bSGuennadi Liakhovetski .num_resources = ARRAY_SIZE(sh_vou_resources), 998aee5ab0bSGuennadi Liakhovetski .resource = sh_vou_resources, 999aee5ab0bSGuennadi Liakhovetski .dev = { 1000aee5ab0bSGuennadi Liakhovetski .platform_data = &sh_vou_pdata, 1001aee5ab0bSGuennadi Liakhovetski }, 1002aee5ab0bSGuennadi Liakhovetski }; 1003aee5ab0bSGuennadi Liakhovetski 10045744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 10051238c684SYusuke Goda /* SH_MMCIF */ 10061238c684SYusuke Goda static void mmcif_down_pwr(struct platform_device *pdev) 10071238c684SYusuke Goda { 1008d4c191dfSGuennadi Liakhovetski cn12_set_pwr(pdev, 0); 10091238c684SYusuke Goda } 10101238c684SYusuke Goda 10111238c684SYusuke Goda static struct resource sh_mmcif_resources[] = { 10121238c684SYusuke Goda [0] = { 10131238c684SYusuke Goda .name = "SH_MMCIF", 10141238c684SYusuke Goda .start = 0xA4CA0000, 10151238c684SYusuke Goda .end = 0xA4CA00FF, 10161238c684SYusuke Goda .flags = IORESOURCE_MEM, 10171238c684SYusuke Goda }, 10181238c684SYusuke Goda [1] = { 10191238c684SYusuke Goda /* MMC2I */ 10209307d115SPaul Mundt .start = evt2irq(0x5a0), 10211238c684SYusuke Goda .flags = IORESOURCE_IRQ, 10221238c684SYusuke Goda }, 10231238c684SYusuke Goda [2] = { 10241238c684SYusuke Goda /* MMC3I */ 10259307d115SPaul Mundt .start = evt2irq(0x5c0), 10261238c684SYusuke Goda .flags = IORESOURCE_IRQ, 10271238c684SYusuke Goda }, 10281238c684SYusuke Goda }; 10291238c684SYusuke Goda 10303ce09334SKuninori Morimoto static struct sh_mmcif_plat_data sh_mmcif_plat = { 1031d4c191dfSGuennadi Liakhovetski .set_pwr = cn12_set_pwr, 10321238c684SYusuke Goda .down_pwr = mmcif_down_pwr, 10331238c684SYusuke Goda .sup_pclk = 0, /* SH7724: Max Pclk/2 */ 10341238c684SYusuke Goda .caps = MMC_CAP_4_BIT_DATA | 10351238c684SYusuke Goda MMC_CAP_8_BIT_DATA | 10361238c684SYusuke Goda MMC_CAP_NEEDS_POLL, 10371238c684SYusuke Goda .ocr = MMC_VDD_32_33 | MMC_VDD_33_34, 10381238c684SYusuke Goda }; 10391238c684SYusuke Goda 10401238c684SYusuke Goda static struct platform_device sh_mmcif_device = { 10411238c684SYusuke Goda .name = "sh_mmcif", 10421238c684SYusuke Goda .id = 0, 10431238c684SYusuke Goda .dev = { 10441238c684SYusuke Goda .platform_data = &sh_mmcif_plat, 10451238c684SYusuke Goda }, 10461238c684SYusuke Goda .num_resources = ARRAY_SIZE(sh_mmcif_resources), 10471238c684SYusuke Goda .resource = sh_mmcif_resources, 10481238c684SYusuke Goda }; 10491238c684SYusuke Goda #endif 10501238c684SYusuke Goda 10514138b740SKuninori Morimoto static struct platform_device *ecovec_devices[] __initdata = { 10524138b740SKuninori Morimoto &heartbeat_device, 10534138b740SKuninori Morimoto &nor_flash_device, 105435a35408SKuninori Morimoto &sh_eth_device, 1055907050a3SKuninori Morimoto &usb0_host_device, 10563714a9a0SKuninori Morimoto &usb1_common_device, 1057fb2e7394SKuninori Morimoto &usbhs_device, 1058fa3ba51bSKuninori Morimoto &lcdc_device, 10592153ad32SKuninori Morimoto &ceu0_device, 10602153ad32SKuninori Morimoto &ceu1_device, 1061e9103e74SKuninori Morimoto &keysc_device, 1062d4c191dfSGuennadi Liakhovetski &cn12_power, 10635744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 1064d4c191dfSGuennadi Liakhovetski &sdhi0_power, 106596987d96SKuninori Morimoto &sdhi0_device, 10665744c881SGuennadi Liakhovetski #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 106796987d96SKuninori Morimoto &sdhi1_device, 10681238c684SYusuke Goda #endif 10691ce4da7aSMagnus Damm #else 10701ce4da7aSMagnus Damm &msiof0_device, 10711ce4da7aSMagnus Damm #endif 1072207efd07SKuninori Morimoto &camera_devices[0], 10739aa25d64SKuninori Morimoto &camera_devices[1], 10749aa25d64SKuninori Morimoto &camera_devices[2], 10751980fdc4SKuninori Morimoto &fsi_device, 1076064bfadaSKuninori Morimoto &fsi_da7210_device, 107726365716SKuninori Morimoto &irda_device, 1078aee5ab0bSGuennadi Liakhovetski &vou_device, 10795744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 10801238c684SYusuke Goda &sh_mmcif_device, 10811238c684SYusuke Goda #endif 10824138b740SKuninori Morimoto }; 10834138b740SKuninori Morimoto 10846b3b5575SMagnus Damm #ifdef CONFIG_I2C 10854907d57fSKuninori Morimoto #define EEPROM_ADDR 0x50 10864907d57fSKuninori Morimoto static u8 mac_read(struct i2c_adapter *a, u8 command) 10874907d57fSKuninori Morimoto { 10884907d57fSKuninori Morimoto struct i2c_msg msg[2]; 10894907d57fSKuninori Morimoto u8 buf; 10904907d57fSKuninori Morimoto int ret; 10914907d57fSKuninori Morimoto 10924907d57fSKuninori Morimoto msg[0].addr = EEPROM_ADDR; 10934907d57fSKuninori Morimoto msg[0].flags = 0; 10944907d57fSKuninori Morimoto msg[0].len = 1; 10954907d57fSKuninori Morimoto msg[0].buf = &command; 10964907d57fSKuninori Morimoto 10974907d57fSKuninori Morimoto msg[1].addr = EEPROM_ADDR; 10984907d57fSKuninori Morimoto msg[1].flags = I2C_M_RD; 10994907d57fSKuninori Morimoto msg[1].len = 1; 11004907d57fSKuninori Morimoto msg[1].buf = &buf; 11014907d57fSKuninori Morimoto 11024907d57fSKuninori Morimoto ret = i2c_transfer(a, msg, 2); 11034907d57fSKuninori Morimoto if (ret < 0) { 11044907d57fSKuninori Morimoto printk(KERN_ERR "error %d\n", ret); 11054907d57fSKuninori Morimoto buf = 0xff; 11064907d57fSKuninori Morimoto } 11074907d57fSKuninori Morimoto 11084907d57fSKuninori Morimoto return buf; 11094907d57fSKuninori Morimoto } 11104907d57fSKuninori Morimoto 1111376abbb4SMagnus Damm static void __init sh_eth_init(struct sh_eth_plat_data *pd) 11124907d57fSKuninori Morimoto { 11134907d57fSKuninori Morimoto struct i2c_adapter *a = i2c_get_adapter(1); 11144907d57fSKuninori Morimoto int i; 11154907d57fSKuninori Morimoto 11164907d57fSKuninori Morimoto if (!a) { 11174907d57fSKuninori Morimoto pr_err("can not get I2C 1\n"); 11184907d57fSKuninori Morimoto return; 11194907d57fSKuninori Morimoto } 11204907d57fSKuninori Morimoto 112125985edcSLucas De Marchi /* read MAC address from EEPROM */ 1122376abbb4SMagnus Damm for (i = 0; i < sizeof(pd->mac_addr); i++) { 1123376abbb4SMagnus Damm pd->mac_addr[i] = mac_read(a, 0x10 + i); 11244907d57fSKuninori Morimoto msleep(10); 11254907d57fSKuninori Morimoto } 1126b230eb32SKuninori Morimoto 1127b230eb32SKuninori Morimoto i2c_put_adapter(a); 11284907d57fSKuninori Morimoto } 11296b3b5575SMagnus Damm #else 11306b3b5575SMagnus Damm static void __init sh_eth_init(struct sh_eth_plat_data *pd) 11316b3b5575SMagnus Damm { 11326b3b5575SMagnus Damm pr_err("unable to read sh_eth MAC address\n"); 11336b3b5575SMagnus Damm } 11346b3b5575SMagnus Damm #endif 11354907d57fSKuninori Morimoto 1136fa3ba51bSKuninori Morimoto #define PORT_HIZA 0xA4050158 1137ea15edb2SKuninori Morimoto #define IODRIVEA 0xA405018A 1138eb0cd9e8SMagnus Damm 1139eb0cd9e8SMagnus Damm extern char ecovec24_sdram_enter_start; 1140eb0cd9e8SMagnus Damm extern char ecovec24_sdram_enter_end; 1141eb0cd9e8SMagnus Damm extern char ecovec24_sdram_leave_start; 1142eb0cd9e8SMagnus Damm extern char ecovec24_sdram_leave_end; 1143eb0cd9e8SMagnus Damm 11444907d57fSKuninori Morimoto static int __init arch_setup(void) 11454138b740SKuninori Morimoto { 11461980fdc4SKuninori Morimoto struct clk *clk; 11474eb80146SGuennadi Liakhovetski bool cn12_enabled = false; 11481980fdc4SKuninori Morimoto 1149eb0cd9e8SMagnus Damm /* register board specific self-refresh code */ 11502839bd61SMagnus Damm sh_mobile_register_self_refresh(SUSP_SH_STANDBY | SUSP_SH_SF | 11512839bd61SMagnus Damm SUSP_SH_RSTANDBY, 1152eb0cd9e8SMagnus Damm &ecovec24_sdram_enter_start, 1153eb0cd9e8SMagnus Damm &ecovec24_sdram_enter_end, 1154eb0cd9e8SMagnus Damm &ecovec24_sdram_leave_start, 1155eb0cd9e8SMagnus Damm &ecovec24_sdram_leave_end); 1156eb0cd9e8SMagnus Damm 1157f78bab30SMagnus Damm /* enable STATUS0, STATUS2 and PDSTATUS */ 1158f78bab30SMagnus Damm gpio_request(GPIO_FN_STATUS0, NULL); 1159f78bab30SMagnus Damm gpio_request(GPIO_FN_STATUS2, NULL); 1160f78bab30SMagnus Damm gpio_request(GPIO_FN_PDSTATUS, NULL); 1161f78bab30SMagnus Damm 11624138b740SKuninori Morimoto /* enable SCIFA0 */ 11634138b740SKuninori Morimoto gpio_request(GPIO_FN_SCIF0_TXD, NULL); 11644138b740SKuninori Morimoto gpio_request(GPIO_FN_SCIF0_RXD, NULL); 11654138b740SKuninori Morimoto 11664138b740SKuninori Morimoto /* enable debug LED */ 11674138b740SKuninori Morimoto gpio_request(GPIO_PTG0, NULL); 11684138b740SKuninori Morimoto gpio_request(GPIO_PTG1, NULL); 11694138b740SKuninori Morimoto gpio_request(GPIO_PTG2, NULL); 11704138b740SKuninori Morimoto gpio_request(GPIO_PTG3, NULL); 1171b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG0, 0); 1172b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG1, 0); 1173b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG2, 0); 1174b7056bc1SKuninori Morimoto gpio_direction_output(GPIO_PTG3, 0); 11759d56dd3bSPaul Mundt __raw_writew((__raw_readw(PORT_HIZA) & ~(0x1 << 1)) , PORT_HIZA); 11764138b740SKuninori Morimoto 117735a35408SKuninori Morimoto /* enable SH-Eth */ 117835a35408SKuninori Morimoto gpio_request(GPIO_PTA1, NULL); 117935a35408SKuninori Morimoto gpio_direction_output(GPIO_PTA1, 1); 118035a35408SKuninori Morimoto mdelay(20); 118135a35408SKuninori Morimoto 118235a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RXD0, NULL); 118335a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RXD1, NULL); 118435a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TXD0, NULL); 118535a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TXD1, NULL); 118635a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_REF_CLK, NULL); 118735a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_TX_EN, NULL); 118835a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_RX_ER, NULL); 118935a35408SKuninori Morimoto gpio_request(GPIO_FN_RMII_CRS_DV, NULL); 119035a35408SKuninori Morimoto gpio_request(GPIO_FN_MDIO, NULL); 119135a35408SKuninori Morimoto gpio_request(GPIO_FN_MDC, NULL); 119235a35408SKuninori Morimoto gpio_request(GPIO_FN_LNKSTA, NULL); 119335a35408SKuninori Morimoto 1194907050a3SKuninori Morimoto /* enable USB */ 11959d56dd3bSPaul Mundt __raw_writew(0x0000, 0xA4D80000); 11969d56dd3bSPaul Mundt __raw_writew(0x0000, 0xA4D90000); 1197907050a3SKuninori Morimoto gpio_request(GPIO_PTB3, NULL); 1198907050a3SKuninori Morimoto gpio_request(GPIO_PTB4, NULL); 1199907050a3SKuninori Morimoto gpio_request(GPIO_PTB5, NULL); 1200907050a3SKuninori Morimoto gpio_direction_input(GPIO_PTB3); 1201907050a3SKuninori Morimoto gpio_direction_output(GPIO_PTB4, 0); 1202907050a3SKuninori Morimoto gpio_direction_output(GPIO_PTB5, 0); 12039d56dd3bSPaul Mundt __raw_writew(0x0600, 0xa40501d4); 12049d56dd3bSPaul Mundt __raw_writew(0x0600, 0xa4050192); 1205907050a3SKuninori Morimoto 12063714a9a0SKuninori Morimoto if (gpio_get_value(GPIO_PTB3)) { 12073714a9a0SKuninori Morimoto printk(KERN_INFO "USB1 function is selected\n"); 12083714a9a0SKuninori Morimoto usb1_common_device.name = "r8a66597_udc"; 12093714a9a0SKuninori Morimoto } else { 12103714a9a0SKuninori Morimoto printk(KERN_INFO "USB1 host is selected\n"); 12113714a9a0SKuninori Morimoto usb1_common_device.name = "r8a66597_hcd"; 12123714a9a0SKuninori Morimoto } 12133714a9a0SKuninori Morimoto 1214fa3ba51bSKuninori Morimoto /* enable LCDC */ 1215fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD23, NULL); 1216fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD22, NULL); 1217fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD21, NULL); 1218fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD20, NULL); 1219fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD19, NULL); 1220fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD18, NULL); 1221fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD17, NULL); 1222fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD16, NULL); 1223fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD15, NULL); 1224fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD14, NULL); 1225fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD13, NULL); 1226fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD12, NULL); 1227fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD11, NULL); 1228fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD10, NULL); 1229fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD9, NULL); 1230fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD8, NULL); 1231fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD7, NULL); 1232fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD6, NULL); 1233fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD5, NULL); 1234fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD4, NULL); 1235fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD3, NULL); 1236fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD2, NULL); 1237fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD1, NULL); 1238fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDD0, NULL); 1239fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDISP, NULL); 1240fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDHSYN, NULL); 1241fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDCK, NULL); 1242fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDVSYN, NULL); 1243fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDDON, NULL); 1244fa3ba51bSKuninori Morimoto gpio_request(GPIO_FN_LCDLCLK, NULL); 12459d56dd3bSPaul Mundt __raw_writew((__raw_readw(PORT_HIZA) & ~0x0001), PORT_HIZA); 1246fa3ba51bSKuninori Morimoto 1247fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTE6, NULL); 1248fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTU1, NULL); 1249fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTR1, NULL); 1250fa3ba51bSKuninori Morimoto gpio_request(GPIO_PTA2, NULL); 1251fa3ba51bSKuninori Morimoto gpio_direction_input(GPIO_PTE6); 1252fa3ba51bSKuninori Morimoto gpio_direction_output(GPIO_PTU1, 0); 1253fa3ba51bSKuninori Morimoto gpio_direction_output(GPIO_PTR1, 0); 1254fa3ba51bSKuninori Morimoto gpio_direction_output(GPIO_PTA2, 0); 1255fa3ba51bSKuninori Morimoto 125682b33221SKuninori Morimoto /* I/O buffer drive ability is high */ 12579d56dd3bSPaul Mundt __raw_writew((__raw_readw(IODRIVEA) & ~0x00c0) | 0x0080 , IODRIVEA); 1258ea15edb2SKuninori Morimoto 1259fa3ba51bSKuninori Morimoto if (gpio_get_value(GPIO_PTE6)) { 1260fa3ba51bSKuninori Morimoto /* DVI */ 1261fa3ba51bSKuninori Morimoto lcdc_info.clock_source = LCDC_CLK_EXTERNAL; 126244432407SGuennadi Liakhovetski lcdc_info.ch[0].clock_divider = 1; 126393ff2598SLaurent Pinchart lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes; 126493ff2598SLaurent Pinchart lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes); 1265fa3ba51bSKuninori Morimoto 1266fa3ba51bSKuninori Morimoto gpio_set_value(GPIO_PTA2, 1); 1267fa3ba51bSKuninori Morimoto gpio_set_value(GPIO_PTU1, 1); 1268fa3ba51bSKuninori Morimoto } else { 1269fa3ba51bSKuninori Morimoto /* Panel */ 1270ea15edb2SKuninori Morimoto lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; 127144432407SGuennadi Liakhovetski lcdc_info.ch[0].clock_divider = 2; 127293ff2598SLaurent Pinchart lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes; 127393ff2598SLaurent Pinchart lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes); 1274ea15edb2SKuninori Morimoto 1275ea15edb2SKuninori Morimoto gpio_set_value(GPIO_PTR1, 1); 1276ea15edb2SKuninori Morimoto 1277ea15edb2SKuninori Morimoto /* FIXME 1278ea15edb2SKuninori Morimoto * 1279ea15edb2SKuninori Morimoto * LCDDON control is needed for Panel, 1280ea15edb2SKuninori Morimoto * but current sh_mobile_lcdc driver doesn't control it. 1281ea15edb2SKuninori Morimoto * It is temporary correspondence 1282ea15edb2SKuninori Morimoto */ 1283ea15edb2SKuninori Morimoto gpio_request(GPIO_PTF4, NULL); 1284ea15edb2SKuninori Morimoto gpio_direction_output(GPIO_PTF4, 1); 12858810e055SKuninori Morimoto 12868810e055SKuninori Morimoto /* enable TouchScreen */ 12878810e055SKuninori Morimoto i2c_register_board_info(0, &ts_i2c_clients, 1); 1288fcb8918fSThomas Gleixner irq_set_irq_type(IRQ0, IRQ_TYPE_LEVEL_LOW); 1289fa3ba51bSKuninori Morimoto } 1290fa3ba51bSKuninori Morimoto 12912153ad32SKuninori Morimoto /* enable CEU0 */ 12922153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D15, NULL); 12932153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D14, NULL); 12942153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D13, NULL); 12952153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D12, NULL); 12962153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D11, NULL); 12972153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D10, NULL); 12982153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D9, NULL); 12992153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D8, NULL); 13002153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D7, NULL); 13012153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D6, NULL); 13022153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D5, NULL); 13032153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D4, NULL); 13042153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D3, NULL); 13052153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D2, NULL); 13062153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D1, NULL); 13072153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_D0, NULL); 13082153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_VD, NULL); 13092153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_CLK, NULL); 13102153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_FLD, NULL); 13112153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO0_HD, NULL); 13122153ad32SKuninori Morimoto platform_resource_setup_memory(&ceu0_device, "ceu0", 4 << 20); 13132153ad32SKuninori Morimoto 13142153ad32SKuninori Morimoto /* enable CEU1 */ 13152153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D7, NULL); 13162153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D6, NULL); 13172153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D5, NULL); 13182153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D4, NULL); 13192153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D3, NULL); 13202153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D2, NULL); 13212153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D1, NULL); 13222153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_D0, NULL); 13232153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_FLD, NULL); 13242153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_HD, NULL); 13252153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_VD, NULL); 13262153ad32SKuninori Morimoto gpio_request(GPIO_FN_VIO1_CLK, NULL); 13272153ad32SKuninori Morimoto platform_resource_setup_memory(&ceu1_device, "ceu1", 4 << 20); 13282153ad32SKuninori Morimoto 1329e9103e74SKuninori Morimoto /* enable KEYSC */ 1330e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT5_IN5, NULL); 1331e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT4_IN6, NULL); 1332e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT3, NULL); 1333e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT2, NULL); 1334e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT1, NULL); 1335e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYOUT0, NULL); 1336e9103e74SKuninori Morimoto gpio_request(GPIO_FN_KEYIN0, NULL); 1337e9103e74SKuninori Morimoto 1338064a16dcSKuninori Morimoto /* enable user debug switch */ 1339064a16dcSKuninori Morimoto gpio_request(GPIO_PTR0, NULL); 1340064a16dcSKuninori Morimoto gpio_request(GPIO_PTR4, NULL); 1341064a16dcSKuninori Morimoto gpio_request(GPIO_PTR5, NULL); 1342064a16dcSKuninori Morimoto gpio_request(GPIO_PTR6, NULL); 1343064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR0); 1344064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR4); 1345064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR5); 1346064a16dcSKuninori Morimoto gpio_direction_input(GPIO_PTR6); 1347064a16dcSKuninori Morimoto 13484eb80146SGuennadi Liakhovetski /* SD-card slot CN11 */ 13494eb80146SGuennadi Liakhovetski /* Card-detect, used on CN11, either with SDHI0 or with SPI */ 13504eb80146SGuennadi Liakhovetski gpio_request(GPIO_PTY7, NULL); 13514eb80146SGuennadi Liakhovetski gpio_direction_input(GPIO_PTY7); 13524eb80146SGuennadi Liakhovetski 13535744c881SGuennadi Liakhovetski #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 13541ce4da7aSMagnus Damm /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ 135596987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0WP, NULL); 135696987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0CMD, NULL); 135796987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0CLK, NULL); 135896987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D3, NULL); 135996987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D2, NULL); 136096987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D1, NULL); 136196987d96SKuninori Morimoto gpio_request(GPIO_FN_SDHI0D0, NULL); 13621ce4da7aSMagnus Damm #else 13631ce4da7aSMagnus Damm /* enable MSIOF0 on CN11 (needs DS2.4 set to OFF) */ 13641ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_TXD, NULL); 13651ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_RXD, NULL); 13661ce4da7aSMagnus Damm gpio_request(GPIO_FN_MSIOF0_TSCK, NULL); 13671ce4da7aSMagnus Damm gpio_request(GPIO_PTM4, NULL); /* software CS control of TSYNC pin */ 13681ce4da7aSMagnus Damm gpio_direction_output(GPIO_PTM4, 1); /* active low CS */ 13691ce4da7aSMagnus Damm gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ 13701ce4da7aSMagnus Damm gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ 13711ce4da7aSMagnus Damm gpio_request(GPIO_PTY6, NULL); /* write protect */ 13721ce4da7aSMagnus Damm gpio_direction_input(GPIO_PTY6); 13731ce4da7aSMagnus Damm 13741ce4da7aSMagnus Damm spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); 13751ce4da7aSMagnus Damm #endif 137696987d96SKuninori Morimoto 13774eb80146SGuennadi Liakhovetski /* MMC/SD-card slot CN12 */ 13784eb80146SGuennadi Liakhovetski #if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 13794eb80146SGuennadi Liakhovetski /* enable MMCIF (needs DS2.6,7 set to OFF,ON) */ 13804eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D7, NULL); 13814eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D6, NULL); 13824eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D5, NULL); 13834eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D4, NULL); 13844eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D3, NULL); 13854eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D2, NULL); 13864eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D1, NULL); 13874eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_D0, NULL); 13884eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_CLK, NULL); 13894eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_MMC_CMD, NULL); 13904eb80146SGuennadi Liakhovetski 13914eb80146SGuennadi Liakhovetski cn12_enabled = true; 13924eb80146SGuennadi Liakhovetski #elif defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 13934eb80146SGuennadi Liakhovetski /* enable SDHI1 on CN12 (needs DS2.6,7 set to ON,OFF) */ 13944eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1WP, NULL); 13954eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1CMD, NULL); 13964eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1CLK, NULL); 13974eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D3, NULL); 13984eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D2, NULL); 13994eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D1, NULL); 14004eb80146SGuennadi Liakhovetski gpio_request(GPIO_FN_SDHI1D0, NULL); 14014eb80146SGuennadi Liakhovetski 14024eb80146SGuennadi Liakhovetski /* Card-detect, used on CN12 with SDHI1 */ 14034eb80146SGuennadi Liakhovetski gpio_request(GPIO_PTW7, NULL); 14044eb80146SGuennadi Liakhovetski gpio_direction_input(GPIO_PTW7); 14054eb80146SGuennadi Liakhovetski 14064eb80146SGuennadi Liakhovetski cn12_enabled = true; 14074eb80146SGuennadi Liakhovetski #endif 14084eb80146SGuennadi Liakhovetski 14094eb80146SGuennadi Liakhovetski if (cn12_enabled) 14104eb80146SGuennadi Liakhovetski /* I/O buffer drive ability is high for CN12 */ 14114eb80146SGuennadi Liakhovetski __raw_writew((__raw_readw(IODRIVEA) & ~0x3000) | 0x2000, 14124eb80146SGuennadi Liakhovetski IODRIVEA); 14134eb80146SGuennadi Liakhovetski 1414207efd07SKuninori Morimoto /* enable Video */ 1415207efd07SKuninori Morimoto gpio_request(GPIO_PTU2, NULL); 1416207efd07SKuninori Morimoto gpio_direction_output(GPIO_PTU2, 1); 1417207efd07SKuninori Morimoto 14189aa25d64SKuninori Morimoto /* enable Camera */ 14199aa25d64SKuninori Morimoto gpio_request(GPIO_PTA3, NULL); 14209aa25d64SKuninori Morimoto gpio_request(GPIO_PTA4, NULL); 14219aa25d64SKuninori Morimoto gpio_direction_output(GPIO_PTA3, 0); 14229aa25d64SKuninori Morimoto gpio_direction_output(GPIO_PTA4, 0); 14239aa25d64SKuninori Morimoto 14241980fdc4SKuninori Morimoto /* enable FSI */ 14251980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIMCKB, NULL); 14261980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBSD, NULL); 14271980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBSD, NULL); 14281980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBBCK, NULL); 14291980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIIBLRCK, NULL); 14301980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBBCK, NULL); 14311980fdc4SKuninori Morimoto gpio_request(GPIO_FN_FSIOBLRCK, NULL); 14321980fdc4SKuninori Morimoto gpio_request(GPIO_FN_CLKAUDIOBO, NULL); 14331980fdc4SKuninori Morimoto 143416afc9fbSKuninori Morimoto /* set SPU2 clock to 83.4 MHz */ 143516afc9fbSKuninori Morimoto clk = clk_get(NULL, "spu_clk"); 143656ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 143716afc9fbSKuninori Morimoto clk_set_rate(clk, clk_round_rate(clk, 83333333)); 143816afc9fbSKuninori Morimoto clk_put(clk); 143910305853SKuninori Morimoto } 144016afc9fbSKuninori Morimoto 14411980fdc4SKuninori Morimoto /* change parent of FSI B */ 14421980fdc4SKuninori Morimoto clk = clk_get(NULL, "fsib_clk"); 144356ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 14444bd5d259SKuninori Morimoto /* 48kHz dummy clock was used to make sure 1/1 divide */ 14454bd5d259SKuninori Morimoto clk_set_rate(&sh7724_fsimckb_clk, 48000); 14464bd5d259SKuninori Morimoto clk_set_parent(clk, &sh7724_fsimckb_clk); 14474bd5d259SKuninori Morimoto clk_set_rate(clk, 48000); 14481980fdc4SKuninori Morimoto clk_put(clk); 144910305853SKuninori Morimoto } 14501980fdc4SKuninori Morimoto 14511980fdc4SKuninori Morimoto gpio_request(GPIO_PTU0, NULL); 14521980fdc4SKuninori Morimoto gpio_direction_output(GPIO_PTU0, 0); 14531980fdc4SKuninori Morimoto mdelay(20); 14541980fdc4SKuninori Morimoto 1455ea440783SNISHIMOTO Hiroki /* enable motion sensor */ 1456ea440783SNISHIMOTO Hiroki gpio_request(GPIO_FN_INTC_IRQ1, NULL); 1457ea440783SNISHIMOTO Hiroki gpio_direction_input(GPIO_FN_INTC_IRQ1); 1458ea440783SNISHIMOTO Hiroki 14596f26d19fSMagnus Damm /* set VPU clock to 166 MHz */ 14606f26d19fSMagnus Damm clk = clk_get(NULL, "vpu_clk"); 146156ea5109SGuennadi Liakhovetski if (!IS_ERR(clk)) { 14626f26d19fSMagnus Damm clk_set_rate(clk, clk_round_rate(clk, 166000000)); 14636f26d19fSMagnus Damm clk_put(clk); 146410305853SKuninori Morimoto } 14656f26d19fSMagnus Damm 146626365716SKuninori Morimoto /* enable IrDA */ 146726365716SKuninori Morimoto gpio_request(GPIO_FN_IRDA_OUT, NULL); 146826365716SKuninori Morimoto gpio_request(GPIO_FN_IRDA_IN, NULL); 146926365716SKuninori Morimoto gpio_request(GPIO_PTU5, NULL); 147026365716SKuninori Morimoto gpio_direction_output(GPIO_PTU5, 0); 147126365716SKuninori Morimoto 1472125ecce6SKuninori Morimoto /* enable I2C device */ 14731980fdc4SKuninori Morimoto i2c_register_board_info(0, i2c0_devices, 14741980fdc4SKuninori Morimoto ARRAY_SIZE(i2c0_devices)); 14751980fdc4SKuninori Morimoto 1476125ecce6SKuninori Morimoto i2c_register_board_info(1, i2c1_devices, 1477125ecce6SKuninori Morimoto ARRAY_SIZE(i2c1_devices)); 1478125ecce6SKuninori Morimoto 147992359a70SGuennadi Liakhovetski #if defined(CONFIG_VIDEO_SH_VOU) || defined(CONFIG_VIDEO_SH_VOU_MODULE) 1480aee5ab0bSGuennadi Liakhovetski /* VOU */ 1481aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D15, NULL); 1482aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D14, NULL); 1483aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D13, NULL); 1484aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D12, NULL); 1485aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D11, NULL); 1486aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D10, NULL); 1487aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D9, NULL); 1488aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_D8, NULL); 1489aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_CLKI, NULL); 1490aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_CLK, NULL); 1491aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_VSYNC, NULL); 1492aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_FN_DV_HSYNC, NULL); 1493aee5ab0bSGuennadi Liakhovetski 1494aee5ab0bSGuennadi Liakhovetski /* AK8813 power / reset sequence */ 1495aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_PTG4, NULL); 1496aee5ab0bSGuennadi Liakhovetski gpio_request(GPIO_PTU3, NULL); 1497aee5ab0bSGuennadi Liakhovetski /* Reset */ 1498aee5ab0bSGuennadi Liakhovetski gpio_direction_output(GPIO_PTG4, 0); 1499aee5ab0bSGuennadi Liakhovetski /* Power down */ 1500aee5ab0bSGuennadi Liakhovetski gpio_direction_output(GPIO_PTU3, 1); 1501aee5ab0bSGuennadi Liakhovetski 1502aee5ab0bSGuennadi Liakhovetski udelay(10); 1503aee5ab0bSGuennadi Liakhovetski 1504aee5ab0bSGuennadi Liakhovetski /* Power up, reset */ 1505aee5ab0bSGuennadi Liakhovetski gpio_set_value(GPIO_PTU3, 0); 1506aee5ab0bSGuennadi Liakhovetski 1507aee5ab0bSGuennadi Liakhovetski udelay(10); 1508aee5ab0bSGuennadi Liakhovetski 1509aee5ab0bSGuennadi Liakhovetski /* Remove reset */ 1510aee5ab0bSGuennadi Liakhovetski gpio_set_value(GPIO_PTG4, 1); 151192359a70SGuennadi Liakhovetski #endif 1512aee5ab0bSGuennadi Liakhovetski 15134138b740SKuninori Morimoto return platform_add_devices(ecovec_devices, 15144138b740SKuninori Morimoto ARRAY_SIZE(ecovec_devices)); 15154138b740SKuninori Morimoto } 15164907d57fSKuninori Morimoto arch_initcall(arch_setup); 15174907d57fSKuninori Morimoto 15184907d57fSKuninori Morimoto static int __init devices_setup(void) 15194907d57fSKuninori Morimoto { 1520376abbb4SMagnus Damm sh_eth_init(&sh_eth_plat); 15214907d57fSKuninori Morimoto return 0; 15224907d57fSKuninori Morimoto } 15234907d57fSKuninori Morimoto device_initcall(devices_setup); 15244907d57fSKuninori Morimoto 15254138b740SKuninori Morimoto static struct sh_machine_vector mv_ecovec __initmv = { 15264138b740SKuninori Morimoto .mv_name = "R0P7724 (EcoVec)", 15274138b740SKuninori Morimoto }; 1528