Path: blob/master/arch/arm/mach-ixp2000/ixdp2400.c
10817 views
/*1* arch/arm/mach-ixp2000/ixdp2400.c2*3* IXDP2400 platform support4*5* Original Author: Naeem Afzal <[email protected]>6* Maintainer: Deepak Saxena <[email protected]>7*8* Copyright (C) 2002 Intel Corp.9* Copyright (C) 2003-2004 MontaVista Software, Inc.10*11* This program is free software; you can redistribute it and/or modify it12* under the terms of the GNU General Public License as published by the13* Free Software Foundation; either version 2 of the License, or (at your14* option) any later version.15*/16#include <linux/kernel.h>17#include <linux/init.h>18#include <linux/mm.h>19#include <linux/sched.h>20#include <linux/interrupt.h>21#include <linux/device.h>22#include <linux/bitops.h>23#include <linux/pci.h>24#include <linux/ioport.h>25#include <linux/delay.h>26#include <linux/io.h>2728#include <asm/irq.h>29#include <asm/pgtable.h>30#include <asm/page.h>31#include <asm/system.h>32#include <mach/hardware.h>33#include <asm/mach-types.h>3435#include <asm/mach/pci.h>36#include <asm/mach/map.h>37#include <asm/mach/irq.h>38#include <asm/mach/time.h>39#include <asm/mach/flash.h>40#include <asm/mach/arch.h>4142/*************************************************************************43* IXDP2400 timer tick44*************************************************************************/45static void __init ixdp2400_timer_init(void)46{47int numerator, denominator;48int denom_array[] = {2, 4, 8, 16, 1, 2, 4, 8};4950numerator = (*(IXDP2400_CPLD_SYS_CLK_M) & 0xFF) *2;51denominator = denom_array[(*(IXDP2400_CPLD_SYS_CLK_N) & 0x7)];5253ixp2000_init_time(((3125000 * numerator) / (denominator)) / 2);54}5556static struct sys_timer ixdp2400_timer = {57.init = ixdp2400_timer_init,58.offset = ixp2000_gettimeoffset,59};6061/*************************************************************************62* IXDP2400 PCI63*************************************************************************/64void __init ixdp2400_pci_preinit(void)65{66ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);67ixp2000_pci_preinit();68pcibios_setup("firmware");69}7071int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys)72{73sys->mem_offset = 0xe0000000;7475ixp2000_pci_setup(nr, sys);7677return 1;78}7980static int __init ixdp2400_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)81{82if (ixdp2x00_master_npu()) {8384/*85* Root bus devices. Slave NPU is only one with interrupt.86* Everything else, we just return -1 b/c nothing else87* on the root bus has interrupts.88*/89if(!dev->bus->self) {90if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN )91return IRQ_IXDP2400_INGRESS_NPU;9293return -1;94}9596/*97* Bridge behind the PMC slot.98* NOTE: Only INTA from the PMC slot is routed. VERY BAD.99*/100if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN &&101dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN &&102!dev->bus->parent->self->bus->parent)103return IRQ_IXDP2400_PMC;104105/*106* Device behind the first bridge107*/108if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) {109switch(dev->devfn) {110case IXDP2400_MASTER_ENET_DEVFN:111return IRQ_IXDP2400_ENET;112113case IXDP2400_MEDIA_DEVFN:114return IRQ_IXDP2400_MEDIA_PCI;115116case IXDP2400_SWITCH_FABRIC_DEVFN:117return IRQ_IXDP2400_SF_PCI;118119case IXDP2X00_PMC_DEVFN:120return IRQ_IXDP2400_PMC;121}122}123124return -1;125} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */126}127128129static void ixdp2400_pci_postinit(void)130{131struct pci_dev *dev;132133if (ixdp2x00_master_npu()) {134dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN);135pci_remove_bus_device(dev);136pci_dev_put(dev);137} else {138dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN);139pci_remove_bus_device(dev);140pci_dev_put(dev);141142ixdp2x00_slave_pci_postinit();143}144}145146static struct hw_pci ixdp2400_pci __initdata = {147.nr_controllers = 1,148.setup = ixdp2400_pci_setup,149.preinit = ixdp2400_pci_preinit,150.postinit = ixdp2400_pci_postinit,151.scan = ixp2000_pci_scan_bus,152.map_irq = ixdp2400_pci_map_irq,153};154155int __init ixdp2400_pci_init(void)156{157if (machine_is_ixdp2400())158pci_common_init(&ixdp2400_pci);159160return 0;161}162163subsys_initcall(ixdp2400_pci_init);164165void __init ixdp2400_init_irq(void)166{167ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);168}169170MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")171/* Maintainer: MontaVista Software, Inc. */172.boot_params = 0x00000100,173.map_io = ixdp2x00_map_io,174.init_irq = ixdp2400_init_irq,175.timer = &ixdp2400_timer,176.init_machine = ixdp2x00_init_machine,177MACHINE_END178179180181