^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/mach-omap1/board-perseus2.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Modified from board-generic.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Original OMAP730 support by Jean Pihet <j-pihet@ti.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Updated for 2.6 by Kevin Hilman <kjh@hilman.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/mtd/mtd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/mtd/platnand.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/mtd/physmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/input.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/smc91x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/omapfb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/platform_data/keypad-omap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <asm/mach-types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <asm/mach/arch.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <asm/mach/map.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <mach/tc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <mach/mux.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "flash.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <mach/hardware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "iomap.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "fpga.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static const unsigned int p2_keymap[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) KEY(0, 0, KEY_UP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) KEY(1, 0, KEY_RIGHT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) KEY(2, 0, KEY_LEFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) KEY(3, 0, KEY_DOWN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) KEY(4, 0, KEY_ENTER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) KEY(0, 1, KEY_F10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) KEY(1, 1, KEY_SEND),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) KEY(2, 1, KEY_END),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) KEY(3, 1, KEY_VOLUMEDOWN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) KEY(4, 1, KEY_VOLUMEUP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) KEY(5, 1, KEY_RECORD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) KEY(0, 2, KEY_F9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) KEY(1, 2, KEY_3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) KEY(2, 2, KEY_6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) KEY(3, 2, KEY_9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) KEY(4, 2, KEY_KPDOT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) KEY(0, 3, KEY_BACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) KEY(1, 3, KEY_2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) KEY(2, 3, KEY_5),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) KEY(3, 3, KEY_8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) KEY(4, 3, KEY_0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) KEY(5, 3, KEY_KPSLASH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) KEY(0, 4, KEY_HOME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) KEY(1, 4, KEY_1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) KEY(2, 4, KEY_4),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) KEY(3, 4, KEY_7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) KEY(4, 4, KEY_KPASTERISK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) KEY(5, 4, KEY_POWER),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static struct smc91x_platdata smc91x_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .leda = RPC_LED_100_10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .ledb = RPC_LED_TX_RX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static struct resource smc91x_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .start = H2P2_DBG_FPGA_ETHR_START, /* Physical */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .end = H2P2_DBG_FPGA_ETHR_START + 0xf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .start = INT_7XX_MPU_EXT_NIRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .end = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static struct mtd_partition nor_partitions[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* bootloader (U-Boot, etc) in first sector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .name = "bootloader",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .offset = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .size = SZ_128K,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .mask_flags = MTD_WRITEABLE, /* force read-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* bootloader params in the next sector */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .name = "params",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .offset = MTDPART_OFS_APPEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .size = SZ_128K,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .mask_flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .name = "kernel",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .offset = MTDPART_OFS_APPEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .size = SZ_2M,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .mask_flags = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* rest of flash is a file system */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .name = "rootfs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .offset = MTDPART_OFS_APPEND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .size = MTDPART_SIZ_FULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .mask_flags = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static struct physmap_flash_data nor_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) .width = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .set_vpp = omap1_set_vpp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .parts = nor_partitions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) .nr_parts = ARRAY_SIZE(nor_partitions),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static struct resource nor_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .start = OMAP_CS0_PHYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) .end = OMAP_CS0_PHYS + SZ_32M - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static struct platform_device nor_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .name = "physmap-flash",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .platform_data = &nor_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .num_resources = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .resource = &nor_resource,
^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) #define P2_NAND_RB_GPIO_PIN 62
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static int nand_dev_ready(struct nand_chip *chip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) return gpio_get_value(P2_NAND_RB_GPIO_PIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static struct platform_nand_data nand_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .chip = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .nr_chips = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .chip_offset = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .options = NAND_SAMSUNG_LP_OPTIONS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .ctrl = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .cmd_ctrl = omap1_nand_cmd_ctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .dev_ready = nand_dev_ready,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static struct resource nand_resource = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .start = OMAP_CS3_PHYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .end = OMAP_CS3_PHYS + SZ_4K - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static struct platform_device nand_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .name = "gen_nand",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .platform_data = &nand_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .num_resources = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) .resource = &nand_resource,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static struct platform_device smc91x_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .name = "smc91x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .platform_data = &smc91x_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) .num_resources = ARRAY_SIZE(smc91x_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .resource = smc91x_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static struct resource kp_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) .start = INT_7XX_MPUIO_KEYPAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .end = INT_7XX_MPUIO_KEYPAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static const struct matrix_keymap_data p2_keymap_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) .keymap = p2_keymap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .keymap_size = ARRAY_SIZE(p2_keymap),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static struct omap_kp_platform_data kp_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .rows = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .cols = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .keymap_data = &p2_keymap_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .delay = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .dbounce = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static struct platform_device kp_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .name = "omap-keypad",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .platform_data = &kp_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .num_resources = ARRAY_SIZE(kp_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .resource = kp_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static struct platform_device *devices[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) &nor_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) &nand_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) &smc91x_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) &kp_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static const struct omap_lcd_config perseus2_lcd_config __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .ctrl_name = "internal",
^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 void __init perseus2_init_smc91x(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) __raw_writeb(1, H2P2_DBG_FPGA_LAN_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) mdelay(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) __raw_writeb(__raw_readb(H2P2_DBG_FPGA_LAN_RESET) & ~1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) H2P2_DBG_FPGA_LAN_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) mdelay(50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static void __init omap_perseus2_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /* Early, board-dependent init */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * Hold GSM Reset until needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) omap_writew(omap_readw(OMAP7XX_DSP_M_CTL) & ~1, OMAP7XX_DSP_M_CTL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * UARTs -> done automagically by 8250 driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * CSx timings, GPIO Mux ... setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Flash: CS0 timings setup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) omap_writel(0x00000088, OMAP7XX_FLASH_ACFG_0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * Ethernet support through the debug board
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * CS1 timings setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) omap_writel(0x00000000, OMAP7XX_FLASH_ACFG_1);
^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) * Configure MPU_EXT_NIRQ IO in IO_CONF9 register,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) * It is used as the Ethernet controller interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) omap_writel(omap_readl(OMAP7XX_IO_CONF_9) & 0x1FFFFFFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) OMAP7XX_IO_CONF_9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) perseus2_init_smc91x();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) BUG_ON(gpio_request(P2_NAND_RB_GPIO_PIN, "NAND ready") < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) gpio_direction_input(P2_NAND_RB_GPIO_PIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) omap_cfg_reg(L3_1610_FLASH_CS2B_OE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) omap_cfg_reg(M8_1610_FLASH_CS2B_WE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /* Mux pins for keypad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) omap_cfg_reg(E2_7XX_KBR0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) omap_cfg_reg(J7_7XX_KBR1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) omap_cfg_reg(E1_7XX_KBR2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) omap_cfg_reg(F3_7XX_KBR3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) omap_cfg_reg(D2_7XX_KBR4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) omap_cfg_reg(C2_7XX_KBC0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) omap_cfg_reg(D3_7XX_KBC1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) omap_cfg_reg(E4_7XX_KBC2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) omap_cfg_reg(F4_7XX_KBC3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) omap_cfg_reg(E3_7XX_KBC4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) platform_add_devices(devices, ARRAY_SIZE(devices));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) omap_serial_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) omap_register_i2c_bus(1, 100, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) omapfb_set_lcd_config(&perseus2_lcd_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* Only FPGA needs to be mapped here. All others are done with ioremap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static struct map_desc omap_perseus2_io_desc[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .virtual = H2P2_DBG_FPGA_BASE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .pfn = __phys_to_pfn(H2P2_DBG_FPGA_START),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .length = H2P2_DBG_FPGA_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .type = MT_DEVICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) static void __init omap_perseus2_map_io(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) omap7xx_map_io();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) iotable_init(omap_perseus2_io_desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) ARRAY_SIZE(omap_perseus2_io_desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /* Maintainer: Kevin Hilman <kjh@hilman.org> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .atag_offset = 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .map_io = omap_perseus2_map_io,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) .init_early = omap1_init_early,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) .init_irq = omap1_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) .handle_irq = omap1_handle_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) .init_machine = omap_perseus2_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) .init_late = omap1_init_late,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) .init_time = omap1_timer_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) .restart = omap1_restart,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) MACHINE_END