aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Bogendoerfer <tsbogend@alpha.franken.de>2013-06-09 17:00:21 -0400
committerHelge Deller <deller@gmx.de>2013-06-18 14:29:07 -0400
commit9a66d1869d90f13fbaf83dcce5b1aeec86fbc699 (patch)
tree2df9a43c270fd2005761d4194eda9223cf153a2a
parent91ea8207168793b365322be3c90a4ee9e8b03ed4 (diff)
parisc: fix serial ports on C8000 workstation
The C8000 workstation (64 bit kernel only) has a somewhat different serial port configuration than other models. Thomas Bogendoerfer sent a patch to fix this in September 2010, which was now minimally modified by me. Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r--arch/parisc/kernel/hardware.c1
-rw-r--r--drivers/parisc/iosapic.c66
-rw-r--r--drivers/tty/serial/8250/8250_gsc.c10
3 files changed, 76 insertions, 1 deletions
diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c
index 9e2d2e408529..872275659d98 100644
--- a/arch/parisc/kernel/hardware.c
+++ b/arch/parisc/kernel/hardware.c
@@ -1205,6 +1205,7 @@ static struct hp_hardware hp_hardware_list[] = {
1205 {HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"}, 1205 {HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"},
1206 {HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"}, 1206 {HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"},
1207 {HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"}, 1207 {HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"},
1208 {HPHW_FIO, 0x076, 0x000AD, 0x00, "Crestone Peak RS-232"},
1208 {HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"}, 1209 {HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"},
1209 {HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"}, 1210 {HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"},
1210 {HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"}, 1211 {HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"},
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c
index 9544cdc0d1af..e79e006eb9ab 100644
--- a/drivers/parisc/iosapic.c
+++ b/drivers/parisc/iosapic.c
@@ -811,6 +811,70 @@ int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
811 return pcidev->irq; 811 return pcidev->irq;
812} 812}
813 813
814static struct iosapic_info *first_isi = NULL;
815
816#ifdef CONFIG_64BIT
817int iosapic_serial_irq(int num)
818{
819 struct iosapic_info *isi = first_isi;
820 struct irt_entry *irte = NULL; /* only used if PAT PDC */
821 struct vector_info *vi;
822 int isi_line; /* line used by device */
823
824 /* lookup IRT entry for isi/slot/pin set */
825 irte = &irt_cell[num];
826
827 DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n",
828 irte,
829 irte->entry_type,
830 irte->entry_length,
831 irte->polarity_trigger,
832 irte->src_bus_irq_devno,
833 irte->src_bus_id,
834 irte->src_seg_id,
835 irte->dest_iosapic_intin,
836 (u32) irte->dest_iosapic_addr);
837 isi_line = irte->dest_iosapic_intin;
838
839 /* get vector info for this input line */
840 vi = isi->isi_vector + isi_line;
841 DBG_IRT("iosapic_serial_irq: line %d vi 0x%p\n", isi_line, vi);
842
843 /* If this IRQ line has already been setup, skip it */
844 if (vi->irte)
845 goto out;
846
847 vi->irte = irte;
848
849 /*
850 * Allocate processor IRQ
851 *
852 * XXX/FIXME The txn_alloc_irq() code and related code should be
853 * moved to enable_irq(). That way we only allocate processor IRQ
854 * bits for devices that actually have drivers claiming them.
855 * Right now we assign an IRQ to every PCI device present,
856 * regardless of whether it's used or not.
857 */
858 vi->txn_irq = txn_alloc_irq(8);
859
860 if (vi->txn_irq < 0)
861 panic("I/O sapic: couldn't get TXN IRQ\n");
862
863 /* enable_irq() will use txn_* to program IRdT */
864 vi->txn_addr = txn_alloc_addr(vi->txn_irq);
865 vi->txn_data = txn_alloc_data(vi->txn_irq);
866
867 vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
868 vi->eoi_data = cpu_to_le32(vi->txn_data);
869
870 cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi);
871
872 out:
873
874 return vi->txn_irq;
875}
876#endif
877
814 878
815/* 879/*
816** squirrel away the I/O Sapic Version 880** squirrel away the I/O Sapic Version
@@ -877,6 +941,8 @@ void *iosapic_register(unsigned long hpa)
877 vip->irqline = (unsigned char) cnt; 941 vip->irqline = (unsigned char) cnt;
878 vip->iosapic = isi; 942 vip->iosapic = isi;
879 } 943 }
944 if (!first_isi)
945 first_isi = isi;
880 return isi; 946 return isi;
881} 947}
882 948
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
index 097dff9c08ad..bb91b4713ebd 100644
--- a/drivers/tty/serial/8250/8250_gsc.c
+++ b/drivers/tty/serial/8250/8250_gsc.c
@@ -30,6 +30,12 @@ static int __init serial_init_chip(struct parisc_device *dev)
30 unsigned long address; 30 unsigned long address;
31 int err; 31 int err;
32 32
33#ifdef CONFIG_64BIT
34 extern int iosapic_serial_irq(int cellnum);
35 if (!dev->irq && (dev->id.sversion == 0xad))
36 dev->irq = iosapic_serial_irq(dev->mod_index-1);
37#endif
38
33 if (!dev->irq) { 39 if (!dev->irq) {
34 /* We find some unattached serial ports by walking native 40 /* We find some unattached serial ports by walking native
35 * busses. These should be silently ignored. Otherwise, 41 * busses. These should be silently ignored. Otherwise,
@@ -51,7 +57,8 @@ static int __init serial_init_chip(struct parisc_device *dev)
51 memset(&uart, 0, sizeof(uart)); 57 memset(&uart, 0, sizeof(uart));
52 uart.port.iotype = UPIO_MEM; 58 uart.port.iotype = UPIO_MEM;
53 /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */ 59 /* 7.272727MHz on Lasi. Assumed the same for Dino, Wax and Timi. */
54 uart.port.uartclk = 7272727; 60 uart.port.uartclk = (dev->id.sversion != 0xad) ?
61 7272727 : 1843200;
55 uart.port.mapbase = address; 62 uart.port.mapbase = address;
56 uart.port.membase = ioremap_nocache(address, 16); 63 uart.port.membase = ioremap_nocache(address, 16);
57 uart.port.irq = dev->irq; 64 uart.port.irq = dev->irq;
@@ -73,6 +80,7 @@ static struct parisc_device_id serial_tbl[] = {
73 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00075 }, 80 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00075 },
74 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008c }, 81 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008c },
75 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008d }, 82 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008d },
83 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x000ad },
76 { 0 } 84 { 0 }
77}; 85};
78 86