Commit 9ff8b151 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33de9071
......@@ -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 *,
......
......@@ -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"
......@@ -346,6 +347,35 @@ static void comedi_report_boards(struct comedi_driver *driv)
pr_info(" %s\n", driv->driver_name);
}
/**
* 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
......
......@@ -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);
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment