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

db88f5281-setup.c (10013B)


      1/*
      2 * arch/arm/mach-orion5x/db88f5281-setup.c
      3 *
      4 * Marvell Orion-2 Development Board Setup
      5 *
      6 * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
      7 *
      8 * This file is licensed under the terms of the GNU General Public
      9 * License version 2.  This program is licensed "as is" without any
     10 * warranty of any kind, whether express or implied.
     11 */
     12#include <linux/gpio.h>
     13#include <linux/kernel.h>
     14#include <linux/init.h>
     15#include <linux/platform_device.h>
     16#include <linux/pci.h>
     17#include <linux/irq.h>
     18#include <linux/mtd/physmap.h>
     19#include <linux/mtd/rawnand.h>
     20#include <linux/timer.h>
     21#include <linux/mv643xx_eth.h>
     22#include <linux/i2c.h>
     23#include <asm/mach-types.h>
     24#include <asm/mach/arch.h>
     25#include <asm/mach/pci.h>
     26#include <linux/platform_data/mtd-orion_nand.h>
     27#include "common.h"
     28#include "mpp.h"
     29#include "orion5x.h"
     30
     31/*****************************************************************************
     32 * DB-88F5281 on board devices
     33 ****************************************************************************/
     34
     35/*
     36 * 512K NOR flash Device bus boot chip select
     37 */
     38
     39#define DB88F5281_NOR_BOOT_BASE		0xf4000000
     40#define DB88F5281_NOR_BOOT_SIZE		SZ_512K
     41
     42/*
     43 * 7-Segment on Device bus chip select 0
     44 */
     45
     46#define DB88F5281_7SEG_BASE		0xfa000000
     47#define DB88F5281_7SEG_SIZE		SZ_1K
     48
     49/*
     50 * 32M NOR flash on Device bus chip select 1
     51 */
     52
     53#define DB88F5281_NOR_BASE		0xfc000000
     54#define DB88F5281_NOR_SIZE		SZ_32M
     55
     56/*
     57 * 32M NAND flash on Device bus chip select 2
     58 */
     59
     60#define DB88F5281_NAND_BASE		0xfa800000
     61#define DB88F5281_NAND_SIZE		SZ_1K
     62
     63/*
     64 * PCI
     65 */
     66
     67#define DB88F5281_PCI_SLOT0_OFFS		7
     68#define DB88F5281_PCI_SLOT0_IRQ_PIN		12
     69#define DB88F5281_PCI_SLOT1_SLOT2_IRQ_PIN	13
     70
     71/*****************************************************************************
     72 * 512M NOR Flash on Device bus Boot CS
     73 ****************************************************************************/
     74
     75static struct physmap_flash_data db88f5281_boot_flash_data = {
     76	.width		= 1,	/* 8 bit bus width */
     77};
     78
     79static struct resource db88f5281_boot_flash_resource = {
     80	.flags		= IORESOURCE_MEM,
     81	.start		= DB88F5281_NOR_BOOT_BASE,
     82	.end		= DB88F5281_NOR_BOOT_BASE + DB88F5281_NOR_BOOT_SIZE - 1,
     83};
     84
     85static struct platform_device db88f5281_boot_flash = {
     86	.name		= "physmap-flash",
     87	.id		= 0,
     88	.dev		= {
     89		.platform_data	= &db88f5281_boot_flash_data,
     90	},
     91	.num_resources	= 1,
     92	.resource	= &db88f5281_boot_flash_resource,
     93};
     94
     95/*****************************************************************************
     96 * 32M NOR Flash on Device bus CS1
     97 ****************************************************************************/
     98
     99static struct physmap_flash_data db88f5281_nor_flash_data = {
    100	.width		= 4,	/* 32 bit bus width */
    101};
    102
    103static struct resource db88f5281_nor_flash_resource = {
    104	.flags		= IORESOURCE_MEM,
    105	.start		= DB88F5281_NOR_BASE,
    106	.end		= DB88F5281_NOR_BASE + DB88F5281_NOR_SIZE - 1,
    107};
    108
    109static struct platform_device db88f5281_nor_flash = {
    110	.name		= "physmap-flash",
    111	.id		= 1,
    112	.dev		= {
    113		.platform_data	= &db88f5281_nor_flash_data,
    114	},
    115	.num_resources	= 1,
    116	.resource	= &db88f5281_nor_flash_resource,
    117};
    118
    119/*****************************************************************************
    120 * 32M NAND Flash on Device bus CS2
    121 ****************************************************************************/
    122
    123static struct mtd_partition db88f5281_nand_parts[] = {
    124	{
    125		.name = "kernel",
    126		.offset = 0,
    127		.size = SZ_2M,
    128	}, {
    129		.name = "root",
    130		.offset = SZ_2M,
    131		.size = (SZ_16M - SZ_2M),
    132	}, {
    133		.name = "user",
    134		.offset = SZ_16M,
    135		.size = SZ_8M,
    136	}, {
    137		.name = "recovery",
    138		.offset = (SZ_16M + SZ_8M),
    139		.size = SZ_8M,
    140	},
    141};
    142
    143static struct resource db88f5281_nand_resource = {
    144	.flags		= IORESOURCE_MEM,
    145	.start		= DB88F5281_NAND_BASE,
    146	.end		= DB88F5281_NAND_BASE + DB88F5281_NAND_SIZE - 1,
    147};
    148
    149static struct orion_nand_data db88f5281_nand_data = {
    150	.parts		= db88f5281_nand_parts,
    151	.nr_parts	= ARRAY_SIZE(db88f5281_nand_parts),
    152	.cle		= 0,
    153	.ale		= 1,
    154	.width		= 8,
    155};
    156
    157static struct platform_device db88f5281_nand_flash = {
    158	.name		= "orion_nand",
    159	.id		= -1,
    160	.dev		= {
    161		.platform_data	= &db88f5281_nand_data,
    162	},
    163	.resource	= &db88f5281_nand_resource,
    164	.num_resources	= 1,
    165};
    166
    167/*****************************************************************************
    168 * 7-Segment on Device bus CS0
    169 * Dummy counter every 2 sec
    170 ****************************************************************************/
    171
    172static void __iomem *db88f5281_7seg;
    173static struct timer_list db88f5281_timer;
    174
    175static void db88f5281_7seg_event(struct timer_list *unused)
    176{
    177	static int count = 0;
    178	writel(0, db88f5281_7seg + (count << 4));
    179	count = (count + 1) & 7;
    180	mod_timer(&db88f5281_timer, jiffies + 2 * HZ);
    181}
    182
    183static int __init db88f5281_7seg_init(void)
    184{
    185	if (machine_is_db88f5281()) {
    186		db88f5281_7seg = ioremap(DB88F5281_7SEG_BASE,
    187					DB88F5281_7SEG_SIZE);
    188		if (!db88f5281_7seg) {
    189			printk(KERN_ERR "Failed to ioremap db88f5281_7seg\n");
    190			return -EIO;
    191		}
    192		timer_setup(&db88f5281_timer, db88f5281_7seg_event, 0);
    193		mod_timer(&db88f5281_timer, jiffies + 2 * HZ);
    194	}
    195
    196	return 0;
    197}
    198
    199__initcall(db88f5281_7seg_init);
    200
    201/*****************************************************************************
    202 * PCI
    203 ****************************************************************************/
    204
    205static void __init db88f5281_pci_preinit(void)
    206{
    207	int pin;
    208
    209	/*
    210	 * Configure PCI GPIO IRQ pins
    211	 */
    212	pin = DB88F5281_PCI_SLOT0_IRQ_PIN;
    213	if (gpio_request(pin, "PCI Int1") == 0) {
    214		if (gpio_direction_input(pin) == 0) {
    215			irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW);
    216		} else {
    217			printk(KERN_ERR "db88f5281_pci_preinit failed to "
    218					"set_irq_type pin %d\n", pin);
    219			gpio_free(pin);
    220		}
    221	} else {
    222		printk(KERN_ERR "db88f5281_pci_preinit failed to gpio_request %d\n", pin);
    223	}
    224
    225	pin = DB88F5281_PCI_SLOT1_SLOT2_IRQ_PIN;
    226	if (gpio_request(pin, "PCI Int2") == 0) {
    227		if (gpio_direction_input(pin) == 0) {
    228			irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW);
    229		} else {
    230			printk(KERN_ERR "db88f5281_pci_preinit failed "
    231					"to set_irq_type pin %d\n", pin);
    232			gpio_free(pin);
    233		}
    234	} else {
    235		printk(KERN_ERR "db88f5281_pci_preinit failed to gpio_request %d\n", pin);
    236	}
    237}
    238
    239static int __init db88f5281_pci_map_irq(const struct pci_dev *dev, u8 slot,
    240	u8 pin)
    241{
    242	int irq;
    243
    244	/*
    245	 * Check for devices with hard-wired IRQs.
    246	 */
    247	irq = orion5x_pci_map_irq(dev, slot, pin);
    248	if (irq != -1)
    249		return irq;
    250
    251	/*
    252	 * PCI IRQs are connected via GPIOs.
    253	 */
    254	switch (slot - DB88F5281_PCI_SLOT0_OFFS) {
    255	case 0:
    256		return gpio_to_irq(DB88F5281_PCI_SLOT0_IRQ_PIN);
    257	case 1:
    258	case 2:
    259		return gpio_to_irq(DB88F5281_PCI_SLOT1_SLOT2_IRQ_PIN);
    260	default:
    261		return -1;
    262	}
    263}
    264
    265static struct hw_pci db88f5281_pci __initdata = {
    266	.nr_controllers	= 2,
    267	.preinit	= db88f5281_pci_preinit,
    268	.setup		= orion5x_pci_sys_setup,
    269	.scan		= orion5x_pci_sys_scan_bus,
    270	.map_irq	= db88f5281_pci_map_irq,
    271};
    272
    273static int __init db88f5281_pci_init(void)
    274{
    275	if (machine_is_db88f5281())
    276		pci_common_init(&db88f5281_pci);
    277
    278	return 0;
    279}
    280
    281subsys_initcall(db88f5281_pci_init);
    282
    283/*****************************************************************************
    284 * Ethernet
    285 ****************************************************************************/
    286static struct mv643xx_eth_platform_data db88f5281_eth_data = {
    287	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),
    288};
    289
    290/*****************************************************************************
    291 * RTC DS1339 on I2C bus
    292 ****************************************************************************/
    293static struct i2c_board_info __initdata db88f5281_i2c_rtc = {
    294	I2C_BOARD_INFO("ds1339", 0x68),
    295};
    296
    297/*****************************************************************************
    298 * General Setup
    299 ****************************************************************************/
    300static unsigned int db88f5281_mpp_modes[] __initdata = {
    301	MPP0_GPIO,		/* USB Over Current */
    302	MPP1_GPIO,		/* USB Vbat input */
    303	MPP2_PCI_ARB,		/* PCI_REQn[2] */
    304	MPP3_PCI_ARB,		/* PCI_GNTn[2] */
    305	MPP4_PCI_ARB,		/* PCI_REQn[3] */
    306	MPP5_PCI_ARB,		/* PCI_GNTn[3] */
    307	MPP6_GPIO,		/* JP0, CON17.2 */
    308	MPP7_GPIO,		/* JP1, CON17.1 */
    309	MPP8_GPIO,		/* JP2, CON11.2 */
    310	MPP9_GPIO,		/* JP3, CON11.3 */
    311	MPP10_GPIO,		/* RTC int */
    312	MPP11_GPIO,		/* Baud Rate Generator */
    313	MPP12_GPIO,		/* PCI int 1 */
    314	MPP13_GPIO,		/* PCI int 2 */
    315	MPP14_NAND,		/* NAND_REn[2] */
    316	MPP15_NAND,		/* NAND_WEn[2] */
    317	MPP16_UART,		/* UART1_RX */
    318	MPP17_UART,		/* UART1_TX */
    319	MPP18_UART,		/* UART1_CTSn */
    320	MPP19_UART,		/* UART1_RTSn */
    321	0,
    322};
    323
    324static void __init db88f5281_init(void)
    325{
    326	/*
    327	 * Basic Orion setup. Need to be called early.
    328	 */
    329	orion5x_init();
    330
    331	orion5x_mpp_conf(db88f5281_mpp_modes);
    332	writel(0, MPP_DEV_CTRL);		/* DEV_D[31:16] */
    333
    334	/*
    335	 * Configure peripherals.
    336	 */
    337	orion5x_ehci0_init();
    338	orion5x_eth_init(&db88f5281_eth_data);
    339	orion5x_i2c_init();
    340	orion5x_uart0_init();
    341	orion5x_uart1_init();
    342
    343	mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
    344				    ORION_MBUS_DEVBUS_BOOT_ATTR,
    345				    DB88F5281_NOR_BOOT_BASE,
    346				    DB88F5281_NOR_BOOT_SIZE);
    347	platform_device_register(&db88f5281_boot_flash);
    348
    349	mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(0),
    350				    ORION_MBUS_DEVBUS_ATTR(0),
    351				    DB88F5281_7SEG_BASE,
    352				    DB88F5281_7SEG_SIZE);
    353
    354	mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(1),
    355				    ORION_MBUS_DEVBUS_ATTR(1),
    356				    DB88F5281_NOR_BASE,
    357				    DB88F5281_NOR_SIZE);
    358	platform_device_register(&db88f5281_nor_flash);
    359
    360	mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(2),
    361				    ORION_MBUS_DEVBUS_ATTR(2),
    362				    DB88F5281_NAND_BASE,
    363				    DB88F5281_NAND_SIZE);
    364	platform_device_register(&db88f5281_nand_flash);
    365
    366	i2c_register_board_info(0, &db88f5281_i2c_rtc, 1);
    367}
    368
    369MACHINE_START(DB88F5281, "Marvell Orion-2 Development Board")
    370	/* Maintainer: Tzachi Perelstein <tzachi@marvell.com> */
    371	.atag_offset	= 0x100,
    372	.nr_irqs	= ORION5X_NR_IRQS,
    373	.init_machine	= db88f5281_init,
    374	.map_io		= orion5x_map_io,
    375	.init_early	= orion5x_init_early,
    376	.init_irq	= orion5x_init_irq,
    377	.init_time	= orion5x_timer_init,
    378	.restart	= orion5x_restart,
    379MACHINE_END