public inbox for linux-serial@vger.kernel.org
 help / color / mirror / Atom feed
* Hardware flowcontrol on XR17D154
@ 2011-08-30 10:17 Søren holm
  2011-08-30 10:34 ` Alan Cox
  0 siblings, 1 reply; 11+ messages in thread
From: Søren holm @ 2011-08-30 10:17 UTC (permalink / raw)
  To: linux-serial

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

Hi

I have hacked hardware flowcontrol into 8250.c for the XR17D154. I have 
attached the patch. The fix just uses another address for the EFR-register.

I would like to have some adwise as to how to do this the right way. 

Thanks.
-- 
Søren Holm

[-- Attachment #2: xr17d154_hwflow.patch --]
[-- Type: text/x-patch, Size: 1245 bytes --]

diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index b3b881b..ba28eb8 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -301,7 +301,7 @@ static const struct serial8250_config uart_config[] = {
 		.fifo_size	= 64,
 		.tx_loadsz	= 64,
 		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
-		.flags		= UART_CAP_FIFO | UART_CAP_AFE,
+		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
 	},
 };
 
@@ -2420,7 +2420,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 			efr |= UART_EFR_CTS;
 
 		serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
-		serial_outp(up, UART_EFR, efr);
+		serial_outp(up, UART_EFR2, efr);
 	}
 
 #ifdef CONFIG_ARCH_OMAP
diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h
index 3ecb71a..56b2569 100644
--- a/include/linux/serial_reg.h
+++ b/include/linux/serial_reg.h
@@ -150,6 +150,7 @@
  * LCR=0xBF (or DLAB=1 for 16C660)
  */
 #define UART_EFR	2	/* I/O: Extended Features Register */
+#define UART_EFR2	9	/* I/O: Extended Features Register for Exari XR17D154 */
 #define UART_EFR_CTS		0x80 /* CTS flow control */
 #define UART_EFR_RTS		0x40 /* RTS flow control */
 #define UART_EFR_SCD		0x20 /* Special character detect */

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-08-30 10:17 Hardware flowcontrol on XR17D154 Søren holm
@ 2011-08-30 10:34 ` Alan Cox
  2011-08-30 11:27   ` Søren holm
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Cox @ 2011-08-30 10:34 UTC (permalink / raw)
  To: Søren holm; +Cc: linux-serial

On Tue, 30 Aug 2011 12:17:07 +0200
Søren holm <sgh@sgh.dk> wrote:

> Hi
> 
> I have hacked hardware flowcontrol into 8250.c for the XR17D154. I have 
> attached the patch. The fix just uses another address for the EFR-register.
> 
> I would like to have some adwise as to how to do this the right way. 

Can you explain what the underlying differences are first of all ?

If you just need to adjust a register differently then override
serial_in/serial_out methods and figure out how to detect your device
against others (or a way to probe it somehow).

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-08-30 10:34 ` Alan Cox
@ 2011-08-30 11:27   ` Søren holm
  2011-08-30 12:32     ` Alan Cox
  0 siblings, 1 reply; 11+ messages in thread
From: Søren holm @ 2011-08-30 11:27 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-serial

Tirsdag den 30. august 2011 12:34:33 skrev Alan Cox:
> 
> Can you explain what the underlying differences are first of all ?

The EFR register is as you wrote adjusted differently.

> If you just need to adjust a register differently then override
> serial_in/serial_out methods and figure out how to detect your device
> against others (or a way to probe it somehow).

I'm a bit in doubt as to which conclusions I am allowed to draw.

In 'autoconfig_16550a' I can see that a sepcific port type is set;

	if (status1 == 6 && status2 == 7) {
		up->port.type = PORT_16750;
		up->capabilities |= UART_CAP_AFE | UART_CAP_SLEEP;
		return;
	}

My particular uart resports (status1 == 6 && status2 == 6). If that is good 
enough I can add another porttype and add the correct register address as 
UART_EXAR_EFR in the header file.

Another thought could be to write 0xFF (or some other value) to the correct 
EFR-register and read that byte to test if the register is present. The 
problem here is that I do not how the bus reacts to writting/reading invalid 
addresses.

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-08-30 11:27   ` Søren holm
@ 2011-08-30 12:32     ` Alan Cox
  2011-08-30 13:14       ` Søren holm
  2011-09-02 10:20       ` Søren holm
  0 siblings, 2 replies; 11+ messages in thread
