| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | /* * Buffalo Terastation Pro II/Live Board Setup * * Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */#include <linux/gpio.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/platform_device.h>#include <linux/pci.h>#include <linux/irq.h>#include <linux/delay.h>#include <linux/mtd/physmap.h>#include <linux/mv643xx_eth.h>#include <linux/i2c.h>#include <linux/serial_reg.h>#include <asm/mach-types.h>#include <asm/mach/arch.h>#include <asm/mach/pci.h>#include <mach/orion5x.h>#include "common.h"#include "mpp.h"/***************************************************************************** * Terastation Pro 2/Live Info ****************************************************************************//* * Terastation Pro 2 hardware : * - Marvell 88F5281-D0 * - Marvell 88SX6042 SATA controller (PCI) * - Marvell 88E1118 Gigabit Ethernet PHY * - 256KB NOR flash * - 128MB of DDR RAM * - PCIe port (not equipped) *//* * 256K NOR flash Device bus boot chip select */#define TSP2_NOR_BOOT_BASE	0xf4000000#define TSP2_NOR_BOOT_SIZE	SZ_256K/***************************************************************************** * 256KB NOR Flash on BOOT Device ****************************************************************************/static struct physmap_flash_data tsp2_nor_flash_data = {	.width    = 1,};static struct resource tsp2_nor_flash_resource = {	.flags = IORESOURCE_MEM,	.start = TSP2_NOR_BOOT_BASE,	.end   = TSP2_NOR_BOOT_BASE + TSP2_NOR_BOOT_SIZE - 1,};static struct platform_device tsp2_nor_flash = {	.name          = "physmap-flash",	.id            = 0,	.dev           = {		.platform_data	= &tsp2_nor_flash_data,	},	.num_resources = 1,	.resource      = &tsp2_nor_flash_resource,};/***************************************************************************** * PCI ****************************************************************************/#define TSP2_PCI_SLOT0_OFFS		7#define TSP2_PCI_SLOT0_IRQ_PIN		11void __init tsp2_pci_preinit(void){	int pin;	/*	 * Configure PCI GPIO IRQ pins	 */	pin = TSP2_PCI_SLOT0_IRQ_PIN;	if (gpio_request(pin, "PCI Int1") == 0) {		if (gpio_direction_input(pin) == 0) {			irq_set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW);		} else {			printk(KERN_ERR "tsp2_pci_preinit failed "					"to set_irq_type pin %d\n", pin);			gpio_free(pin);		}	} else {		printk(KERN_ERR "tsp2_pci_preinit failed to "				"gpio_request %d\n", pin);	}}static int __init tsp2_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin){	int irq;	/*	 * Check for devices with hard-wired IRQs.	 */	irq = orion5x_pci_map_irq(dev, slot, pin);	if (irq != -1)		return irq;	/*	 * PCI IRQs are connected via GPIOs.	 */	if (slot == TSP2_PCI_SLOT0_OFFS)		return gpio_to_irq(TSP2_PCI_SLOT0_IRQ_PIN);	return -1;}static struct hw_pci tsp2_pci __initdata = {	.nr_controllers = 2,	.preinit        = tsp2_pci_preinit,	.setup          = orion5x_pci_sys_setup,	.scan           = orion5x_pci_sys_scan_bus,	.map_irq        = tsp2_pci_map_irq,};static int __init tsp2_pci_init(void){	if (machine_is_terastation_pro2())		pci_common_init(&tsp2_pci);	return 0;}subsys_initcall(tsp2_pci_init);
 |