提交 c990081b 编写于 作者: T Thomas Bogendoerfer 提交者: Ralf Baechle

[MIPS] Fix IP32 breakage

- suppress master aborts during config read
- set io_map_base
- only fixup end of iomem resource to avoid failing request_resource
  in serial driver
- killed useless setting of crime_int bit, which caused wrong interrupts
- use physcial address for serial port platform device and let 8250
  driver do the ioremap
Signed-off-by: NThomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
上级 9cfacb79
...@@ -42,6 +42,10 @@ static int ...@@ -42,6 +42,10 @@ static int
mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
int reg, int size, u32 *val) int reg, int size, u32 *val)
{ {
u32 control = mace->pci.control;
/* disable master aborts interrupts during config read */
mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT;
mace->pci.config_addr = mkaddr(bus, devfn, reg); mace->pci.config_addr = mkaddr(bus, devfn, reg);
switch (size) { switch (size) {
case 1: case 1:
...@@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, ...@@ -54,6 +58,9 @@ mace_pci_read_config(struct pci_bus *bus, unsigned int devfn,
*val = mace->pci.config_data.l; *val = mace->pci.config_data.l;
break; break;
} }
/* ack possible master abort */
mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT;
mace->pci.control = control;
DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val); DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val);
......
...@@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = { ...@@ -119,6 +119,7 @@ static struct pci_controller mace_pci_controller = {
.iommu = 0, .iommu = 0,
.mem_offset = MACE_PCI_MEM_OFFSET, .mem_offset = MACE_PCI_MEM_OFFSET,
.io_offset = 0, .io_offset = 0,
.io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO),
}; };
static int __init mace_init(void) static int __init mace_init(void)
...@@ -135,7 +136,8 @@ static int __init mace_init(void) ...@@ -135,7 +136,8 @@ static int __init mace_init(void)
BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0, BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0,
"MACE PCI error", NULL)); "MACE PCI error", NULL));
iomem_resource = mace_pci_mem_resource; /* extend memory resources */
iomem_resource.end = mace_pci_mem_resource.end;
ioport_resource = mace_pci_io_resource; ioport_resource = mace_pci_io_resource;
register_pci_controller(&mace_pci_controller); register_pci_controller(&mace_pci_controller);
......
...@@ -426,7 +426,6 @@ static void ip32_irq0(void) ...@@ -426,7 +426,6 @@ static void ip32_irq0(void)
crime_int = crime->istat & crime_mask; crime_int = crime->istat & crime_mask;
irq = MACE_VID_IN1_IRQ + __ffs(crime_int); irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
crime_int = 1 << irq;
if (crime_int & CRIME_MACEISA_INT_MASK) { if (crime_int & CRIME_MACEISA_INT_MASK) {
unsigned long mace_int = mace->perif.ctrl.istat; unsigned long mace_int = mace->perif.ctrl.istat;
......
...@@ -13,21 +13,22 @@ ...@@ -13,21 +13,22 @@
#include <asm/ip32/mace.h> #include <asm/ip32/mace.h>
#include <asm/ip32/ip32_ints.h> #include <asm/ip32/ip32_ints.h>
/* #define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1)
* .iobase isn't a constant (in the sense of C) so we fill it in at runtime. #define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2)
*/
#define MACE_PORT(int) \ #define MACE_PORT(offset,_irq) \
{ \ { \
.irq = int, \ .mapbase = MACE_BASE + offset, \
.irq = _irq, \
.uartclk = 1843200, \ .uartclk = 1843200, \
.iotype = UPIO_MEM, \ .iotype = UPIO_MEM, \
.flags = UPF_SKIP_TEST, \ .flags = UPF_SKIP_TEST|UPF_IOREMAP, \
.regshift = 8, \ .regshift = 8, \
} }
static struct plat_serial8250_port uart8250_data[] = { static struct plat_serial8250_port uart8250_data[] = {
MACE_PORT(MACEISA_SERIAL1_IRQ), MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ),
MACE_PORT(MACEISA_SERIAL2_IRQ), MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ),
{ }, { },
}; };
...@@ -41,9 +42,6 @@ static struct platform_device uart8250_device = { ...@@ -41,9 +42,6 @@ static struct platform_device uart8250_device = {
static int __init uart8250_init(void) static int __init uart8250_init(void)
{ {
uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1;
uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2;
return platform_device_register(&uart8250_device); return platform_device_register(&uart8250_device);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册