From: Alan Cox @ 2011-08-30 12:32 UTC (permalink / raw)
  To: Søren holm; +Cc: linux-serial

> My particular uart resports (status1 == 6 && status2 == 6). If that is good 
> enough I can add another porttype and add the correct register address as 
> UART_EXAR_EFR in the header file.

Try it and see. We can put it in -next for a while and then there will a
release cycle duriing which any unfortunate clashes wil get resolved.

Alternatively if it's a device attached to a specific platform create it
as a platform device of some kind in the board specific code and pick
that up in the serial driver.

> Another thought could be to write 0xFF (or some other value) to the correct 
> EFR-register and read that byte to test if the register is present. The 
> problem here is that I do not how the bus reacts to writting/reading invalid 
> addresses.

The trouble is an extra register may in fact be part of some other device
- it's generally not a great idea if there are other choices.

Alan

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-08-30 12:32     ` Alan Cox
@ 2011-08-30 13:14       ` Søren holm
  2011-09-02 10:20       ` Søren holm
  1 sibling, 0 replies; 11+ messages in thread
From: Søren holm @ 2011-08-30 13:14 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-serial

> > My particular uart resports (status1 == 6 && status2 == 6). If that is
> > good enough I can add another porttype and add the correct register
> > address as UART_EXAR_EFR in the header file.
> 
> Try it and see. We can put it in -next for a while and then there will a
> release cycle duriing which any unfortunate clashes wil get resolved.

I will prepare and test a patch.

> Alternatively if it's a device attached to a specific platform create it
> as a platform device of some kind in the board specific code and pick
> that up in the serial driver.
> 
> > Another thought could be to write 0xFF (or some other value) to the
> > correct EFR-register and read that byte to test if the register is
> > present. The problem here is that I do not how the bus reacts to
> > writting/reading invalid addresses.
> 
> The trouble is an extra register may in fact be part of some other device
> - it's generally not a great idea if there are other choices.

Ok. It did seem like a dangerous thing to do.

Thanks Alan

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-08-30 12:32     ` Alan Cox
  2011-08-30 13:14       ` Søren holm
@ 2011-09-02 10:20       ` Søren holm
  2011-09-02 12:28         ` Alan Cox
  1 sibling, 1 reply; 11+ messages in thread
From: Søren holm @ 2011-09-02 10:20 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-serial

[-- Attachment #1: Type: Text/Plain, Size: 147 bytes --]

Hi

Here is my patch to add EFR-support for XR17D15x
Do you have any comments, since this is my first patch to the kernel ?

-- 
Søren Holm

[-- Attachment #2: 0001-serial-Support-the-EFR-register-of-XR1715x-uarts.patch --]
[-- Type: text/x-patch, Size: 5264 bytes --]

From fcf3746a15af26ddd2e8e2421f81799b15c27707 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Holm?= <sh@mikrofyn.com>
Date: Fri, 2 Sep 2011 12:18:59 +0200
Subject: [PATCH] serial: Support the EFR-register of XR1715x uarts.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The EFR (Enhenced-Features-Register) is located at a different offset
than the other devices supporting UART_CAP_EFR. This change add a special
setup quick to set UPF_EXAR_EFR on the port. UPF_EXAR_EFR is then used to
the port type to PORT_XR17D15X since it is for sure a XR17D15X uart.

Signed-off-by: Søren Holm <sgh@sgh.dk>
---
 drivers/tty/serial/8250.c     |   18 +++++++++++++++++-
 drivers/tty/serial/8250_pci.c |   33 +++++++++++++++++++++++++++++++++
 include/linux/serial_core.h   |    4 +++-
 include/linux/serial_reg.h    |    1 +
 4 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index 7f50999..d626ca8 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -309,6 +309,13 @@ static const struct serial8250_config uart_config[] = {
 				  UART_FCR_T_TRIG_01,
 		.flags		= UART_CAP_FIFO | UART_CAP_RTOIE,
 	},
+	[PORT_XR17D15X] = {
+		.name		= "XR17D15X",
+		.fifo_size	= 64,
+		.tx_loadsz	= 64,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
+	},
 };
 
 #if defined(CONFIG_MIPS_ALCHEMY)
@@ -1119,6 +1126,12 @@ static void autoconfig_16550a(struct uart_8250_port *up)
 	}
 	serial_outp(up, UART_IER, iersave);
 
+	// Exar uarts have EFR in a weird location
+	if (up->port.flags & UPF_EXAR_EFR) {
+		up->port.type = PORT_XR17D15X;
+		up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
+	}
+
 	/*
 	 * We distinguish between 16550A and U6 16550A by counting
 	 * how many bytes are in the FIFO.
@@ -2458,7 +2471,10 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 			efr |= UART_EFR_CTS;
 
 		serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
-		serial_outp(up, UART_EFR, efr);
+		if (up->port.flags & UPF_EXAR_EFR)
+			serial_outp(up, UART_XR_EFR, efr);
+		else
+			serial_outp(up, UART_EFR, efr);
 	}
 
 #ifdef CONFIG_ARCH_OMAP
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250_pci.c
index 3abeca2..52247da 100644
--- a/drivers/tty/serial/8250_pci.c
+++ b/drivers/tty/serial/8250_pci.c
@@ -1101,6 +1101,15 @@ static int pci_eg20t_init(struct pci_dev *dev)
 #endif
 }
 
+static int
+pci_xr17c154_setup(struct serial_private *priv,
+		  const struct pciserial_board *board,
+		  struct uart_port *port, int idx)
+{
+	port->flags |= UPF_EXAR_EFR;
+	return pci_default_setup(priv, board, port, idx);
+}
+
 /* This should be in linux/pci_ids.h */
 #define PCI_VENDOR_ID_SBSMODULARIO	0x124B
 #define PCI_SUBVENDOR_ID_SBSMODULARIO	0x124B
@@ -1506,6 +1515,30 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
 		.setup		= pci_timedia_setup,
 	},
 	/*
+	 * Exar cards
+	 */
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C152,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C154,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C158,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	/*
 	 * Xircom cards
 	 */
 	{
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index a5c3114..01aa96b 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -46,7 +46,8 @@
 #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */
 #define PORT_U6_16550A	19	/* ST-Ericsson U6xxx internal UART */
 #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */
-#define PORT_MAX_8250	20	/* max port ID */
+#define PORT_XR17D15X	21	/* Exar XR17D15x UART */
+#define PORT_MAX_8250	21	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
@@ -350,6 +351,7 @@ struct uart_port {
 #define UPF_MAGIC_MULTIPLIER	((__force upf_t) (1 << 16))
 #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
 #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
+#define UPF_EXAR_EFR		((__force upf_t) (1 << 25))
 /* The exact UART type is known and should not be probed.  */
 #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))
 #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h
index c75bda3..63a749a 100644
--- a/include/linux/serial_reg.h
+++ b/include/linux/serial_reg.h
@@ -152,6 +152,7 @@
  * LCR=0xBF (or DLAB=1 for 16C660)
  */
 #define UART_EFR	2	/* I/O: Extended Features Register */
+#define UART_XR_EFR	9	/* I/O: Extended Features Register for Exar XR17D154 */
 #define UART_EFR_CTS		0x80 /* CTS flow control */
 #define UART_EFR_RTS		0x40 /* RTS flow control */
 #define UART_EFR_SCD		0x20 /* Special character detect */
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-09-02 10:20       ` Søren holm
@ 2011-09-02 12:28         ` Alan Cox
  2011-09-02 20:52           ` [PATCH] serial: Support the EFR-register of XR1715x uarts Søren Holm
                             ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Alan Cox @ 2011-09-02 12:28 UTC (permalink / raw)
  To: Søren holm; +Cc: linux-serial

