summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-05-17 18:17:00 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-05-17 19:09:49 (GMT)
commit9ff8b151881adb408d1337bd7654cc869e9f42e0 (patch)
treeed9f458d5607482f2523a073a76f93b7c7db239c /drivers/staging
parent33de9071262a68a3817359e418ff45d018ca2021 (diff)
downloadlinux-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.h5
-rw-r--r--drivers/staging/comedi/drivers.c30
-rw-r--r--drivers/staging/comedi/drivers/jr3_pci.c35
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);
*/