]> err.no Git - linux-2.6/blobdiff - drivers/base/firmware_class.c
Merge ../linus
[linux-2.6] / drivers / base / firmware_class.c
index 4acb2c5733c3b46710d6321b886d16b8704f1d1c..59dacb6552c0c5b5088c65377f607310d43ee0c8 100644 (file)
@@ -62,14 +62,16 @@ firmware_timeout_show(struct class *class, char *buf)
 }
 
 /**
- * firmware_timeout_store:
- * Description:
+ * firmware_timeout_store - set number of seconds to wait for firmware
+ * @class: device class pointer
+ * @buf: buffer to scan for timeout value
+ * @count: number of bytes in @buf
+ *
  *     Sets the number of seconds to wait for the firmware.  Once
- *     this expires an error will be return to the driver and no
+ *     this expires an error will be returned to the driver and no
  *     firmware will be provided.
  *
- *     Note: zero means 'wait for ever'
- *
+ *     Note: zero means 'wait forever'.
  **/
 static ssize_t
 firmware_timeout_store(struct class *class, const char *buf, size_t count)
@@ -123,12 +125,15 @@ firmware_loading_show(struct class_device *class_dev, char *buf)
 }
 
 /**
- * firmware_loading_store: - loading control file
- * Description:
+ * firmware_loading_store - set value in the 'loading' control file
+ * @class_dev: class_device pointer
+ * @buf: buffer to scan for loading control value
+ * @count: number of bytes in @buf
+ *
  *     The relevant values are:
  *
  *      1: Start a load, discarding any previous partial load.
- *      0: Conclude the load and handle the data to the driver code.
+ *      0: Conclude the load and hand the data to the driver code.
  *     -1: Conclude the load with an error and discard any written data.
  **/
 static ssize_t
@@ -201,6 +206,7 @@ out:
        up(&fw_lock);
        return ret_count;
 }
+
 static int
 fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
 {
@@ -227,11 +233,13 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
 }
 
 /**
- * firmware_data_write:
- *
- * Description:
+ * firmware_data_write - write method for firmware
+ * @kobj: kobject for the class_device
+ * @buffer: buffer being written
+ * @offset: buffer offset for write in total data store area
+ * @count: buffer size
  *
- *     Data written to the 'data' attribute will be later handled to
+ *     Data written to the 'data' attribute will be later handed to
  *     the driver as a firmware image.
  **/
 static ssize_t
@@ -264,6 +272,7 @@ out:
        up(&fw_lock);
        return retval;
 }
+
 static struct bin_attribute firmware_attr_data_tmpl = {
        .attr = {.name = "data", .mode = 0644, .owner = THIS_MODULE},
        .size = 0,
@@ -448,13 +457,16 @@ out:
 
 /**
  * request_firmware: - request firmware to hotplug and wait for it
- * Description:
- *      @firmware will be used to return a firmware image by the name
+ * @firmware_p: pointer to firmware image
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ *
+ *      @firmware_p will be used to return a firmware image by the name
  *      of @name for device @device.
  *
  *      Should be called from user context where sleeping is allowed.
  *
- *      @name will be use as $FIRMWARE in the hotplug environment and
+ *      @name will be used as $FIRMWARE in the hotplug environment and
  *      should be distinctive enough not to be confused with any other
  *      firmware image for this or any other device.
  **/
@@ -468,6 +480,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
 
 /**
  * release_firmware: - release the resource associated with a firmware image
+ * @fw: firmware resource to release
  **/
 void
 release_firmware(const struct firmware *fw)
@@ -480,8 +493,10 @@ release_firmware(const struct firmware *fw)
 
 /**
  * register_firmware: - provide a firmware image for later usage
+ * @name: name of firmware image file
+ * @data: buffer pointer for the firmware image
+ * @size: size of the data buffer area
  *
- * Description:
  *     Make sure that @data will be available by requesting firmware @name.
  *
  *     Note: This will not be possible until some kind of persistence
@@ -511,36 +526,39 @@ request_firmware_work_func(void *arg)
 {
        struct firmware_work *fw_work = arg;
        const struct firmware *fw;
+       int ret;
        if (!arg) {
                WARN_ON(1);
                return 0;
        }
        daemonize("%s/%s", "firmware", fw_work->name);
-       _request_firmware(&fw, fw_work->name, fw_work->device,
+       ret = _request_firmware(&fw, fw_work->name, fw_work->device,
                fw_work->hotplug);
-       fw_work->cont(fw, fw_work->context);
-       release_firmware(fw);
+       if (ret < 0)
+               fw_work->cont(NULL, fw_work->context);
+       else {
+               fw_work->cont(fw, fw_work->context);
+               release_firmware(fw);
+       }
        module_put(fw_work->module);
        kfree(fw_work);
-       return 0;
+       return ret;
 }
 
 /**
- * request_firmware_nowait:
+ * request_firmware_nowait: asynchronous version of request_firmware
+ * @module: module requesting the firmware
+ * @hotplug: invokes hotplug event to copy the firmware image if this flag
+ *     is non-zero else the firmware copy must be done manually.
+ * @name: name of firmware file
+ * @device: device for which firmware is being loaded
+ * @context: will be passed over to @cont, and
+ *     @fw may be %NULL if firmware request fails.
+ * @cont: function will be called asynchronously when the firmware
+ *     request is over.
  *
- * Description:
  *     Asynchronous variant of request_firmware() for contexts where
  *     it is not possible to sleep.
- *
- *      @hotplug invokes hotplug event to copy the firmware image if this flag
- *      is non-zero else the firmware copy must be done manually.
- *
- *     @cont will be called asynchronously when the firmware request is over.
- *
- *     @context will be passed over to @cont.
- *
- *     @fw may be %NULL if firmware request fails.
- *
  **/
 int
 request_firmware_nowait(
@@ -573,6 +591,8 @@ request_firmware_nowait(
 
        if (ret < 0) {
                fw_work->cont(NULL, fw_work->context);
+               module_put(fw_work->module);
+               kfree(fw_work);
                return ret;
        }
        return 0;