18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-omap1/board-innovator.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Board specific inits for OMAP-1510 and OMAP-1610 Innovator
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (C) 2001 RidgeRun, Inc.
88c2ecf20Sopenharmony_ci * Author: Greg Lonnon <glonnon@ridgerun.com>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * Copyright (C) 2002 MontaVista Software, Inc.
118c2ecf20Sopenharmony_ci *
128c2ecf20Sopenharmony_ci * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
138c2ecf20Sopenharmony_ci * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci#include <linux/gpio.h>
168c2ecf20Sopenharmony_ci#include <linux/kernel.h>
178c2ecf20Sopenharmony_ci#include <linux/init.h>
188c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
198c2ecf20Sopenharmony_ci#include <linux/delay.h>
208c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h>
218c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h>
228c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h>
238c2ecf20Sopenharmony_ci#include <linux/input.h>
248c2ecf20Sopenharmony_ci#include <linux/smc91x.h>
258c2ecf20Sopenharmony_ci#include <linux/omapfb.h>
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#include <asm/mach-types.h>
288c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
298c2ecf20Sopenharmony_ci#include <asm/mach/map.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#include <mach/mux.h>
328c2ecf20Sopenharmony_ci#include "flash.h"
338c2ecf20Sopenharmony_ci#include <mach/tc.h>
348c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-omap.h>
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#include <mach/hardware.h>
378c2ecf20Sopenharmony_ci#include <mach/usb.h>
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#include "iomap.h"
408c2ecf20Sopenharmony_ci#include "common.h"
418c2ecf20Sopenharmony_ci#include "mmc.h"
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
448c2ecf20Sopenharmony_ci#define INNOVATOR1610_ETHR_START	0x04000300
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic const unsigned int innovator_keymap[] = {
478c2ecf20Sopenharmony_ci	KEY(0, 0, KEY_F1),
488c2ecf20Sopenharmony_ci	KEY(3, 0, KEY_DOWN),
498c2ecf20Sopenharmony_ci	KEY(1, 1, KEY_F2),
508c2ecf20Sopenharmony_ci	KEY(2, 1, KEY_RIGHT),
518c2ecf20Sopenharmony_ci	KEY(0, 2, KEY_F3),
528c2ecf20Sopenharmony_ci	KEY(1, 2, KEY_F4),
538c2ecf20Sopenharmony_ci	KEY(2, 2, KEY_UP),
548c2ecf20Sopenharmony_ci	KEY(2, 3, KEY_ENTER),
558c2ecf20Sopenharmony_ci	KEY(3, 3, KEY_LEFT),
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistatic struct mtd_partition innovator_partitions[] = {
598c2ecf20Sopenharmony_ci	/* bootloader (U-Boot, etc) in first sector */
608c2ecf20Sopenharmony_ci	{
618c2ecf20Sopenharmony_ci	      .name		= "bootloader",
628c2ecf20Sopenharmony_ci	      .offset		= 0,
638c2ecf20Sopenharmony_ci	      .size		= SZ_128K,
648c2ecf20Sopenharmony_ci	      .mask_flags	= MTD_WRITEABLE, /* force read-only */
658c2ecf20Sopenharmony_ci	},
668c2ecf20Sopenharmony_ci	/* bootloader params in the next sector */
678c2ecf20Sopenharmony_ci	{
688c2ecf20Sopenharmony_ci	      .name		= "params",
698c2ecf20Sopenharmony_ci	      .offset		= MTDPART_OFS_APPEND,
708c2ecf20Sopenharmony_ci	      .size		= SZ_128K,
718c2ecf20Sopenharmony_ci	      .mask_flags	= 0,
728c2ecf20Sopenharmony_ci	},
738c2ecf20Sopenharmony_ci	/* kernel */
748c2ecf20Sopenharmony_ci	{
758c2ecf20Sopenharmony_ci	      .name		= "kernel",
768c2ecf20Sopenharmony_ci	      .offset		= MTDPART_OFS_APPEND,
778c2ecf20Sopenharmony_ci	      .size		= SZ_2M,
788c2ecf20Sopenharmony_ci	      .mask_flags	= 0
798c2ecf20Sopenharmony_ci	},
808c2ecf20Sopenharmony_ci	/* rest of flash1 is a file system */
818c2ecf20Sopenharmony_ci	{
828c2ecf20Sopenharmony_ci	      .name		= "rootfs",
838c2ecf20Sopenharmony_ci	      .offset		= MTDPART_OFS_APPEND,
848c2ecf20Sopenharmony_ci	      .size		= SZ_16M - SZ_2M - 2 * SZ_128K,
858c2ecf20Sopenharmony_ci	      .mask_flags	= 0
868c2ecf20Sopenharmony_ci	},
878c2ecf20Sopenharmony_ci	/* file system */
888c2ecf20Sopenharmony_ci	{
898c2ecf20Sopenharmony_ci	      .name		= "filesystem",
908c2ecf20Sopenharmony_ci	      .offset		= MTDPART_OFS_APPEND,
918c2ecf20Sopenharmony_ci	      .size		= MTDPART_SIZ_FULL,
928c2ecf20Sopenharmony_ci	      .mask_flags	= 0
938c2ecf20Sopenharmony_ci	}
948c2ecf20Sopenharmony_ci};
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_cistatic struct physmap_flash_data innovator_flash_data = {
978c2ecf20Sopenharmony_ci	.width		= 2,
988c2ecf20Sopenharmony_ci	.set_vpp	= omap1_set_vpp,
998c2ecf20Sopenharmony_ci	.parts		= innovator_partitions,
1008c2ecf20Sopenharmony_ci	.nr_parts	= ARRAY_SIZE(innovator_partitions),
1018c2ecf20Sopenharmony_ci};
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_cistatic struct resource innovator_flash_resource = {
1048c2ecf20Sopenharmony_ci	.start		= OMAP_CS0_PHYS,
1058c2ecf20Sopenharmony_ci	.end		= OMAP_CS0_PHYS + SZ_32M - 1,
1068c2ecf20Sopenharmony_ci	.flags		= IORESOURCE_MEM,
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cistatic struct platform_device innovator_flash_device = {
1108c2ecf20Sopenharmony_ci	.name		= "physmap-flash",
1118c2ecf20Sopenharmony_ci	.id		= 0,
1128c2ecf20Sopenharmony_ci	.dev		= {
1138c2ecf20Sopenharmony_ci		.platform_data	= &innovator_flash_data,
1148c2ecf20Sopenharmony_ci	},
1158c2ecf20Sopenharmony_ci	.num_resources	= 1,
1168c2ecf20Sopenharmony_ci	.resource	= &innovator_flash_resource,
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cistatic struct resource innovator_kp_resources[] = {
1208c2ecf20Sopenharmony_ci	[0] = {
1218c2ecf20Sopenharmony_ci		.start	= INT_KEYBOARD,
1228c2ecf20Sopenharmony_ci		.end	= INT_KEYBOARD,
1238c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ,
1248c2ecf20Sopenharmony_ci	},
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cistatic const struct matrix_keymap_data innovator_keymap_data = {
1288c2ecf20Sopenharmony_ci	.keymap		= innovator_keymap,
1298c2ecf20Sopenharmony_ci	.keymap_size	= ARRAY_SIZE(innovator_keymap),
1308c2ecf20Sopenharmony_ci};
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cistatic struct omap_kp_platform_data innovator_kp_data = {
1338c2ecf20Sopenharmony_ci	.rows		= 8,
1348c2ecf20Sopenharmony_ci	.cols		= 8,
1358c2ecf20Sopenharmony_ci	.keymap_data	= &innovator_keymap_data,
1368c2ecf20Sopenharmony_ci	.delay		= 4,
1378c2ecf20Sopenharmony_ci};
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistatic struct platform_device innovator_kp_device = {
1408c2ecf20Sopenharmony_ci	.name		= "omap-keypad",
1418c2ecf20Sopenharmony_ci	.id		= -1,
1428c2ecf20Sopenharmony_ci	.dev		= {
1438c2ecf20Sopenharmony_ci		.platform_data = &innovator_kp_data,
1448c2ecf20Sopenharmony_ci	},
1458c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(innovator_kp_resources),
1468c2ecf20Sopenharmony_ci	.resource	= innovator_kp_resources,
1478c2ecf20Sopenharmony_ci};
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_cistatic struct smc91x_platdata innovator_smc91x_info = {
1508c2ecf20Sopenharmony_ci	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT,
1518c2ecf20Sopenharmony_ci	.leda	= RPC_LED_100_10,
1528c2ecf20Sopenharmony_ci	.ledb	= RPC_LED_TX_RX,
1538c2ecf20Sopenharmony_ci};
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci#include <linux/spi/spi.h>
1588c2ecf20Sopenharmony_ci#include <linux/spi/ads7846.h>
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci/* Only FPGA needs to be mapped here. All others are done with ioremap */
1628c2ecf20Sopenharmony_cistatic struct map_desc innovator1510_io_desc[] __initdata = {
1638c2ecf20Sopenharmony_ci	{
1648c2ecf20Sopenharmony_ci		.virtual	= OMAP1510_FPGA_BASE,
1658c2ecf20Sopenharmony_ci		.pfn		= __phys_to_pfn(OMAP1510_FPGA_START),
1668c2ecf20Sopenharmony_ci		.length		= OMAP1510_FPGA_SIZE,
1678c2ecf20Sopenharmony_ci		.type		= MT_DEVICE
1688c2ecf20Sopenharmony_ci	}
1698c2ecf20Sopenharmony_ci};
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistatic struct resource innovator1510_smc91x_resources[] = {
1728c2ecf20Sopenharmony_ci	[0] = {
1738c2ecf20Sopenharmony_ci		.start	= OMAP1510_FPGA_ETHR_START,	/* Physical */
1748c2ecf20Sopenharmony_ci		.end	= OMAP1510_FPGA_ETHR_START + 0xf,
1758c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
1768c2ecf20Sopenharmony_ci	},
1778c2ecf20Sopenharmony_ci	[1] = {
1788c2ecf20Sopenharmony_ci		.start	= OMAP1510_INT_ETHER,
1798c2ecf20Sopenharmony_ci		.end	= OMAP1510_INT_ETHER,
1808c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
1818c2ecf20Sopenharmony_ci	},
1828c2ecf20Sopenharmony_ci};
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_smc91x_device = {
1858c2ecf20Sopenharmony_ci	.name		= "smc91x",
1868c2ecf20Sopenharmony_ci	.id		= 0,
1878c2ecf20Sopenharmony_ci	.dev	= {
1888c2ecf20Sopenharmony_ci		.platform_data	= &innovator_smc91x_info,
1898c2ecf20Sopenharmony_ci	},
1908c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(innovator1510_smc91x_resources),
1918c2ecf20Sopenharmony_ci	.resource	= innovator1510_smc91x_resources,
1928c2ecf20Sopenharmony_ci};
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_lcd_device = {
1958c2ecf20Sopenharmony_ci	.name		= "lcd_inn1510",
1968c2ecf20Sopenharmony_ci	.id		= -1,
1978c2ecf20Sopenharmony_ci};
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_cistatic struct platform_device innovator1510_spi_device = {
2008c2ecf20Sopenharmony_ci	.name		= "spi_inn1510",
2018c2ecf20Sopenharmony_ci	.id		= -1,
2028c2ecf20Sopenharmony_ci};
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_cistatic struct platform_device *innovator1510_devices[] __initdata = {
2058c2ecf20Sopenharmony_ci	&innovator_flash_device,
2068c2ecf20Sopenharmony_ci	&innovator1510_smc91x_device,
2078c2ecf20Sopenharmony_ci	&innovator_kp_device,
2088c2ecf20Sopenharmony_ci	&innovator1510_lcd_device,
2098c2ecf20Sopenharmony_ci	&innovator1510_spi_device,
2108c2ecf20Sopenharmony_ci};
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_cistatic int innovator_get_pendown_state(void)
2138c2ecf20Sopenharmony_ci{
2148c2ecf20Sopenharmony_ci	return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));
2158c2ecf20Sopenharmony_ci}
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_cistatic const struct ads7846_platform_data innovator1510_ts_info = {
2188c2ecf20Sopenharmony_ci	.model			= 7846,
2198c2ecf20Sopenharmony_ci	.vref_delay_usecs	= 100,	/* internal, no capacitor */
2208c2ecf20Sopenharmony_ci	.x_plate_ohms		= 419,
2218c2ecf20Sopenharmony_ci	.y_plate_ohms		= 486,
2228c2ecf20Sopenharmony_ci	.get_pendown_state	= innovator_get_pendown_state,
2238c2ecf20Sopenharmony_ci};
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_cistatic struct spi_board_info __initdata innovator1510_boardinfo[] = { {
2268c2ecf20Sopenharmony_ci	/* FPGA (bus "10") CS0 has an ads7846e */
2278c2ecf20Sopenharmony_ci	.modalias		= "ads7846",
2288c2ecf20Sopenharmony_ci	.platform_data		= &innovator1510_ts_info,
2298c2ecf20Sopenharmony_ci	.irq			= OMAP1510_INT_FPGA_TS,
2308c2ecf20Sopenharmony_ci	.max_speed_hz		= 120000 /* max sample rate at 3V */
2318c2ecf20Sopenharmony_ci					* 26 /* command + data + overhead */,
2328c2ecf20Sopenharmony_ci	.bus_num		= 10,
2338c2ecf20Sopenharmony_ci	.chip_select		= 0,
2348c2ecf20Sopenharmony_ci} };
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ci#endif /* CONFIG_ARCH_OMAP15XX */
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_cistatic struct resource innovator1610_smc91x_resources[] = {
2418c2ecf20Sopenharmony_ci	[0] = {
2428c2ecf20Sopenharmony_ci		.start	= INNOVATOR1610_ETHR_START,		/* Physical */
2438c2ecf20Sopenharmony_ci		.end	= INNOVATOR1610_ETHR_START + 0xf,
2448c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_MEM,
2458c2ecf20Sopenharmony_ci	},
2468c2ecf20Sopenharmony_ci	[1] = {
2478c2ecf20Sopenharmony_ci		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
2488c2ecf20Sopenharmony_ci	},
2498c2ecf20Sopenharmony_ci};
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_cistatic struct platform_device innovator1610_smc91x_device = {
2528c2ecf20Sopenharmony_ci	.name		= "smc91x",
2538c2ecf20Sopenharmony_ci	.id		= 0,
2548c2ecf20Sopenharmony_ci	.dev	= {
2558c2ecf20Sopenharmony_ci		.platform_data	= &innovator_smc91x_info,
2568c2ecf20Sopenharmony_ci	},
2578c2ecf20Sopenharmony_ci	.num_resources	= ARRAY_SIZE(innovator1610_smc91x_resources),
2588c2ecf20Sopenharmony_ci	.resource	= innovator1610_smc91x_resources,
2598c2ecf20Sopenharmony_ci};
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_cistatic struct platform_device innovator1610_lcd_device = {
2628c2ecf20Sopenharmony_ci	.name		= "inn1610_lcd",
2638c2ecf20Sopenharmony_ci	.id		= -1,
2648c2ecf20Sopenharmony_ci};
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_cistatic struct platform_device *innovator1610_devices[] __initdata = {
2678c2ecf20Sopenharmony_ci	&innovator_flash_device,
2688c2ecf20Sopenharmony_ci	&innovator1610_smc91x_device,
2698c2ecf20Sopenharmony_ci	&innovator_kp_device,
2708c2ecf20Sopenharmony_ci	&innovator1610_lcd_device,
2718c2ecf20Sopenharmony_ci};
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci#endif /* CONFIG_ARCH_OMAP16XX */
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_cistatic void __init innovator_init_smc91x(void)
2768c2ecf20Sopenharmony_ci{
2778c2ecf20Sopenharmony_ci	if (cpu_is_omap1510()) {
2788c2ecf20Sopenharmony_ci		__raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1,
2798c2ecf20Sopenharmony_ci			   OMAP1510_FPGA_RST);
2808c2ecf20Sopenharmony_ci		udelay(750);
2818c2ecf20Sopenharmony_ci	} else {
2828c2ecf20Sopenharmony_ci		if (gpio_request(0, "SMC91x irq") < 0) {
2838c2ecf20Sopenharmony_ci			printk("Error requesting gpio 0 for smc91x irq\n");
2848c2ecf20Sopenharmony_ci			return;
2858c2ecf20Sopenharmony_ci		}
2868c2ecf20Sopenharmony_ci	}
2878c2ecf20Sopenharmony_ci}
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
2908c2ecf20Sopenharmony_cistatic struct omap_usb_config innovator1510_usb_config __initdata = {
2918c2ecf20Sopenharmony_ci	/* for bundled non-standard host and peripheral cables */
2928c2ecf20Sopenharmony_ci	.hmc_mode	= 4,
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci	.register_host	= 1,
2958c2ecf20Sopenharmony_ci	.pins[1]	= 6,
2968c2ecf20Sopenharmony_ci	.pins[2]	= 6,		/* Conflicts with UART2 */
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	.register_dev	= 1,
2998c2ecf20Sopenharmony_ci	.pins[0]	= 2,
3008c2ecf20Sopenharmony_ci};
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_cistatic const struct omap_lcd_config innovator1510_lcd_config __initconst = {
3038c2ecf20Sopenharmony_ci	.ctrl_name	= "internal",
3048c2ecf20Sopenharmony_ci};
3058c2ecf20Sopenharmony_ci#endif
3068c2ecf20Sopenharmony_ci
3078c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX
3088c2ecf20Sopenharmony_cistatic struct omap_usb_config h2_usb_config __initdata = {
3098c2ecf20Sopenharmony_ci	/* usb1 has a Mini-AB port and external isp1301 transceiver */
3108c2ecf20Sopenharmony_ci	.otg		= 2,
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_OMAP)
3138c2ecf20Sopenharmony_ci	.hmc_mode	= 19,	/* 0:host(off) 1:dev|otg 2:disabled */
3148c2ecf20Sopenharmony_ci	/* .hmc_mode	= 21,*/	/* 0:host(off) 1:dev(loopback) 2:host(loopback) */
3158c2ecf20Sopenharmony_ci#elif	IS_ENABLED(CONFIG_USB_OHCI_HCD)
3168c2ecf20Sopenharmony_ci	/* NONSTANDARD CABLE NEEDED (B-to-Mini-B) */
3178c2ecf20Sopenharmony_ci	.hmc_mode	= 20,	/* 1:dev|otg(off) 1:host 2:disabled */
3188c2ecf20Sopenharmony_ci#endif
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	.pins[1]	= 3,
3218c2ecf20Sopenharmony_ci};
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_cistatic const struct omap_lcd_config innovator1610_lcd_config __initconst = {
3248c2ecf20Sopenharmony_ci	.ctrl_name	= "internal",
3258c2ecf20Sopenharmony_ci};
3268c2ecf20Sopenharmony_ci#endif
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_MMC_OMAP)
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_cistatic int mmc_set_power(struct device *dev, int slot, int power_on,
3318c2ecf20Sopenharmony_ci				int vdd)
3328c2ecf20Sopenharmony_ci{
3338c2ecf20Sopenharmony_ci	if (power_on)
3348c2ecf20Sopenharmony_ci		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) | (1 << 3),
3358c2ecf20Sopenharmony_ci				OMAP1510_FPGA_POWER);
3368c2ecf20Sopenharmony_ci	else
3378c2ecf20Sopenharmony_ci		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) & ~(1 << 3),
3388c2ecf20Sopenharmony_ci				OMAP1510_FPGA_POWER);
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci	return 0;
3418c2ecf20Sopenharmony_ci}
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci/*
3448c2ecf20Sopenharmony_ci * Innovator could use the following functions tested:
3458c2ecf20Sopenharmony_ci * - mmc_get_wp that uses OMAP_MPUIO(3)
3468c2ecf20Sopenharmony_ci * - mmc_get_cover_state that uses FPGA F4 UIO43
3478c2ecf20Sopenharmony_ci */
3488c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data mmc1_data = {
3498c2ecf20Sopenharmony_ci	.nr_slots                       = 1,
3508c2ecf20Sopenharmony_ci	.slots[0]       = {
3518c2ecf20Sopenharmony_ci		.set_power		= mmc_set_power,
3528c2ecf20Sopenharmony_ci		.wires			= 4,
3538c2ecf20Sopenharmony_ci		.name                   = "mmcblk",
3548c2ecf20Sopenharmony_ci	},
3558c2ecf20Sopenharmony_ci};
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_cistatic struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_cistatic void __init innovator_mmc_init(void)
3608c2ecf20Sopenharmony_ci{
3618c2ecf20Sopenharmony_ci	mmc_data[0] = &mmc1_data;
3628c2ecf20Sopenharmony_ci	omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);
3638c2ecf20Sopenharmony_ci}
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci#else
3668c2ecf20Sopenharmony_cistatic inline void innovator_mmc_init(void)
3678c2ecf20Sopenharmony_ci{
3688c2ecf20Sopenharmony_ci}
3698c2ecf20Sopenharmony_ci#endif
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_cistatic void __init innovator_init(void)
3728c2ecf20Sopenharmony_ci{
3738c2ecf20Sopenharmony_ci	if (cpu_is_omap1510())
3748c2ecf20Sopenharmony_ci		omap1510_fpga_init_irq();
3758c2ecf20Sopenharmony_ci	innovator_init_smc91x();
3768c2ecf20Sopenharmony_ci
3778c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
3788c2ecf20Sopenharmony_ci	if (cpu_is_omap1510()) {
3798c2ecf20Sopenharmony_ci		unsigned char reg;
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci		/* mux pins for uarts */
3828c2ecf20Sopenharmony_ci		omap_cfg_reg(UART1_TX);
3838c2ecf20Sopenharmony_ci		omap_cfg_reg(UART1_RTS);
3848c2ecf20Sopenharmony_ci		omap_cfg_reg(UART2_TX);
3858c2ecf20Sopenharmony_ci		omap_cfg_reg(UART2_RTS);
3868c2ecf20Sopenharmony_ci		omap_cfg_reg(UART3_TX);
3878c2ecf20Sopenharmony_ci		omap_cfg_reg(UART3_RX);
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci		reg = __raw_readb(OMAP1510_FPGA_POWER);
3908c2ecf20Sopenharmony_ci		reg |= OMAP1510_FPGA_PCR_COM1_EN;
3918c2ecf20Sopenharmony_ci		__raw_writeb(reg, OMAP1510_FPGA_POWER);
3928c2ecf20Sopenharmony_ci		udelay(10);
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci		reg = __raw_readb(OMAP1510_FPGA_POWER);
3958c2ecf20Sopenharmony_ci		reg |= OMAP1510_FPGA_PCR_COM2_EN;
3968c2ecf20Sopenharmony_ci		__raw_writeb(reg, OMAP1510_FPGA_POWER);
3978c2ecf20Sopenharmony_ci		udelay(10);
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci		platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices));
4008c2ecf20Sopenharmony_ci		spi_register_board_info(innovator1510_boardinfo,
4018c2ecf20Sopenharmony_ci				ARRAY_SIZE(innovator1510_boardinfo));
4028c2ecf20Sopenharmony_ci	}
4038c2ecf20Sopenharmony_ci#endif
4048c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX
4058c2ecf20Sopenharmony_ci	if (!cpu_is_omap1510()) {
4068c2ecf20Sopenharmony_ci		innovator1610_smc91x_resources[1].start = gpio_to_irq(0);
4078c2ecf20Sopenharmony_ci		innovator1610_smc91x_resources[1].end = gpio_to_irq(0);
4088c2ecf20Sopenharmony_ci		platform_add_devices(innovator1610_devices, ARRAY_SIZE(innovator1610_devices));
4098c2ecf20Sopenharmony_ci	}
4108c2ecf20Sopenharmony_ci#endif
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
4138c2ecf20Sopenharmony_ci	if (cpu_is_omap1510()) {
4148c2ecf20Sopenharmony_ci		omap1_usb_init(&innovator1510_usb_config);
4158c2ecf20Sopenharmony_ci		omapfb_set_lcd_config(&innovator1510_lcd_config);
4168c2ecf20Sopenharmony_ci	}
4178c2ecf20Sopenharmony_ci#endif
4188c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX
4198c2ecf20Sopenharmony_ci	if (cpu_is_omap1610()) {
4208c2ecf20Sopenharmony_ci		omap1_usb_init(&h2_usb_config);
4218c2ecf20Sopenharmony_ci		omapfb_set_lcd_config(&innovator1610_lcd_config);
4228c2ecf20Sopenharmony_ci	}
4238c2ecf20Sopenharmony_ci#endif
4248c2ecf20Sopenharmony_ci	omap_serial_init();
4258c2ecf20Sopenharmony_ci	omap_register_i2c_bus(1, 100, NULL, 0);
4268c2ecf20Sopenharmony_ci	innovator_mmc_init();
4278c2ecf20Sopenharmony_ci}
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci/*
4308c2ecf20Sopenharmony_ci * REVISIT: Assume 15xx for now, we don't want to do revision check
4318c2ecf20Sopenharmony_ci * until later on. The right way to fix this is to set up a different
4328c2ecf20Sopenharmony_ci * machine_id for 16xx Innovator, or use device tree.
4338c2ecf20Sopenharmony_ci */
4348c2ecf20Sopenharmony_cistatic void __init innovator_map_io(void)
4358c2ecf20Sopenharmony_ci{
4368c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
4378c2ecf20Sopenharmony_ci	omap15xx_map_io();
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_ci	iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc));
4408c2ecf20Sopenharmony_ci	udelay(10);	/* Delay needed for FPGA */
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	/* Dump the Innovator FPGA rev early - useful info for support. */
4438c2ecf20Sopenharmony_ci	pr_debug("Innovator FPGA Rev %d.%d Board Rev %d\n",
4448c2ecf20Sopenharmony_ci			__raw_readb(OMAP1510_FPGA_REV_HIGH),
4458c2ecf20Sopenharmony_ci			__raw_readb(OMAP1510_FPGA_REV_LOW),
4468c2ecf20Sopenharmony_ci			__raw_readb(OMAP1510_FPGA_BOARD_REV));
4478c2ecf20Sopenharmony_ci#endif
4488c2ecf20Sopenharmony_ci}
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_ciMACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
4518c2ecf20Sopenharmony_ci	/* Maintainer: MontaVista Software, Inc. */
4528c2ecf20Sopenharmony_ci	.atag_offset	= 0x100,
4538c2ecf20Sopenharmony_ci	.map_io		= innovator_map_io,
4548c2ecf20Sopenharmony_ci	.init_early     = omap1_init_early,
4558c2ecf20Sopenharmony_ci	.init_irq	= omap1_init_irq,
4568c2ecf20Sopenharmony_ci	.handle_irq	= omap1_handle_irq,
4578c2ecf20Sopenharmony_ci	.init_machine	= innovator_init,
4588c2ecf20Sopenharmony_ci	.init_late	= omap1_init_late,
4598c2ecf20Sopenharmony_ci	.init_time	= omap1_timer_init,
4608c2ecf20Sopenharmony_ci	.restart	= omap1_restart,
4618c2ecf20Sopenharmony_ciMACHINE_END
462