On Fri, 2 Sep 2011 12:20:50 +0200
Søren holm <sgh@sgh.dk> wrote:

> Hi
> 
> Here is my patch to add EFR-support for XR17D15x
> Do you have any comments, since this is my first patch to the kernel ?


Codewise it looks fine

Two things though - run changes through scripts/checkpatch.pl (and it'll
tell you off for the // comment...) and actually inline the patch rather
than attach it so it is easy for people to comment on.

The important bits of it however  - the actual implementation looks right
to me and sensibly implemented.

Possibly it should instead override serial_out/in to use the different EFR
that way but given this is one spot only I don't think its worth the extra
complexity - and if other changes later make it worth doing it's easy to
change.

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH] serial: Support the EFR-register of XR1715x uarts.
  2011-09-02 12:28         ` Alan Cox
@ 2011-09-02 20:52           ` Søren Holm
  2011-09-02 20:55           ` Søren Holm
  2011-09-02 21:11           ` Hardware flowcontrol on XR17D154 Søren holm
  2 siblings, 0 replies; 11+ messages in thread
From: Søren Holm @ 2011-09-02 20:52 UTC (permalink / raw)
  To: linux-serial; +Cc: Søren Holm

The EFR (Enhenced-Features-Register) is located at a different offset
than the other devices supporting UART_CAP_EFR. This change add a special
setup quick to set UPF_EXAR_EFR on the port. UPF_EXAR_EFR is then used to
the port type to PORT_XR17D15X since it is for sure a XR17D15X uart.

