20 #if defined(CONFIG_XENO_DRIVERS_16550A_PCI) 22 #include <linux/pci.h> 24 struct rt_16550_pci_board {
26 resource_size_t resource_base_addr;
28 unsigned int port_ofs;
29 unsigned long irqtype;
30 unsigned int baud_base;
34 #if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) 36 #define PCI_DEVICE_ID_CP112UL 0x1120 37 #define PCI_DEVICE_ID_CP114UL 0x1143 38 #define PCI_DEVICE_ID_CP138U 0x1380 40 static const struct rt_16550_pci_board rt_16550_moxa_c104 = {
41 .name =
"Moxa C104H/PCI",
42 .resource_base_addr = 2,
50 static const struct rt_16550_pci_board rt_16550_moxa_c168 = {
51 .name =
"Moxa C168H/PCI",
52 .resource_base_addr = 2,
60 static const struct rt_16550_pci_board rt_16550_moxa_cp114 = {
61 .name =
"Moxa CP-114",
62 .resource_base_addr = 2,
70 static const struct rt_16550_pci_board rt_16550_moxa_cp132 = {
71 .name =
"Moxa CP-132",
72 .resource_base_addr = 2,
80 static const struct rt_16550_pci_board rt_16550_moxa_cp102u = {
81 .name =
"Moxa CP-102U",
82 .resource_base_addr = 2,
90 static const struct rt_16550_pci_board rt_16550_moxa_cp102ul = {
91 .name =
"Moxa CP-102UL",
92 .resource_base_addr = 2,
100 static const struct rt_16550_pci_board rt_16550_moxa_cp104u = {
101 .name =
"Moxa CP-104U",
102 .resource_base_addr = 2,
110 static const struct rt_16550_pci_board rt_16550_moxa_cp112ul = {
111 .name =
"Moxa CP-112UL",
112 .resource_base_addr = 2,
120 static const struct rt_16550_pci_board rt_16550_moxa_cp114ul = {
121 .name =
"Moxa CP-114UL",
122 .resource_base_addr = 2,
130 static const struct rt_16550_pci_board rt_16550_moxa_cp118u = {
131 .name =
"Moxa CP-118U",
132 .resource_base_addr = 2,
140 static const struct rt_16550_pci_board rt_16550_moxa_cp132u = {
141 .name =
"Moxa CP-132U",
142 .resource_base_addr = 2,
150 static const struct rt_16550_pci_board rt_16550_moxa_cp134u = {
151 .name =
"Moxa CP-134U",
152 .resource_base_addr = 2,
160 static const struct rt_16550_pci_board rt_16550_moxa_cp138u = {
161 .name =
"Moxa CP-138U",
162 .resource_base_addr = 2,
170 static const struct rt_16550_pci_board rt_16550_moxa_cp168u = {
171 .name =
"Moxa CP-168U",
172 .resource_base_addr = 2,
181 const struct pci_device_id rt_16550_pci_table[] = {
182 #if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) 183 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C104),
184 .driver_data = (
unsigned long)&rt_16550_moxa_c104},
185 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C168),
186 .driver_data = (
unsigned long)&rt_16550_moxa_c168},
187 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114),
188 .driver_data = (
unsigned long)&rt_16550_moxa_cp114},
189 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132),
190 .driver_data = (
unsigned long)&rt_16550_moxa_cp132},
191 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102U),
192 .driver_data = (
unsigned long)&rt_16550_moxa_cp102u},
193 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UL),
194 .driver_data = (
unsigned long)&rt_16550_moxa_cp102ul},
195 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104U),
196 .driver_data = (
unsigned long)&rt_16550_moxa_cp104u},
197 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP112UL),
198 .driver_data = (
unsigned long)&rt_16550_moxa_cp112ul},
199 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL),
200 .driver_data = (
unsigned long)&rt_16550_moxa_cp114ul},
201 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118U),
202 .driver_data = (
unsigned long)&rt_16550_moxa_cp118u},
203 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132U),
204 .driver_data = (
unsigned long)&rt_16550_moxa_cp132u},
205 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134U),
206 .driver_data = (
unsigned long)&rt_16550_moxa_cp134u},
207 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U),
208 .driver_data = (
unsigned long)&rt_16550_moxa_cp138u},
209 {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168U),
210 .driver_data = (
unsigned long)&rt_16550_moxa_cp168u},
215 static int rt_16550_pci_probe(
struct pci_dev *pdev,
216 const struct pci_device_id *ent)
218 struct rt_16550_pci_board *board;
225 if (!ent->driver_data)
228 board = (
struct rt_16550_pci_board *)ent->driver_data;
230 for (i = 0; i < MAX_DEVICES; i++)
231 if (!rt_16550_addr_param(i))
234 if (board->nports > max_devices)
237 if ((err = pci_enable_device(pdev)))
240 base_addr = pci_resource_start(pdev, board->resource_base_addr);
242 for (i = 0; i < MAX_DEVICES; i++) {
243 if ((port < board->nports) && (!rt_16550_addr_param(i))) {
244 io[i] = base_addr + port * board->port_ofs;
246 irqtype[i] = board->irqtype;
247 baud_base[i] = board->baud_base;
248 tx_fifo[i] = board->tx_fifo;
256 static void rt_16550_pci_remove(
struct pci_dev *pdev) {
257 pci_disable_device( pdev );
260 static struct pci_driver rt_16550_pci_driver = {
261 .name = RT_16550_DRIVER_NAME,
262 .id_table = rt_16550_pci_table,
263 .probe = rt_16550_pci_probe,
264 .remove = rt_16550_pci_remove
267 static int pci_registered;
269 static inline void rt_16550_pci_init(
void)
271 if (pci_register_driver(&rt_16550_pci_driver) == 0)
275 static inline void rt_16550_pci_cleanup(
void)
278 pci_unregister_driver(&rt_16550_pci_driver);
283 #define rt_16550_pci_init() do { } while (0) 284 #define rt_16550_pci_cleanup() do { } while (0) #define RTDM_IRQTYPE_SHARED
Enable IRQ-sharing with other real-time drivers.
Definition: driver.h:811