All of lore.kernel.org
 help / color / mirror / Atom feed
* 16552 UART detection
@ 2004-03-10 14:29 David Howells
  0 siblings, 0 replies; only message in thread
From: David Howells @ 2004-03-10 14:29 UTC (permalink / raw)
  To: Russell King; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 466 bytes --]


Hi Russell,

Would something like the following be a reasonable way of detecting a NatSemi
PC16552 UART?:

	if type == 16650A
	then
		set LCR.DLAB to 1
		if EFR bits 7-3 are 0
		then
			set EFR to 0xff
			if EFR == 0x07
			then
				set type to 16552
				set EFR to 0
			fi
		else
			restore EFR to previous value
		fi
	fi

This needs to be inserted before the test for the StarTech ST16650.

I've implemented by the attached patch against a 2.4.18 kernel.

David



[-- Attachment #2: serial-16652.patch --]
[-- Type: application/octet-stream, Size: 1633 bytes --]

Index: drivers/char/serial.c
===================================================================
RCS file: /home/cvs/linux-am33-2.4.18/drivers/char/serial.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 serial.c
--- drivers/char/serial.c	8 May 2002 12:07:55 -0000	1.1.1.1
+++ drivers/char/serial.c	10 Mar 2004 13:48:32 -0000
@@ -312,6 +312,7 @@
 	{ "XR16850", 128, UART_CLEAR_FIFO | UART_USE_FIFO |
 		  UART_STARTECH },
 	{ "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO }, 
+	{ "16552", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, 
 	{ 0, 0}
 };
 
@@ -3739,6 +3740,19 @@
 		case 3:
 			state->type = PORT_16550A;
 			break;
+	}
+	if (state->type == PORT_16550A) {
+		/* check for half of an NS 16552 */
+		serial_outp(info, UART_LCR, UART_LCR_DLAB);
+		scratch = serial_in(info, UART_EFR);
+		if ((scratch & ~7) == 0) {
+			serial_outp(info, UART_EFR, 0xff);
+			if (serial_in(info, UART_EFR) == 7) {
+				state->type = PORT_16552;
+				scratch = 0;
+			}
+			serial_outp(info, UART_EFR, scratch);
+		}
 	}
 	if (state->type == PORT_16550A) {
 		/* Check for Startech UART's */
Index: include/linux/serial.h
===================================================================
RCS file: /home/cvs/linux-am33-2.4.18/include/linux/serial.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 serial.h
--- include/linux/serial.h	8 May 2002 12:11:50 -0000	1.1.1.1
+++ include/linux/serial.h	10 Mar 2004 13:48:10 -0000
@@ -75,7 +75,8 @@
 #define PORT_16654	11
 #define PORT_16850	12
 #define PORT_RSA	13	/* RSA-DV II/S card */
-#define PORT_MAX	13
+#define PORT_16552	14
+#define PORT_MAX	14
 
 #define SERIAL_IO_PORT	0
 #define SERIAL_IO_HUB6	1

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-03-10 14:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-10 14:29 16552 UART detection David Howells

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.