OSDN Git Service

staging: comedi: drivers: generalize comedi_load_firmware()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Fri, 17 May 2013 18:17:00 +0000 (11:17 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 17 May 2013 19:09:49 +0000 (12:09 -0700)
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>
drivers/staging/comedi/comedidev.h
drivers/staging/comedi/drivers.c
drivers/staging/comedi/drivers/jr3_pci.c

index ff7fc45..7adc426 100644 (file)
@@ -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 *,
index 216ba44..12f1974 100644 (file)
@@ -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
index 9b61b55..6c5406c 100644 (file)
@@ -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);
         */