diff options
| author | Paul Mundt <lethal@linux-sh.org> | 2009-04-20 03:14:29 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-04-20 03:14:29 -0400 |
| commit | a3c0e0d0032d5bbfd7dc04827a257c717d432a5b (patch) | |
| tree | ba853dce3346b33c44cd4d224ca662632186594e | |
| parent | 9833385131fc4e8c52f95320ab899051d1c06831 (diff) | |
sh: pci: Consolidate pcibios_align_resource() definitions.
This introduces a saner pcibios_align_resource() that can be used
regardless of whether pci-auto or pci-new are being used, and
consolidates it in pci-lib.c.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
| -rw-r--r-- | arch/sh/boards/mach-se/7751/pci.c | 9 | ||||
| -rw-r--r-- | arch/sh/drivers/pci/pci-lib.c | 42 | ||||
| -rw-r--r-- | arch/sh/drivers/pci/pci-new.c | 23 | ||||
| -rw-r--r-- | arch/sh/drivers/pci/pci.c | 23 | ||||
| -rw-r--r-- | arch/sh/include/asm/pci.h | 5 |
5 files changed, 49 insertions, 53 deletions
diff --git a/arch/sh/boards/mach-se/7751/pci.c b/arch/sh/boards/mach-se/7751/pci.c index 203b2923fe7f..9ec64a416b30 100644 --- a/arch/sh/boards/mach-se/7751/pci.c +++ b/arch/sh/boards/mach-se/7751/pci.c | |||
| @@ -30,6 +30,9 @@ | |||
| 30 | #define PCIC_WRITE(x,v) writel((v), PCI_REG(x)) | 30 | #define PCIC_WRITE(x,v) writel((v), PCI_REG(x)) |
| 31 | #define PCIC_READ(x) readl(PCI_REG(x)) | 31 | #define PCIC_READ(x) readl(PCI_REG(x)) |
| 32 | 32 | ||
| 33 | #define xPCIBIOS_MIN_IO board_pci_channels->io_resource->start | ||
| 34 | #define xPCIBIOS_MIN_MEM board_pci_channels->mem_resource->start | ||
| 35 | |||
| 33 | /* | 36 | /* |
| 34 | * Description: This function sets up and initializes the pcic, sets | 37 | * Description: This function sets up and initializes the pcic, sets |
| 35 | * up the BARS, maps the DRAM into the address space etc, etc. | 38 | * up the BARS, maps the DRAM into the address space etc, etc. |
| @@ -97,12 +100,12 @@ int __init pcibios_init_platform(void) | |||
| 97 | * meaning all calls go straight through... use BUG_ON to | 100 | * meaning all calls go straight through... use BUG_ON to |
| 98 | * catch erroneous assumption. | 101 | * catch erroneous assumption. |
| 99 | */ | 102 | */ |
| 100 | BUG_ON(PCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE); | 103 | BUG_ON(xPCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE); |
| 101 | 104 | ||
| 102 | PCIC_WRITE(SH7751_PCIMBR, PCIBIOS_MIN_MEM); | 105 | PCIC_WRITE(SH7751_PCIMBR, xPCIBIOS_MIN_MEM); |
| 103 | 106 | ||
| 104 | /* Set IOBR for window containing area specified in pci.h */ | 107 | /* Set IOBR for window containing area specified in pci.h */ |
| 105 | PCIC_WRITE(SH7751_PCIIOBR, (PCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK)); | 108 | PCIC_WRITE(SH7751_PCIIOBR, (xPCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK)); |
| 106 | 109 | ||
| 107 | /* All done, may as well say so... */ | 110 | /* All done, may as well say so... */ |
| 108 | printk("SH7751 PCI: Finished initialization of the PCI controller\n"); | 111 | printk("SH7751 PCI: Finished initialization of the PCI controller\n"); |
diff --git a/arch/sh/drivers/pci/pci-lib.c b/arch/sh/drivers/pci/pci-lib.c index 1a43a350d574..8ab1a2d1b483 100644 --- a/arch/sh/drivers/pci/pci-lib.c +++ b/arch/sh/drivers/pci/pci-lib.c | |||
| @@ -4,6 +4,41 @@ | |||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/pci.h> | 5 | #include <linux/pci.h> |
| 6 | 6 | ||
| 7 | unsigned long PCIBIOS_MIN_IO = 0x0000; | ||
| 8 | unsigned long PCIBIOS_MIN_MEM = 0; | ||
| 9 | |||
| 10 | /* | ||
| 11 | * We need to avoid collisions with `mirrored' VGA ports | ||
| 12 | * and other strange ISA hardware, so we always want the | ||
| 13 | * addresses to be allocated in the 0x000-0x0ff region | ||
| 14 | * modulo 0x400. | ||
| 15 | */ | ||
| 16 | void pcibios_align_resource(void *data, struct resource *res, | ||
| 17 | resource_size_t size, resource_size_t align) | ||
| 18 | { | ||
| 19 | struct pci_dev *dev = data; | ||
| 20 | struct pci_channel *chan = dev->sysdata; | ||
| 21 | resource_size_t start = res->start; | ||
| 22 | |||
| 23 | if (res->flags & IORESOURCE_IO) { | ||
| 24 | if (start < PCIBIOS_MIN_IO + chan->io_resource->start) | ||
| 25 | start = PCIBIOS_MIN_IO + chan->io_resource->start; | ||
| 26 | |||
| 27 | /* | ||
| 28 | * Put everything into 0x00-0xff region modulo 0x400. | ||
| 29 | */ | ||
| 30 | if (start & 0x300) { | ||
| 31 | start = (start + 0x3ff) & ~0x3ff; | ||
| 32 | res->start = start; | ||
| 33 | } | ||
| 34 | } else if (res->flags & IORESOURCE_MEM) { | ||
| 35 | if (start < PCIBIOS_MIN_MEM + chan->mem_resource->start) | ||
| 36 | start = PCIBIOS_MIN_MEM + chan->mem_resource->start; | ||
| 37 | } | ||
| 38 | |||
| 39 | res->start = start; | ||
| 40 | } | ||
| 41 | |||
| 7 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | 42 | int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
| 8 | enum pci_mmap_state mmap_state, int write_combine) | 43 | enum pci_mmap_state mmap_state, int write_combine) |
| 9 | { | 44 | { |
| @@ -24,3 +59,10 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
| 24 | vma->vm_end - vma->vm_start, | 59 | vma->vm_end - vma->vm_start, |
| 25 | vma->vm_page_prot); | 60 | vma->vm_page_prot); |
| 26 | } | 61 | } |
| 62 | |||
| 63 | #ifdef CONFIG_HOTPLUG | ||
| 64 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
| 65 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
| 66 | EXPORT_SYMBOL(PCIBIOS_MIN_IO); | ||
| 67 | EXPORT_SYMBOL(PCIBIOS_MIN_MEM); | ||
| 68 | #endif | ||
diff --git a/arch/sh/drivers/pci/pci-new.c b/arch/sh/drivers/pci/pci-new.c index 097eb8811120..4e9251f3d090 100644 --- a/arch/sh/drivers/pci/pci-new.c +++ b/arch/sh/drivers/pci/pci-new.c | |||
| @@ -129,29 +129,6 @@ pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | |||
| 129 | res->end = region->end + offset; | 129 | res->end = region->end + offset; |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | void pcibios_align_resource(void *data, struct resource *res, | ||
| 133 | resource_size_t size, resource_size_t align) | ||
| 134 | __attribute__ ((weak)); | ||
| 135 | |||
| 136 | /* | ||
| 137 | * We need to avoid collisions with `mirrored' VGA ports | ||
| 138 | * and other strange ISA hardware, so we always want the | ||
| 139 | * addresses to be allocated in the 0x000-0x0ff region | ||
| 140 | * modulo 0x400. | ||
| 141 | */ | ||
| 142 | void pcibios_align_resource(void *data, struct resource *res, | ||
| 143 | resource_size_t size, resource_size_t align) | ||
| 144 | { | ||
| 145 | if (res->flags & IORESOURCE_IO) { | ||
| 146 | resource_size_t start = res->start; | ||
| 147 | |||
| 148 | if (start & 0x300) { | ||
| 149 | start = (start + 0x3ff) & ~0x3ff; | ||
| 150 | res->start = start; | ||
| 151 | } | ||
| 152 | } | ||
| 153 | } | ||
| 154 | |||
| 155 | int pcibios_enable_device(struct pci_dev *dev, int mask) | 132 | int pcibios_enable_device(struct pci_dev *dev, int mask) |
| 156 | { | 133 | { |
| 157 | u16 cmd, old_cmd; | 134 | u16 cmd, old_cmd; |
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 6d659cd93c9d..f670988e033d 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
| @@ -86,29 +86,6 @@ void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | |||
| 86 | res->end = region->end; | 86 | res->end = region->end; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | void pcibios_align_resource(void *data, struct resource *res, | ||
| 90 | resource_size_t size, resource_size_t align) | ||
| 91 | __attribute__ ((weak)); | ||
| 92 | |||
| 93 | /* | ||
| 94 | * We need to avoid collisions with `mirrored' VGA ports | ||
| 95 | * and other strange ISA hardware, so we always want the | ||
| 96 | * addresses to be allocated in the 0x000-0x0ff region | ||
| 97 | * modulo 0x400. | ||
| 98 | */ | ||
| 99 | void pcibios_align_resource(void *data, struct resource *res, | ||
| 100 | resource_size_t size, resource_size_t align) | ||
| 101 | { | ||
| 102 | if (res->flags & IORESOURCE_IO) { | ||
| 103 | resource_size_t start = res->start; | ||
| 104 | |||
| 105 | if (start & 0x300) { | ||
| 106 | start = (start + 0x3ff) & ~0x3ff; | ||
| 107 | res->start = start; | ||
| 108 | } | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | int pcibios_enable_device(struct pci_dev *dev, int mask) | 89 | int pcibios_enable_device(struct pci_dev *dev, int mask) |
| 113 | { | 90 | { |
| 114 | u16 cmd, old_cmd; | 91 | u16 cmd, old_cmd; |
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h index 46afd449739d..5212bf6dd4b1 100644 --- a/arch/sh/include/asm/pci.h +++ b/arch/sh/include/asm/pci.h | |||
| @@ -33,10 +33,7 @@ struct pci_channel { | |||
| 33 | */ | 33 | */ |
| 34 | extern struct pci_channel board_pci_channels[]; | 34 | extern struct pci_channel board_pci_channels[]; |
| 35 | 35 | ||
| 36 | /* ugly as hell, but makes drivers/pci/setup-res.c compile and work */ | 36 | extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM; |
| 37 | #define __PCI_CHAN(bus) ((struct pci_channel *)bus->sysdata) | ||
| 38 | #define PCIBIOS_MIN_IO __PCI_CHAN(bus)->io_resource->start | ||
| 39 | #define PCIBIOS_MIN_MEM __PCI_CHAN(bus)->mem_resource->start | ||
| 40 | 37 | ||
| 41 | struct pci_dev; | 38 | struct pci_dev; |
| 42 | 39 | ||
