summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2003-09-07 21:51:03 +0000
committermarcel <marcel@FreeBSD.org>2003-09-07 21:51:03 +0000
commit99d0e6c9d5d310d7f4c4558288e881c89b3fdf78 (patch)
tree22e0d3f0111ac1127e824ebbf9c76d4238693f5f /sys/dev/uart
parent49215d6199e1f0cf0b9f639b2113118e61c3180d (diff)
downloadFreeBSD-src-99d0e6c9d5d310d7f4c4558288e881c89b3fdf78.zip
FreeBSD-src-99d0e6c9d5d310d7f4c4558288e881c89b3fdf78.tar.gz
Remove the assumption that a bus_space_handle_t is an I/O address
from the SAB82532 and the Z8530 hardware drivers by introducing uart_cpu_busaddr(). The assumption is not true on pc98 where bus_space_handle_t is a pointer to a structure. The uart_cpu_busaddr() function will return the bus address corresponding the tag and handle given to it by the BAS. WARNING: the intend of the function is STRICTLY to allow hardware drivers to determine which logical channel they control and is NOT to be used for actual I/O. It is therefore EXPLICITLY allowed that uart_cpu_busaddr() returns only the lower 8 bits of the address and garbage in all other bits. No mistakes...
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart_cpu.h5
-rw-r--r--sys/dev/uart/uart_cpu_alpha.c21
-rw-r--r--sys/dev/uart/uart_cpu_amd64.c21
-rw-r--r--sys/dev/uart/uart_cpu_i386.c21
-rw-r--r--sys/dev/uart/uart_cpu_ia64.c21
-rw-r--r--sys/dev/uart/uart_cpu_pc98.c21
-rw-r--r--sys/dev/uart/uart_cpu_sparc64.c21
-rw-r--r--sys/dev/uart/uart_dev_sab82532.c4
-rw-r--r--sys/dev/uart/uart_dev_z8530.c4
9 files changed, 91 insertions, 48 deletions
diff --git a/sys/dev/uart/uart_cpu.h b/sys/dev/uart/uart_cpu.h
index f10e4dd..e60ce57 100644
--- a/sys/dev/uart/uart_cpu.h
+++ b/sys/dev/uart/uart_cpu.h
@@ -67,8 +67,9 @@ struct uart_devinfo {
void *cookie; /* Type dependent use. */
};
-int uart_cpu_getdev(int devtype, struct uart_devinfo *di);
-int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2);
+bus_addr_t uart_cpu_busaddr(struct uart_bas *);
+int uart_cpu_eqres(struct uart_bas *, struct uart_bas *);
+int uart_cpu_getdev(int, struct uart_devinfo *);
void uart_add_sysdev(struct uart_devinfo*);
diff --git a/sys/dev/uart/uart_cpu_alpha.c b/sys/dev/uart/uart_cpu_alpha.c
index 95ee2ff..8638277 100644
--- a/sys/dev/uart/uart_cpu_alpha.c
+++ b/sys/dev/uart/uart_cpu_alpha.c
@@ -39,6 +39,20 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -102,10 +116,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_cpu_amd64.c b/sys/dev/uart/uart_cpu_amd64.c
index a186216..1852d40 100644
--- a/sys/dev/uart/uart_cpu_amd64.c
+++ b/sys/dev/uart/uart_cpu_amd64.c
@@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -83,10 +97,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_cpu_i386.c b/sys/dev/uart/uart_cpu_i386.c
index 04de73a..9e34290 100644
--- a/sys/dev/uart/uart_cpu_i386.c
+++ b/sys/dev/uart/uart_cpu_i386.c
@@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -83,10 +97,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_cpu_ia64.c b/sys/dev/uart/uart_cpu_ia64.c
index f3523fb..32073fc 100644
--- a/sys/dev/uart/uart_cpu_ia64.c
+++ b/sys/dev/uart/uart_cpu_ia64.c
@@ -44,6 +44,20 @@ static int dig64_to_uart_parity[] = {
UART_PARITY_ODD, UART_PARITY_MARK, UART_PARITY_SPACE
};
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -130,10 +144,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_cpu_pc98.c b/sys/dev/uart/uart_cpu_pc98.c
index ab7f0b7..05704d2 100644
--- a/sys/dev/uart/uart_cpu_pc98.c
+++ b/sys/dev/uart/uart_cpu_pc98.c
@@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh->bsh_base);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -87,10 +101,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_cpu_sparc64.c b/sys/dev/uart/uart_cpu_sparc64.c
index fed26a8..d14c68b 100644
--- a/sys/dev/uart/uart_cpu_sparc64.c
+++ b/sys/dev/uart/uart_cpu_sparc64.c
@@ -58,6 +58,20 @@ uart_cpu_channel(char *dev)
return (alias[len - 1] - 'a');
}
+bus_addr_t
+uart_cpu_busaddr(struct uart_bas *bas)
+{
+
+ return (bas->bsh);
+}
+
+int
+uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
+{
+
+ return ((b1->bsh == b2->bsh) ? 1 : 0);
+}
+
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
@@ -147,10 +161,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
(par == 'o') ? UART_PARITY_ODD : UART_PARITY_EVEN;
return (0);
}
-
-int
-uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
-{
-
- return ((b1->bsh == b2->bsh) ? 1 : 0);
-}
diff --git a/sys/dev/uart/uart_dev_sab82532.c b/sys/dev/uart/uart_dev_sab82532.c
index b7ca2e4..5345e97 100644
--- a/sys/dev/uart/uart_dev_sab82532.c
+++ b/sys/dev/uart/uart_dev_sab82532.c
@@ -42,8 +42,8 @@ __FBSDID("$FreeBSD$");
#define DEFAULT_RCLK 29491200
-#define IS_CHANNEL_A(bas) (((bas)->bsh & 0x40) == 0x00)
-#define IS_CHANNEL_B(bas) (((bas)->bsh & 0x40) == 0x40)
+#define IS_CHANNEL_A(bas) ((uart_cpu_busaddr(bas) & 0x40) == 0x00)
+#define IS_CHANNEL_B(bas) ((uart_cpu_busaddr(bas) & 0x40) == 0x40)
/*
* NOTE: To allow us to read the baudrate divisor from the chip, we
diff --git a/sys/dev/uart/uart_dev_z8530.c b/sys/dev/uart/uart_dev_z8530.c
index 498b3a3..a7c6e25 100644
--- a/sys/dev/uart/uart_dev_z8530.c
+++ b/sys/dev/uart/uart_dev_z8530.c
@@ -42,8 +42,8 @@ __FBSDID("$FreeBSD$");
#define DEFAULT_RCLK 307200
-#define IS_CHANNEL_A(bas) (((bas)->bsh & 7) != 0)
-#define IS_CHANNEL_B(bas) (((bas)->bsh & 7) == 0)
+#define IS_CHANNEL_A(bas) ((uart_cpu_busaddr(bas) & 7) != 0)
+#define IS_CHANNEL_B(bas) ((uart_cpu_busaddr(bas) & 7) == 0)
/* Multiplexed I/O. */
static __inline void
OpenPOWER on IntegriCloud