00001 #include "local.h"
00002
00003 #include <linux/delay.h>
00004 #include <linux/pci.h>
00005 #include <linux/list.h>
00006 #include <linux/init.h>
00007
00008
00009 #include "pci.h"
00010
00011 DECLARE_INITVAR(dde26_pci);
00012
00013
00014 typedef struct l4dde_pci_dev {
00015 struct list_head next;
00016 struct ddekit_pci_dev *ddekit_dev;
00017 struct pci_dev *linux_dev;
00018 } l4dde_pci_dev_t;
00019
00020
00021
00022
00023
00024
00025 static LIST_HEAD(pcidev_mappings);
00026
00027
00028 static struct pci_bus *pci_bus = NULL;
00029
00030 static int l4dde26_pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val);
00031 static int l4dde26_pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
00032
00033
00034 static struct pci_ops dde_pcibus_ops = {
00035 .read = l4dde26_pci_read,
00036 .write = l4dde26_pci_write,
00037 };
00038
00039
00040
00041
00042
00043 static int l4dde26_pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val)
00044 {
00045 return ddekit_pci_read(bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val);
00046 }
00047
00048 static int l4dde26_pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val)
00049 {
00050 return ddekit_pci_write(bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val);
00051 }
00052
00053 int pci_irq_enable(struct pci_dev *dev)
00054 {
00055 int irq = dev->irq;
00056 int pin = 0;
00057 int ret;
00058
00059 DEBUG_MSG("dev %p", dev);
00060 if (!dev)
00061 return -EINVAL;
00062
00063 pin = (int)dev->pin;
00064 DEBUG_MSG("irq %d, pin %d", dev->irq, dev->pin);
00065 if (!pin) {
00066 dev_warn(&dev->dev,
00067 "No interrupt pin configured for device %s\n",
00068 pci_name(dev));
00069 return 0;
00070 }
00071 pin--;
00072
00073 ret = ddekit_pci_irq_enable(dev->bus->number, PCI_SLOT(dev->devfn),
00074 PCI_FUNC(dev->devfn), pin, &irq);
00075 if (ret) {
00076 dev_warn(&dev->dev, "Interrupt enable failed for device %s (%d)\n",
00077 pci_name(dev), ret);
00078 return -1;
00079 }
00080
00081 dev_info(&dev->dev, "PCI INT %c -> GSI %d -> IRQ %d\n",
00082 'A' + pin, irq, dev->irq);
00083
00084 dev->irq = irq;
00085 return 0;
00086 }
00087
00088 int __pci_enable_device(struct pci_dev *dev)
00089 {
00090 WARN_UNIMPL;
00091 return 0;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 int
00106 pci_enable_device(struct pci_dev *dev)
00107 {
00108 CHECK_INITVAR(dde26_pci);
00109
00110 return pci_irq_enable(dev);
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 void pci_disable_device(struct pci_dev *dev)
00123 {
00124 CHECK_INITVAR(dde26_pci);
00125 WARN_UNIMPL;
00126 }
00127
00128
00129 void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
00130 {
00131
00132 }
00133
00134 void pci_set_master(struct pci_dev *dev)
00135 {
00136 CHECK_INITVAR(dde26_pci);
00137 WARN_UNIMPL;
00138 }
00139
00140
00141 int pci_create_sysfs_dev_files(struct pci_dev *pdev)
00142 {
00143 return 0;
00144 }
00145
00146 unsigned int pcibios_assign_all_busses(void)
00147 {
00148 return 1;
00149 }
00150
00151 void
00152 pcibios_align_resource(void *data, struct resource *res,
00153 resource_size_t size, resource_size_t align)
00154 {
00155 WARN_UNIMPL;
00156 }
00157
00158 int pcibios_enable_device(struct pci_dev *dev, int mask)
00159 {
00160 #if 0
00161 int err;
00162
00163 if ((err = pcibios_enable_resources(dev, mask)) < 0)
00164 return err;
00165
00166 return pcibios_enable_irq(dev);
00167 #endif
00168 return 0;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177 void __init l4dde26_init_pci(void)
00178 {
00179 ddekit_pci_init();
00180
00181 pci_bus = pci_create_bus(NULL, 0, &dde_pcibus_ops, NULL);
00182 Assert(pci_bus);
00183
00184 pci_do_scan_bus(pci_bus);
00185
00186 INITIALIZE_INITVAR(dde26_pci);
00187 }
00188
00189 arch_initcall(l4dde26_init_pci);