21typedef enum { MODE_PIO, MODE_MMIO } io_mode_t;
23#if defined(CONFIG_XENO_DRIVERS_16550A_PIO) || \
24 defined(CONFIG_XENO_DRIVERS_16550A_ANY)
25static unsigned long io[MAX_DEVICES];
26module_param_array(io, ulong, NULL, 0400);
27MODULE_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)
32static unsigned long mem[MAX_DEVICES];
33static void *mapped_io[MAX_DEVICES];
34module_param_array(mem, ulong, NULL, 0400);
35MODULE_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
42extern void *mapped_io[];
44static inline unsigned long rt_16550_addr_param(
int dev_id)
49static inline int rt_16550_addr_param_valid(
int dev_id)
54static inline unsigned long rt_16550_base_addr(
int dev_id)
59static inline io_mode_t rt_16550_io_mode(
int dev_id)
64static inline io_mode_t
65rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
71rt_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
80extern unsigned long io[];
82static inline unsigned long rt_16550_addr_param(
int dev_id)
87static inline int rt_16550_addr_param_valid(
int dev_id)
92static inline unsigned long rt_16550_base_addr(
int dev_id)
94 return (
unsigned long)mapped_io[dev_id];
97static inline io_mode_t rt_16550_io_mode(
int dev_id)
102static inline io_mode_t
103rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
109rt_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
118static inline unsigned long rt_16550_addr_param(
int dev_id)
120 return (io[dev_id]) ? io[dev_id] : mem[dev_id];
123static inline int rt_16550_addr_param_valid(
int dev_id)
125 return !(io[dev_id] && mem[dev_id]);
128static inline unsigned long rt_16550_base_addr(
int dev_id)
130 return (io[dev_id]) ? io[dev_id] : (
unsigned long)mapped_io[dev_id];
133static inline io_mode_t rt_16550_io_mode(
int dev_id)
135 return (io[dev_id]) ? MODE_PIO : MODE_MMIO;
138static inline io_mode_t
139rt_16550_io_mode_from_ctx(
struct rt_16550_context *ctx)
145rt_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
160static RT_16550_IO_INLINE u8
161rt_16550_reg_in(io_mode_t io_mode,
unsigned long base,
int off)
165 return inb(base + off);
167 return readb((
void *)base + off);
171static RT_16550_IO_INLINE
void
172rt_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);
184static 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])
200static 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]);