aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/staging/comedi/drivers/das08_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/comedi/drivers/das08_cs.c')
-rw-r--r--drivers/staging/comedi/drivers/das08_cs.c189
1 files changed, 52 insertions, 137 deletions
diff --git a/drivers/staging/comedi/drivers/das08_cs.c b/drivers/staging/comedi/drivers/das08_cs.c
index 4ad398aad72c..f5700de7b6c0 100644
--- a/drivers/staging/comedi/drivers/das08_cs.c
+++ b/drivers/staging/comedi/drivers/das08_cs.c
@@ -20,6 +20,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ PCMCIA support code for this driver is adapted from the dummy_cs.c
+ driver of the Linux PCMCIA Card Services package.
+
+ The initial developer of the original code is David A. Hinds
+ <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
+ are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
+
*****************************************************************
*/
@@ -53,24 +60,10 @@ Command support does not exist, but could be added for this board.
static struct pcmcia_device *cur_dev;
-#define thisboard ((const struct das08_board_struct *)dev->board_ptr)
-
-static int das08_cs_attach(struct comedi_device *dev,
- struct comedi_devconfig *it);
-
-static struct comedi_driver driver_das08_cs = {
- .driver_name = "das08_cs",
- .module = THIS_MODULE,
- .attach = das08_cs_attach,
- .detach = das08_common_detach,
- .board_name = &das08_cs_boards[0].name,
- .num_names = ARRAY_SIZE(das08_cs_boards),
- .offset = sizeof(struct das08_board_struct),
-};
-
static int das08_cs_attach(struct comedi_device *dev,
struct comedi_devconfig *it)
{
+ const struct das08_board_struct *thisboard = comedi_board(dev);
int ret;
unsigned long iobase;
struct pcmcia_device *link = cur_dev; /* XXX hack */
@@ -79,82 +72,34 @@ static int das08_cs_attach(struct comedi_device *dev,
if (ret < 0)
return ret;
- dev_info(dev->hw_dev, "comedi%d: das08_cs:\n", dev->minor);
+ dev_info(dev->class_dev, "das08_cs: attach\n");
/* deal with a pci board */
if (thisboard->bustype == pcmcia) {
if (link == NULL) {
- dev_err(dev->hw_dev, "no pcmcia cards found\n");
+ dev_err(dev->class_dev, "no pcmcia cards found\n");
return -EIO;
}
iobase = link->resource[0]->start;
} else {
- dev_err(dev->hw_dev, "bug! board does not have PCMCIA bustype\n");
+ dev_err(dev->class_dev,
+ "bug! board does not have PCMCIA bustype\n");
return -EINVAL;
}
return das08_common_attach(dev, iobase);
}
-/*======================================================================
-
- The following pcmcia code for the pcm-das08 is adapted from the
- dummy_cs.c driver of the Linux PCMCIA Card Services package.
-
- The initial developer of the original code is David A. Hinds
- <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
- are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
-
-======================================================================*/
-
-static void das08_pcmcia_config(struct pcmcia_device *link);
-static void das08_pcmcia_release(struct pcmcia_device *link);
-static int das08_pcmcia_suspend(struct pcmcia_device *p_dev);
-static int das08_pcmcia_resume(struct pcmcia_device *p_dev);
-
-static int das08_pcmcia_attach(struct pcmcia_device *);
-static void das08_pcmcia_detach(struct pcmcia_device *);
-
-struct local_info_t {
- struct pcmcia_device *link;
- int stop;
- struct bus_operations *bus;
+static struct comedi_driver driver_das08_cs = {
+ .driver_name = "das08_cs",
+ .module = THIS_MODULE,
+ .attach = das08_cs_attach,
+ .detach = das08_common_detach,
+ .board_name = &das08_cs_boards[0].name,
+ .num_names = ARRAY_SIZE(das08_cs_boards),
+ .offset = sizeof(struct das08_board_struct),
};
-static int das08_pcmcia_attach(struct pcmcia_device *link)
-{
- struct local_info_t *local;
-
- dev_dbg(&link->dev, "das08_pcmcia_attach()\n");
-
- /* Allocate space for private device-specific data */
- local = kzalloc(sizeof(struct local_info_t), GFP_KERNEL);
- if (!local)
- return -ENOMEM;
- local->link = link;
- link->priv = local;
-
- cur_dev = link;
-
- das08_pcmcia_config(link);
-
- return 0;
-} /* das08_pcmcia_attach */
-
-static void das08_pcmcia_detach(struct pcmcia_device *link)
-{
-
- dev_dbg(&link->dev, "das08_pcmcia_detach\n");
-
- ((struct local_info_t *)link->priv)->stop = 1;
- das08_pcmcia_release(link);
-
- /* This points to the parent struct local_info_t struct */
- kfree(link->priv);
-
-} /* das08_pcmcia_detach */
-
-
static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
void *priv_data)
{
@@ -164,19 +109,15 @@ static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
return pcmcia_request_io(p_dev);
}
-static void das08_pcmcia_config(struct pcmcia_device *link)
+static int das08_pcmcia_attach(struct pcmcia_device *link)
{
int ret;
- dev_dbg(&link->dev, "das08_pcmcia_config\n");
-
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
ret = pcmcia_loop_config(link, das08_pcmcia_config_loop, NULL);
- if (ret) {
- dev_warn(&link->dev, "no configuration found\n");
+ if (ret)
goto failed;
- }
if (!link->irq)
goto failed;
@@ -185,87 +126,61 @@ static void das08_pcmcia_config(struct pcmcia_device *link)
if (ret)
goto failed;
- return;
+ cur_dev = link;
+ return 0;
failed:
- das08_pcmcia_release(link);
-
-} /* das08_pcmcia_config */
-
-static void das08_pcmcia_release(struct pcmcia_device *link)
-{
- dev_dbg(&link->dev, "das08_pcmcia_release\n");
pcmcia_disable_device(link);
-} /* das08_pcmcia_release */
-
-static int das08_pcmcia_suspend(struct pcmcia_device *link)
-{
- struct local_info_t *local = link->priv;
- /* Mark the device as stopped, to block IO until later */
- local->stop = 1;
-
- return 0;
-} /* das08_pcmcia_suspend */
+ return ret;
+}
-static int das08_pcmcia_resume(struct pcmcia_device *link)
+static void das08_pcmcia_detach(struct pcmcia_device *link)
{
- struct local_info_t *local = link->priv;
-
- local->stop = 0;
- return 0;
-} /* das08_pcmcia_resume */
-
-/*====================================================================*/
+ pcmcia_disable_device(link);
+ cur_dev = NULL;
+}
static const struct pcmcia_device_id das08_cs_id_table[] = {
PCMCIA_DEVICE_MANF_CARD(0x01c5, 0x4001),
PCMCIA_DEVICE_NULL
};
-
MODULE_DEVICE_TABLE(pcmcia, das08_cs_id_table);
-MODULE_AUTHOR("David A. Schleef <ds@schleef.org>, "
- "Frank Mori Hess <fmhess@users.sourceforge.net>");
-MODULE_DESCRIPTION("Comedi driver for ComputerBoards DAS-08 PCMCIA boards");
-MODULE_LICENSE("GPL");
-struct pcmcia_driver das08_cs_driver = {
- .probe = das08_pcmcia_attach,
- .remove = das08_pcmcia_detach,
- .suspend = das08_pcmcia_suspend,
- .resume = das08_pcmcia_resume,
- .id_table = das08_cs_id_table,
- .owner = THIS_MODULE,
- .name = "pcm-das08",
+static struct pcmcia_driver das08_cs_driver = {
+ .name = "pcm-das08",
+ .owner = THIS_MODULE,
+ .probe = das08_pcmcia_attach,
+ .remove = das08_pcmcia_detach,
+ .id_table = das08_cs_id_table,
};
-static int __init init_das08_pcmcia_cs(void)
-{
- pcmcia_register_driver(&das08_cs_driver);
- return 0;
-}
-
-static void __exit exit_das08_pcmcia_cs(void)
-{
- pr_debug("das08_pcmcia_cs: unloading\n");
- pcmcia_unregister_driver(&das08_cs_driver);
-}
-
static int __init das08_cs_init_module(void)
{
int ret;
- ret = init_das08_pcmcia_cs();
+ ret = comedi_driver_register(&driver_das08_cs);
if (ret < 0)
return ret;
- return comedi_driver_register(&driver_das08_cs);
+ ret = pcmcia_register_driver(&das08_cs_driver);
+ if (ret < 0) {
+ comedi_driver_unregister(&driver_das08_cs);
+ return ret;
+ }
+
+ return 0;
+
}
+module_init(das08_cs_init_module);
static void __exit das08_cs_exit_module(void)
{
- exit_das08_pcmcia_cs();
+ pcmcia_unregister_driver(&das08_cs_driver);
comedi_driver_unregister(&driver_das08_cs);
}
-
-module_init(das08_cs_init_module);
module_exit(das08_cs_exit_module);
+
+MODULE_AUTHOR("David A. Schleef <ds@schleef.org>, "
+ "Frank Mori Hess <fmhess@users.sourceforge.net>");
+MODULE_DESCRIPTION("Comedi driver for ComputerBoards DAS-08 PCMCIA boards");
+MODULE_LICENSE("GPL");