21 typedef enum { MODE_PIO, MODE_MMIO } io_mode_t;
23 #if defined(CONFIG_XENO_DRIVERS_16550A_PIO) || \ 24 defined(CONFIG_XENO_DRIVERS_16550A_ANY) 25 static unsigned long io[MAX_DEVICES];
26 module_param_array(io, ulong, NULL, 0400);
27 MODULE_PARM_DESC(io,
"I/O port addresses of the serial devices");
30 #if defined(CONFIG_XENO_DRIVERS_16550A_MMIO) || \ 31 defined(CONFIG_XENO_DRIVERS_16550A_ANY) 32 static unsigned long mem[MAX_DEVICES];
33 static void *mapped_io[MAX_DEVICES];
34 module_param_array(mem, ulong, NULL, 0400);
35 MODULE_PARM_DESC(mem,
"I/O memory addresses of the serial devices");
38 #ifdef CONFIG_XENO_DRIVERS_16550A_PIO 40 #define RT_16550_IO_INLINE inline 42 extern void *mapped_io[];
44 static inline unsigned long rt_16550_addr_param(
int dev_id)
49 static inline int rt_16550_addr_param_valid(
int dev_id)
54 static inline unsigned long rt_16550_base_addr(
int dev_id)
59 static inline io_mode_t rt_16550_io_mode(
int dev_id)
64 static inline io_mode_t
65 rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
71 rt_16550_init_io_ctx(
int dev_id,
struct rt_16550_context *ctx)
73 ctx->base_addr = io[dev_id];
76 #elif defined(CONFIG_XENO_DRIVERS_16550A_MMIO) 78 #define RT_16550_IO_INLINE inline 80 extern unsigned long io[];
82 static inline unsigned long rt_16550_addr_param(
int dev_id)
87 static inline int rt_16550_addr_param_valid(
int dev_id)
92 static inline unsigned long rt_16550_base_addr(
int dev_id)
94 return (
unsigned long)mapped_io[dev_id];
97 static inline io_mode_t rt_16550_io_mode(
int dev_id)
102 static inline io_mode_t
103 rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
109 rt_16550_init_io_ctx(
int dev_id,
struct rt_16550_context *ctx)
111 ctx->base_addr = (
unsigned long)mapped_io[dev_id];
114 #elif defined(CONFIG_XENO_DRIVERS_16550A_ANY) 116 #define RT_16550_IO_INLINE 118 static inline unsigned long rt_16550_addr_param(
int dev_id)
120 return (io[dev_id]) ? io[dev_id] : mem[dev_id];
123 static inline int rt_16550_addr_param_valid(
int dev_id)
125 return !(io[dev_id] && mem[dev_id]);
128 static inline unsigned long rt_16550_base_addr(
int dev_id)
130 return (io[dev_id]) ? io[dev_id] : (
unsigned long)mapped_io[dev_id];
133 static inline io_mode_t rt_16550_io_mode(
int dev_id)
135 return (io[dev_id]) ? MODE_PIO : MODE_MMIO;
138 static inline io_mode_t
139 rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
145 rt_16550_init_io_ctx(
int dev_id,
struct rt_16550_context *ctx)
148 ctx->base_addr = io[dev_id];
149 ctx->io_mode = MODE_PIO;
151 ctx->base_addr = (
unsigned long)mapped_io[dev_id];
152 ctx->io_mode = MODE_MMIO;
157 # error Unsupported I/O access method 160 static RT_16550_IO_INLINE u8
161 rt_16550_reg_in(io_mode_t io_mode,
unsigned long base,
int off)
165 return inb(base + off);
167 return readb((
void *)base + off);
171 static RT_16550_IO_INLINE
void 172 rt_16550_reg_out(io_mode_t io_mode,
unsigned long base,
int off, u8 val)
176 outb(val, base + off);
179 writeb(val, (
void *)base + off);
184 static int rt_16550_init_io(
int dev_id,
char* name)
186 switch (rt_16550_io_mode(dev_id)) {
188 if (!request_region(rt_16550_addr_param(dev_id), 8, name))
192 mapped_io[dev_id] = ioremap(rt_16550_addr_param(dev_id), 8);
193 if (!mapped_io[dev_id])
200 static void rt_16550_release_io(
int dev_id)
202 switch (rt_16550_io_mode(dev_id)) {
204 release_region(io[dev_id], 8);
207 iounmap(mapped_io[dev_id]);