^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Renesas Technology Sales RTS7751R2D Support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2002 - 2006 Atom Create Engineering Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2004 - 2007 Paul Mundt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/mtd/mtd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/mtd/partitions.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/mtd/physmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/ata_platform.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/sm501.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/sm501-regs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/pm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/fb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/spi/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/spi/spi_bitbang.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <asm/machvec.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <mach/r2d.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <asm/io_trapped.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/spi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static struct resource cf_ide_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .start = PA_AREA5_IO + 0x1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .end = PA_AREA5_IO + 0x1000 + 0x10 - 0x2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .start = PA_AREA5_IO + 0x80c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .end = PA_AREA5_IO + 0x80c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #ifndef CONFIG_RTS7751R2D_1 /* For R2D-1 polling is preferred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) [2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .start = IRQ_CF_IDE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static struct pata_platform_info pata_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .ioport_shift = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static struct platform_device cf_ide_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .name = "pata_platform",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .num_resources = ARRAY_SIZE(cf_ide_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .resource = cf_ide_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .platform_data = &pata_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static struct spi_board_info spi_bus[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .modalias = "rtc-r9701",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .max_speed_hz = 1000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .mode = SPI_MODE_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) static void r2d_chip_select(struct sh_spi_info *spi, int cs, int state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) BUG_ON(cs != 0); /* Single Epson RTC-9701JE attached on CS0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) __raw_writew(state == BITBANG_CS_ACTIVE, PA_RTCCE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static struct sh_spi_info spi_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .num_chipselect = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .chip_select = r2d_chip_select,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static struct resource spi_sh_sci_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .start = 0xffe00000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .end = 0xffe0001f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static struct platform_device spi_sh_sci_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .name = "spi_sh_sci",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .num_resources = ARRAY_SIZE(spi_sh_sci_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .resource = spi_sh_sci_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .platform_data = &spi_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) static struct resource heartbeat_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .start = PA_OUTPORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .end = PA_OUTPORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static struct platform_device heartbeat_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .name = "heartbeat",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .num_resources = ARRAY_SIZE(heartbeat_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .resource = heartbeat_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static struct resource sm501_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .start = 0x10000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .end = 0x13e00000 - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .start = 0x13e00000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .end = 0x13ffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) [2] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .start = IRQ_VOYAGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static struct fb_videomode sm501_default_mode = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .pixclock = 35714,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .xres = 640,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) .yres = 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .left_margin = 105,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .right_margin = 50,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .upper_margin = 35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .lower_margin = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .hsync_len = 96,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .vsync_len = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static struct sm501_platdata_fbsub sm501_pdata_fbsub_pnl = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .def_bpp = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .def_mode = &sm501_default_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .flags = SM501FB_FLAG_USE_INIT_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) SM501FB_FLAG_USE_HWCURSOR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) SM501FB_FLAG_USE_HWACCEL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) SM501FB_FLAG_DISABLE_AT_EXIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static struct sm501_platdata_fbsub sm501_pdata_fbsub_crt = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .flags = (SM501FB_FLAG_USE_INIT_MODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) SM501FB_FLAG_USE_HWCURSOR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) SM501FB_FLAG_USE_HWACCEL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) SM501FB_FLAG_DISABLE_AT_EXIT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static struct sm501_platdata_fb sm501_fb_pdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .fb_route = SM501_FB_OWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .fb_crt = &sm501_pdata_fbsub_crt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .fb_pnl = &sm501_pdata_fbsub_pnl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .flags = SM501_FBPD_SWAP_FB_ENDIAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static struct sm501_initdata sm501_initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .devices = SM501_USE_USB_HOST | SM501_USE_UART0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static struct sm501_platdata sm501_platform_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .init = &sm501_initdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .fb = &sm501_fb_pdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static struct platform_device sm501_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .name = "sm501",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .platform_data = &sm501_platform_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .num_resources = ARRAY_SIZE(sm501_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .resource = sm501_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static struct mtd_partition r2d_partitions[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) .name = "U-Boot",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .offset = 0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .size = 0x00040000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .mask_flags = MTD_WRITEABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .name = "Environment",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .offset = MTDPART_OFS_NXTBLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .size = 0x00040000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .mask_flags = MTD_WRITEABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .name = "Kernel",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) .offset = MTDPART_OFS_NXTBLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .size = 0x001c0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .name = "Flash_FS",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .offset = MTDPART_OFS_NXTBLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .size = MTDPART_SIZ_FULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static struct physmap_flash_data flash_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .width = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .nr_parts = ARRAY_SIZE(r2d_partitions),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .parts = r2d_partitions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static struct resource flash_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .start = 0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .end = 0x02000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static struct platform_device flash_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .name = "physmap-flash",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .resource = &flash_resource,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) .num_resources = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .platform_data = &flash_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) static struct platform_device *rts7751r2d_devices[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) &sm501_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) &heartbeat_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) &spi_sh_sci_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * The CF is connected with a 16-bit bus where 8-bit operations are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * unsupported. The linux ata driver is however using 8-bit operations, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * insert a trapped io filter to convert 8-bit operations into 16-bit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static struct trapped_io cf_trapped_io = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .resource = cf_ide_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) .num_resources = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .minimum_bus_width = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) static int __init rts7751r2d_devices_setup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (register_trapped_io(&cf_trapped_io) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) platform_device_register(&cf_ide_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (mach_is_r2d_plus())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) platform_device_register(&flash_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return platform_add_devices(rts7751r2d_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) ARRAY_SIZE(rts7751r2d_devices));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) device_initcall(rts7751r2d_devices_setup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static void rts7751r2d_power_off(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) __raw_writew(0x0001, PA_POWOFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * Initialize the board
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) static void __init rts7751r2d_setup(char **cmdline_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) void __iomem *sm501_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) u16 ver = __raw_readw(PA_VERREG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) printk(KERN_INFO "FPGA version:%d (revision:%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) (ver >> 4) & 0xf, ver & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) __raw_writew(0x0000, PA_OUTPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) pm_power_off = rts7751r2d_power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) /* sm501 dram configuration:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * ColSizeX = 11 - External Memory Column Size: 256 words.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * APX = 1 - External Memory Active to Pre-Charge Delay: 7 clocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * RstX = 1 - External Memory Reset: Normal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * Rfsh = 1 - Local Memory Refresh to Command Delay: 12 clocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * BwC = 1 - Local Memory Block Write Cycle Time: 2 clocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * BwP = 1 - Local Memory Block Write to Pre-Charge Delay: 1 clock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * AP = 1 - Internal Memory Active to Pre-Charge Delay: 7 clocks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * Rst = 1 - Internal Memory Reset: Normal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) * RA = 1 - Internal Memory Remain in Active State: Do not remain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) sm501_reg = (void __iomem *)0xb3e00000 + SM501_DRAM_CONTROL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) writel(readl(sm501_reg) | 0x00f107c0, sm501_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * The Machine Vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) static struct sh_machine_vector mv_rts7751r2d __initmv = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .mv_name = "RTS7751R2D",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .mv_setup = rts7751r2d_setup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .mv_init_irq = init_rts7751r2d_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .mv_irq_demux = rts7751r2d_irq_demux,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) };