Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

Thomas Bogendoerfer and committed by
Ralf Baechle
c990081b 9cfacb79

+19 -13
+7
arch/mips/pci/ops-mace.c
··· 42 42 mace_pci_read_config(struct pci_bus *bus, unsigned int devfn, 43 43 int reg, int size, u32 *val) 44 44 { 45 + u32 control = mace->pci.control; 46 + 47 + /* disable master aborts interrupts during config read */ 48 + mace->pci.control = control & ~MACEPCI_CONTROL_MAR_INT; 45 49 mace->pci.config_addr = mkaddr(bus, devfn, reg); 46 50 switch (size) { 47 51 case 1: ··· 58 54 *val = mace->pci.config_data.l; 59 55 break; 60 56 } 57 + /* ack possible master abort */ 58 + mace->pci.error &= ~MACEPCI_ERROR_MASTER_ABORT; 59 + mace->pci.control = control; 61 60 62 61 DPRINTK("read%d: reg=%08x,val=%02x\n", size * 8, reg, *val); 63 62
+3 -1
arch/mips/pci/pci-ip32.c
··· 119 119 .iommu = 0, 120 120 .mem_offset = MACE_PCI_MEM_OFFSET, 121 121 .io_offset = 0, 122 + .io_map_base = CKSEG1ADDR(MACEPCI_LOW_IO), 122 123 }; 123 124 124 125 static int __init mace_init(void) ··· 136 135 BUG_ON(request_irq(MACE_PCI_BRIDGE_IRQ, macepci_error, 0, 137 136 "MACE PCI error", NULL)); 138 137 139 - iomem_resource = mace_pci_mem_resource; 138 + /* extend memory resources */ 139 + iomem_resource.end = mace_pci_mem_resource.end; 140 140 ioport_resource = mace_pci_io_resource; 141 141 142 142 register_pci_controller(&mace_pci_controller);
-1
arch/mips/sgi-ip32/ip32-irq.c
··· 426 426 427 427 crime_int = crime->istat & crime_mask; 428 428 irq = MACE_VID_IN1_IRQ + __ffs(crime_int); 429 - crime_int = 1 << irq; 430 429 431 430 if (crime_int & CRIME_MACEISA_INT_MASK) { 432 431 unsigned long mace_int = mace->perif.ctrl.istat;
+9 -11
arch/mips/sgi-ip32/ip32-platform.c
··· 13 13 #include <asm/ip32/mace.h> 14 14 #include <asm/ip32/ip32_ints.h> 15 15 16 - /* 17 - * .iobase isn't a constant (in the sense of C) so we fill it in at runtime. 18 - */ 19 - #define MACE_PORT(int) \ 16 + #define MACEISA_SERIAL1_OFFS offsetof(struct sgi_mace, isa.serial1) 17 + #define MACEISA_SERIAL2_OFFS offsetof(struct sgi_mace, isa.serial2) 18 + 19 + #define MACE_PORT(offset,_irq) \ 20 20 { \ 21 - .irq = int, \ 21 + .mapbase = MACE_BASE + offset, \ 22 + .irq = _irq, \ 22 23 .uartclk = 1843200, \ 23 24 .iotype = UPIO_MEM, \ 24 - .flags = UPF_SKIP_TEST, \ 25 + .flags = UPF_SKIP_TEST|UPF_IOREMAP, \ 25 26 .regshift = 8, \ 26 27 } 27 28 28 29 static struct plat_serial8250_port uart8250_data[] = { 29 - MACE_PORT(MACEISA_SERIAL1_IRQ), 30 - MACE_PORT(MACEISA_SERIAL2_IRQ), 30 + MACE_PORT(MACEISA_SERIAL1_OFFS, MACEISA_SERIAL1_IRQ), 31 + MACE_PORT(MACEISA_SERIAL2_OFFS, MACEISA_SERIAL2_IRQ), 31 32 { }, 32 33 }; 33 34 ··· 42 41 43 42 static int __init uart8250_init(void) 44 43 { 45 - uart8250_data[0].membase = (void __iomem *) &mace->isa.serial1; 46 - uart8250_data[1].membase = (void __iomem *) &mace->isa.serial2; 47 - 48 44 return platform_device_register(&uart8250_device); 49 45 } 50 46