Commit bf9bc995 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.29

* git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.29:
  parisc: update defconfigs
  parisc: define x->x mmio accessors
  parisc: dino: struct device - replace bus_id with dev_name(), dev_set_name()
  parisc: convert cpu_check_affinity to new cpumask api
  parisc: convert (read|write)bwlq to inlines
  parisc: fix use of new cpumask api in irq.c
  parisc: update parisc for new irq_desc
  parisc: update MAINTAINERS
  parisc: fix wrong assumption about bus->self
  parisc: fix 64bit build
  parisc: add braces around arguments in assembler macros
  parisc: fix dev_printk() compile warnings for accessing a device struct
  parisc: remove unused local out_putf label
  parisc: fix `struct pt_regs' declared inside parameter list warning
  parisc: fix section mismatch warnings
  parisc: remove klist iterators
  parisc: BUG_ON() cleanup
parents 6d71135d e8f208e8
...@@ -3350,10 +3350,8 @@ S: Maintained ...@@ -3350,10 +3350,8 @@ S: Maintained
PARISC ARCHITECTURE PARISC ARCHITECTURE
P: Kyle McMartin P: Kyle McMartin
M: kyle@mcmartin.ca M: kyle@mcmartin.ca
P: Matthew Wilcox P: Helge Deller
M: matthew@wil.cx M: deller@gmx.de
P: Grant Grundler
M: grundler@parisc-linux.org
L: linux-parisc@vger.kernel.org L: linux-parisc@vger.kernel.org
W: http://www.parisc-linux.org/ W: http://www.parisc-linux.org/
T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -137,7 +137,6 @@ int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned i ...@@ -137,7 +137,6 @@ int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned i
error = count - buf.count; error = count - buf.count;
} }
out_putf:
fput(file); fput(file);
out: out:
return error; return error;
......
...@@ -79,6 +79,7 @@ ...@@ -79,6 +79,7 @@
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/types.h>
#include <asm/asmregs.h> #include <asm/asmregs.h>
...@@ -129,27 +130,27 @@ ...@@ -129,27 +130,27 @@
/* Shift Left - note the r and t can NOT be the same! */ /* Shift Left - note the r and t can NOT be the same! */
.macro shl r, sa, t .macro shl r, sa, t
dep,z \r, 31-\sa, 32-\sa, \t dep,z \r, 31-(\sa), 32-(\sa), \t
.endm .endm
/* The PA 2.0 shift left */ /* The PA 2.0 shift left */
.macro shlw r, sa, t .macro shlw r, sa, t
depw,z \r, 31-\sa, 32-\sa, \t depw,z \r, 31-(\sa), 32-(\sa), \t
.endm .endm
/* And the PA 2.0W shift left */ /* And the PA 2.0W shift left */
.macro shld r, sa, t .macro shld r, sa, t
depd,z \r, 63-\sa, 64-\sa, \t depd,z \r, 63-(\sa), 64-(\sa), \t
.endm .endm
/* Shift Right - note the r and t can NOT be the same! */ /* Shift Right - note the r and t can NOT be the same! */
.macro shr r, sa, t .macro shr r, sa, t
extru \r, 31-\sa, 32-\sa, \t extru \r, 31-(\sa), 32-(\sa), \t
.endm .endm
/* pa20w version of shift right */ /* pa20w version of shift right */
.macro shrd r, sa, t .macro shrd r, sa, t
extrd,u \r, 63-\sa, 64-\sa, \t extrd,u \r, 63-(\sa), 64-(\sa), \t
.endm .endm
/* load 32-bit 'value' into 'reg' compensating for the ldil /* load 32-bit 'value' into 'reg' compensating for the ldil
......
...@@ -174,15 +174,48 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add ...@@ -174,15 +174,48 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add
*(volatile unsigned long long __force *) addr = b; *(volatile unsigned long long __force *) addr = b;
} }
/* readb can never be const, so use __fswab instead of le*_to_cpu */ static inline unsigned char readb(const volatile void __iomem *addr)
#define readb(addr) __raw_readb(addr) {
#define readw(addr) le16_to_cpu(__raw_readw(addr)) return __raw_readb(addr);
#define readl(addr) le32_to_cpu(__raw_readl(addr)) }
#define readq(addr) le64_to_cpu(__raw_readq(addr)) static inline unsigned short readw(const volatile void __iomem *addr)
#define writeb(b, addr) __raw_writeb(b, addr) {
#define writew(b, addr) __raw_writew(cpu_to_le16(b), addr) return le16_to_cpu(__raw_readw(addr));
#define writel(b, addr) __raw_writel(cpu_to_le32(b), addr) }
#define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr) static inline unsigned int readl(const volatile void __iomem *addr)
{
return le32_to_cpu(__raw_readl(addr));
}
static inline unsigned long long readq(const volatile void __iomem *addr)
{
return le64_to_cpu(__raw_readq(addr));
}
static inline void writeb(unsigned char b, volatile void __iomem *addr)
{
__raw_writeb(b, addr);
}
static inline void writew(unsigned short w, volatile void __iomem *addr)
{
__raw_writew(cpu_to_le16(w), addr);
}
static inline void writel(unsigned int l, volatile void __iomem *addr)
{
__raw_writel(cpu_to_le32(l), addr);
}
static inline void writeq(unsigned long long q, volatile void __iomem *addr)
{
__raw_writeq(cpu_to_le64(q), addr);
}
#define readb readb
#define readw readw
#define readl readl
#define readq readq
#define writeb writeb
#define writew writew
#define writel writel
#define writeq writeq
#define readb_relaxed(addr) readb(addr) #define readb_relaxed(addr) readb(addr)
#define readw_relaxed(addr) readw(addr) #define readw_relaxed(addr) readw(addr)
......
...@@ -49,7 +49,7 @@ extern unsigned long txn_alloc_addr(unsigned int); ...@@ -49,7 +49,7 @@ extern unsigned long txn_alloc_addr(unsigned int);
extern unsigned long txn_affinity_addr(unsigned int irq, int cpu); extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);
extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *); extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *);
extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest); extern int cpu_check_affinity(unsigned int irq, const struct cpumask *dest);
/* soft power switch support (power.c) */ /* soft power switch support (power.c) */
extern struct tasklet_struct power_tasklet; extern struct tasklet_struct power_tasklet;
......
...@@ -241,6 +241,7 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo ...@@ -241,6 +241,7 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo
#define __copy_to_user_inatomic __copy_to_user #define __copy_to_user_inatomic __copy_to_user
#define __copy_from_user_inatomic __copy_from_user #define __copy_from_user_inatomic __copy_from_user
struct pt_regs;
int fixup_exception(struct pt_regs *regs); int fixup_exception(struct pt_regs *regs);
#endif /* __PARISC_UACCESS_H */ #endif /* __PARISC_UACCESS_H */
...@@ -551,10 +551,7 @@ void flush_cache_range(struct vm_area_struct *vma, ...@@ -551,10 +551,7 @@ void flush_cache_range(struct vm_area_struct *vma,
{ {
int sr3; int sr3;
if (!vma->vm_mm->context) { BUG_ON(!vma->vm_mm->context);
BUG();
return;
}
sr3 = mfsp(3); sr3 = mfsp(3);
if (vma->vm_mm->context == sr3) { if (vma->vm_mm->context == sr3) {
......
...@@ -368,7 +368,7 @@ ...@@ -368,7 +368,7 @@
* abstractions for the macros */ * abstractions for the macros */
.macro EXTR reg1,start,length,reg2 .macro EXTR reg1,start,length,reg2
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
extrd,u \reg1,32+\start,\length,\reg2 extrd,u \reg1,32+(\start),\length,\reg2
#else #else
extrw,u \reg1,\start,\length,\reg2 extrw,u \reg1,\start,\length,\reg2
#endif #endif
...@@ -376,7 +376,7 @@ ...@@ -376,7 +376,7 @@
.macro DEP reg1,start,length,reg2 .macro DEP reg1,start,length,reg2
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
depd \reg1,32+\start,\length,\reg2 depd \reg1,32+(\start),\length,\reg2
#else #else
depw \reg1,\start,\length,\reg2 depw \reg1,\start,\length,\reg2
#endif #endif
...@@ -384,7 +384,7 @@ ...@@ -384,7 +384,7 @@
.macro DEPI val,start,length,reg .macro DEPI val,start,length,reg
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
depdi \val,32+\start,\length,\reg depdi \val,32+(\start),\length,\reg
#else #else
depwi \val,\start,\length,\reg depwi \val,\start,\length,\reg
#endif #endif
......
...@@ -151,7 +151,7 @@ static void convert_to_wide(unsigned long *addr) ...@@ -151,7 +151,7 @@ static void convert_to_wide(unsigned long *addr)
} }
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
void __init set_firmware_width_unlocked(void) void __cpuinit set_firmware_width_unlocked(void)
{ {
int ret; int ret;
...@@ -168,7 +168,7 @@ void __init set_firmware_width_unlocked(void) ...@@ -168,7 +168,7 @@ void __init set_firmware_width_unlocked(void)
* This function must be called before any pdc_* function that uses the * This function must be called before any pdc_* function that uses the
* convert_to_wide function. * convert_to_wide function.
*/ */
void __init set_firmware_width(void) void __cpuinit set_firmware_width(void)
{ {
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&pdc_lock, flags); spin_lock_irqsave(&pdc_lock, flags);
...@@ -176,11 +176,11 @@ void __init set_firmware_width(void) ...@@ -176,11 +176,11 @@ void __init set_firmware_width(void)
spin_unlock_irqrestore(&pdc_lock, flags); spin_unlock_irqrestore(&pdc_lock, flags);
} }
#else #else
void __init set_firmware_width_unlocked(void) { void __cpuinit set_firmware_width_unlocked(void) {
return; return;
} }
void __init set_firmware_width(void) { void __cpuinit set_firmware_width(void) {
return; return;
} }
#endif /*CONFIG_64BIT*/ #endif /*CONFIG_64BIT*/
...@@ -302,7 +302,7 @@ int pdc_chassis_warn(unsigned long *warn) ...@@ -302,7 +302,7 @@ int pdc_chassis_warn(unsigned long *warn)
return retval; return retval;
} }
int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info) int __cpuinit pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
{ {
int ret; int ret;
...@@ -323,7 +323,7 @@ int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info) ...@@ -323,7 +323,7 @@ int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)
* This PDC call returns the presence and status of all the coprocessors * This PDC call returns the presence and status of all the coprocessors
* attached to the processor. * attached to the processor.
*/ */
int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info) int __cpuinit pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
{ {
int ret; int ret;
unsigned long flags; unsigned long flags;
......
...@@ -112,7 +112,7 @@ void cpu_end_irq(unsigned int irq) ...@@ -112,7 +112,7 @@ void cpu_end_irq(unsigned int irq)
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
int cpu_check_affinity(unsigned int irq, cpumask_t *dest) int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)
{ {
int cpu_dest; int cpu_dest;
...@@ -120,23 +120,25 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest) ...@@ -120,23 +120,25 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest)
if (CHECK_IRQ_PER_CPU(irq)) { if (CHECK_IRQ_PER_CPU(irq)) {
/* Bad linux design decision. The mask has already /* Bad linux design decision. The mask has already
* been set; we must reset it */ * been set; we must reset it */
irq_desc[irq].affinity = CPU_MASK_ALL; cpumask_setall(&irq_desc[irq].affinity);
return -EINVAL; return -EINVAL;
} }
/* whatever mask they set, we just allow one CPU */ /* whatever mask they set, we just allow one CPU */
cpu_dest = first_cpu(*dest); cpu_dest = first_cpu(*dest);
*dest = cpumask_of_cpu(cpu_dest);
return 0; return cpu_dest;
} }
static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest)
{ {
if (cpu_check_affinity(irq, dest)) int cpu_dest;
cpu_dest = cpu_check_affinity(irq, dest);
if (cpu_dest < 0)
return; return;
irq_desc[irq].affinity = *dest; cpumask_copy(&irq_desc[irq].affinity, &cpumask_of_cpu(cpu_dest));
} }
#endif #endif
...@@ -295,7 +297,7 @@ int txn_alloc_irq(unsigned int bits_wide) ...@@ -295,7 +297,7 @@ int txn_alloc_irq(unsigned int bits_wide)
unsigned long txn_affinity_addr(unsigned int irq, int cpu) unsigned long txn_affinity_addr(unsigned int irq, int cpu)
{ {
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
irq_desc[irq].affinity = cpumask_of_cpu(cpu); cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu));
#endif #endif
return per_cpu(cpu_data, cpu).txn_addr; return per_cpu(cpu_data, cpu).txn_addr;
...@@ -352,7 +354,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) ...@@ -352,7 +354,7 @@ void do_cpu_irq_mask(struct pt_regs *regs)
irq = eirr_to_irq(eirr_val); irq = eirr_to_irq(eirr_val);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
dest = irq_desc[irq].affinity; cpumask_copy(&dest, &irq_desc[irq].affinity);
if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) &&
!cpu_isset(smp_processor_id(), dest)) { !cpu_isset(smp_processor_id(), dest)) {
int cpu = first_cpu(dest); int cpu = first_cpu(dest);
......
...@@ -447,10 +447,7 @@ static void pa11_dma_free_consistent (struct device *dev, size_t size, void *vad ...@@ -447,10 +447,7 @@ static void pa11_dma_free_consistent (struct device *dev, size_t size, void *vad
static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction) static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction)
{ {
if (direction == DMA_NONE) { BUG_ON(direction == DMA_NONE);
printk(KERN_ERR "pa11_dma_map_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
BUG();
}
flush_kernel_dcache_range((unsigned long) addr, size); flush_kernel_dcache_range((unsigned long) addr, size);
return virt_to_phys(addr); return virt_to_phys(addr);
...@@ -458,10 +455,7 @@ static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t siz ...@@ -458,10 +455,7 @@ static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t siz
static void pa11_dma_unmap_single(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) static void pa11_dma_unmap_single(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
{ {
if (direction == DMA_NONE) { BUG_ON(direction == DMA_NONE);
printk(KERN_ERR "pa11_dma_unmap_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0));
BUG();
}
if (direction == DMA_TO_DEVICE) if (direction == DMA_TO_DEVICE)
return; return;
...@@ -480,8 +474,7 @@ static int pa11_dma_map_sg(struct device *dev, struct scatterlist *sglist, int n ...@@ -480,8 +474,7 @@ static int pa11_dma_map_sg(struct device *dev, struct scatterlist *sglist, int n
{ {
int i; int i;
if (direction == DMA_NONE) BUG_ON(direction == DMA_NONE);
BUG();
for (i = 0; i < nents; i++, sglist++ ) { for (i = 0; i < nents; i++, sglist++ ) {
unsigned long vaddr = sg_virt_addr(sglist); unsigned long vaddr = sg_virt_addr(sglist);
...@@ -496,8 +489,7 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in ...@@ -496,8 +489,7 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in
{ {
int i; int i;
if (direction == DMA_NONE) BUG_ON(direction == DMA_NONE);
BUG();
if (direction == DMA_TO_DEVICE) if (direction == DMA_TO_DEVICE)
return; return;
...@@ -511,16 +503,14 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in ...@@ -511,16 +503,14 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in
static void pa11_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction) static void pa11_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
{ {
if (direction == DMA_NONE) BUG_ON(direction == DMA_NONE);
BUG();
flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size); flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
} }
static void pa11_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction) static void pa11_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)
{ {
if (direction == DMA_NONE) BUG_ON(direction == DMA_NONE);
BUG();
flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size); flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);
} }
......
...@@ -304,10 +304,8 @@ static void __init setup_bootmem(void) ...@@ -304,10 +304,8 @@ static void __init setup_bootmem(void)
*/ */
max_low_pfn = max_pfn; max_low_pfn = max_pfn;
if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) { /* bootmap sizing messed up? */
printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n"); BUG_ON((bootmap_pfn - bootmap_start_pfn) != bootmap_pages);
BUG();
}
/* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */ /* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */
......
...@@ -359,9 +359,16 @@ fail: ...@@ -359,9 +359,16 @@ fail:
return error; return error;
} }
static struct device *next_device(struct klist_iter *i) { static int
struct klist_node * n = klist_next(i); find_quicksilver(struct device *dev, void *data)
return n ? container_of(n, struct device, knode_parent) : NULL; {
struct parisc_device **lba = data;
struct parisc_device *padev = to_parisc_device(dev);
if (IS_QUICKSILVER(padev))
*lba = padev;
return 0;
} }
static int static int
...@@ -372,8 +379,6 @@ parisc_agp_init(void) ...@@ -372,8 +379,6 @@ parisc_agp_init(void)
int err = -1; int err = -1;
struct parisc_device *sba = NULL, *lba = NULL; struct parisc_device *sba = NULL, *lba = NULL;
struct lba_device *lbadev = NULL; struct lba_device *lbadev = NULL;
struct device *dev = NULL;
struct klist_iter i;
if (!sba_list) if (!sba_list)
goto out; goto out;
...@@ -386,13 +391,7 @@ parisc_agp_init(void) ...@@ -386,13 +391,7 @@ parisc_agp_init(void)
} }
/* Now search our Pluto for our precious AGP device... */ /* Now search our Pluto for our precious AGP device... */
klist_iter_init(&sba->dev.klist_children, &i); device_for_each_child(&sba->dev, &lba, find_quicksilver);
while ((dev = next_device(&i))) {
struct parisc_device *padev = to_parisc_device(dev);
if (IS_QUICKSILVER(padev))
lba = padev;
}
klist_iter_exit(&i);
if (!lba) { if (!lba) {
printk(KERN_INFO DRVPFX "No AGP devices found.\n"); printk(KERN_INFO DRVPFX "No AGP devices found.\n");
......
...@@ -479,7 +479,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr) ...@@ -479,7 +479,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)
res = &dino_dev->hba.lmmio_space; res = &dino_dev->hba.lmmio_space;
res->flags = IORESOURCE_MEM; res->flags = IORESOURCE_MEM;
size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)", size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)",
bus->bridge->bus_id); dev_name(bus->bridge));
res->name = kmalloc(size+1, GFP_KERNEL); res->name = kmalloc(size+1, GFP_KERNEL);
if(res->name) if(res->name)
strcpy((char *)res->name, name); strcpy((char *)res->name, name);
...@@ -493,7 +493,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr) ...@@ -493,7 +493,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)
struct list_head *ln, *tmp_ln; struct list_head *ln, *tmp_ln;
printk(KERN_ERR "Dino: cannot attach bus %s\n", printk(KERN_ERR "Dino: cannot attach bus %s\n",
bus->bridge->bus_id); dev_name(bus->bridge));
/* kill the bus, we can't do anything with it */ /* kill the bus, we can't do anything with it */
list_for_each_safe(ln, tmp_ln, &bus->devices) { list_for_each_safe(ln, tmp_ln, &bus->devices) {
struct pci_dev *dev = pci_dev_b(ln); struct pci_dev *dev = pci_dev_b(ln);
...@@ -587,7 +587,7 @@ dino_fixup_bus(struct pci_bus *bus) ...@@ -587,7 +587,7 @@ dino_fixup_bus(struct pci_bus *bus)
bus->resource[i+1] = &res[i]; bus->resource[i+1] = &res[i];
} }
} else if(bus->self) { } else if (bus->parent) {
int i; int i;
pci_read_bridge_bases(bus); pci_read_bridge_bases(bus);
...@@ -611,12 +611,12 @@ dino_fixup_bus(struct pci_bus *bus) ...@@ -611,12 +611,12 @@ dino_fixup_bus(struct pci_bus *bus)
} }
DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n", DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n",
bus->self->dev.bus_id, i, dev_name(&bus->self->dev), i,
bus->self->resource[i].start, bus->self->resource[i].start,
bus->self->resource[i].end); bus->self->resource[i].end);
pci_assign_resource(bus->self, i); pci_assign_resource(bus->self, i);
DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n", DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
bus->self->dev.bus_id, i, dev_name(&bus->self->dev), i,
bus->self->resource[i].start, bus->self->resource[i].start,
bus->self->resource[i].end); bus->self->resource[i].end);
} }
...@@ -1026,7 +1026,8 @@ static int __init dino_probe(struct parisc_device *dev) ...@@ -1026,7 +1026,8 @@ static int __init dino_probe(struct parisc_device *dev)
dino_current_bus = bus->subordinate + 1; dino_current_bus = bus->subordinate + 1;
pci_bus_assign_resources(bus); pci_bus_assign_resources(bus);
} else { } else {
printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus); printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n",
dev_name(&dev->dev), dino_current_bus);
/* increment the bus number in case of duplicates */ /* increment the bus number in case of duplicates */
dino_current_bus++; dino_current_bus++;
} }
......
...@@ -186,29 +186,34 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp) ...@@ -186,29 +186,34 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)
*irqp = irq; *irqp = irq;
} }
static struct device *next_device(struct klist_iter *i) struct gsc_fixup_struct {
{ void (*choose_irq)(struct parisc_device *, void *);
struct klist_node * n = klist_next(i); void *ctrl;
return n ? container_of(n, struct device, knode_parent) : NULL; };
}
void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, static int gsc_fixup_irqs_callback(struct device *dev, void *data)
void (*choose_irq)(struct parisc_device *, void *))
{ {
struct device *dev;
struct klist_iter i;
klist_iter_init(&parent->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *padev = to_parisc_device(dev); struct parisc_device *padev = to_parisc_device(dev);
struct gsc_fixup_struct *gf = data;
/* work-around for 715/64 and others which have parent /* work-around for 715/64 and others which have parent
at path [5] and children at path [5/0/x] */ at path [5] and children at path [5/0/x] */
if (padev->id.hw_type == HPHW_FAULTY) if (padev->id.hw_type == HPHW_FAULTY)
return gsc_fixup_irqs(padev, ctrl, choose_irq); gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq);
choose_irq(padev, ctrl); gf->choose_irq(padev, gf->ctrl);
}
klist_iter_exit(&i); return 0;
}
void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
void (*choose_irq)(struct parisc_device *, void *))
{
struct gsc_fixup_struct data = {
.choose_irq = choose_irq,
.ctrl = ctrl,
};
device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback);
} }
int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)
......
...@@ -487,7 +487,7 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev) ...@@ -487,7 +487,7 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)
} }
/* Check if pcidev behind a PPB */ /* Check if pcidev behind a PPB */
if (NULL != pcidev->bus->self) { if (pcidev->bus->parent) {
/* Convert pcidev INTR_PIN into something we /* Convert pcidev INTR_PIN into something we
** can lookup in the IRT. ** can lookup in the IRT.
*/ */
...@@ -523,10 +523,9 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev) ...@@ -523,10 +523,9 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)
#endif /* PCI_BRIDGE_FUNCS */ #endif /* PCI_BRIDGE_FUNCS */
/* /*
** Locate the host slot the PPB nearest the Host bus * Locate the host slot of the PPB.
** adapter.
*/ */
while (NULL != p->parent->self) while (p->parent->parent)
p = p->parent; p = p->parent;
intr_slot = PCI_SLOT(p->self->devfn); intr_slot = PCI_SLOT(p->self->devfn);
...@@ -709,11 +708,14 @@ static void iosapic_set_affinity_irq(unsigned int irq, ...@@ -709,11 +708,14 @@ static void iosapic_set_affinity_irq(unsigned int irq,
struct vector_info *vi = iosapic_get_vector(irq); struct vector_info *vi = iosapic_get_vector(irq);
u32 d0, d1, dummy_d0; u32 d0, d1, dummy_d0;
unsigned long flags; unsigned long flags;
int dest_cpu;
if (cpu_check_affinity(irq, dest)) dest_cpu = cpu_check_affinity(irq, dest);
if (dest_cpu < 0)
return; return;
vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest)); irq_desc[irq].affinity = cpumask_of_cpu(dest_cpu);
vi->txn_addr = txn_affinity_addr(irq, dest_cpu);
spin_lock_irqsave(&iosapic_lock, flags); spin_lock_irqsave(&iosapic_lock, flags);
/* d1 contains the destination CPU, so only want to set that /* d1 contains the destination CPU, so only want to set that
......
...@@ -644,7 +644,7 @@ lba_fixup_bus(struct pci_bus *bus) ...@@ -644,7 +644,7 @@ lba_fixup_bus(struct pci_bus *bus)
** Properly Setup MMIO resources for this bus. ** Properly Setup MMIO resources for this bus.
** pci_alloc_primary_bus() mangles this. ** pci_alloc_primary_bus() mangles this.
*/ */
if (bus->self) { if (bus->parent) {
int i; int i;
/* PCI-PCI Bridge */ /* PCI-PCI Bridge */
pci_read_bridge_bases(bus); pci_read_bridge_bases(bus);
...@@ -802,7 +802,7 @@ lba_fixup_bus(struct pci_bus *bus) ...@@ -802,7 +802,7 @@ lba_fixup_bus(struct pci_bus *bus)
** Can't fixup here anyway....garr... ** Can't fixup here anyway....garr...
*/ */
if (fbb_enable) { if (fbb_enable) {
if (bus->self) { if (bus->parent) {
u8 control; u8 control;
/* enable on PPB */ /* enable on PPB */
(void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control); (void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control);
......
...@@ -1206,30 +1206,48 @@ sba_alloc_pdir(unsigned int pdir_size) ...@@ -1206,30 +1206,48 @@ sba_alloc_pdir(unsigned int pdir_size)
return (void *) pdir_base; return (void *) pdir_base;
} }
static struct device *next_device(struct klist_iter *i) struct ibase_data_struct {
struct ioc *ioc;
int ioc_num;
};
static int setup_ibase_imask_callback(struct device *dev, void *data)
{ {
struct klist_node * n = klist_next(i); /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
return n ? container_of(n, struct device, knode_parent) : NULL; extern void lba_set_iregs(struct parisc_device *, u32, u32);
struct parisc_device *lba = to_parisc_device(dev);
struct ibase_data_struct *ibd = data;
int rope_num = (lba->hpa.start >> 13) & 0xf;
if (rope_num >> 3 == ibd->ioc_num)
lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask);
return 0;
} }
/* setup Mercury or Elroy IBASE/IMASK registers. */ /* setup Mercury or Elroy IBASE/IMASK registers. */
static void static void
setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num) setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
{ {
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */ struct ibase_data_struct ibase_data = {
extern void lba_set_iregs(struct parisc_device *, u32, u32); .ioc = ioc,
struct device *dev; .ioc_num = ioc_num,
struct klist_iter i; };
klist_iter_init(&sba->dev.klist_children, &i); device_for_each_child(&sba->dev, &ibase_data,
while ((dev = next_device(&i))) { setup_ibase_imask_callback);
}
#ifdef SBA_AGP_SUPPORT
static int
sba_ioc_find_quicksilver(struct device *dev, void *data)
{
int *agp_found = data;
struct parisc_device *lba = to_parisc_device(dev); struct parisc_device *lba = to_parisc_device(dev);
int rope_num = (lba->hpa.start >> 13) & 0xf;
if (rope_num >> 3 == ioc_num) if (IS_QUICKSILVER(lba))
lba_set_iregs(lba, ioc->ibase, ioc->imask); *agp_found = 1;
} return 0;
klist_iter_exit(&i);
} }
#endif
static void static void
sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
...@@ -1332,9 +1350,6 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) ...@@ -1332,9 +1350,6 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM); WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
#ifdef SBA_AGP_SUPPORT #ifdef SBA_AGP_SUPPORT
{
struct klist_iter i;
struct device *dev = NULL;
/* /*
** If an AGP device is present, only use half of the IOV space ** If an AGP device is present, only use half of the IOV space
...@@ -1344,13 +1359,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num) ...@@ -1344,13 +1359,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
** We program the next pdir index after we stop w/ a key for ** We program the next pdir index after we stop w/ a key for
** the GART code to handshake on. ** the GART code to handshake on.
*/ */
klist_iter_init(&sba->dev.klist_children, &i); device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver);
while ((dev = next_device(&i))) {
struct parisc_device *lba = to_parisc_device(dev);
if (IS_QUICKSILVER(lba))
agp_found = 1;
}
klist_iter_exit(&i);
if (agp_found && sba_reserve_agpgart) { if (agp_found && sba_reserve_agpgart) {
printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n", printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n",
......
...@@ -103,7 +103,7 @@ lasi700_probe(struct parisc_device *dev) ...@@ -103,7 +103,7 @@ lasi700_probe(struct parisc_device *dev)
hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL); hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
if (!hostdata) { if (!hostdata) {
dev_printk(KERN_ERR, dev, "Failed to allocate host data\n"); dev_printk(KERN_ERR, &dev->dev, "Failed to allocate host data\n");
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -137,7 +137,7 @@ zalon_probe(struct parisc_device *dev) ...@@ -137,7 +137,7 @@ zalon_probe(struct parisc_device *dev)
goto fail; goto fail;
if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) {
dev_printk(KERN_ERR, dev, "irq problem with %d, detaching\n ", dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ",
dev->irq); dev->irq);
goto fail; goto fail;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment