diff mbox

parisc: fix serial ports on C8000 workstation

Message ID 20130609210021.GA1009@p100.box (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Helge Deller June 9, 2013, 9 p.m. UTC
From: Thomas Bogendoerfer <tsbogend@alpha.franken.de>

The C8000 workstation (64 bit kernel only) has a somewhat different
serial port configuration that other models.
Thonmas Bogendoerfers sent a patch to fix this in September 2010, which
was now minimally modified by me.

Signed-off-by: Helge Deller <deller@gmx.de>
CC: Thomas Bogendoerfer <tsbogend@alpha.franken.de>


--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Rolf Eike Beer June 9, 2013, 9:49 p.m. UTC | #1
Helge Deller wrote:
> From: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
> 
> The C8000 workstation (64 bit kernel only) has a somewhat different
> serial port configuration that other models.
> Thonmas Bogendoerfers sent a patch to fix this in September 2010, which
> was now minimally modified by me.

Cool, that explains why it doesn't work for me. And it saves me the time to 
debug what _I_ did wrong ;)

> diff --git a/drivers/tty/serial/8250/8250_gsc.c
> b/drivers/tty/serial/8250/8250_gsc.c index 097dff9..bb91b47 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) unsigned long address;
>  	int err;
> 
> +#ifdef CONFIG_64BIT
> +	extern int iosapic_serial_irq(int cellnum);
> +	if (!dev->irq && (dev->id.sversion == 0xad))
> +		dev->irq = iosapic_serial_irq(dev->mod_index-1);
> +#endif
> +

Forward declaration in the middle of a function. Is this permitted? By 
standard and by coding style? Looks strange to me.

>  	if (!dev->irq) {
>  		/* We find some unattached serial ports by walking native
>  		 * busses.  These should be silently ignored.  Otherwise,
> @@ -51,7 +57,8 @@ static int __init serial_init_chip(struct parisc_device
> *dev) memset(&uart, 0, sizeof(uart));
>  	uart.port.iotype	= UPIO_MEM;
>  	/* 7.272727MHz on Lasi.  Assumed the same for Dino, Wax and Timi. */
> -	uart.port.uartclk	= 7272727;
> +	uart.port.uartclk	= (dev->id.sversion != 0xad) ?
> +					7272727 : 1843200;

If there is a nice comment explaining 72 another nice comment for the other 
number should be added.

Eike
John David Anglin June 9, 2013, 10:21 p.m. UTC | #2
On 9-Jun-13, at 5:49 PM, Rolf Eike Beer wrote:

>> 	/* 7.272727MHz on Lasi.  Assumed the same for Dino, Wax and Timi. */
>> -	uart.port.uartclk	= 7272727;
>> +	uart.port.uartclk	= (dev->id.sversion != 0xad) ?
>> +					7272727 : 1843200;
>
> If there is a nice comment explaining 72 another nice comment for  
> the other
> number should be added.

1.8432 MHz is a common oscillator frequency for UARTs.  See for example,
http://en.wikipedia.org/wiki/Crystal_oscillator_frequencies

Dave
--
John David Anglin	dave.anglin@bell.net



--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Helge Deller June 10, 2013, 8:27 a.m. UTC | #3
> > The C8000 workstation (64 bit kernel only) has a somewhat different
> > serial port configuration that other models.
> > Thonmas Bogendoerfers sent a patch to fix this in September 2010, which
> > was now minimally modified by me.

I shouldn't send patches that late... too many typos and not very good patch description :-)

> Cool, that explains why it doesn't work for me. And it saves me the time to
> debug what _I_ did wrong ;)

Rolf, the original patch from Thomas Bogendörfer including his comments is here:
http://comments.gmane.org/gmane.linux.ports.parisc/3258
(if you need the patch only, go here: https://patchwork.kernel.org/patch/357572/raw/)

Maybe you want to clean up the other parts, e.g. impmi or pci_mmap?

Helge
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Thomas Bogendoerfer June 10, 2013, 10 a.m. UTC | #4
On Mon, Jun 10, 2013 at 10:27:09AM +0200, Helge Deller wrote:
> Maybe you want to clean up the other parts, e.g. impmi or pci_mmap?

ipmi is already cleaned up, but I didn't get any response from the
maintainer.

http://www.spinics.net/lists/linux-parisc/msg03191.html

Thomas.
Rolf Eike Beer June 10, 2013, 10:43 a.m. UTC | #5
Am 10.06.2013 12:00, schrieb Thomas Bogendoerfer:
> On Mon, Jun 10, 2013 at 10:27:09AM +0200, Helge Deller wrote:
>> Maybe you want to clean up the other parts, e.g. impmi or pci_mmap?
> 
> ipmi is already cleaned up, but I didn't get any response from the
> maintainer.
> 
> http://www.spinics.net/lists/linux-parisc/msg03191.html

parisc_registered should be a bool, and you don't reset it on 
unregister_parisc_driver. If this can be compiled as module you get bad 
effects (i.e. OOPS, crash ) on repeated modprobe/rmmod.

> info->irq               = 0; /* no interrup */

There is a 't' missing at the end.

I would say resend the patch, it probably got lost.

Eike
--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c
index 9e2d2e4..8722756 100644
--- a/arch/parisc/kernel/hardware.c
+++ b/arch/parisc/kernel/hardware.c
@@ -1205,6 +1205,7 @@  static struct hp_hardware hp_hardware_list[] = {
 	{HPHW_FIO, 0x004, 0x00320, 0x0, "Metheus Frame Buffer"}, 
 	{HPHW_FIO, 0x004, 0x00340, 0x0, "BARCO CX4500 VME Grphx Cnsl"}, 
 	{HPHW_FIO, 0x004, 0x00360, 0x0, "Hughes TOG VME FDDI"}, 
+	{HPHW_FIO, 0x076, 0x000AD, 0x00, "Crestone Peak RS-232"},
 	{HPHW_IOA, 0x185, 0x0000B, 0x00, "Java BC Summit Port"}, 
 	{HPHW_IOA, 0x1FF, 0x0000B, 0x00, "Hitachi Ghostview Summit Port"}, 
 	{HPHW_IOA, 0x580, 0x0000B, 0x10, "U2-IOA BC Runway Port"}, 
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c
index 9544cdc..e79e006 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)
 	return pcidev->irq;
 }
 
