diff options
Diffstat (limited to 'arch/sh/drivers/pci/ops-sh4.c')
| -rw-r--r-- | arch/sh/drivers/pci/ops-sh4.c | 79 | 
1 files changed, 23 insertions, 56 deletions
diff --git a/arch/sh/drivers/pci/ops-sh4.c b/arch/sh/drivers/pci/ops-sh4.c index 710a3b0306e..78bebebdc99 100644 --- a/arch/sh/drivers/pci/ops-sh4.c +++ b/arch/sh/drivers/pci/ops-sh4.c @@ -1,22 +1,22 @@  /*   * Generic SH-4 / SH-4A PCIC operations (SH7751, SH7780).   * - * Copyright (C) 2002 - 2006  Paul Mundt + * Copyright (C) 2002 - 2009  Paul Mundt   *   * This file is subject to the terms and conditions of the GNU General Public   * License v2. See the file "COPYING" in the main directory of this archive   * for more details.   */  #include <linux/pci.h> +#include <linux/io.h>  #include <asm/addrspace.h> -#include <asm/io.h>  #include "pci-sh4.h"  /*   * Direct access to PCI hardware...   */  #define CONFIG_CMD(bus, devfn, where) \ -	P1SEGADDR((bus->number << 16) | (devfn << 8) | (where & ~3)) +	(P1SEG | (bus->number << 16) | (devfn << 8) | (where & ~3))  static DEFINE_SPINLOCK(sh4_pci_lock); @@ -26,6 +26,7 @@ static DEFINE_SPINLOCK(sh4_pci_lock);  static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,  			   int where, int size, u32 *val)  { +	struct pci_channel *chan = bus->sysdata;  	unsigned long flags;  	u32 data; @@ -34,8 +35,8 @@ static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,  	 * so we must do byte alignment by hand  	 */  	spin_lock_irqsave(&sh4_pci_lock, flags); -	pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); -	data = pci_read_reg(SH4_PCIPDR); +	pci_write_reg(chan, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); +	data = pci_read_reg(chan, SH4_PCIPDR);  	spin_unlock_irqrestore(&sh4_pci_lock, flags);  	switch (size) { @@ -63,13 +64,14 @@ static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,  static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,  			 int where, int size, u32 val)  { +	struct pci_channel *chan = bus->sysdata;  	unsigned long flags;  	int shift;  	u32 data;  	spin_lock_irqsave(&sh4_pci_lock, flags); -	pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); -	data = pci_read_reg(SH4_PCIPDR); +	pci_write_reg(chan, CONFIG_CMD(bus, devfn, where), SH4_PCIPAR); +	data = pci_read_reg(chan, SH4_PCIPDR);  	spin_unlock_irqrestore(&sh4_pci_lock, flags);  	switch (size) { @@ -90,7 +92,7 @@ static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,  		return PCIBIOS_FUNC_NOT_SUPPORTED;  	} -	pci_write_reg(data, SH4_PCIPDR); +	pci_write_reg(chan, data, SH4_PCIPDR);  	return PCIBIOS_SUCCESSFUL;  } @@ -104,66 +106,31 @@ struct pci_ops sh4_pci_ops = {   * Not really related to pci_ops, but it's common and not worth shoving   * somewhere else for now..   */ -static unsigned int pci_probe = PCI_PROBE_CONF1; - -int __init sh4_pci_check_direct(void) +int __init sh4_pci_check_direct(struct pci_channel *chan)  {  	/*  	 * Check if configuration works.  	 */ -	if (pci_probe & PCI_PROBE_CONF1) { -		unsigned int tmp = pci_read_reg(SH4_PCIPAR); - -		pci_write_reg(P1SEG, SH4_PCIPAR); +	unsigned int tmp = pci_read_reg(chan, SH4_PCIPAR); -		if (pci_read_reg(SH4_PCIPAR) == P1SEG) { -			pci_write_reg(tmp, SH4_PCIPAR); -			printk(KERN_INFO "PCI: Using configuration type 1\n"); -			request_region(PCI_REG(SH4_PCIPAR), 8, "PCI conf1"); +	pci_write_reg(chan, P1SEG, SH4_PCIPAR); -			return 0; -		} - -		pci_write_reg(tmp, SH4_PCIPAR); +	if (pci_read_reg(chan, SH4_PCIPAR) == P1SEG) { +		pci_write_reg(chan, tmp, SH4_PCIPAR); +		printk(KERN_INFO "PCI: Using configuration type 1\n"); +		request_region(chan->reg_base + SH4_PCIPAR, 8, +			       "PCI conf1"); +		return 0;  	} -	pr_debug("PCI: pci_check_direct failed\n"); -	return -EINVAL; -} - -/* Handle generic fixups */ -static void __init pci_fixup_ide_bases(struct pci_dev *d) -{ -	int i; - -	/* -	 * PCI IDE controllers use non-standard I/O port decoding, respect it. -	 */ -	if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) -		return; -	pr_debug("PCI: IDE base address fixup for %s\n", pci_name(d)); -	for(i = 0; i < 4; i++) { -		struct resource *r = &d->resource[i]; - -		if ((r->start & ~0x80) == 0x374) { -			r->start |= 2; -			r->end = r->start; -		} -	} -} -DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases); +	pci_write_reg(chan, tmp, SH4_PCIPAR); -char * __devinit pcibios_setup(char *str) -{ -	if (!strcmp(str, "off")) { -		pci_probe = 0; -		return NULL; -	} +	printk(KERN_ERR "PCI: %s failed\n", __func__); -	return str; +	return -EINVAL;  } -int __attribute__((weak)) pci_fixup_pcic(void) +int __attribute__((weak)) pci_fixup_pcic(struct pci_channel *chan)  {  	/* Nothing to do. */  	return 0;  |