Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52c9bf4c authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: ni_daq_700: convert to auto attach



Convert this pcmcia driver to the comedi auto attach mechanism.

This allows getting rid of the "hack" needed to pass the pcmcia_device
pointer from the pcmcia_driver to the comedi_driver.

We can also get rid of the boardinfo since it was only used to
provide the "name" that was used with the manual attach.

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8cd98c82
Loading
Loading
Loading
Loading
+33 −74
Original line number Diff line number Diff line
@@ -50,22 +50,15 @@ Manuals: Register level: http://www.ni.com/pdf/manuals/340698.pdf
		User Manual:	http://www.ni.com/pdf/manuals/320676d.pdf
*/

#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
#include "../comedidev.h"

#include <linux/ioport.h>
#include "../comedidev.h"

#include <pcmcia/cistpl.h>
#include <pcmcia/cisreg.h>
#include <pcmcia/ds.h>

static struct pcmcia_device *pcmcia_cur_dev;

struct daq700_board {
	const char *name;
};

/* daqcard700 registers */
#define DIO_W		0x04	/* WO 8bit */
#define DIO_R		0x05	/* RO 8bit */
@@ -202,24 +195,35 @@ static void daq700_ai_config(struct comedi_device *dev,
	inw(iobase + ADFIFO_R);		/* read 16bit junk from FIFO to clear */
}

static int daq700_attach(struct comedi_device *dev, struct comedi_devconfig *it)
static int daq700_pcmcia_config_loop(struct pcmcia_device *p_dev,
				     void *priv_data)
{
	const struct daq700_board *thisboard = comedi_board(dev);
	if (p_dev->config_index == 0)
		return -EINVAL;

	return pcmcia_request_io(p_dev);
}

static int daq700_auto_attach(struct comedi_device *dev,
			      unsigned long context)
{
	struct pcmcia_device *link = comedi_to_pcmcia_dev(dev);
	struct comedi_subdevice *s;
	struct pcmcia_device *link;
	int ret;

	link = pcmcia_cur_dev;	/* XXX hack */
	if (!link)
		return -EIO;
	dev->board_name = dev->driver->driver_name;

	dev->iobase = link->resource[0]->start;
	if (!dev->iobase) {
		dev_err(dev->class_dev, "io base address is zero!\n");
		return -EINVAL;
	}
	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_AUDIO |
			      CONF_AUTO_SET_IO;

	dev->board_name = thisboard->name;
	ret = pcmcia_loop_config(link, daq700_pcmcia_config_loop, NULL);
	if (ret)
		return ret;

	ret = pcmcia_enable_device(link);
	if (ret)
		return ret;
	dev->iobase = link->resource[0]->start;

	ret = comedi_alloc_subdevices(dev, 2);
	if (ret)
@@ -258,66 +262,22 @@ static int daq700_attach(struct comedi_device *dev, struct comedi_devconfig *it)

static void daq700_detach(struct comedi_device *dev)
{
	/* nothing to cleanup */
}
	struct pcmcia_device *link = comedi_to_pcmcia_dev(dev);

static const struct daq700_board daq700_boards[] = {
	{
		.name		= "daqcard-700",
	}, {
		.name		= "ni_daq_700",
	},
};
	if (dev->iobase)
		pcmcia_disable_device(link);
}

static struct comedi_driver daq700_driver = {
	.driver_name	= "ni_daq_700",
	.module		= THIS_MODULE,
	.attach		= daq700_attach,
	.auto_attach	= daq700_auto_attach,
	.detach		= daq700_detach,
	.board_name	= &daq700_boards[0].name,
	.num_names	= ARRAY_SIZE(daq700_boards),
	.offset		= sizeof(struct daq700_board),
};

static int daq700_pcmcia_config_loop(struct pcmcia_device *p_dev,
				void *priv_data)
{
	if (p_dev->config_index == 0)
		return -EINVAL;

	return pcmcia_request_io(p_dev);
}

static int daq700_cs_attach(struct pcmcia_device *link)
{
	int ret;

	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_AUDIO |
		CONF_AUTO_SET_IO;

	ret = pcmcia_loop_config(link, daq700_pcmcia_config_loop, NULL);
	if (ret)
		goto failed;

	if (!link->irq)
		goto failed;

	ret = pcmcia_enable_device(link);
	if (ret)
		goto failed;

	pcmcia_cur_dev = link;
	return 0;

failed:
	pcmcia_disable_device(link);
	return ret;
}

static void daq700_cs_detach(struct pcmcia_device *link)
{
	pcmcia_disable_device(link);
	pcmcia_cur_dev = NULL;
	return comedi_pcmcia_auto_config(link, &daq700_driver);
}

static const struct pcmcia_device_id daq700_cs_ids[] = {
@@ -329,11 +289,10 @@ MODULE_DEVICE_TABLE(pcmcia, daq700_cs_ids);
static struct pcmcia_driver daq700_cs_driver = {
	.name		= "ni_daq_700",
	.owner		= THIS_MODULE,
	.probe		= daq700_cs_attach,
	.remove		= daq700_cs_detach,
	.id_table	= daq700_cs_ids,
	.probe		= daq700_cs_attach,
	.remove		= comedi_pcmcia_auto_unconfig,
};

module_comedi_pcmcia_driver(daq700_driver, daq700_cs_driver);

MODULE_AUTHOR("Fred Brooks <nsaspook@nsaspook.com>");