All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alan Cox <alan@lxorguk.ukuu.org.uk>
To: linux-serial@vger.kernel.org
Subject: [RFC 1/5] 8250: Make serial_dl_write a port operation
Date: Fri, 18 Mar 2011 15:24:50 +0000	[thread overview]
Message-ID: <20110318152439.10657.19067.stgit@bob.linux.org.uk> (raw)
In-Reply-To: <20110318152145.10657.23718.stgit@bob.linux.org.uk>

From: Alan Cox <alan@linux.intel.com>

This is pre-requisite to splitting out some of the platform specific stuff

Signed-off-by: Alan Cox <alan@linux.intel.com>
---

 drivers/tty/serial/8250.c   |  122 +++++++++++++++++++++++++------------------
 include/linux/serial_8250.h |    2 +
 include/linux/serial_core.h |    2 +
 3 files changed, 74 insertions(+), 52 deletions(-)


diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
index b3b881b..a8e43fd 100644
--- a/drivers/tty/serial/8250.c
+++ b/drivers/tty/serial/8250.c
@@ -503,10 +503,50 @@ static void io_serial_out(struct uart_port *p, int offset, int value)
 	outb(value, p->iobase + offset);
 }
 
+/* Uart divisor latch read */
+static unsigned int _serial_dl_read(struct uart_port *p)
+{
+	return p->serial_in(p, UART_DLL) | p->serial_in(p, UART_DLM) << 8;
+}
+
+/* Uart divisor latch write */
+static void _serial_dl_write(struct uart_port *p, unsigned int value)
+{
+	p->serial_out(p, UART_DLL, value & 0xff);
+	p->serial_out(p, UART_DLM, value >> 8 & 0xff);
+}
+
+/* Au1x00 haven't got a standard divisor latch */
+static unsigned int au_serial_dl_read(struct uart_port *p)
+{
+	return __raw_readl(p->membase + 0x28);
+}
+
+static void au_serial_dl_write(struct uart_port *p, unsigned int value)
+{
+	__raw_writel(value, p->membase + 0x28);
+}
+
+static unsigned int rm9k_serial_dl_read(struct uart_port *p)
+{
+	return	(((__raw_readl(p->membase + 0x10) << 8) |
+		(__raw_readl(p->membase + 0x08) & 0xff)) & 0xffff);
+}
+
+static void rm9k_serial_dl_write(struct uart_port *p, unsigned int value)
+{
+	__raw_writel(value, p->membase + 0x08);
+	__raw_writel(value >> 8, p->membase + 0x10);
+}
+
 static void set_io_from_upio(struct uart_port *p)
 {
 	struct uart_8250_port *up =
 		container_of(p, struct uart_8250_port, port);
+
+	p->serial_dl_read = _serial_dl_read;
+	p->serial_dl_write = _serial_dl_write;
+
 	switch (p->iotype) {
 	case UPIO_HUB6:
 		p->serial_in = hub6_serial_in;
@@ -519,6 +559,8 @@ static void set_io_from_upio(struct uart_port *p)
 		break;
 
 	case UPIO_RM9000:
+		p->serial_dl_read = rm9k_serial_dl_read;
+		p->serial_dl_write = rm9k_serial_dl_write;
 	case UPIO_MEM32:
 		p->serial_in = mem32_serial_in;
 		p->serial_out = mem32_serial_out;
@@ -527,6 +569,8 @@ static void set_io_from_upio(struct uart_port *p)
 	case UPIO_AU:
 		p->serial_in = au_serial_in;
 		p->serial_out = au_serial_out;
+		p->serial_dl_read = au_serial_dl_read;
+		p->serial_dl_write = au_serial_dl_write;
 		break;
 
 	case UPIO_TSI:
@@ -575,6 +619,17 @@ serial_out_sync(struct uart_8250_port *up, int offset, int value)
 	(up->port.serial_in(&(up)->port, (offset)))
 #define serial_out(up, offset, value)	\
 	(up->port.serial_out(&(up)->port, (offset), (value)))
+
+static unsigned int serial_dl_read(struct uart_8250_port *up)
+{
+	return up->port.serial_dl_read(&up->port);
+}
+
+static void serial_dl_write(struct uart_8250_port *up, unsigned int value)
+{
+	up->port.serial_dl_write(&up->port, value);
+}
+
 /*
  * We used to support using pause I/O for certain machines.  We
  * haven't supported this for a while, but just in case it's badly
@@ -584,58 +639,6 @@ serial_out_sync(struct uart_8250_port *up, int offset, int value)
 #define serial_inp(up, offset)		serial_in(up, offset)
 #define serial_outp(up, offset, value)	serial_out(up, offset, value)
 
-/* Uart divisor latch read */
-static inline int _serial_dl_read(struct uart_8250_port *up)
-{
-	return serial_inp(up, UART_DLL) | serial_inp(up, UART_DLM) << 8;
-}
-
-/* Uart divisor latch write */
-static inline void _serial_dl_write(struct uart_8250_port *up, int value)
-{
-	serial_outp(up, UART_DLL, value & 0xff);
-	serial_outp(up, UART_DLM, value >> 8 & 0xff);
-}
-
-#if defined(CONFIG_MIPS_ALCHEMY)
-/* Au1x00 haven't got a standard divisor latch */
-static int serial_dl_read(struct uart_8250_port *up)
-{
-	if (up->port.iotype == UPIO_AU)
-		return __raw_readl(up->port.membase + 0x28);
-	else
-		return _serial_dl_read(up);
-}
-
-static void serial_dl_write(struct uart_8250_port *up, int value)
-{
-	if (up->port.iotype == UPIO_AU)
-		__raw_writel(value, up->port.membase + 0x28);
-	else
-		_serial_dl_write(up, value);
-}
-#elif defined(CONFIG_SERIAL_8250_RM9K)
-static int serial_dl_read(struct uart_8250_port *up)
-{
-	return	(up->port.iotype == UPIO_RM9000) ?
-		(((__raw_readl(up->port.membase + 0x10) << 8) |
-		(__raw_readl(up->port.membase + 0x08) & 0xff)) & 0xffff) :
-		_serial_dl_read(up);
-}
-
-static void serial_dl_write(struct uart_8250_port *up, int value)
-{
-	if (up->port.iotype == UPIO_RM9000) {
-		__raw_writel(value, up->port.membase + 0x08);
-		__raw_writel(value >> 8, up->port.membase + 0x10);
-	} else {
-		_serial_dl_write(up, value);
-	}
-}
-#else
-#define serial_dl_read(up) _serial_dl_read(up)
-#define serial_dl_write(up, value) _serial_dl_write(up, value)
-#endif
 
 /*
  * For the 16C950
@@ -3008,10 +3011,15 @@ int __init early_serial_setup(struct uart_port *port)
 	p->line		= port->line;
 
 	set_io_from_upio(p);
+
 	if (port->serial_in)
 		p->serial_in = port->serial_in;
 	if (port->serial_out)
 		p->serial_out = port->serial_out;
+	if (port->serial_dl_read)
+		p->serial_dl_read = port->serial_dl_read;
+	if (port->serial_dl_write)
+		p->serial_dl_write = port->serial_dl_write;
 
 	return 0;
 }
@@ -3080,6 +3088,16 @@ static int __devinit serial8250_probe(struct platform_device *dev)
 		port.type		= p->type;
 		port.serial_in		= p->serial_in;
 		port.serial_out		= p->serial_out;
+		port.serial_dl_read	= p->serial_dl_read;
+		port.serial_dl_write	= p->serial_dl_write;
+		/* Temporary to help people transferring */
+		if (port.serial_dl_read == NULL ||
+					port.serial_dl_write == NULL) {
+			dev_warn(&dev->dev,
+				"needs updating to set dl_read/write.\n");
+			port.serial_dl_read = _serial_dl_read;
+			port.serial_dl_write = _serial_dl_write;
+		}
 		port.set_termios	= p->set_termios;
 		port.pm			= p->pm;
 		port.dev		= &dev->dev;
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h
index 97f5b45..9e42ff7 100644
--- a/include/linux/serial_8250.h
+++ b/include/linux/serial_8250.h
@@ -37,6 +37,8 @@ struct plat_serial8250_port {
 			               struct ktermios *old);
 	void		(*pm)(struct uart_port *, unsigned int state,
 			      unsigned old);
+	unsigned int	(*serial_dl_read)(struct uart_port *);
+	void		(*serial_dl_write)(struct uart_port *, unsigned int);
 };
 
 /*
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 758c5b0..f47f95c 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -291,6 +291,8 @@ struct uart_port {
 	spinlock_t		lock;			/* port lock */
 	unsigned long		iobase;			/* in/out[bwl] */
 	unsigned char __iomem	*membase;		/* read/write[bwl] */
+	unsigned int		(*serial_dl_read)(struct uart_port *);
+	void			(*serial_dl_write)(struct uart_port *, unsigned int);
 	unsigned int		(*serial_in)(struct uart_port *, int);
 	void			(*serial_out)(struct uart_port *, int, int);
 	void			(*set_termios)(struct uart_port *,


  reply	other threads:[~2011-03-18 15:44 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-18 15:24 [RFC 0/5] Starting to pull out the I/O operations Alan Cox
2011-03-18 15:24 ` Alan Cox [this message]
2011-03-18 15:25 ` [RFC 2/5] 8250: introduce the idea of an operations struct for an 8250 port Alan Cox
2011-03-18 15:25 ` [RFC 3/5] 8250: register upio users Alan Cox
2011-03-18 15:25 ` [RFC 4/5] 8250: evict the hub6 I/O operations Alan Cox
2011-03-18 15:26 ` [RFC 5/5] 8250: extract out the "odd" port types Alan Cox
2011-03-18 20:04 ` [RFC 0/5] Starting to pull out the I/O operations Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110318152439.10657.19067.stgit@bob.linux.org.uk \
    --to=alan@lxorguk.ukuu.org.uk \
    --cc=linux-serial@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.