Signed-off-by: Søren Holm <sgh@sgh.dk>
---
 drivers/tty/serial/8250.c     |   20 +++++++++++++++++++-
 drivers/tty/serial/8250_pci.c |   33 +++++++++++++++++++++++++++++++++
 include/linux/serial_core.h   |    4 +++-
 include/linux/serial_reg.h    |    1 +
 4 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index 7f50999..7572666 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -309,6 +309,13 @@ static const struct serial8250_config uart_config[] = {
 				  UART_FCR_T_TRIG_01,
 		.flags		= UART_CAP_FIFO | UART_CAP_RTOIE,
 	},
+	[PORT_XR17D15X] = {
+		.name		= "XR17D15X",
+		.fifo_size	= 64,
+		.tx_loadsz	= 64,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
+	},
 };
 
 #if defined(CONFIG_MIPS_ALCHEMY)
@@ -1120,6 +1127,14 @@ static void autoconfig_16550a(struct uart_8250_port *up)
 	serial_outp(up, UART_IER, iersave);
 
 	/*
+	 * Exar uarts have EFR in a weird location
+	 */
+	if (up->port.flags & UPF_EXAR_EFR) {
+		up->port.type = PORT_XR17D15X;
+		up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
+	}
+
+	/*
 	 * We distinguish between 16550A and U6 16550A by counting
 	 * how many bytes are in the FIFO.
 	 */
@@ -2458,7 +2473,10 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 			efr |= UART_EFR_CTS;
 
 		serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
-		serial_outp(up, UART_EFR, efr);
+		if (up->port.flags & UPF_EXAR_EFR)
+			serial_outp(up, UART_XR_EFR, efr);
+		else
+			serial_outp(up, UART_EFR, efr);
 	}
 
 #ifdef CONFIG_ARCH_OMAP
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250_pci.c
index 3abeca2..52247da 100644
--- a/drivers/tty/serial/8250_pci.c
+++ b/drivers/tty/serial/8250_pci.c
@@ -1101,6 +1101,15 @@ static int pci_eg20t_init(struct pci_dev *dev)
 #endif
 }
 
+static int
+pci_xr17c154_setup(struct serial_private *priv,
+		  const struct pciserial_board *board,
+		  struct uart_port *port, int idx)
+{
+	port->flags |= UPF_EXAR_EFR;
+	return pci_default_setup(priv, board, port, idx);
+}
+
 /* This should be in linux/pci_ids.h */
 #define PCI_VENDOR_ID_SBSMODULARIO	0x124B
 #define PCI_SUBVENDOR_ID_SBSMODULARIO	0x124B
