Am Dienstag 04 Januar 2011, 20:49:59 schrieben Sie: > Stefan Kisdaroczi wrote: > > Hi, > > > > the attached patch adds pci support to the 16550A serial driver. I have > > a Moxa CP-132 board and the first tests are looking good. If there is a > > chance to get the patch applied I kindly request you to review it. I'll > > add support for more Moxa boards if there is a interest to apply the > > patch. > > > > thanks > > Stefan > > Looks fine to me, however, nit-picking a bit, could we do this differently:
new patches attached. Stefan
From eff6d96e62b3bd04569cb2e07e675ae3a31d1710 Mon Sep 17 00:00:00 2001 From: Stefan Kisdaroczi <[email protected]> Date: Wed, 5 Jan 2011 11:18:55 +0100 Subject: [PATCH 1/2] 16550A: pci support --- ksrc/drivers/serial/16550A.c | 3 + ksrc/drivers/serial/16550A_pci.h | 108 ++++++++++++++++++++++++++++++++++++++ ksrc/drivers/serial/Kconfig | 8 +++ 3 files changed, 119 insertions(+), 0 deletions(-) create mode 100644 ksrc/drivers/serial/16550A_pci.h diff --git a/ksrc/drivers/serial/16550A.c b/ksrc/drivers/serial/16550A.c index 4c46d86..73665f0 100644 --- a/ksrc/drivers/serial/16550A.c +++ b/ksrc/drivers/serial/16550A.c @@ -140,6 +140,7 @@ MODULE_AUTHOR("[email protected]"); #include "16550A_io.h" #include "16550A_pnp.h" +#include "16550A_pci.h" static inline int rt_16550_rx_interrupt(struct rt_16550_context *ctx, uint64_t * timestamp) @@ -1119,6 +1120,7 @@ int __init rt_16550_init(void) int i; rt_16550_pnp_init(); + rt_16550_pci_init(); for (i = 0; i < MAX_DEVICES; i++) { if (!rt_16550_addr_param(i)) @@ -1192,6 +1194,7 @@ void rt_16550_exit(void) kfree(device[i]); } + rt_16550_pci_cleanup(); rt_16550_pnp_cleanup(); } diff --git a/ksrc/drivers/serial/16550A_pci.h b/ksrc/drivers/serial/16550A_pci.h new file mode 100644 index 0000000..6aff93e --- /dev/null +++ b/ksrc/drivers/serial/16550A_pci.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2006-2007 Jan Kiszka <[email protected]>. + * Copyright (C) 2011 Stefan Kisdaroczi <[email protected]>. + * + * Xenomai is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Xenomai is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Xenomai; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && defined(CONFIG_PCI) && \ + defined(CONFIG_XENO_DRIVERS_16550A_PCI) + +#include <linux/pci.h> + +struct rt_16550_pci_board { + char *name; + resource_size_t resource_base_addr; + unsigned int nports; + unsigned int port_ofs; + unsigned int baud_base; + int tx_fifo; +}; + +DEFINE_PCI_DEVICE_TABLE( rt_16550_pci_table ) = { + { } +}; + +static int __devinit rt_16550_pci_probe( struct pci_dev *pdev, + const struct pci_device_id *ent ) +{ + struct rt_16550_pci_board *board; + int err; + int i; + int port = 0; + int base_addr; + int max_devices = 0; + + if (!ent->driver_data) + return -ENODEV; + + board = (struct rt_16550_pci_board *)ent->driver_data; + + for (i = 0; i < MAX_DEVICES; i++) + if (!rt_16550_addr_param(i)) + max_devices++; + + if (board->nports > max_devices) + return -ENODEV; + + if (err = pci_enable_device(pdev)) + return err; + + base_addr = pci_resource_start(pdev, board->resource_base_addr); + + for (i = 0; i < MAX_DEVICES; i++) { + if ((port < board->nports) && (!rt_16550_addr_param(i))) { + io[i] = base_addr + port * board->port_ofs; + irq[i] = pdev->irq; + baud_base[i] = board->baud_base; + tx_fifo[i] = board->tx_fifo; + port++; + } + } + + return 0; +} + +static void __devexit rt_16550_pci_remove( struct pci_dev *pdev ) { + pci_disable_device( pdev ); +}; + +static struct pci_driver rt_16550_pci_driver = { + .name = RT_16550_DRIVER_NAME, + .id_table = rt_16550_pci_table, + .probe = rt_16550_pci_probe, + .remove = __devexit_p(rt_16550_pci_remove) +}; + +static int pci_registered; + +static inline void rt_16550_pci_init(void) +{ + if (pci_register_driver(&rt_16550_pci_driver) == 0) + pci_registered = 1; +} + +static inline void rt_16550_pci_cleanup(void) +{ + if (pci_registered) + pci_unregister_driver(&rt_16550_pci_driver); +} + +#else /* Linux < 2.6.0 || !CONFIG_PCI || !(..._16550A_PCI */ + +#define rt_16550_pci_init() do { } while (0) +#define rt_16550_pci_cleanup() do { } while (0) + +#endif /* Linux < 2.6.0 || !CONFIG_PCI || !(..._16550A_PCI */ diff --git a/ksrc/drivers/serial/Kconfig b/ksrc/drivers/serial/Kconfig index afbaabf..b468fbc 100644 --- a/ksrc/drivers/serial/Kconfig +++ b/ksrc/drivers/serial/Kconfig @@ -39,4 +39,12 @@ config XENO_DRIVERS_16550A_ANY endchoice +config XENO_DRIVERS_16550A_PCI + depends on XENO_DRIVERS_16550A_PIO || XENO_DRIVERS_16550A_ANY + bool "PCI board support" + default n + help + + This option activates support for PCI serial boards. + endmenu -- 1.7.2.3
From 73a885e49804d176afbd778eecf4b94582291df2 Mon Sep 17 00:00:00 2001 From: Stefan Kisdaroczi <[email protected]> Date: Wed, 5 Jan 2011 13:35:01 +0100 Subject: [PATCH 2/2] 16550A: Moxa pci board support --- ksrc/drivers/serial/16550A_pci.h | 163 ++++++++++++++++++++++++++++++++++++++ ksrc/drivers/serial/Kconfig | 16 ++++ 2 files changed, 179 insertions(+), 0 deletions(-) diff --git a/ksrc/drivers/serial/16550A_pci.h b/ksrc/drivers/serial/16550A_pci.h index 6aff93e..63ecee8 100644 --- a/ksrc/drivers/serial/16550A_pci.h +++ b/ksrc/drivers/serial/16550A_pci.h @@ -31,7 +31,170 @@ struct rt_16550_pci_board { int tx_fifo; }; +#if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) + +#define PCI_DEVICE_ID_CP112UL 0x1120 +#define PCI_DEVICE_ID_CP114UL 0x1143 +#define PCI_DEVICE_ID_CP138U 0x1380 + +static const struct rt_16550_pci_board rt_16550_moxa_c104 = { + .name = "Moxa C104H/PCI", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_c168 = { + .name = "Moxa C168H/PCI", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp114 = { + .name = "Moxa CP-114", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp132 = { + .name = "Moxa CP-132", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp102u = { + .name = "Moxa CP-102U", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp102ul = { + .name = "Moxa CP-102UL", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp104u = { + .name = "Moxa CP-104U", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp112ul = { + .name = "Moxa CP-112UL", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp114ul = { + .name = "Moxa CP-114UL", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp118u = { + .name = "Moxa CP-118U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp132u = { + .name = "Moxa CP-132U", + .resource_base_addr = 2, + .nports = 2, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp134u = { + .name = "Moxa CP-134U", + .resource_base_addr = 2, + .nports = 4, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp138u = { + .name = "Moxa CP-138U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; + +static const struct rt_16550_pci_board rt_16550_moxa_cp168u = { + .name = "Moxa CP-168U", + .resource_base_addr = 2, + .nports = 8, + .port_ofs = 8, + .baud_base = 921600, + .tx_fifo = 16, +}; +#endif + DEFINE_PCI_DEVICE_TABLE( rt_16550_pci_table ) = { +#if defined(CONFIG_XENO_DRIVERS_16550A_PCI_MOXA) + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C104), + .driver_data = &rt_16550_moxa_c104}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C168), + .driver_data = &rt_16550_moxa_c168}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114), + .driver_data = &rt_16550_moxa_cp114}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132), + .driver_data = &rt_16550_moxa_cp132}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102U), + .driver_data = &rt_16550_moxa_cp102u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UL), + .driver_data = &rt_16550_moxa_cp102ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104U), + .driver_data = &rt_16550_moxa_cp104u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP112UL), + .driver_data = &rt_16550_moxa_cp112ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL), + .driver_data = &rt_16550_moxa_cp114ul}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118U), + .driver_data = &rt_16550_moxa_cp118u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132U), + .driver_data = &rt_16550_moxa_cp132u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134U), + .driver_data = &rt_16550_moxa_cp134u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U), + .driver_data = &rt_16550_moxa_cp138u}, + {PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168U), + .driver_data = &rt_16550_moxa_cp168u}, +#endif { } }; diff --git a/ksrc/drivers/serial/Kconfig b/ksrc/drivers/serial/Kconfig index b468fbc..d3c100e 100644 --- a/ksrc/drivers/serial/Kconfig +++ b/ksrc/drivers/serial/Kconfig @@ -47,4 +47,20 @@ config XENO_DRIVERS_16550A_PCI This option activates support for PCI serial boards. +config XENO_DRIVERS_16550A_PCI_MOXA + depends on XENO_DRIVERS_16550A_PCI + bool "Moxa PCI boards" + default n + help + + This option activates support for the following Moxa boards: + PCI Serial Boards: + C104H/PCI, C168H/PCI + CP-114, CP-132 + Universal PCI Serial Boards: + CP-102U, CP-102UL, CP-104U + CP-112UL, CP-114UL, CP-118U + CP-132U, CP-134U, CP-138U + CP-168U + endmenu -- 1.7.2.3
_______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
