Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 181160
b: refs/heads/master
c: 85b59f5
h: refs/heads/master
v: v3
  • Loading branch information
Paul Mundt committed Feb 1, 2010
1 parent 25a8179 commit ed9b27c
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aee4467b5ce5047401efb4175b1360ec1734affc
refs/heads/master: 85b59f5bb24aeca1a987cbb206e228bf630c8327
2 changes: 1 addition & 1 deletion trunk/arch/sh/drivers/pci/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#
# Makefile for the PCI specific kernel interface routines under Linux.
#
obj-y += pci.o
obj-y += common.o pci.o

obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o
obj-$(CONFIG_CPU_SUBTYPE_SH7751R) += pci-sh7751.o ops-sh4.o
Expand Down
64 changes: 64 additions & 0 deletions trunk/arch/sh/drivers/pci/common.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <linux/pci.h>
#include <linux/kernel.h>

static int __init
early_read_config_word(struct pci_channel *hose,
int top_bus, int bus, int devfn, int offset, u16 *value)
{
struct pci_dev fake_dev;
struct pci_bus fake_bus;

fake_dev.bus = &fake_bus;
fake_dev.sysdata = hose;
fake_dev.devfn = devfn;
fake_bus.number = bus;
fake_bus.sysdata = hose;
fake_bus.ops = hose->pci_ops;

if (bus != top_bus)
/* Fake a parent bus structure. */
fake_bus.parent = &fake_bus;
else
fake_bus.parent = NULL;

return pci_read_config_word(&fake_dev, offset, value);
}

int __init pci_is_66mhz_capable(struct pci_channel *hose,
int top_bus, int current_bus)
{
u32 pci_devfn;
unsigned short vid;
int cap66 = -1;
u16 stat;

printk(KERN_INFO "PCI: Checking 66MHz capabilities...\n");

for (pci_devfn = 0; pci_devfn < 0xff; pci_devfn++) {
if (PCI_FUNC(pci_devfn))
continue;
if (early_read_config_word(hose, top_bus, current_bus,
pci_devfn, PCI_VENDOR_ID, &vid) !=
PCIBIOS_SUCCESSFUL)
continue;
if (vid == 0xffff)
continue;

/* check 66MHz capability */
if (cap66 < 0)
cap66 = 1;
if (cap66) {
early_read_config_word(hose, top_bus, current_bus,
pci_devfn, PCI_STATUS, &stat);
if (!(stat & PCI_STATUS_66MHZ)) {
printk(KERN_DEBUG
"PCI: %02x:%02x not 66MHz capable.\n",
current_bus, pci_devfn);
cap66 = 0;
break;
}
}
}

return cap66 > 0;
}
29 changes: 29 additions & 0 deletions trunk/arch/sh/drivers/pci/pci-sh7780.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,29 @@ static struct pci_channel sh7780_pci_controller = {
.io_map_base = SH7780_PCI_IO_BASE,
};

static void __init sh7780_pci66_init(struct pci_channel *hose)
{
unsigned int tmp;

if (!pci_is_66mhz_capable(hose, 0, 0))
return;

/* Enable register access */
tmp = __raw_readl(hose->reg_base + SH4_PCICR);
tmp |= SH4_PCICR_PREFIX;
__raw_writel(tmp, hose->reg_base + SH4_PCICR);

/* Enable 66MHz operation */
tmp = __raw_readw(hose->reg_base + PCI_STATUS);
tmp |= PCI_STATUS_66MHZ;
__raw_writew(tmp, hose->reg_base + PCI_STATUS);

/* Done */
tmp = __raw_readl(hose->reg_base + SH4_PCICR);
tmp |= SH4_PCICR_PREFIX | SH4_PCICR_CFIN;
__raw_writel(tmp, hose->reg_base + SH4_PCICR);
}

static int __init sh7780_pci_init(void)
{
struct pci_channel *chan = &sh7780_pci_controller;
Expand Down Expand Up @@ -176,6 +199,12 @@ static int __init sh7780_pci_init(void)

register_pci_controller(chan);

sh7780_pci66_init(chan);

printk(KERN_NOTICE "PCI: Running at %dMHz.\n",
(__raw_readw(chan->reg_base + PCI_STATUS) & PCI_STATUS_66MHZ) ?
66 : 33);

return 0;
}
arch_initcall(sh7780_pci_init);
2 changes: 2 additions & 0 deletions trunk/arch/sh/drivers/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ void __devinit register_pci_controller(struct pci_channel *hose)
mutex_unlock(&pci_scan_mutex);
}

return;

out:
printk(KERN_WARNING "Skipping PCI bus scan due to resource conflict\n");
}
Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/sh/include/asm/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ struct pci_channel {
};

extern void register_pci_controller(struct pci_channel *hose);
extern int pci_is_66mhz_capable(struct pci_channel *hose,
int top_bus, int current_bus);

extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM;

Expand Down

0 comments on commit ed9b27c

Please sign in to comment.