@@ -1506,6 +1515,30 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
 		.setup		= pci_timedia_setup,
 	},
 	/*
+	 * Exar cards
+	 */
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C152,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C154,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C158,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	/*
 	 * Xircom cards
 	 */
 	{
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index a5c3114..01aa96b 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -46,7 +46,8 @@
 #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */
 #define PORT_U6_16550A	19	/* ST-Ericsson U6xxx internal UART */
 #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */
-#define PORT_MAX_8250	20	/* max port ID */
+#define PORT_XR17D15X	21	/* Exar XR17D15x UART */
+#define PORT_MAX_8250	21	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
@@ -350,6 +351,7 @@ struct uart_port {
 #define UPF_MAGIC_MULTIPLIER	((__force upf_t) (1 << 16))
 #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
 #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
+#define UPF_EXAR_EFR		((__force upf_t) (1 << 25))
 /* The exact UART type is known and should not be probed.  */
 #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))
 #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h
index c75bda3..8ce70d7 100644
--- a/include/linux/serial_reg.h
+++ b/include/linux/serial_reg.h
@@ -152,6 +152,7 @@
  * LCR=0xBF (or DLAB=1 for 16C660)
  */
 #define UART_EFR	2	/* I/O: Extended Features Register */
+#define UART_XR_EFR	9	/* I/O: Extended Features Register (XR17D15x) */
 #define UART_EFR_CTS		0x80 /* CTS flow control */
 #define UART_EFR_RTS		0x40 /* RTS flow control */
 #define UART_EFR_SCD		0x20 /* Special character detect */
-- 
1.7.4.1

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

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] serial: Support the EFR-register of XR1715x uarts.
  2011-09-02 12:28         ` Alan Cox
  2011-09-02 20:52           ` [PATCH] serial: Support the EFR-register of XR1715x uarts Søren Holm
@ 2011-09-02 20:55           ` Søren Holm
  2011-09-03 10:47             ` Alan Cox
  2011-09-02 21:11           ` Hardware flowcontrol on XR17D154 Søren holm
  2 siblings, 1 reply; 11+ messages in thread
From: Søren Holm @ 2011-09-02 20:55 UTC (permalink / raw)
  To: linux-serial

The EFR (Enhenced-Features-Register) is located at a different offset
than the other devices supporting UART_CAP_EFR. This change add a special
setup quick to set UPF_EXAR_EFR on the port. UPF_EXAR_EFR is then used to
the port type to PORT_XR17D15X since it is for sure a XR17D15X uart.

Signed-off-by: Søren Holm <sgh@sgh.dk>
---
 drivers/tty/serial/8250.c     |   20 +++++++++++++++++++-
 drivers/tty/serial/8250_pci.c |   33 +++++++++++++++++++++++++++++++++
 include/linux/serial_core.h   |    4 +++-
 include/linux/serial_reg.h    |    1 +
 4 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index 7f50999..7572666 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -309,6 +309,13 @@ static const struct serial8250_config uart_config[] = {
 				  UART_FCR_T_TRIG_01,
 		.flags		= UART_CAP_FIFO | UART_CAP_RTOIE,
 	},
+	[PORT_XR17D15X] = {
+		.name		= "XR17D15X",
+		.fifo_size	= 64,
+		.tx_loadsz	= 64,
+		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10,
+		.flags		= UART_CAP_FIFO | UART_CAP_AFE | UART_CAP_EFR,
+	},
 };
 
 #if defined(CONFIG_MIPS_ALCHEMY)
@@ -1120,6 +1127,14 @@ static void autoconfig_16550a(struct uart_8250_port *up)
 	serial_outp(up, UART_IER, iersave);
 
 	/*
+	 * Exar uarts have EFR in a weird location
+	 */
+	if (up->port.flags & UPF_EXAR_EFR) {
+		up->port.type = PORT_XR17D15X;
+		up->capabilities |= UART_CAP_AFE | UART_CAP_EFR;
+	}
+
+	/*
 	 * We distinguish between 16550A and U6 16550A by counting
 	 * how many bytes are in the FIFO.
 	 */
@@ -2458,7 +2473,10 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 			efr |= UART_EFR_CTS;
 
 		serial_outp(up, UART_LCR, UART_LCR_CONF_MODE_B);
-		serial_outp(up, UART_EFR, efr);
+		if (up->port.flags & UPF_EXAR_EFR)
+			serial_outp(up, UART_XR_EFR, efr);
+		else
+			serial_outp(up, UART_EFR, efr);
 	}
 
 #ifdef CONFIG_ARCH_OMAP
diff --git a/drivers/tty/serial/8250_pci.c b/drivers/tty/serial/8250_pci.c
index 3abeca2..52247da 100644
--- a/drivers/tty/serial/8250_pci.c
+++ b/drivers/tty/serial/8250_pci.c
@@ -1101,6 +1101,15 @@ static int pci_eg20t_init(struct pci_dev *dev)
 #endif
 }
 
+static int
+pci_xr17c154_setup(struct serial_private *priv,
+		  const struct pciserial_board *board,
+		  struct uart_port *port, int idx)
+{
+	port->flags |= UPF_EXAR_EFR;
+	return pci_default_setup(priv, board, port, idx);
+}
+
 /* This should be in linux/pci_ids.h */
 #define PCI_VENDOR_ID_SBSMODULARIO	0x124B
 #define PCI_SUBVENDOR_ID_SBSMODULARIO	0x124B
@@ -1506,6 +1515,30 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
 		.setup		= pci_timedia_setup,
 	},
 	/*
+	 * Exar cards
+	 */
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C152,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C154,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	{
+		.vendor = PCI_VENDOR_ID_EXAR,
+		.device = PCI_DEVICE_ID_EXAR_XR17C158,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.setup		= pci_xr17c154_setup,
+	},
+	/*
 	 * Xircom cards
 	 */
 	{
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index a5c3114..01aa96b 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -46,7 +46,8 @@
 #define PORT_AR7	18	/* Texas Instruments AR7 internal UART */
 #define PORT_U6_16550A	19	/* ST-Ericsson U6xxx internal UART */
 #define PORT_TEGRA	20	/* NVIDIA Tegra internal UART */
-#define PORT_MAX_8250	20	/* max port ID */
+#define PORT_XR17D15X	21	/* Exar XR17D15x UART */
+#define PORT_MAX_8250	21	/* max port ID */
 
 /*
  * ARM specific type numbers.  These are not currently guaranteed
@@ -350,6 +351,7 @@ struct uart_port {
 #define UPF_MAGIC_MULTIPLIER	((__force upf_t) (1 << 16))
 #define UPF_CONS_FLOW		((__force upf_t) (1 << 23))
 #define UPF_SHARE_IRQ		((__force upf_t) (1 << 24))
+#define UPF_EXAR_EFR		((__force upf_t) (1 << 25))
 /* The exact UART type is known and should not be probed.  */
 #define UPF_FIXED_TYPE		((__force upf_t) (1 << 27))
 #define UPF_BOOT_AUTOCONF	((__force upf_t) (1 << 28))
diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h
index c75bda3..8ce70d7 100644
--- a/include/linux/serial_reg.h
+++ b/include/linux/serial_reg.h
@@ -152,6 +152,7 @@
  * LCR=0xBF (or DLAB=1 for 16C660)
  */
 #define UART_EFR	2	/* I/O: Extended Features Register */
+#define UART_XR_EFR	9	/* I/O: Extended Features Register (XR17D15x) */
 #define UART_EFR_CTS		0x80 /* CTS flow control */
 #define UART_EFR_RTS		0x40 /* RTS flow control */
 #define UART_EFR_SCD		0x20 /* Special character detect */
-- 
1.7.4.1

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

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: Hardware flowcontrol on XR17D154
  2011-09-02 12:28         ` Alan Cox
  2011-09-02 20:52           ` [PATCH] serial: Support the EFR-register of XR1715x uarts Søren Holm
  2011-09-02 20:55           ` Søren Holm
@ 2011-09-02 21:11           ` Søren holm
  2 siblings, 0 replies; 11+ messages in thread
From: Søren holm @ 2011-09-02 21:11 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-serial

I cleaned up the style issues in my previous mails.

Sorry for the double posting. The maillist was problably slower that my 
partience could bear :)

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

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH] serial: Support the EFR-register of XR1715x uarts.
  2011-09-02 20:55           ` Søren Holm
@ 2011-09-03 10:47             ` Alan Cox
  0 siblings, 0 replies; 11+ messages in thread
From: Alan Cox @ 2011-09-03 10:47 UTC (permalink / raw)
  To: Søren Holm; +Cc: linux-serial, greg

On Fri,  2 Sep 2011 22:55:37 +0200
Søren Holm <sgh@sgh.dk> wrote:

> The EFR (Enhenced-Features-Register) is located at a different offset
> than the other devices supporting UART_CAP_EFR. This change add a special
> setup quick to set UPF_EXAR_EFR on the port. UPF_EXAR_EFR is then used to
> the port type to PORT_XR17D15X since it is for sure a XR17D15X uart.
> 
> Signed-off-by: Søren Holm <sgh@sgh.dk>

Acked-by: Alan Cox <alan@linux.intel.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-09-03 10:48 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-30 10:17 Hardware flowcontrol on XR17D154 Søren holm
2011-08-30 10:34 ` Alan Cox
2011-08-30 11:27   ` Søren holm
2011-08-30 12:32     ` Alan Cox
2011-08-30 13:14       ` Søren holm
2011-09-02 10:20       ` Søren holm
2011-09-02 12:28         ` Alan Cox
2011-09-02 20:52           ` [PATCH] serial: Support the EFR-register of XR1715x uarts Søren Holm
2011-09-02 20:55           ` Søren Holm
2011-09-03 10:47             ` Alan Cox
2011-09-02 21:11           ` Hardware flowcontrol on XR17D154 Søren holm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox