13db91708SLuca Santini /* 23db91708SLuca Santini * Renesas Europe EDOSK7760 Board Support 33db91708SLuca Santini * 43db91708SLuca Santini * Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd. 53db91708SLuca Santini * Author: Luca Santini <luca.santini@spesonline.com> 63db91708SLuca Santini * 73db91708SLuca Santini * This program is free software; you can redistribute it and/or modify 83db91708SLuca Santini * it under the terms of the GNU General Public License as published by 93db91708SLuca Santini * the Free Software Foundation; either version 2 of the License, or 103db91708SLuca Santini * (at your option) any later version. 113db91708SLuca Santini * 123db91708SLuca Santini * This program is distributed in the hope that it will be useful, 133db91708SLuca Santini * but WITHOUT ANY WARRANTY; without even the implied warranty of 143db91708SLuca Santini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 153db91708SLuca Santini * GNU General Public License for more details. 163db91708SLuca Santini * 173db91708SLuca Santini * You should have received a copy of the GNU General Public License 183db91708SLuca Santini * along with this program; if not, write to the Free Software 193db91708SLuca Santini * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 203db91708SLuca Santini */ 213db91708SLuca Santini #include <linux/init.h> 223db91708SLuca Santini #include <linux/types.h> 233db91708SLuca Santini #include <linux/platform_device.h> 243db91708SLuca Santini #include <linux/smc91x.h> 253db91708SLuca Santini #include <linux/interrupt.h> 263db91708SLuca Santini #include <linux/i2c.h> 274018ffcfSLuca Santini #include <linux/mtd/physmap.h> 283db91708SLuca Santini #include <asm/machvec.h> 293db91708SLuca Santini #include <asm/io.h> 303db91708SLuca Santini #include <asm/addrspace.h> 313db91708SLuca Santini #include <asm/delay.h> 323db91708SLuca Santini #include <asm/i2c-sh7760.h> 33347cd34fSLuca Santini #include <asm/sizes.h> 343db91708SLuca Santini 353db91708SLuca Santini /* Bus state controller registers for CS4 area */ 363db91708SLuca Santini #define BSC_CS4BCR 0xA4FD0010 373db91708SLuca Santini #define BSC_CS4WCR 0xA4FD0030 383db91708SLuca Santini 393db91708SLuca Santini #define SMC_IOBASE 0xA2000000 403db91708SLuca Santini #define SMC_IO_OFFSET 0x300 413db91708SLuca Santini #define SMC_IOADDR (SMC_IOBASE + SMC_IO_OFFSET) 423db91708SLuca Santini 433db91708SLuca Santini #define ETHERNET_IRQ 5 443db91708SLuca Santini 454018ffcfSLuca Santini /* NOR flash */ 464018ffcfSLuca Santini static struct mtd_partition edosk7760_nor_flash_partitions[] = { 474018ffcfSLuca Santini { 484018ffcfSLuca Santini .name = "bootloader", 494018ffcfSLuca Santini .offset = 0, 50347cd34fSLuca Santini .size = SZ_256K, 514018ffcfSLuca Santini .mask_flags = MTD_WRITEABLE, /* Read-only */ 524018ffcfSLuca Santini }, { 534018ffcfSLuca Santini .name = "kernel", 544018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 55347cd34fSLuca Santini .size = SZ_2M, 564018ffcfSLuca Santini }, { 574018ffcfSLuca Santini .name = "fs", 584018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 59347cd34fSLuca Santini .size = SZ_26M, 604018ffcfSLuca Santini }, { 614018ffcfSLuca Santini .name = "other", 624018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 634018ffcfSLuca Santini .size = MTDPART_SIZ_FULL, 644018ffcfSLuca Santini }, 654018ffcfSLuca Santini }; 664018ffcfSLuca Santini 674018ffcfSLuca Santini static struct physmap_flash_data edosk7760_nor_flash_data = { 684018ffcfSLuca Santini .width = 4, 694018ffcfSLuca Santini .parts = edosk7760_nor_flash_partitions, 704018ffcfSLuca Santini .nr_parts = ARRAY_SIZE(edosk7760_nor_flash_partitions), 714018ffcfSLuca Santini }; 724018ffcfSLuca Santini 734018ffcfSLuca Santini static struct resource edosk7760_nor_flash_resources[] = { 744018ffcfSLuca Santini [0] = { 754018ffcfSLuca Santini .name = "NOR Flash", 764018ffcfSLuca Santini .start = 0x00000000, 77347cd34fSLuca Santini .end = 0x00000000 + SZ_32M - 1, 784018ffcfSLuca Santini .flags = IORESOURCE_MEM, 794018ffcfSLuca Santini } 804018ffcfSLuca Santini }; 814018ffcfSLuca Santini 824018ffcfSLuca Santini static struct platform_device edosk7760_nor_flash_device = { 834018ffcfSLuca Santini .name = "physmap-flash", 844018ffcfSLuca Santini .resource = edosk7760_nor_flash_resources, 854018ffcfSLuca Santini .num_resources = ARRAY_SIZE(edosk7760_nor_flash_resources), 864018ffcfSLuca Santini .dev = { 874018ffcfSLuca Santini .platform_data = &edosk7760_nor_flash_data, 884018ffcfSLuca Santini }, 894018ffcfSLuca Santini }; 904018ffcfSLuca Santini 913db91708SLuca Santini /* i2c initialization functions */ 923db91708SLuca Santini static struct sh7760_i2c_platdata i2c_pd = { 933db91708SLuca Santini .speed_khz = 400, 943db91708SLuca Santini }; 953db91708SLuca Santini 963db91708SLuca Santini static struct resource sh7760_i2c1_res[] = { 973db91708SLuca Santini { 983db91708SLuca Santini .start = SH7760_I2C1_MMIO, 993db91708SLuca Santini .end = SH7760_I2C1_MMIOEND, 1003db91708SLuca Santini .flags = IORESOURCE_MEM, 1013db91708SLuca Santini },{ 1023db91708SLuca Santini .start = SH7760_I2C1_IRQ, 1033db91708SLuca Santini .end = SH7760_I2C1_IRQ, 1043db91708SLuca Santini .flags = IORESOURCE_IRQ, 1053db91708SLuca Santini }, 1063db91708SLuca Santini }; 1073db91708SLuca Santini 1083db91708SLuca Santini static struct platform_device sh7760_i2c1_dev = { 1093db91708SLuca Santini .dev = { 1103db91708SLuca Santini .platform_data = &i2c_pd, 1113db91708SLuca Santini }, 1123db91708SLuca Santini 1133db91708SLuca Santini .name = SH7760_I2C_DEVNAME, 1143db91708SLuca Santini .id = 1, 1153db91708SLuca Santini .resource = sh7760_i2c1_res, 1163db91708SLuca Santini .num_resources = ARRAY_SIZE(sh7760_i2c1_res), 1173db91708SLuca Santini }; 1183db91708SLuca Santini 1193db91708SLuca Santini static struct resource sh7760_i2c0_res[] = { 1203db91708SLuca Santini { 1213db91708SLuca Santini .start = SH7760_I2C0_MMIO, 1223db91708SLuca Santini .end = SH7760_I2C0_MMIOEND, 1233db91708SLuca Santini .flags = IORESOURCE_MEM, 1243db91708SLuca Santini }, { 1253db91708SLuca Santini .start = SH7760_I2C0_IRQ, 1263db91708SLuca Santini .end = SH7760_I2C0_IRQ, 1273db91708SLuca Santini .flags = IORESOURCE_IRQ, 1283db91708SLuca Santini }, 1293db91708SLuca Santini }; 1303db91708SLuca Santini 1313db91708SLuca Santini static struct platform_device sh7760_i2c0_dev = { 1323db91708SLuca Santini .dev = { 1333db91708SLuca Santini .platform_data = &i2c_pd, 1343db91708SLuca Santini }, 1353db91708SLuca Santini .name = SH7760_I2C_DEVNAME, 1363db91708SLuca Santini .id = 0, 1373db91708SLuca Santini .resource = sh7760_i2c0_res, 1383db91708SLuca Santini .num_resources = ARRAY_SIZE(sh7760_i2c0_res), 1393db91708SLuca Santini }; 1403db91708SLuca Santini 1413db91708SLuca Santini /* eth initialization functions */ 1423db91708SLuca Santini static struct smc91x_platdata smc91x_info = { 1433db91708SLuca Santini .flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL, 1443db91708SLuca Santini }; 1453db91708SLuca Santini 1463db91708SLuca Santini static struct resource smc91x_res[] = { 1473db91708SLuca Santini [0] = { 1483db91708SLuca Santini .start = SMC_IOADDR, 149347cd34fSLuca Santini .end = SMC_IOADDR + SZ_32 - 1, 1503db91708SLuca Santini .flags = IORESOURCE_MEM, 1513db91708SLuca Santini }, 1523db91708SLuca Santini [1] = { 1533db91708SLuca Santini .start = ETHERNET_IRQ, 1543db91708SLuca Santini .end = ETHERNET_IRQ, 1553db91708SLuca Santini .flags = IORESOURCE_IRQ , 1563db91708SLuca Santini } 1573db91708SLuca Santini }; 1583db91708SLuca Santini 1593db91708SLuca Santini static struct platform_device smc91x_dev = { 1603db91708SLuca Santini .name = "smc91x", 1613db91708SLuca Santini .id = -1, 1623db91708SLuca Santini .num_resources = ARRAY_SIZE(smc91x_res), 1633db91708SLuca Santini .resource = smc91x_res, 1643db91708SLuca Santini 1653db91708SLuca Santini .dev = { 1663db91708SLuca Santini .platform_data = &smc91x_info, 1673db91708SLuca Santini }, 1683db91708SLuca Santini }; 1693db91708SLuca Santini 1703db91708SLuca Santini /* platform init code */ 1713db91708SLuca Santini static struct platform_device *edosk7760_devices[] __initdata = { 1724018ffcfSLuca Santini &smc91x_dev, 1734018ffcfSLuca Santini &edosk7760_nor_flash_device, 1743db91708SLuca Santini &sh7760_i2c0_dev, 1753db91708SLuca Santini &sh7760_i2c1_dev, 1763db91708SLuca Santini }; 1773db91708SLuca Santini 1783db91708SLuca Santini static int __init init_edosk7760_devices(void) 1793db91708SLuca Santini { 1803db91708SLuca Santini plat_irq_setup_pins(IRQ_MODE_IRQ); 1813db91708SLuca Santini 1823db91708SLuca Santini return platform_add_devices(edosk7760_devices, 1833db91708SLuca Santini ARRAY_SIZE(edosk7760_devices)); 1843db91708SLuca Santini } 1853db91708SLuca Santini __initcall(init_edosk7760_devices); 1863db91708SLuca Santini 1873db91708SLuca Santini /* 1883db91708SLuca Santini * The Machine Vector 1893db91708SLuca Santini */ 1903db91708SLuca Santini struct sh_machine_vector mv_edosk7760 __initmv = { 1913db91708SLuca Santini .mv_name = "EDOSK7760", 1923db91708SLuca Santini .mv_nr_irqs = 128, 1933db91708SLuca Santini }; 194