cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

board-innovator.c (11973B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * linux/arch/arm/mach-omap1/board-innovator.c
      4 *
      5 * Board specific inits for OMAP-1510 and OMAP-1610 Innovator
      6 *
      7 * Copyright (C) 2001 RidgeRun, Inc.
      8 * Author: Greg Lonnon <glonnon@ridgerun.com>
      9 *
     10 * Copyright (C) 2002 MontaVista Software, Inc.
     11 *
     12 * Separated FPGA interrupts from innovator1510.c and cleaned up for 2.6
     13 * Copyright (C) 2004 Nokia Corporation by Tony Lindrgen <tony@atomide.com>
     14 */
     15#include <linux/gpio.h>
     16#include <linux/kernel.h>
     17#include <linux/init.h>
     18#include <linux/platform_device.h>
     19#include <linux/delay.h>
     20#include <linux/mtd/mtd.h>
     21#include <linux/mtd/partitions.h>
     22#include <linux/mtd/physmap.h>
     23#include <linux/input.h>
     24#include <linux/smc91x.h>
     25#include <linux/omapfb.h>
     26#include <linux/platform_data/keypad-omap.h>
     27
     28#include <asm/mach-types.h>
     29#include <asm/mach/arch.h>
     30#include <asm/mach/map.h>
     31
     32#include "tc.h"
     33#include "mux.h"
     34#include "flash.h"
     35#include "hardware.h"
     36#include "usb.h"
     37#include "iomap.h"
     38#include "common.h"
     39#include "mmc.h"
     40
     41/* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */
     42#define INNOVATOR1610_ETHR_START	0x04000300
     43
     44static const unsigned int innovator_keymap[] = {
     45	KEY(0, 0, KEY_F1),
     46	KEY(3, 0, KEY_DOWN),
     47	KEY(1, 1, KEY_F2),
     48	KEY(2, 1, KEY_RIGHT),
     49	KEY(0, 2, KEY_F3),
     50	KEY(1, 2, KEY_F4),
     51	KEY(2, 2, KEY_UP),
     52	KEY(2, 3, KEY_ENTER),
     53	KEY(3, 3, KEY_LEFT),
     54};
     55
     56static struct mtd_partition innovator_partitions[] = {
     57	/* bootloader (U-Boot, etc) in first sector */
     58	{
     59	      .name		= "bootloader",
     60	      .offset		= 0,
     61	      .size		= SZ_128K,
     62	      .mask_flags	= MTD_WRITEABLE, /* force read-only */
     63	},
     64	/* bootloader params in the next sector */
     65	{
     66	      .name		= "params",
     67	      .offset		= MTDPART_OFS_APPEND,
     68	      .size		= SZ_128K,
     69	      .mask_flags	= 0,
     70	},
     71	/* kernel */
     72	{
     73	      .name		= "kernel",
     74	      .offset		= MTDPART_OFS_APPEND,
     75	      .size		= SZ_2M,
     76	      .mask_flags	= 0
     77	},
     78	/* rest of flash1 is a file system */
     79	{
     80	      .name		= "rootfs",
     81	      .offset		= MTDPART_OFS_APPEND,
     82	      .size		= SZ_16M - SZ_2M - 2 * SZ_128K,
     83	      .mask_flags	= 0
     84	},
     85	/* file system */
     86	{
     87	      .name		= "filesystem",
     88	      .offset		= MTDPART_OFS_APPEND,
     89	      .size		= MTDPART_SIZ_FULL,
     90	      .mask_flags	= 0
     91	}
     92};
     93
     94static struct physmap_flash_data innovator_flash_data = {
     95	.width		= 2,
     96	.set_vpp	= omap1_set_vpp,
     97	.parts		= innovator_partitions,
     98	.nr_parts	= ARRAY_SIZE(innovator_partitions),
     99};
    100
    101static struct resource innovator_flash_resource = {
    102	.start		= OMAP_CS0_PHYS,
    103	.end		= OMAP_CS0_PHYS + SZ_32M - 1,
    104	.flags		= IORESOURCE_MEM,
    105};
    106
    107static struct platform_device innovator_flash_device = {
    108	.name		= "physmap-flash",
    109	.id		= 0,
    110	.dev		= {
    111		.platform_data	= &innovator_flash_data,
    112	},
    113	.num_resources	= 1,
    114	.resource	= &innovator_flash_resource,
    115};
    116
    117static struct resource innovator_kp_resources[] = {
    118	[0] = {
    119		.start	= INT_KEYBOARD,
    120		.end	= INT_KEYBOARD,
    121		.flags	= IORESOURCE_IRQ,
    122	},
    123};
    124
    125static const struct matrix_keymap_data innovator_keymap_data = {
    126	.keymap		= innovator_keymap,
    127	.keymap_size	= ARRAY_SIZE(innovator_keymap),
    128};
    129
    130static struct omap_kp_platform_data innovator_kp_data = {
    131	.rows		= 8,
    132	.cols		= 8,
    133	.keymap_data	= &innovator_keymap_data,
    134	.delay		= 4,
    135};
    136
    137static struct platform_device innovator_kp_device = {
    138	.name		= "omap-keypad",
    139	.id		= -1,
    140	.dev		= {
    141		.platform_data = &innovator_kp_data,
    142	},
    143	.num_resources	= ARRAY_SIZE(innovator_kp_resources),
    144	.resource	= innovator_kp_resources,
    145};
    146
    147static struct smc91x_platdata innovator_smc91x_info = {
    148	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT,
    149	.leda	= RPC_LED_100_10,
    150	.ledb	= RPC_LED_TX_RX,
    151};
    152
    153#ifdef CONFIG_ARCH_OMAP15XX
    154
    155#include <linux/spi/spi.h>
    156#include <linux/spi/ads7846.h>
    157
    158
    159/* Only FPGA needs to be mapped here. All others are done with ioremap */
    160static struct map_desc innovator1510_io_desc[] __initdata = {
    161	{
    162		.virtual	= OMAP1510_FPGA_BASE,
    163		.pfn		= __phys_to_pfn(OMAP1510_FPGA_START),
    164		.length		= OMAP1510_FPGA_SIZE,
    165		.type		= MT_DEVICE
    166	}
    167};
    168
    169static struct resource innovator1510_smc91x_resources[] = {
    170	[0] = {
    171		.start	= OMAP1510_FPGA_ETHR_START,	/* Physical */
    172		.end	= OMAP1510_FPGA_ETHR_START + 0xf,
    173		.flags	= IORESOURCE_MEM,
    174	},
    175	[1] = {
    176		.start	= OMAP1510_INT_ETHER,
    177		.end	= OMAP1510_INT_ETHER,
    178		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
    179	},
    180};
    181
    182static struct platform_device innovator1510_smc91x_device = {
    183	.name		= "smc91x",
    184	.id		= 0,
    185	.dev	= {
    186		.platform_data	= &innovator_smc91x_info,
    187	},
    188	.num_resources	= ARRAY_SIZE(innovator1510_smc91x_resources),
    189	.resource	= innovator1510_smc91x_resources,
    190};
    191
    192static struct platform_device innovator1510_lcd_device = {
    193	.name		= "lcd_inn1510",
    194	.id		= -1,
    195	.dev	= {
    196		.platform_data = (void __force *)OMAP1510_FPGA_LCD_PANEL_CONTROL,
    197	}
    198};
    199
    200static struct platform_device innovator1510_spi_device = {
    201	.name		= "spi_inn1510",
    202	.id		= -1,
    203};
    204
    205static struct platform_device *innovator1510_devices[] __initdata = {
    206	&innovator_flash_device,
    207	&innovator1510_smc91x_device,
    208	&innovator_kp_device,
    209	&innovator1510_lcd_device,
    210	&innovator1510_spi_device,
    211};
    212
    213static int innovator_get_pendown_state(void)
    214{
    215	return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));
    216}
    217
    218static const struct ads7846_platform_data innovator1510_ts_info = {
    219	.model			= 7846,
    220	.vref_delay_usecs	= 100,	/* internal, no capacitor */
    221	.x_plate_ohms		= 419,
    222	.y_plate_ohms		= 486,
    223	.get_pendown_state	= innovator_get_pendown_state,
    224};
    225
    226static struct spi_board_info __initdata innovator1510_boardinfo[] = { {
    227	/* FPGA (bus "10") CS0 has an ads7846e */
    228	.modalias		= "ads7846",
    229	.platform_data		= &innovator1510_ts_info,
    230	.irq			= OMAP1510_INT_FPGA_TS,
    231	.max_speed_hz		= 120000 /* max sample rate at 3V */
    232					* 26 /* command + data + overhead */,
    233	.bus_num		= 10,
    234	.chip_select		= 0,
    235} };
    236
    237#endif /* CONFIG_ARCH_OMAP15XX */
    238
    239#ifdef CONFIG_ARCH_OMAP16XX
    240
    241static struct resource innovator1610_smc91x_resources[] = {
    242	[0] = {
    243		.start	= INNOVATOR1610_ETHR_START,		/* Physical */
    244		.end	= INNOVATOR1610_ETHR_START + 0xf,
    245		.flags	= IORESOURCE_MEM,
    246	},
    247	[1] = {
    248		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
    249	},
    250};
    251
    252static struct platform_device innovator1610_smc91x_device = {
    253	.name		= "smc91x",
    254	.id		= 0,
    255	.dev	= {
    256		.platform_data	= &innovator_smc91x_info,
    257	},
    258	.num_resources	= ARRAY_SIZE(innovator1610_smc91x_resources),
    259	.resource	= innovator1610_smc91x_resources,
    260};
    261
    262static struct platform_device innovator1610_lcd_device = {
    263	.name		= "inn1610_lcd",
    264	.id		= -1,
    265};
    266
    267static struct platform_device *innovator1610_devices[] __initdata = {
    268	&innovator_flash_device,
    269	&innovator1610_smc91x_device,
    270	&innovator_kp_device,
    271	&innovator1610_lcd_device,
    272};
    273
    274#endif /* CONFIG_ARCH_OMAP16XX */
    275
    276static void __init innovator_init_smc91x(void)
    277{
    278	if (cpu_is_omap1510()) {
    279		__raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1,
    280			   OMAP1510_FPGA_RST);
    281		udelay(750);
    282	} else {
    283		if (gpio_request(0, "SMC91x irq") < 0) {
    284			printk("Error requesting gpio 0 for smc91x irq\n");
    285			return;
    286		}
    287	}
    288}
    289
    290#ifdef CONFIG_ARCH_OMAP15XX
    291/*
    292 * Board specific gang-switched transceiver power on/off.
    293 */
    294static int innovator_omap_ohci_transceiver_power(int on)
    295{
    296	if (on)
    297		__raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL)
    298				| ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)),
    299			       INNOVATOR_FPGA_CAM_USB_CONTROL);
    300	else
    301		__raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL)
    302				& ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)),
    303			       INNOVATOR_FPGA_CAM_USB_CONTROL);
    304
    305	return 0;
    306}
    307
    308static struct omap_usb_config innovator1510_usb_config __initdata = {
    309	/* for bundled non-standard host and peripheral cables */
    310	.hmc_mode	= 4,
    311
    312	.register_host	= 1,
    313	.pins[1]	= 6,
    314	.pins[2]	= 6,		/* Conflicts with UART2 */
    315
    316	.register_dev	= 1,
    317	.pins[0]	= 2,
    318
    319	.transceiver_power = innovator_omap_ohci_transceiver_power,
    320};
    321
    322static const struct omap_lcd_config innovator1510_lcd_config __initconst = {
    323	.ctrl_name	= "internal",
    324};
    325#endif
    326
    327#ifdef CONFIG_ARCH_OMAP16XX
    328static struct omap_usb_config h2_usb_config __initdata = {
    329	/* usb1 has a Mini-AB port and external isp1301 transceiver */
    330	.otg		= 2,
    331
    332#if IS_ENABLED(CONFIG_USB_OMAP)
    333	.hmc_mode	= 19,	/* 0:host(off) 1:dev|otg 2:disabled */
    334	/* .hmc_mode	= 21,*/	/* 0:host(off) 1:dev(loopback) 2:host(loopback) */
    335#elif	IS_ENABLED(CONFIG_USB_OHCI_HCD)
    336	/* NONSTANDARD CABLE NEEDED (B-to-Mini-B) */
    337	.hmc_mode	= 20,	/* 1:dev|otg(off) 1:host 2:disabled */
    338#endif
    339
    340	.pins[1]	= 3,
    341};
    342
    343static const struct omap_lcd_config innovator1610_lcd_config __initconst = {
    344	.ctrl_name	= "internal",
    345};
    346#endif
    347
    348#if IS_ENABLED(CONFIG_MMC_OMAP)
    349
    350static int mmc_set_power(struct device *dev, int slot, int power_on,
    351				int vdd)
    352{
    353	if (power_on)
    354		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) | (1 << 3),
    355				OMAP1510_FPGA_POWER);
    356	else
    357		__raw_writeb(__raw_readb(OMAP1510_FPGA_POWER) & ~(1 << 3),
    358				OMAP1510_FPGA_POWER);
    359
    360	return 0;
    361}
    362
    363/*
    364 * Innovator could use the following functions tested:
    365 * - mmc_get_wp that uses OMAP_MPUIO(3)
    366 * - mmc_get_cover_state that uses FPGA F4 UIO43
    367 */
    368static struct omap_mmc_platform_data mmc1_data = {
    369	.nr_slots                       = 1,
    370	.slots[0]       = {
    371		.set_power		= mmc_set_power,
    372		.wires			= 4,
    373		.name                   = "mmcblk",
    374	},
    375};
    376
    377static struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];
    378
    379static void __init innovator_mmc_init(void)
    380{
    381	mmc_data[0] = &mmc1_data;
    382	omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);
    383}
    384
    385#else
    386static inline void innovator_mmc_init(void)
    387{
    388}
    389#endif
    390
    391static void __init innovator_init(void)
    392{
    393	if (cpu_is_omap1510())
    394		omap1510_fpga_init_irq();
    395	innovator_init_smc91x();
    396
    397#ifdef CONFIG_ARCH_OMAP15XX
    398	if (cpu_is_omap1510()) {
    399		unsigned char reg;
    400
    401		/* mux pins for uarts */
    402		omap_cfg_reg(UART1_TX);
    403		omap_cfg_reg(UART1_RTS);
    404		omap_cfg_reg(UART2_TX);
    405		omap_cfg_reg(UART2_RTS);
    406		omap_cfg_reg(UART3_TX);
    407		omap_cfg_reg(UART3_RX);
    408
    409		reg = __raw_readb(OMAP1510_FPGA_POWER);
    410		reg |= OMAP1510_FPGA_PCR_COM1_EN;
    411		__raw_writeb(reg, OMAP1510_FPGA_POWER);
    412		udelay(10);
    413
    414		reg = __raw_readb(OMAP1510_FPGA_POWER);
    415		reg |= OMAP1510_FPGA_PCR_COM2_EN;
    416		__raw_writeb(reg, OMAP1510_FPGA_POWER);
    417		udelay(10);
    418
    419		platform_add_devices(innovator1510_devices, ARRAY_SIZE(innovator1510_devices));
    420		spi_register_board_info(innovator1510_boardinfo,
    421				ARRAY_SIZE(innovator1510_boardinfo));
    422	}
    423#endif
    424#ifdef CONFIG_ARCH_OMAP16XX
    425	if (!cpu_is_omap1510()) {
    426		innovator1610_smc91x_resources[1].start = gpio_to_irq(0);
    427		innovator1610_smc91x_resources[1].end = gpio_to_irq(0);
    428		platform_add_devices(innovator1610_devices, ARRAY_SIZE(innovator1610_devices));
    429	}
    430#endif
    431
    432#ifdef CONFIG_ARCH_OMAP15XX
    433	if (cpu_is_omap1510()) {
    434		omap1_usb_init(&innovator1510_usb_config);
    435		omapfb_set_lcd_config(&innovator1510_lcd_config);
    436	}
    437#endif
    438#ifdef CONFIG_ARCH_OMAP16XX
    439	if (cpu_is_omap1610()) {
    440		omap1_usb_init(&h2_usb_config);
    441		omapfb_set_lcd_config(&innovator1610_lcd_config);
    442	}
    443#endif
    444	omap_serial_init();
    445	omap_register_i2c_bus(1, 100, NULL, 0);
    446	innovator_mmc_init();
    447}
    448
    449/*
    450 * REVISIT: Assume 15xx for now, we don't want to do revision check
    451 * until later on. The right way to fix this is to set up a different
    452 * machine_id for 16xx Innovator, or use device tree.
    453 */
    454static void __init innovator_map_io(void)
    455{
    456#ifdef CONFIG_ARCH_OMAP15XX
    457	omap15xx_map_io();
    458
    459	iotable_init(innovator1510_io_desc, ARRAY_SIZE(innovator1510_io_desc));
    460	udelay(10);	/* Delay needed for FPGA */
    461
    462	/* Dump the Innovator FPGA rev early - useful info for support. */
    463	pr_debug("Innovator FPGA Rev %d.%d Board Rev %d\n",
    464			__raw_readb(OMAP1510_FPGA_REV_HIGH),
    465			__raw_readb(OMAP1510_FPGA_REV_LOW),
    466			__raw_readb(OMAP1510_FPGA_BOARD_REV));
    467#endif
    468}
    469
    470MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
    471	/* Maintainer: MontaVista Software, Inc. */
    472	.atag_offset	= 0x100,
    473	.map_io		= innovator_map_io,
    474	.init_early     = omap1_init_early,
    475	.init_irq	= omap1_init_irq,
    476	.handle_irq	= omap1_handle_irq,
    477	.init_machine	= innovator_init,
    478	.init_late	= omap1_init_late,
    479	.init_time	= omap1_timer_init,
    480	.restart	= omap1_restart,
    481MACHINE_END