diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-02-04 14:19:35 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-02-04 14:47:18 -0800 |
commit | ddb2d0a0185583b268dfe0a32e2f70ee2f118bd0 (patch) | |
tree | e7b91821c9fb8156726baa77df3d70496d5f209b /drivers/staging | |
parent | e44adfdb6740f5673612a3060b8d3120ccafd5d1 (diff) |
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 <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/comedi/comedi_pcmcia.c | 46 | ||||
-rw-r--r-- | drivers/staging/comedi/comedidev.h | 3 |
2 files changed, 49 insertions, 0 deletions
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 *); |