1aaf9128aSKuninori Morimoto // SPDX-License-Identifier: GPL-2.0+ 23db91708SLuca Santini /* 33db91708SLuca Santini * Renesas Europe EDOSK7760 Board Support 43db91708SLuca Santini * 53db91708SLuca Santini * Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd. 63db91708SLuca Santini * Author: Luca Santini <luca.santini@spesonline.com> 73db91708SLuca Santini */ 83db91708SLuca Santini #include <linux/init.h> 93db91708SLuca Santini #include <linux/types.h> 103db91708SLuca Santini #include <linux/platform_device.h> 113db91708SLuca Santini #include <linux/smc91x.h> 123db91708SLuca Santini #include <linux/interrupt.h> 1303c5713cSPaul Mundt #include <linux/sh_intc.h> 143db91708SLuca Santini #include <linux/i2c.h> 154018ffcfSLuca Santini #include <linux/mtd/physmap.h> 163db91708SLuca Santini #include <asm/machvec.h> 173db91708SLuca Santini #include <asm/io.h> 183db91708SLuca Santini #include <asm/addrspace.h> 193db91708SLuca Santini #include <asm/delay.h> 203db91708SLuca Santini #include <asm/i2c-sh7760.h> 21347cd34fSLuca Santini #include <asm/sizes.h> 223db91708SLuca Santini 233db91708SLuca Santini /* Bus state controller registers for CS4 area */ 243db91708SLuca Santini #define BSC_CS4BCR 0xA4FD0010 253db91708SLuca Santini #define BSC_CS4WCR 0xA4FD0030 263db91708SLuca Santini 273db91708SLuca Santini #define SMC_IOBASE 0xA2000000 283db91708SLuca Santini #define SMC_IO_OFFSET 0x300 293db91708SLuca Santini #define SMC_IOADDR (SMC_IOBASE + SMC_IO_OFFSET) 303db91708SLuca Santini 314018ffcfSLuca Santini /* NOR flash */ 324018ffcfSLuca Santini static struct mtd_partition edosk7760_nor_flash_partitions[] = { 334018ffcfSLuca Santini { 344018ffcfSLuca Santini .name = "bootloader", 354018ffcfSLuca Santini .offset = 0, 36347cd34fSLuca Santini .size = SZ_256K, 374018ffcfSLuca Santini .mask_flags = MTD_WRITEABLE, /* Read-only */ 384018ffcfSLuca Santini }, { 394018ffcfSLuca Santini .name = "kernel", 404018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 41347cd34fSLuca Santini .size = SZ_2M, 424018ffcfSLuca Santini }, { 434018ffcfSLuca Santini .name = "fs", 444018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 45f47adbb9SPaul Mundt .size = (26 << 20), 464018ffcfSLuca Santini }, { 474018ffcfSLuca Santini .name = "other", 484018ffcfSLuca Santini .offset = MTDPART_OFS_APPEND, 494018ffcfSLuca Santini .size = MTDPART_SIZ_FULL, 504018ffcfSLuca Santini }, 514018ffcfSLuca Santini }; 524018ffcfSLuca Santini 534018ffcfSLuca Santini static struct physmap_flash_data edosk7760_nor_flash_data = { 544018ffcfSLuca Santini .width = 4, 554018ffcfSLuca Santini .parts = edosk7760_nor_flash_partitions, 564018ffcfSLuca Santini .nr_parts = ARRAY_SIZE(edosk7760_nor_flash_partitions), 574018ffcfSLuca Santini }; 584018ffcfSLuca Santini 594018ffcfSLuca Santini static struct resource edosk7760_nor_flash_resources[] = { 604018ffcfSLuca Santini [0] = { 614018ffcfSLuca Santini .name = "NOR Flash", 624018ffcfSLuca Santini .start = 0x00000000, 63347cd34fSLuca Santini .end = 0x00000000 + SZ_32M - 1, 644018ffcfSLuca Santini .flags = IORESOURCE_MEM, 654018ffcfSLuca Santini } 664018ffcfSLuca Santini }; 674018ffcfSLuca Santini 684018ffcfSLuca Santini static struct platform_device edosk7760_nor_flash_device = { 694018ffcfSLuca Santini .name = "physmap-flash", 704018ffcfSLuca Santini .resource = edosk7760_nor_flash_resources, 714018ffcfSLuca Santini .num_resources = ARRAY_SIZE(edosk7760_nor_flash_resources), 724018ffcfSLuca Santini .dev = { 734018ffcfSLuca Santini .platform_data = &edosk7760_nor_flash_data, 744018ffcfSLuca Santini }, 754018ffcfSLuca Santini }; 764018ffcfSLuca Santini 773db91708SLuca Santini /* i2c initialization functions */ 783db91708SLuca Santini static struct sh7760_i2c_platdata i2c_pd = { 793db91708SLuca Santini .speed_khz = 400, 803db91708SLuca Santini }; 813db91708SLuca Santini 823db91708SLuca Santini static struct resource sh7760_i2c1_res[] = { 833db91708SLuca Santini { 843db91708SLuca Santini .start = SH7760_I2C1_MMIO, 853db91708SLuca Santini .end = SH7760_I2C1_MMIOEND, 863db91708SLuca Santini .flags = IORESOURCE_MEM, 873db91708SLuca Santini },{ 8803c5713cSPaul Mundt .start = evt2irq(0x9e0), 8903c5713cSPaul Mundt .end = evt2irq(0x9e0), 903db91708SLuca Santini .flags = IORESOURCE_IRQ, 913db91708SLuca Santini }, 923db91708SLuca Santini }; 933db91708SLuca Santini 943db91708SLuca Santini static struct platform_device sh7760_i2c1_dev = { 953db91708SLuca Santini .dev = { 963db91708SLuca Santini .platform_data = &i2c_pd, 973db91708SLuca Santini }, 983db91708SLuca Santini 993db91708SLuca Santini .name = SH7760_I2C_DEVNAME, 1003db91708SLuca Santini .id = 1, 1013db91708SLuca Santini .resource = sh7760_i2c1_res, 1023db91708SLuca Santini .num_resources = ARRAY_SIZE(sh7760_i2c1_res), 1033db91708SLuca Santini }; 1043db91708SLuca Santini 1053db91708SLuca Santini static struct resource sh7760_i2c0_res[] = { 1063db91708SLuca Santini { 1073db91708SLuca Santini .start = SH7760_I2C0_MMIO, 1083db91708SLuca Santini .end = SH7760_I2C0_MMIOEND, 1093db91708SLuca Santini .flags = IORESOURCE_MEM, 1103db91708SLuca Santini }, { 11103c5713cSPaul Mundt .start = evt2irq(0x9c0), 11203c5713cSPaul Mundt .end = evt2irq(0x9c0), 1133db91708SLuca Santini .flags = IORESOURCE_IRQ, 1143db91708SLuca Santini }, 1153db91708SLuca Santini }; 1163db91708SLuca Santini 1173db91708SLuca Santini static struct platform_device sh7760_i2c0_dev = { 1183db91708SLuca Santini .dev = { 1193db91708SLuca Santini .platform_data = &i2c_pd, 1203db91708SLuca Santini }, 1213db91708SLuca Santini .name = SH7760_I2C_DEVNAME, 1223db91708SLuca Santini .id = 0, 1233db91708SLuca Santini .resource = sh7760_i2c0_res, 1243db91708SLuca Santini .num_resources = ARRAY_SIZE(sh7760_i2c0_res), 1253db91708SLuca Santini }; 1263db91708SLuca Santini 1273db91708SLuca Santini /* eth initialization functions */ 1283db91708SLuca Santini static struct smc91x_platdata smc91x_info = { 1293db91708SLuca Santini .flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL, 1303db91708SLuca Santini }; 1313db91708SLuca Santini 1323db91708SLuca Santini static struct resource smc91x_res[] = { 1333db91708SLuca Santini [0] = { 1343db91708SLuca Santini .start = SMC_IOADDR, 135347cd34fSLuca Santini .end = SMC_IOADDR + SZ_32 - 1, 1363db91708SLuca Santini .flags = IORESOURCE_MEM, 1373db91708SLuca Santini }, 1383db91708SLuca Santini [1] = { 13903c5713cSPaul Mundt .start = evt2irq(0x2a0), 14003c5713cSPaul Mundt .end = evt2irq(0x2a0), 1413db91708SLuca Santini .flags = IORESOURCE_IRQ , 1423db91708SLuca Santini } 1433db91708SLuca Santini }; 1443db91708SLuca Santini 1453db91708SLuca Santini static struct platform_device smc91x_dev = { 1463db91708SLuca Santini .name = "smc91x", 1473db91708SLuca Santini .id = -1, 1483db91708SLuca Santini .num_resources = ARRAY_SIZE(smc91x_res), 1493db91708SLuca Santini .resource = smc91x_res, 1503db91708SLuca Santini 1513db91708SLuca Santini .dev = { 1523db91708SLuca Santini .platform_data = &smc91x_info, 1533db91708SLuca Santini }, 1543db91708SLuca Santini }; 1553db91708SLuca Santini 1563db91708SLuca Santini /* platform init code */ 1573db91708SLuca Santini static struct platform_device *edosk7760_devices[] __initdata = { 1584018ffcfSLuca Santini &smc91x_dev, 1594018ffcfSLuca Santini &edosk7760_nor_flash_device, 1603db91708SLuca Santini &sh7760_i2c0_dev, 1613db91708SLuca Santini &sh7760_i2c1_dev, 1623db91708SLuca Santini }; 1633db91708SLuca Santini 1643db91708SLuca Santini static int __init init_edosk7760_devices(void) 1653db91708SLuca Santini { 1663db91708SLuca Santini plat_irq_setup_pins(IRQ_MODE_IRQ); 1673db91708SLuca Santini 1683db91708SLuca Santini return platform_add_devices(edosk7760_devices, 1693db91708SLuca Santini ARRAY_SIZE(edosk7760_devices)); 1703db91708SLuca Santini } 17195d210ceSNobuhiro Iwamatsu device_initcall(init_edosk7760_devices); 1723db91708SLuca Santini 1733db91708SLuca Santini /* 1743db91708SLuca Santini * The Machine Vector 1753db91708SLuca Santini */ 1763db91708SLuca Santini struct sh_machine_vector mv_edosk7760 __initmv = { 1773db91708SLuca Santini .mv_name = "EDOSK7760", 1783db91708SLuca Santini }; 179