/*
 * arch/arm/mach-iop3xx/iq80332-pci.c
 *
 * PCI support for the Intel IQ80332 reference board
 *
 * Author: Dave Jiang <dave.jiang@intel.com>
 * Copyright (C) 2004 Intel Corp.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/slab.h>

#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/mach/pci.h>
#include <asm/mach-types.h>

/*
 * The following macro is used to lookup irqs in a standard table
 * format for those systems that do not already have PCI
 * interrupts properly routed.  We assume 1 <= pin <= 4
 */
#define PCI_IRQ_TABLE_LOOKUP(minid,maxid)	\
({ int _ctl_ = -1;				\
   unsigned int _idsel = idsel - minid;		\
   if (_idsel <= maxid)				\
      _ctl_ = pci_irq_table[_idsel][pin-1];	\
   _ctl_; })

#define INTA	IRQ_IQ80332_INTA
#define INTB	IRQ_IQ80332_INTB
#define INTC	IRQ_IQ80332_INTC
#define INTD	IRQ_IQ80332_INTD

//#define INTE	IRQ_IQ80332_I82544

static inline int __init
iq80332_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
{
	static int pci_irq_table[][8] = {
		/*
		 * PCI IDSEL/INTPIN->INTLINE
		 * A       B       C       D
		 */
		{-1,   -1,   -1,   -1},
		{-1,   -1,   -1,   -1},
		{-1,   -1,   -1,   -1},
		{INTA, INTB, INTC, INTD}, /* PCI-X Slot */
		{-1,   -1,   -1,   -1},
		{INTC, INTC, INTC, INTC}, /* GigE  */
		{-1,   -1,   -1,   -1},
		{-1,   -1,   -1,   -1},
	};

	BUG_ON(pin < 1 || pin > 4);

	return PCI_IRQ_TABLE_LOOKUP(1, 7);
}

static int iq80332_setup(int nr, struct pci_sys_data *sys)
{
	struct resource *res;

	if(nr != 0)
		return 0;

	res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL);
	if (!res)
		panic("PCI: unable to alloc resources");

	res[0].start = IOP331_PCI_LOWER_IO_VA;
	res[0].end   = IOP331_PCI_UPPER_IO_VA;
	res[0].name  = "IQ80332 PCI I/O Space";
	res[0].flags = IORESOURCE_IO;

	res[1].start = IOP331_PCI_LOWER_MEM_PA;
	res[1].end   = IOP331_PCI_UPPER_MEM_PA;
	res[1].name  = "IQ80332 PCI Memory Space";
	res[1].flags = IORESOURCE_MEM;

	request_resource(&ioport_resource, &res[0]);
	request_resource(&iomem_resource, &res[1]);

	sys->mem_offset = IOP331_PCI_MEM_OFFSET;
	sys->io_offset  = IOP331_PCI_IO_OFFSET;

	sys->resource[0] = &res[0];
	sys->resource[1] = &res[1];
	sys->resource[2] = NULL;

	return 1;
}

static void iq80332_preinit(void)
{
	iop331_init();
}

static struct hw_pci iq80332_pci __initdata = {
	.swizzle	= pci_std_swizzle,
	.nr_controllers = 1,
	.setup		= iq80332_setup,
	.scan		= iop331_scan_bus,
	.preinit	= iq80332_preinit,
	.map_irq	= iq80332_map_irq
};

static int __init iq80332_pci_init(void)
{
	if (machine_is_iq80332())
		pci_common_init(&iq80332_pci);
	return 0;
}

subsys_initcall(iq80332_pci_init);