+static struct iosapic_info *first_isi = NULL;
+
+#ifdef CONFIG_64BIT
+int iosapic_serial_irq(int num)
+{
+	struct iosapic_info *isi = first_isi;
+	struct irt_entry *irte = NULL;  /* only used if PAT PDC */
+	struct vector_info *vi;
+	int isi_line;	/* line used by device */
+
+	/* lookup IRT entry for isi/slot/pin set */
+	irte = &irt_cell[num];
+
+	DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n",
+		irte,
+		irte->entry_type,
+		irte->entry_length,
+		irte->polarity_trigger,
+		irte->src_bus_irq_devno,
+		irte->src_bus_id,
+		irte->src_seg_id,
+		irte->dest_iosapic_intin,
+		(u32) irte->dest_iosapic_addr);
+	isi_line = irte->dest_iosapic_intin;
+
+	/* get vector info for this input line */
+	vi = isi->isi_vector + isi_line;
+	DBG_IRT("iosapic_serial_irq:  line %d vi 0x%p\n", isi_line, vi);
+
+	/* If this IRQ line has already been setup, skip it */
+	if (vi->irte)
+		goto out;
+
+	vi->irte = irte;
+
+	/*
+	 * Allocate processor IRQ
+	 *
+	 * XXX/FIXME The txn_alloc_irq() code and related code should be
+	 * moved to enable_irq(). That way we only allocate processor IRQ
+	 * bits for devices that actually have drivers claiming them.
+	 * Right now we assign an IRQ to every PCI device present,
+	 * regardless of whether it's used or not.
+	 */
+	vi->txn_irq = txn_alloc_irq(8);
+
+	if (vi->txn_irq < 0)
+		panic("I/O sapic: couldn't get TXN IRQ\n");
+
+	/* enable_irq() will use txn_* to program IRdT */
+	vi->txn_addr = txn_alloc_addr(vi->txn_irq);
+	vi->txn_data = txn_alloc_data(vi->txn_irq);
+
+	vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
+	vi->eoi_data = cpu_to_le32(vi->txn_data);
+
+	cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi);
+
+ out:
+
+	return vi->txn_irq;
+}
+#endif
+
 
 /*
 ** squirrel away the I/O Sapic Version
@@ -877,6 +941,8 @@  void *iosapic_register(unsigned long hpa)
 		vip->irqline = (unsigned char) cnt;
 		vip->iosapic = isi;
 	}
+	if (!first_isi)
+		first_isi = isi;
 	return isi;
 }
 
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
index 097dff9..bb91b47 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)
 	unsigned long address;
 	int err;
 
+#ifdef CONFIG_64BIT
+	extern int iosapic_serial_irq(int cellnum);
+	if (!dev->irq && (dev->id.sversion == 0xad))
+		dev->irq = iosapic_serial_irq(dev->mod_index-1);
+#endif
+
 	if (!dev->irq) {
 		/* We find some unattached serial ports by walking native
 		 * busses.  These should be silently ignored.  Otherwise,
@@ -51,7 +57,8 @@  static int __init serial_init_chip(struct parisc_device *dev)
 	memset(&uart, 0, sizeof(uart));
 	uart.port.iotype	= UPIO_MEM;
 	/* 7.272727MHz on Lasi.  Assumed the same for Dino, Wax and Timi. */
-	uart.port.uartclk	= 7272727;
+	uart.port.uartclk	= (dev->id.sversion != 0xad) ?
+					7272727 : 1843200;
 	uart.port.mapbase	= address;
 	uart.port.membase	= ioremap_nocache(address, 16);
 	uart.port.irq	= dev->irq;
@@ -73,6 +80,7 @@  static struct parisc_device_id serial_tbl[] = {
 	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00075 },
 	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008c },
 	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0008d },
+	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x000ad },
 	{ 0 }
 };