linux/arch/arm/mach-ixp2000/ixdp2400.c
<<
>>
Prefs
   1/*
   2 * arch/arm/mach-ixp2000/ixdp2400.c
   3 *
   4 * IXDP2400 platform support
   5 *
   6 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
   7 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
   8 *
   9 * Copyright (C) 2002 Intel Corp.
  10 * Copyright (C) 2003-2004 MontaVista Software, Inc.
  11 *
  12 *  This program is free software; you can redistribute  it and/or modify it
  13 *  under  the terms of  the GNU General  Public License as published by the
  14 *  Free Software Foundation;  either version 2 of the  License, or (at your
  15 *  option) any later version.
  16 */
  17#include <linux/kernel.h>
  18#include <linux/init.h>
  19#include <linux/mm.h>
  20#include <linux/sched.h>
  21#include <linux/interrupt.h>
  22#include <linux/device.h>
  23#include <linux/bitops.h>
  24#include <linux/pci.h>
  25#include <linux/ioport.h>
  26#include <linux/slab.h>
  27#include <linux/delay.h>
  28#include <linux/io.h>
  29
  30#include <asm/irq.h>
  31#include <asm/pgtable.h>
  32#include <asm/page.h>
  33#include <asm/system.h>
  34#include <mach/hardware.h>
  35#include <asm/mach-types.h>
  36
  37#include <asm/mach/pci.h>
  38#include <asm/mach/map.h>
  39#include <asm/mach/irq.h>
  40#include <asm/mach/time.h>
  41#include <asm/mach/flash.h>
  42#include <asm/mach/arch.h>
  43
  44/*************************************************************************
  45 * IXDP2400 timer tick
  46 *************************************************************************/
  47static void __init ixdp2400_timer_init(void)
  48{
  49        int numerator, denominator;
  50        int denom_array[] = {2, 4, 8, 16, 1, 2, 4, 8};
  51
  52        numerator = (*(IXDP2400_CPLD_SYS_CLK_M) & 0xFF) *2;
  53        denominator = denom_array[(*(IXDP2400_CPLD_SYS_CLK_N) & 0x7)];
  54
  55        ixp2000_init_time(((3125000 * numerator) / (denominator)) / 2);
  56}
  57
  58static struct sys_timer ixdp2400_timer = {
  59        .init           = ixdp2400_timer_init,
  60        .offset         = ixp2000_gettimeoffset,
  61};
  62
  63/*************************************************************************
  64 * IXDP2400 PCI
  65 *************************************************************************/
  66void __init ixdp2400_pci_preinit(void)
  67{
  68        ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
  69        ixp2000_pci_preinit();
  70        pcibios_setup("firmware");
  71}
  72
  73int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys)
  74{
  75        sys->mem_offset = 0xe0000000;
  76
  77        ixp2000_pci_setup(nr, sys);
  78
  79        return 1;
  80}
  81
  82static int __init ixdp2400_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
  83{
  84        if (ixdp2x00_master_npu()) {
  85
  86                /*
  87                 * Root bus devices.  Slave NPU is only one with interrupt.
  88                 * Everything else, we just return -1 b/c nothing else
  89                 * on the root bus has interrupts.
  90                 */
  91                if(!dev->bus->self) {
  92                        if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN )
  93                                return IRQ_IXDP2400_INGRESS_NPU;
  94
  95                        return -1;
  96                }
  97
  98                /*
  99                 * Bridge behind the PMC slot.
 100                 * NOTE: Only INTA from the PMC slot is routed. VERY BAD.
 101                 */
 102                if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN &&
 103                        dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN &&
 104                        !dev->bus->parent->self->bus->parent)
 105                                  return IRQ_IXDP2400_PMC;
 106
 107                /*
 108                 * Device behind the first bridge
 109                 */
 110                if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) {
 111                        switch(dev->devfn) {
 112                                case IXDP2400_MASTER_ENET_DEVFN:        
 113                                        return IRQ_IXDP2400_ENET;       
 114                        
 115                                case IXDP2400_MEDIA_DEVFN:
 116                                        return IRQ_IXDP2400_MEDIA_PCI;
 117
 118                                case IXDP2400_SWITCH_FABRIC_DEVFN:
 119                                        return IRQ_IXDP2400_SF_PCI;
 120
 121                                case IXDP2X00_PMC_DEVFN:
 122                                        return IRQ_IXDP2400_PMC;
 123                        }
 124                }
 125
 126                return -1;
 127        } else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
 128}
 129
 130
 131static void ixdp2400_pci_postinit(void)
 132{
 133        struct pci_dev *dev;
 134
 135        if (ixdp2x00_master_npu()) {
 136                dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN);
 137                pci_remove_bus_device(dev);
 138                pci_dev_put(dev);
 139        } else {
 140                dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN);
 141                pci_remove_bus_device(dev);
 142                pci_dev_put(dev);
 143
 144                ixdp2x00_slave_pci_postinit();
 145        }
 146}
 147
 148static struct hw_pci ixdp2400_pci __initdata = {
 149        .nr_controllers = 1,
 150        .setup          = ixdp2400_pci_setup,
 151        .preinit        = ixdp2400_pci_preinit,
 152        .postinit       = ixdp2400_pci_postinit,
 153        .scan           = ixp2000_pci_scan_bus,
 154        .map_irq        = ixdp2400_pci_map_irq,
 155};
 156
 157int __init ixdp2400_pci_init(void)
 158{
 159        if (machine_is_ixdp2400())
 160                pci_common_init(&ixdp2400_pci);
 161
 162        return 0;
 163}
 164
 165subsys_initcall(ixdp2400_pci_init);
 166
 167void __init ixdp2400_init_irq(void)
 168{
 169        ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);
 170}
 171
 172MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
 173        /* Maintainer: MontaVista Software, Inc. */
 174        .phys_io        = IXP2000_UART_PHYS_BASE,
 175        .io_pg_offst    = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
 176        .boot_params    = 0x00000100,
 177        .map_io         = ixdp2x00_map_io,
 178        .init_irq       = ixdp2400_init_irq,
 179        .timer          = &ixdp2400_timer,
 180        .init_machine   = ixdp2x00_init_machine,
 181MACHINE_END
 182
 183
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.