diff options
author | Ian Abbott <abbotti@mev.co.uk> | 2012-10-27 20:44:14 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-10-29 22:02:08 (GMT) |
commit | 8ed705aff0652fdbd2c6b406155d7d480e1aabe0 (patch) | |
tree | 565fd8ab2bb905f209e0a5e21a2c98a7621a1ab6 /drivers/staging/comedi/drivers.c | |
parent | 156096a0398fd5c42beeed87ad9b79134d890d22 (diff) | |
download | linux-fsl-qoriq-8ed705aff0652fdbd2c6b406155d7d480e1aabe0.tar.xz |
staging: comedi: add generic auto-config functions
Add (and export) generic auto-config function `comedi_auto_config()` to
allow hardware devices on arbitrary bus types (e.g. platform devices,
spi devices, etc.) to be auto-configured as comedi devices. This uses a
new `auto_attach()` hook in the `struct comedi_driver`. This new hook
will eventually replace the bus-specific `attach_pci()` and
`attach_usb()` hooks in the low-level comedi drivers.
When the `auto_attach()` hook is called in the low-level driver, the
`hw_dev` member of the `struct comedi_device` will have already been set
to the hardware device passed to `comedi_auto_config()`. The low-level
driver can convert this to some bus-device wrapper structure pointer,
possibly with the help of the `context` parameter that is passed
unchanged from the `comedi_auto_config()` call.
Also export the existing `comedi_auto_unconfig()` function as the
matching call to `comedi_auto_config()`.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/comedi/drivers.c')
-rw-r--r-- | drivers/staging/comedi/drivers.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 4e61f5b..d60fa55 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -922,7 +922,27 @@ static int comedi_old_auto_config(struct device *hardware_device, (unsigned long)&it); } -static void comedi_auto_unconfig(struct device *hardware_device) +static int comedi_auto_config_wrapper(struct comedi_device *dev, + unsigned long context) +{ + if (!dev->driver->auto_attach) { + dev_warn(dev->class_dev, + "BUG! driver '%s' has no auto_attach handler\n", + dev->driver->driver_name); + return -EINVAL; + } + return dev->driver->auto_attach(dev, context); +} + +int comedi_auto_config(struct device *hardware_device, + struct comedi_driver *driver, unsigned long context) +{ + return comedi_auto_config_helper(hardware_device, driver, + comedi_auto_config_wrapper, context); +} +EXPORT_SYMBOL_GPL(comedi_auto_config); + +void comedi_auto_unconfig(struct device *hardware_device) { int minor; @@ -934,6 +954,7 @@ static void comedi_auto_unconfig(struct device *hardware_device) BUG_ON(minor >= COMEDI_NUM_BOARD_MINORS); comedi_free_board_minor(minor); } +EXPORT_SYMBOL_GPL(comedi_auto_unconfig); /** * comedi_pci_enable() - Enable the PCI device and request the regions. |