diff options
Diffstat (limited to 'drivers/pci/setup-res.c')
| -rw-r--r-- | drivers/pci/setup-res.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index ea9277b7f899..577f4b55c46d 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
| @@ -155,6 +155,46 @@ int pci_assign_resource(struct pci_dev *dev, int resno) | |||
| 155 | return ret; | 155 | return ret; |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | #ifdef CONFIG_EMBEDDED | ||
| 159 | int pci_assign_resource_fixed(struct pci_dev *dev, int resno) | ||
| 160 | { | ||
| 161 | struct pci_bus *bus = dev->bus; | ||
| 162 | struct resource *res = dev->resource + resno; | ||
| 163 | unsigned int type_mask; | ||
| 164 | int i, ret = -EBUSY; | ||
| 165 | |||
| 166 | type_mask = IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH; | ||
| 167 | |||
| 168 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | ||
| 169 | struct resource *r = bus->resource[i]; | ||
| 170 | if (!r) | ||
| 171 | continue; | ||
| 172 | |||
| 173 | /* type_mask must match */ | ||
| 174 | if ((res->flags ^ r->flags) & type_mask) | ||
| 175 | continue; | ||
| 176 | |||
| 177 | ret = request_resource(r, res); | ||
| 178 | |||
| 179 | if (ret == 0) | ||
| 180 | break; | ||
| 181 | } | ||
| 182 | |||
| 183 | if (ret) { | ||
| 184 | printk(KERN_ERR "PCI: Failed to allocate %s resource " | ||
| 185 | "#%d:%llx@%llx for %s\n", | ||
| 186 | res->flags & IORESOURCE_IO ? "I/O" : "mem", | ||
| 187 | resno, (unsigned long long)(res->end - res->start + 1), | ||
| 188 | (unsigned long long)res->start, pci_name(dev)); | ||
| 189 | } else if (resno < PCI_BRIDGE_RESOURCES) { | ||
| 190 | pci_update_resource(dev, res, resno); | ||
| 191 | } | ||
| 192 | |||
| 193 | return ret; | ||
| 194 | } | ||
| 195 | EXPORT_SYMBOL_GPL(pci_assign_resource_fixed); | ||
| 196 | #endif | ||
| 197 | |||
| 158 | /* Sort resources by alignment */ | 198 | /* Sort resources by alignment */ |
| 159 | void __devinit | 199 | void __devinit |
| 160 | pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | 200 | pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) |
