From ddb2d0a0185583b268dfe0a32e2f70ee2f118bd0 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Mon, 4 Feb 2013 14:19:35 -0700 Subject: [PATCH] staging: comedi: comedi_pcmcia: introduce comedi_pcmcia_{enable, disable} Introduce some helper functions to enable/disable the PCMCIA device. This will allow removing some of the boilerplate code in the comedi PCMCIA drivers. Signed-off-by: H Hartley Sweeten Cc: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/comedi_pcmcia.c | 46 ++++++++++++++++++++++++++ drivers/staging/comedi/comedidev.h | 3 ++ 2 files changed, 49 insertions(+) diff --git a/drivers/staging/comedi/comedi_pcmcia.c b/drivers/staging/comedi/comedi_pcmcia.c index f10bcc529585..925f12825c1b 100644 --- a/drivers/staging/comedi/comedi_pcmcia.c +++ b/drivers/staging/comedi/comedi_pcmcia.c @@ -37,6 +37,52 @@ struct pcmcia_device *comedi_to_pcmcia_dev(struct comedi_device *dev) } EXPORT_SYMBOL_GPL(comedi_to_pcmcia_dev); +static int comedi_pcmcia_conf_check(struct pcmcia_device *link, + void *priv_data) +{ + if (link->config_index == 0) + return -EINVAL; + + return pcmcia_request_io(link); +} + +/** + * comedi_pcmcia_enable() - Request the regions and enable the PCMCIA device. + * @dev: comedi_device struct + * + * The comedi PCMCIA driver needs to set the link->config_flags, as + * appropriate for that driver, before calling this function in order + * to allow pcmcia_loop_config() to do its internal autoconfiguration. + */ +int comedi_pcmcia_enable(struct comedi_device *dev) +{ + struct pcmcia_device *link = comedi_to_pcmcia_dev(dev); + int ret; + + if (!link) + return -ENODEV; + + ret = pcmcia_loop_config(link, comedi_pcmcia_conf_check, NULL); + if (ret) + return ret; + + return pcmcia_enable_device(link); +} +EXPORT_SYMBOL_GPL(comedi_pcmcia_enable); + +/** + * comedi_pcmcia_disable() - Disable the PCMCIA device and release the regions. + * @dev: comedi_device struct + */ +void comedi_pcmcia_disable(struct comedi_device *dev) +{ + struct pcmcia_device *link = comedi_to_pcmcia_dev(dev); + + if (link) + pcmcia_disable_device(link); +} +EXPORT_SYMBOL_GPL(comedi_pcmcia_disable); + /** * comedi_pcmcia_auto_config() - Configure/probe a comedi PCMCIA driver. * @link: pcmcia_device struct diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h index b7bb120f48be..4836fe6dfb35 100644 --- a/drivers/staging/comedi/comedidev.h +++ b/drivers/staging/comedi/comedidev.h @@ -440,6 +440,9 @@ struct pcmcia_device; struct pcmcia_device *comedi_to_pcmcia_dev(struct comedi_device *); +int comedi_pcmcia_enable(struct comedi_device *); +void comedi_pcmcia_disable(struct comedi_device *); + int comedi_pcmcia_auto_config(struct pcmcia_device *, struct comedi_driver *); void comedi_pcmcia_auto_unconfig(struct pcmcia_device *); -- 2.39.5