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-perseus2.c (7543B)


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