mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
![David Woodhouse](/assets/img/avatar_default.png)
Some drivers have their own hacks to bypass the kernel's firmware loader and build their firmware into the kernel; this renders those unnecessary. Other drivers don't use the firmware loader at all, because they always want the firmware to be available. This allows them to start using the firmware loader. A third set of drivers already use the firmware loader, but can't be used without help from userspace, which sometimes requires an initrd. This allows them to work in a static kernel. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
66 lines
1.7 KiB
C
66 lines
1.7 KiB
C
#ifndef _LINUX_FIRMWARE_H
|
|
#define _LINUX_FIRMWARE_H
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/types.h>
|
|
#include <linux/compiler.h>
|
|
|
|
#define FIRMWARE_NAME_MAX 30
|
|
#define FW_ACTION_NOHOTPLUG 0
|
|
#define FW_ACTION_HOTPLUG 1
|
|
|
|
struct firmware {
|
|
size_t size;
|
|
const u8 *data;
|
|
};
|
|
|
|
struct device;
|
|
|
|
struct builtin_fw {
|
|
char *name;
|
|
void *data;
|
|
unsigned long size;
|
|
};
|
|
|
|
/* We have to play tricks here much like stringify() to get the
|
|
__COUNTER__ macro to be expanded as we want it */
|
|
#define __fw_concat1(x, y) x##y
|
|
#define __fw_concat(x, y) __fw_concat1(x, y)
|
|
|
|
#define DECLARE_BUILTIN_FIRMWARE(name, blob) \
|
|
DECLARE_BUILTIN_FIRMWARE_SIZE(name, &(blob), sizeof(blob))
|
|
|
|
#define DECLARE_BUILTIN_FIRMWARE_SIZE(name, blob, size) \
|
|
static const struct builtin_fw __fw_concat(__builtin_fw,__COUNTER__) \
|
|
__used __section(.builtin_fw) = { name, blob, size }
|
|
|
|
#if defined(CONFIG_FW_LOADER) || (defined(CONFIG_FW_LOADER_MODULE) && defined(MODULE))
|
|
int request_firmware(const struct firmware **fw, const char *name,
|
|
struct device *device);
|
|
int request_firmware_nowait(
|
|
struct module *module, int uevent,
|
|
const char *name, struct device *device, void *context,
|
|
void (*cont)(const struct firmware *fw, void *context));
|
|
|
|
void release_firmware(const struct firmware *fw);
|
|
#else
|
|
static inline int request_firmware(const struct firmware **fw,
|
|
const char *name,
|
|
struct device *device)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
static inline int request_firmware_nowait(
|
|
struct module *module, int uevent,
|
|
const char *name, struct device *device, void *context,
|
|
void (*cont)(const struct firmware *fw, void *context))
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline void release_firmware(const struct firmware *fw)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#endif
|