1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Renesas Europe EDOSK7760 Board Support 4 * 5 * Copyright (C) 2008 SPES Societa' Progettazione Elettronica e Software Ltd. 6 * Author: Luca Santini <luca.santini@spesonline.com> 7 */ 8 #include <linux/init.h> 9 #include <linux/types.h> 10 #include <linux/platform_device.h> 11 #include <linux/smc91x.h> 12 #include <linux/interrupt.h> 13 #include <linux/sh_intc.h> 14 #include <linux/i2c.h> 15 #include <linux/mtd/physmap.h> 16 #include <asm/machvec.h> 17 #include <asm/io.h> 18 #include <asm/addrspace.h> 19 #include <asm/delay.h> 20 #include <asm/i2c-sh7760.h> 21 #include <asm/sizes.h> 22 23 /* Bus state controller registers for CS4 area */ 24 #define BSC_CS4BCR 0xA4FD0010 25 #define BSC_CS4WCR 0xA4FD0030 26 27 #define SMC_IOBASE 0xA2000000 28 #define SMC_IO_OFFSET 0x300 29 #define SMC_IOADDR (SMC_IOBASE + SMC_IO_OFFSET) 30 31 /* NOR flash */ 32 static struct mtd_partition edosk7760_nor_flash_partitions[] = { 33 { 34 .name = "bootloader", 35 .offset = 0, 36 .size = SZ_256K, 37 .mask_flags = MTD_WRITEABLE, /* Read-only */ 38 }, { 39 .name = "kernel", 40 .offset = MTDPART_OFS_APPEND, 41 .size = SZ_2M, 42 }, { 43 .name = "fs", 44 .offset = MTDPART_OFS_APPEND, 45 .size = (26 << 20), 46 }, { 47 .name = "other", 48 .offset = MTDPART_OFS_APPEND, 49 .size = MTDPART_SIZ_FULL, 50 }, 51 }; 52 53 static struct physmap_flash_data edosk7760_nor_flash_data = { 54 .width = 4, 55 .parts = edosk7760_nor_flash_partitions, 56 .nr_parts = ARRAY_SIZE(edosk7760_nor_flash_partitions), 57 }; 58 59 static struct resource edosk7760_nor_flash_resources[] = { 60 [0] = { 61 .name = "NOR Flash", 62 .start = 0x00000000, 63 .end = 0x00000000 + SZ_32M - 1, 64 .flags = IORESOURCE_MEM, 65 } 66 }; 67 68 static struct platform_device edosk7760_nor_flash_device = { 69 .name = "physmap-flash", 70 .resource = edosk7760_nor_flash_resources, 71 .num_resources = ARRAY_SIZE(edosk7760_nor_flash_resources), 72 .dev = { 73 .platform_data = &edosk7760_nor_flash_data, 74 }, 75 }; 76 77 /* i2c initialization functions */ 78 static struct sh7760_i2c_platdata i2c_pd = { 79 .speed_khz = 400, 80 }; 81 82 static struct resource sh7760_i2c1_res[] = { 83 { 84 .start = SH7760_I2C1_MMIO, 85 .end = SH7760_I2C1_MMIOEND, 86 .flags = IORESOURCE_MEM, 87 },{ 88 .start = evt2irq(0x9e0), 89 .end = evt2irq(0x9e0), 90 .flags = IORESOURCE_IRQ, 91 }, 92 }; 93 94 static struct platform_device sh7760_i2c1_dev = { 95 .dev = { 96 .platform_data = &i2c_pd, 97 }, 98 99 .name = SH7760_I2C_DEVNAME, 100 .id = 1, 101 .resource = sh7760_i2c1_res, 102 .num_resources = ARRAY_SIZE(sh7760_i2c1_res), 103 }; 104 105 static struct resource sh7760_i2c0_res[] = { 106 { 107 .start = SH7760_I2C0_MMIO, 108 .end = SH7760_I2C0_MMIOEND, 109 .flags = IORESOURCE_MEM, 110 }, { 111 .start = evt2irq(0x9c0), 112 .end = evt2irq(0x9c0), 113 .flags = IORESOURCE_IRQ, 114 }, 115 }; 116 117 static struct platform_device sh7760_i2c0_dev = { 118 .dev = { 119 .platform_data = &i2c_pd, 120 }, 121 .name = SH7760_I2C_DEVNAME, 122 .id = 0, 123 .resource = sh7760_i2c0_res, 124 .num_resources = ARRAY_SIZE(sh7760_i2c0_res), 125 }; 126 127 /* eth initialization functions */ 128 static struct smc91x_platdata smc91x_info = { 129 .flags = SMC91X_USE_16BIT | SMC91X_IO_SHIFT_1 | IORESOURCE_IRQ_LOWLEVEL, 130 }; 131 132 static struct resource smc91x_res[] = { 133 [0] = { 134 .start = SMC_IOADDR, 135 .end = SMC_IOADDR + SZ_32 - 1, 136 .flags = IORESOURCE_MEM, 137 }, 138 [1] = { 139 .start = evt2irq(0x2a0), 140 .end = evt2irq(0x2a0), 141 .flags = IORESOURCE_IRQ , 142 } 143 }; 144 145 static struct platform_device smc91x_dev = { 146 .name = "smc91x", 147 .id = -1, 148 .num_resources = ARRAY_SIZE(smc91x_res), 149 .resource = smc91x_res, 150 151 .dev = { 152 .platform_data = &smc91x_info, 153 }, 154 }; 155 156 /* platform init code */ 157 static struct platform_device *edosk7760_devices[] __initdata = { 158 &smc91x_dev, 159 &edosk7760_nor_flash_device, 160 &sh7760_i2c0_dev, 161 &sh7760_i2c1_dev, 162 }; 163 164 static int __init init_edosk7760_devices(void) 165 { 166 plat_irq_setup_pins(IRQ_MODE_IRQ); 167 168 return platform_add_devices(edosk7760_devices, 169 ARRAY_SIZE(edosk7760_devices)); 170 } 171 device_initcall(init_edosk7760_devices); 172 173 /* 174 * The Machine Vector 175 */ 176 struct sh_machine_vector mv_edosk7760 __initmv = { 177 .mv_name = "EDOSK7760", 178 }; 179