diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-05-17 18:17:00 (GMT) |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-17 19:09:49 (GMT) |
commit | 9ff8b151881adb408d1337bd7654cc869e9f42e0 (patch) | |
tree | ed9f458d5607482f2523a073a76f93b7c7db239c /drivers/staging | |
parent | 33de9071262a68a3817359e418ff45d018ca2021 (diff) | |
download | linux-fsl-qoriq-9ff8b151881adb408d1337bd7654cc869e9f42e0.tar.xz |
staging: comedi: drivers: generalize comedi_load_firmware()
Move comedi_load_firmware() from jr3_pci.c to drivers.c and export
it for general use by the comedi 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/comedidev.h | 5 | ||||
-rw-r--r-- | drivers/staging/comedi/drivers.c | 30 | ||||
-rw-r--r-- | drivers/staging/comedi/drivers/jr3_pci.c | 35 |
3 files changed, 40 insertions, 30 deletions
diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h index ff7fc45..7adc426 100644 --- a/drivers/staging/comedi/comedidev.h +++ b/drivers/staging/comedi/comedidev.h @@ -346,6 +346,11 @@ int comedi_alloc_subdevices(struct comedi_device *, int); void comedi_spriv_free(struct comedi_device *, int subdev_num); +int comedi_load_firmware(struct comedi_device *, struct device *, + const char *name, + int (*cb)(struct comedi_device *, + const u8 *data, size_t size)); + int __comedi_request_region(struct comedi_device *, unsigned long start, unsigned long len); int comedi_request_region(struct comedi_device *, diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index 216ba44..12f1974 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -33,6 +33,7 @@ #include <linux/dma-mapping.h> #include <linux/io.h> #include <linux/interrupt.h> +#include <linux/firmware.h> #include "comedidev.h" #include "comedi_internal.h" @@ -347,6 +348,35 @@ static void comedi_report_boards(struct comedi_driver *driv) } /** + * comedi_load_firmware() - Request and load firmware for a device. + * @dev: comedi_device struct + * @hw_device: device struct for the comedi_device + * @name: the name of the firmware image + * @cb: callback to the upload the firmware image + */ +int comedi_load_firmware(struct comedi_device *dev, + struct device *device, + const char *name, + int (*cb)(struct comedi_device *dev, + const u8 *data, size_t size)) +{ + const struct firmware *fw; + int ret; + + if (!cb) + return -EINVAL; + + ret = request_firmware(&fw, name, device); + if (ret == 0) { + ret = cb(dev, fw->data, fw->size); + release_firmware(fw); + } + + return ret; +} +EXPORT_SYMBOL_GPL(comedi_load_firmware); + +/** * __comedi_request_region() - Request an I/O reqion for a legacy driver. * @dev: comedi_device struct * @start: base address of the I/O reqion diff --git a/drivers/staging/comedi/drivers/jr3_pci.c b/drivers/staging/comedi/drivers/jr3_pci.c index 9b61b55..6c5406c 100644 --- a/drivers/staging/comedi/drivers/jr3_pci.c +++ b/drivers/staging/comedi/drivers/jr3_pci.c @@ -41,7 +41,6 @@ #include <linux/pci.h> #include <linux/delay.h> #include <linux/ctype.h> -#include <linux/firmware.h> #include <linux/jiffies.h> #include <linux/slab.h> #include <linux/timer.h> @@ -92,33 +91,6 @@ struct jr3_pci_subdev_private { int retries; }; -/* Hotplug firmware loading stuff */ -static int comedi_load_firmware(struct comedi_device *dev, const char *name, - int (*cb)(struct comedi_device *dev, - const u8 *data, size_t size)) -{ - struct pci_dev *pcidev = comedi_to_pci_dev(dev); - const struct firmware *fw; - char *firmware_path; - int ret; - - if (!cb) - return -EINVAL; - - firmware_path = kasprintf(GFP_KERNEL, "comedi/%s", name); - if (!firmware_path) - return -ENOMEM; - - ret = request_firmware(&fw, firmware_path, &pcidev->dev); - if (ret == 0) { - ret = cb(dev, fw->data, fw->size); - release_firmware(fw); - } - kfree(firmware_path); - - return ret; -} - static struct poll_delay_t poll_delay_min_max(int min, int max) { struct poll_delay_t result; @@ -759,7 +731,9 @@ static int jr3_pci_auto_attach(struct comedi_device *dev, /* Reset DSP card */ writel(0, &devpriv->iobase->channel[0].reset); - result = comedi_load_firmware(dev, "jr3pci.idm", jr3_download_firmware); + result = comedi_load_firmware(dev, &comedi_to_pci_dev(dev)->dev, + "comedi/jr3pci.idm", + jr3_download_firmware); dev_dbg(dev->class_dev, "Firmare load %d\n", result); if (result < 0) @@ -769,7 +743,8 @@ static int jr3_pci_auto_attach(struct comedi_device *dev, * format: * model serial Fx Fy Fz Mx My Mz\n * - * comedi_load_firmware(dev, "jr3_offsets_table", + * comedi_load_firmware(dev, &comedi_to_pci_dev(dev)->dev, + * "comedi/jr3_offsets_table", * jr3_download_firmware); */ |