Path: blob/master/arch/sh/boards/board-sh7757lcr.c
10817 views
/*1* Renesas R0P7757LC0012RL Support.2*3* Copyright (C) 2009 - 2010 Renesas Solutions Corp.4*5* This file is subject to the terms and conditions of the GNU General Public6* License. See the file "COPYING" in the main directory of this archive7* for more details.8*/910#include <linux/init.h>11#include <linux/platform_device.h>12#include <linux/gpio.h>13#include <linux/irq.h>14#include <linux/spi/spi.h>15#include <linux/spi/flash.h>16#include <linux/io.h>17#include <linux/mmc/host.h>18#include <linux/mmc/sh_mmcif.h>19#include <linux/mmc/sh_mobile_sdhi.h>20#include <cpu/sh7757.h>21#include <asm/sh_eth.h>22#include <asm/heartbeat.h>2324static struct resource heartbeat_resource = {25.start = 0xffec005c, /* PUDR */26.end = 0xffec005c,27.flags = IORESOURCE_MEM | IORESOURCE_MEM_8BIT,28};2930static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3 };3132static struct heartbeat_data heartbeat_data = {33.bit_pos = heartbeat_bit_pos,34.nr_bits = ARRAY_SIZE(heartbeat_bit_pos),35.flags = HEARTBEAT_INVERTED,36};3738static struct platform_device heartbeat_device = {39.name = "heartbeat",40.id = -1,41.dev = {42.platform_data = &heartbeat_data,43},44.num_resources = 1,45.resource = &heartbeat_resource,46};4748/* Fast Ethernet */49#define GBECONT 0xffc1010050#define GBECONT_RMII1 BIT(17)51#define GBECONT_RMII0 BIT(16)52static void sh7757_eth_set_mdio_gate(unsigned long addr)53{54if ((addr & 0x00000fff) < 0x0800)55writel(readl(GBECONT) | GBECONT_RMII0, GBECONT);56else57writel(readl(GBECONT) | GBECONT_RMII1, GBECONT);58}5960static struct resource sh_eth0_resources[] = {61{62.start = 0xfef00000,63.end = 0xfef001ff,64.flags = IORESOURCE_MEM,65}, {66.start = 84,67.end = 84,68.flags = IORESOURCE_IRQ,69},70};7172static struct sh_eth_plat_data sh7757_eth0_pdata = {73.phy = 1,74.edmac_endian = EDMAC_LITTLE_ENDIAN,75.register_type = SH_ETH_REG_FAST_SH4,76.set_mdio_gate = sh7757_eth_set_mdio_gate,77};7879static struct platform_device sh7757_eth0_device = {80.name = "sh-eth",81.resource = sh_eth0_resources,82.id = 0,83.num_resources = ARRAY_SIZE(sh_eth0_resources),84.dev = {85.platform_data = &sh7757_eth0_pdata,86},87};8889static struct resource sh_eth1_resources[] = {90{91.start = 0xfef00800,92.end = 0xfef009ff,93.flags = IORESOURCE_MEM,94}, {95.start = 84,96.end = 84,97.flags = IORESOURCE_IRQ,98},99};100101static struct sh_eth_plat_data sh7757_eth1_pdata = {102.phy = 1,103.edmac_endian = EDMAC_LITTLE_ENDIAN,104.register_type = SH_ETH_REG_FAST_SH4,105.set_mdio_gate = sh7757_eth_set_mdio_gate,106};107108static struct platform_device sh7757_eth1_device = {109.name = "sh-eth",110.resource = sh_eth1_resources,111.id = 1,112.num_resources = ARRAY_SIZE(sh_eth1_resources),113.dev = {114.platform_data = &sh7757_eth1_pdata,115},116};117118static void sh7757_eth_giga_set_mdio_gate(unsigned long addr)119{120if ((addr & 0x00000fff) < 0x0800) {121gpio_set_value(GPIO_PTT4, 1);122writel(readl(GBECONT) & ~GBECONT_RMII0, GBECONT);123} else {124gpio_set_value(GPIO_PTT4, 0);125writel(readl(GBECONT) & ~GBECONT_RMII1, GBECONT);126}127}128129static struct resource sh_eth_giga0_resources[] = {130{131.start = 0xfee00000,132.end = 0xfee007ff,133.flags = IORESOURCE_MEM,134}, {135/* TSU */136.start = 0xfee01800,137.end = 0xfee01fff,138.flags = IORESOURCE_MEM,139}, {140.start = 315,141.end = 315,142.flags = IORESOURCE_IRQ,143},144};145146static struct sh_eth_plat_data sh7757_eth_giga0_pdata = {147.phy = 18,148.edmac_endian = EDMAC_LITTLE_ENDIAN,149.register_type = SH_ETH_REG_GIGABIT,150.set_mdio_gate = sh7757_eth_giga_set_mdio_gate,151.phy_interface = PHY_INTERFACE_MODE_RGMII_ID,152};153154static struct platform_device sh7757_eth_giga0_device = {155.name = "sh-eth",156.resource = sh_eth_giga0_resources,157.id = 2,158.num_resources = ARRAY_SIZE(sh_eth_giga0_resources),159.dev = {160.platform_data = &sh7757_eth_giga0_pdata,161},162};163164static struct resource sh_eth_giga1_resources[] = {165{166.start = 0xfee00800,167.end = 0xfee00fff,168.flags = IORESOURCE_MEM,169}, {170.start = 316,171.end = 316,172.flags = IORESOURCE_IRQ,173},174};175176static struct sh_eth_plat_data sh7757_eth_giga1_pdata = {177.phy = 19,178.edmac_endian = EDMAC_LITTLE_ENDIAN,179.register_type = SH_ETH_REG_GIGABIT,180.set_mdio_gate = sh7757_eth_giga_set_mdio_gate,181.phy_interface = PHY_INTERFACE_MODE_RGMII_ID,182};183184static struct platform_device sh7757_eth_giga1_device = {185.name = "sh-eth",186.resource = sh_eth_giga1_resources,187.id = 3,188.num_resources = ARRAY_SIZE(sh_eth_giga1_resources),189.dev = {190.platform_data = &sh7757_eth_giga1_pdata,191},192};193194/* SH_MMCIF */195static struct resource sh_mmcif_resources[] = {196[0] = {197.start = 0xffcb0000,198.end = 0xffcb00ff,199.flags = IORESOURCE_MEM,200},201[1] = {202.start = 211,203.flags = IORESOURCE_IRQ,204},205[2] = {206.start = 212,207.flags = IORESOURCE_IRQ,208},209};210211static struct sh_mmcif_dma sh7757lcr_mmcif_dma = {212.chan_priv_tx = SHDMA_SLAVE_MMCIF_TX,213.chan_priv_rx = SHDMA_SLAVE_MMCIF_RX,214};215216static struct sh_mmcif_plat_data sh_mmcif_plat = {217.dma = &sh7757lcr_mmcif_dma,218.sup_pclk = 0x0f,219.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,220.ocr = MMC_VDD_32_33 | MMC_VDD_33_34,221};222223static struct platform_device sh_mmcif_device = {224.name = "sh_mmcif",225.id = 0,226.dev = {227.platform_data = &sh_mmcif_plat,228},229.num_resources = ARRAY_SIZE(sh_mmcif_resources),230.resource = sh_mmcif_resources,231};232233/* SDHI0 */234static struct sh_mobile_sdhi_info sdhi_info = {235.dma_slave_tx = SHDMA_SLAVE_SDHI_TX,236.dma_slave_rx = SHDMA_SLAVE_SDHI_RX,237.tmio_caps = MMC_CAP_SD_HIGHSPEED,238};239240static struct resource sdhi_resources[] = {241[0] = {242.start = 0xffe50000,243.end = 0xffe501ff,244.flags = IORESOURCE_MEM,245},246[1] = {247.start = 20,248.flags = IORESOURCE_IRQ,249},250};251252static struct platform_device sdhi_device = {253.name = "sh_mobile_sdhi",254.num_resources = ARRAY_SIZE(sdhi_resources),255.resource = sdhi_resources,256.id = 0,257.dev = {258.platform_data = &sdhi_info,259},260};261262static struct platform_device *sh7757lcr_devices[] __initdata = {263&heartbeat_device,264&sh7757_eth0_device,265&sh7757_eth1_device,266&sh7757_eth_giga0_device,267&sh7757_eth_giga1_device,268&sh_mmcif_device,269&sdhi_device,270};271272static struct flash_platform_data spi_flash_data = {273.name = "m25p80",274.type = "m25px64",275};276277static struct spi_board_info spi_board_info[] = {278{279.modalias = "m25p80",280.max_speed_hz = 25000000,281.bus_num = 0,282.chip_select = 1,283.platform_data = &spi_flash_data,284},285};286287static int __init sh7757lcr_devices_setup(void)288{289/* RGMII (PTA) */290gpio_request(GPIO_FN_ET0_MDC, NULL);291gpio_request(GPIO_FN_ET0_MDIO, NULL);292gpio_request(GPIO_FN_ET1_MDC, NULL);293gpio_request(GPIO_FN_ET1_MDIO, NULL);294295/* ONFI (PTB, PTZ) */296gpio_request(GPIO_FN_ON_NRE, NULL);297gpio_request(GPIO_FN_ON_NWE, NULL);298gpio_request(GPIO_FN_ON_NWP, NULL);299gpio_request(GPIO_FN_ON_NCE0, NULL);300gpio_request(GPIO_FN_ON_R_B0, NULL);301gpio_request(GPIO_FN_ON_ALE, NULL);302gpio_request(GPIO_FN_ON_CLE, NULL);303304gpio_request(GPIO_FN_ON_DQ7, NULL);305gpio_request(GPIO_FN_ON_DQ6, NULL);306gpio_request(GPIO_FN_ON_DQ5, NULL);307gpio_request(GPIO_FN_ON_DQ4, NULL);308gpio_request(GPIO_FN_ON_DQ3, NULL);309gpio_request(GPIO_FN_ON_DQ2, NULL);310gpio_request(GPIO_FN_ON_DQ1, NULL);311gpio_request(GPIO_FN_ON_DQ0, NULL);312313/* IRQ8 to 0 (PTB, PTC) */314gpio_request(GPIO_FN_IRQ8, NULL);315gpio_request(GPIO_FN_IRQ7, NULL);316gpio_request(GPIO_FN_IRQ6, NULL);317gpio_request(GPIO_FN_IRQ5, NULL);318gpio_request(GPIO_FN_IRQ4, NULL);319gpio_request(GPIO_FN_IRQ3, NULL);320gpio_request(GPIO_FN_IRQ2, NULL);321gpio_request(GPIO_FN_IRQ1, NULL);322gpio_request(GPIO_FN_IRQ0, NULL);323324/* SPI0 (PTD) */325gpio_request(GPIO_FN_SP0_MOSI, NULL);326gpio_request(GPIO_FN_SP0_MISO, NULL);327gpio_request(GPIO_FN_SP0_SCK, NULL);328gpio_request(GPIO_FN_SP0_SCK_FB, NULL);329gpio_request(GPIO_FN_SP0_SS0, NULL);330gpio_request(GPIO_FN_SP0_SS1, NULL);331gpio_request(GPIO_FN_SP0_SS2, NULL);332gpio_request(GPIO_FN_SP0_SS3, NULL);333334/* RMII 0/1 (PTE, PTF) */335gpio_request(GPIO_FN_RMII0_CRS_DV, NULL);336gpio_request(GPIO_FN_RMII0_TXD1, NULL);337gpio_request(GPIO_FN_RMII0_TXD0, NULL);338gpio_request(GPIO_FN_RMII0_TXEN, NULL);339gpio_request(GPIO_FN_RMII0_REFCLK, NULL);340gpio_request(GPIO_FN_RMII0_RXD1, NULL);341gpio_request(GPIO_FN_RMII0_RXD0, NULL);342gpio_request(GPIO_FN_RMII0_RX_ER, NULL);343gpio_request(GPIO_FN_RMII1_CRS_DV, NULL);344gpio_request(GPIO_FN_RMII1_TXD1, NULL);345gpio_request(GPIO_FN_RMII1_TXD0, NULL);346gpio_request(GPIO_FN_RMII1_TXEN, NULL);347gpio_request(GPIO_FN_RMII1_REFCLK, NULL);348gpio_request(GPIO_FN_RMII1_RXD1, NULL);349gpio_request(GPIO_FN_RMII1_RXD0, NULL);350gpio_request(GPIO_FN_RMII1_RX_ER, NULL);351352/* eMMC (PTG) */353gpio_request(GPIO_FN_MMCCLK, NULL);354gpio_request(GPIO_FN_MMCCMD, NULL);355gpio_request(GPIO_FN_MMCDAT7, NULL);356gpio_request(GPIO_FN_MMCDAT6, NULL);357gpio_request(GPIO_FN_MMCDAT5, NULL);358gpio_request(GPIO_FN_MMCDAT4, NULL);359gpio_request(GPIO_FN_MMCDAT3, NULL);360gpio_request(GPIO_FN_MMCDAT2, NULL);361gpio_request(GPIO_FN_MMCDAT1, NULL);362gpio_request(GPIO_FN_MMCDAT0, NULL);363364/* LPC (PTG, PTH, PTQ, PTU) */365gpio_request(GPIO_FN_SERIRQ, NULL);366gpio_request(GPIO_FN_LPCPD, NULL);367gpio_request(GPIO_FN_LDRQ, NULL);368gpio_request(GPIO_FN_WP, NULL);369gpio_request(GPIO_FN_FMS0, NULL);370gpio_request(GPIO_FN_LAD3, NULL);371gpio_request(GPIO_FN_LAD2, NULL);372gpio_request(GPIO_FN_LAD1, NULL);373gpio_request(GPIO_FN_LAD0, NULL);374gpio_request(GPIO_FN_LFRAME, NULL);375gpio_request(GPIO_FN_LRESET, NULL);376gpio_request(GPIO_FN_LCLK, NULL);377gpio_request(GPIO_FN_LGPIO7, NULL);378gpio_request(GPIO_FN_LGPIO6, NULL);379gpio_request(GPIO_FN_LGPIO5, NULL);380gpio_request(GPIO_FN_LGPIO4, NULL);381382/* SPI1 (PTH) */383gpio_request(GPIO_FN_SP1_MOSI, NULL);384gpio_request(GPIO_FN_SP1_MISO, NULL);385gpio_request(GPIO_FN_SP1_SCK, NULL);386gpio_request(GPIO_FN_SP1_SCK_FB, NULL);387gpio_request(GPIO_FN_SP1_SS0, NULL);388gpio_request(GPIO_FN_SP1_SS1, NULL);389390/* SDHI (PTI) */391gpio_request(GPIO_FN_SD_WP, NULL);392gpio_request(GPIO_FN_SD_CD, NULL);393gpio_request(GPIO_FN_SD_CLK, NULL);394gpio_request(GPIO_FN_SD_CMD, NULL);395gpio_request(GPIO_FN_SD_D3, NULL);396gpio_request(GPIO_FN_SD_D2, NULL);397gpio_request(GPIO_FN_SD_D1, NULL);398gpio_request(GPIO_FN_SD_D0, NULL);399400/* SCIF3/4 (PTJ, PTW) */401gpio_request(GPIO_FN_RTS3, NULL);402gpio_request(GPIO_FN_CTS3, NULL);403gpio_request(GPIO_FN_TXD3, NULL);404gpio_request(GPIO_FN_RXD3, NULL);405gpio_request(GPIO_FN_RTS4, NULL);406gpio_request(GPIO_FN_RXD4, NULL);407gpio_request(GPIO_FN_TXD4, NULL);408gpio_request(GPIO_FN_CTS4, NULL);409410/* SERMUX (PTK, PTL, PTO, PTV) */411gpio_request(GPIO_FN_COM2_TXD, NULL);412gpio_request(GPIO_FN_COM2_RXD, NULL);413gpio_request(GPIO_FN_COM2_RTS, NULL);414gpio_request(GPIO_FN_COM2_CTS, NULL);415gpio_request(GPIO_FN_COM2_DTR, NULL);416gpio_request(GPIO_FN_COM2_DSR, NULL);417gpio_request(GPIO_FN_COM2_DCD, NULL);418gpio_request(GPIO_FN_COM2_RI, NULL);419gpio_request(GPIO_FN_RAC_RXD, NULL);420gpio_request(GPIO_FN_RAC_RTS, NULL);421gpio_request(GPIO_FN_RAC_CTS, NULL);422gpio_request(GPIO_FN_RAC_DTR, NULL);423gpio_request(GPIO_FN_RAC_DSR, NULL);424gpio_request(GPIO_FN_RAC_DCD, NULL);425gpio_request(GPIO_FN_RAC_TXD, NULL);426gpio_request(GPIO_FN_COM1_TXD, NULL);427gpio_request(GPIO_FN_COM1_RXD, NULL);428gpio_request(GPIO_FN_COM1_RTS, NULL);429gpio_request(GPIO_FN_COM1_CTS, NULL);430431writeb(0x10, 0xfe470000); /* SMR0: SerMux mode 0 */432433/* IIC (PTM, PTR, PTS) */434gpio_request(GPIO_FN_SDA7, NULL);435gpio_request(GPIO_FN_SCL7, NULL);436gpio_request(GPIO_FN_SDA6, NULL);437gpio_request(GPIO_FN_SCL6, NULL);438gpio_request(GPIO_FN_SDA5, NULL);439gpio_request(GPIO_FN_SCL5, NULL);440gpio_request(GPIO_FN_SDA4, NULL);441gpio_request(GPIO_FN_SCL4, NULL);442gpio_request(GPIO_FN_SDA3, NULL);443gpio_request(GPIO_FN_SCL3, NULL);444gpio_request(GPIO_FN_SDA2, NULL);445gpio_request(GPIO_FN_SCL2, NULL);446gpio_request(GPIO_FN_SDA1, NULL);447gpio_request(GPIO_FN_SCL1, NULL);448gpio_request(GPIO_FN_SDA0, NULL);449gpio_request(GPIO_FN_SCL0, NULL);450451/* USB (PTN) */452gpio_request(GPIO_FN_VBUS_EN, NULL);453gpio_request(GPIO_FN_VBUS_OC, NULL);454455/* SGPIO1/0 (PTN, PTO) */456gpio_request(GPIO_FN_SGPIO1_CLK, NULL);457gpio_request(GPIO_FN_SGPIO1_LOAD, NULL);458gpio_request(GPIO_FN_SGPIO1_DI, NULL);459gpio_request(GPIO_FN_SGPIO1_DO, NULL);460gpio_request(GPIO_FN_SGPIO0_CLK, NULL);461gpio_request(GPIO_FN_SGPIO0_LOAD, NULL);462gpio_request(GPIO_FN_SGPIO0_DI, NULL);463gpio_request(GPIO_FN_SGPIO0_DO, NULL);464465/* WDT (PTN) */466gpio_request(GPIO_FN_SUB_CLKIN, NULL);467468/* System (PTT) */469gpio_request(GPIO_FN_STATUS1, NULL);470gpio_request(GPIO_FN_STATUS0, NULL);471472/* PWMX (PTT) */473gpio_request(GPIO_FN_PWMX1, NULL);474gpio_request(GPIO_FN_PWMX0, NULL);475476/* R-SPI (PTV) */477gpio_request(GPIO_FN_R_SPI_MOSI, NULL);478gpio_request(GPIO_FN_R_SPI_MISO, NULL);479gpio_request(GPIO_FN_R_SPI_RSPCK, NULL);480gpio_request(GPIO_FN_R_SPI_SSL0, NULL);481gpio_request(GPIO_FN_R_SPI_SSL1, NULL);482483/* EVC (PTV, PTW) */484gpio_request(GPIO_FN_EVENT7, NULL);485gpio_request(GPIO_FN_EVENT6, NULL);486gpio_request(GPIO_FN_EVENT5, NULL);487gpio_request(GPIO_FN_EVENT4, NULL);488gpio_request(GPIO_FN_EVENT3, NULL);489gpio_request(GPIO_FN_EVENT2, NULL);490gpio_request(GPIO_FN_EVENT1, NULL);491gpio_request(GPIO_FN_EVENT0, NULL);492493/* LED for heartbeat */494gpio_request(GPIO_PTU3, NULL);495gpio_direction_output(GPIO_PTU3, 1);496gpio_request(GPIO_PTU2, NULL);497gpio_direction_output(GPIO_PTU2, 1);498gpio_request(GPIO_PTU1, NULL);499gpio_direction_output(GPIO_PTU1, 1);500gpio_request(GPIO_PTU0, NULL);501gpio_direction_output(GPIO_PTU0, 1);502503/* control for MDIO of Gigabit Ethernet */504gpio_request(GPIO_PTT4, NULL);505gpio_direction_output(GPIO_PTT4, 1);506507/* control for eMMC */508gpio_request(GPIO_PTT7, NULL); /* eMMC_RST# */509gpio_direction_output(GPIO_PTT7, 0);510gpio_request(GPIO_PTT6, NULL); /* eMMC_INDEX# */511gpio_direction_output(GPIO_PTT6, 0);512gpio_request(GPIO_PTT5, NULL); /* eMMC_PRST# */513gpio_direction_output(GPIO_PTT5, 1);514515/* register SPI device information */516spi_register_board_info(spi_board_info,517ARRAY_SIZE(spi_board_info));518519/* General platform */520return platform_add_devices(sh7757lcr_devices,521ARRAY_SIZE(sh7757lcr_devices));522}523arch_initcall(sh7757lcr_devices_setup);524525/* Initialize IRQ setting */526void __init init_sh7757lcr_IRQ(void)527{528plat_irq_setup_pins(IRQ_MODE_IRQ7654);529plat_irq_setup_pins(IRQ_MODE_IRQ3210);530}531532/* Initialize the board */533static void __init sh7757lcr_setup(char **cmdline_p)534{535printk(KERN_INFO "Renesas R0P7757LC0012RL support.\n");536}537538static int sh7757lcr_mode_pins(void)539{540int value = 0;541542/* These are the factory default settings of S3 (Low active).543* If you change these dip switches then you will need to544* adjust the values below as well.545*/546value |= MODE_PIN0; /* Clock Mode: 1 */547548return value;549}550551/* The Machine Vector */552static struct sh_machine_vector mv_sh7757lcr __initmv = {553.mv_name = "SH7757LCR",554.mv_setup = sh7757lcr_setup,555.mv_init_irq = init_sh7757lcr_IRQ,556.mv_mode_pins = sh7757lcr_mode_pins,557};558559560561