mirror of https://gitee.com/openkylin/linux.git
Driver core changes for 5.14-rc1
Here is the small set of driver core and debugfs updates for 5.14-rc1. Included in here are: - debugfs api cleanups (touched some drivers) - devres updates - tiny driver core updates and tweaks Nothing major in here at all, and all have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYOM7jA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yloDQCfZOlLYXF+2KgXJQqevNnRiu7/B1gAn3aCX6xh UWVUfu5LDIXi2uFERRT1 =Ze3R -----END PGP SIGNATURE----- Merge tag 'driver-core-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core Pull driver core changes from Greg KH: "Here is the small set of driver core and debugfs updates for 5.14-rc1. Included in here are: - debugfs api cleanups (touched some drivers) - devres updates - tiny driver core updates and tweaks Nothing major in here at all, and all have been in linux-next for a while with no reported issues" * tag 'driver-core-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (27 commits) docs: ABI: testing: sysfs-firmware-memmap: add some memmap types. devres: Enable trace events devres: No need to call remove_nodes() when there none present devres: Use list_for_each_safe_from() in remove_nodes() devres: Make locking straight forward in release_nodes() kernfs: move revalidate to be near lookup drivers/base: Constify static attribute_group structs firmware_loader: remove unneeded 'comma' macro devcoredump: remove contact information driver core: Drop helper devm_platform_ioremap_resource_wc() component: Rename 'dev' to 'parent' component: Drop 'dev' argument to component_match_realloc() device property: Don't check for NULL twice in the loops driver core: auxiliary bus: Fix typo in the docs drivers/base/node.c: make CACHE_ATTR define static DEVICE_ATTR_RO debugfs: remove return value of debugfs_create_ulong() debugfs: remove return value of debugfs_create_bool() scsi: snic: debugfs: remove local storage of debugfs files b43: don't save dentries for debugfs b43legacy: don't save dentries for debugfs ...
This commit is contained in:
commit
f5c13f1fde
|
@ -56,6 +56,10 @@ Description:
|
|||
- System RAM
|
||||
- ACPI Tables
|
||||
- ACPI Non-volatile Storage
|
||||
- Unusable memory
|
||||
- Persistent Memory (legacy)
|
||||
- Persistent Memory
|
||||
- Soft Reserved
|
||||
- reserved
|
||||
|
||||
Following shell snippet can be used to display that memory
|
||||
|
|
|
@ -11,7 +11,7 @@ too complex for a single device to be managed by a monolithic driver
|
|||
(e.g. Sound Open Firmware), multiple devices might implement a common
|
||||
intersection of functionality (e.g. NICs + RDMA), or a driver may want to
|
||||
export an interface for another subsystem to drive (e.g. SIOV Physical Function
|
||||
export Virtual Function management). A split of the functinoality into child-
|
||||
export Virtual Function management). A split of the functionality into child-
|
||||
devices representing sub-domains of functionality makes it possible to
|
||||
compartmentalize, layer, and distribute domain-specific concerns via a Linux
|
||||
device-driver model.
|
||||
|
|
|
@ -314,7 +314,6 @@ IOMAP
|
|||
devm_ioremap_resource() : checks resource, requests memory region, ioremaps
|
||||
devm_ioremap_resource_wc()
|
||||
devm_platform_ioremap_resource() : calls devm_ioremap_resource() for platform device
|
||||
devm_platform_ioremap_resource_wc()
|
||||
devm_platform_ioremap_resource_byname()
|
||||
devm_platform_get_and_ioremap_resource()
|
||||
devm_iounmap()
|
||||
|
|
|
@ -120,8 +120,8 @@ and hexadecimal::
|
|||
|
||||
Boolean values can be placed in debugfs with::
|
||||
|
||||
struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value);
|
||||
void debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value);
|
||||
|
||||
A read on the resulting file will yield either Y (for non-zero values) or
|
||||
N, followed by a newline. If written to, it will accept either upper- or
|
||||
|
|
|
@ -30,3 +30,6 @@ obj-y += test/
|
|||
|
||||
ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG
|
||||
|
||||
# define_trace.h needs to know how to find our header
|
||||
CFLAGS_trace.o := -I$(src)
|
||||
obj-$(CONFIG_TRACING) += trace.o
|
||||
|
|
|
@ -284,8 +284,8 @@ do_attribute_container_device_trigger_safe(struct device *dev,
|
|||
* matching classdev or fail all of them.
|
||||
*
|
||||
* @dev: The generic device to run the trigger for
|
||||
* @fn the function to execute for each classdev.
|
||||
* @undo A function to undo the work previously done in case of error
|
||||
* @fn: the function to execute for each classdev.
|
||||
* @undo: A function to undo the work previously done in case of error
|
||||
*
|
||||
* This function is a safe version of
|
||||
* attribute_container_device_trigger. It stops on the first error and
|
||||
|
@ -343,7 +343,7 @@ attribute_container_device_trigger_safe(struct device *dev,
|
|||
* attribute_container_device_trigger - execute a trigger for each matching classdev
|
||||
*
|
||||
* @dev: The generic device to run the trigger for
|
||||
* @fn the function to execute for each classdev.
|
||||
* @fn: the function to execute for each classdev.
|
||||
*
|
||||
* This function is for executing a trigger when you need to know both
|
||||
* the container and the classdev. If you only care about the
|
||||
|
|
|
@ -63,7 +63,7 @@ struct master {
|
|||
bool bound;
|
||||
|
||||
const struct component_master_ops *ops;
|
||||
struct device *dev;
|
||||
struct device *parent;
|
||||
struct component_match *match;
|
||||
};
|
||||
|
||||
|
@ -95,7 +95,7 @@ static int component_devices_show(struct seq_file *s, void *data)
|
|||
seq_printf(s, "%-40s %20s\n", "master name", "status");
|
||||
seq_puts(s, "-------------------------------------------------------------\n");
|
||||
seq_printf(s, "%-40s %20s\n\n",
|
||||
dev_name(m->dev), m->bound ? "bound" : "not bound");
|
||||
dev_name(m->parent), m->bound ? "bound" : "not bound");
|
||||
|
||||
seq_printf(s, "%-40s %20s\n", "device name", "status");
|
||||
seq_puts(s, "-------------------------------------------------------------\n");
|
||||
|
@ -124,13 +124,13 @@ core_initcall(component_debug_init);
|
|||
|
||||
static void component_master_debugfs_add(struct master *m)
|
||||
{
|
||||
debugfs_create_file(dev_name(m->dev), 0444, component_debugfs_dir, m,
|
||||
debugfs_create_file(dev_name(m->parent), 0444, component_debugfs_dir, m,
|
||||
&component_devices_fops);
|
||||
}
|
||||
|
||||
static void component_master_debugfs_del(struct master *m)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(dev_name(m->dev), component_debugfs_dir));
|
||||
debugfs_remove(debugfs_lookup(dev_name(m->parent), component_debugfs_dir));
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -143,13 +143,13 @@ static void component_master_debugfs_del(struct master *m)
|
|||
|
||||
#endif
|
||||
|
||||
static struct master *__master_find(struct device *dev,
|
||||
static struct master *__master_find(struct device *parent,
|
||||
const struct component_master_ops *ops)
|
||||
{
|
||||
struct master *m;
|
||||
|
||||
list_for_each_entry(m, &masters, node)
|
||||
if (m->dev == dev && (!ops || m->ops == ops))
|
||||
if (m->parent == parent && (!ops || m->ops == ops))
|
||||
return m;
|
||||
|
||||
return NULL;
|
||||
|
@ -189,7 +189,7 @@ static int find_components(struct master *master)
|
|||
struct component_match_array *mc = &match->compare[i];
|
||||
struct component *c;
|
||||
|
||||
dev_dbg(master->dev, "Looking for component %zu\n", i);
|
||||
dev_dbg(master->parent, "Looking for component %zu\n", i);
|
||||
|
||||
if (match->compare[i].component)
|
||||
continue;
|
||||
|
@ -200,7 +200,7 @@ static int find_components(struct master *master)
|
|||
break;
|
||||
}
|
||||
|
||||
dev_dbg(master->dev, "found component %s, duplicate %u\n", dev_name(c->dev), !!c->master);
|
||||
dev_dbg(master->parent, "found component %s, duplicate %u\n", dev_name(c->dev), !!c->master);
|
||||
|
||||
/* Attach this component to the master */
|
||||
match->compare[i].duplicate = !!c->master;
|
||||
|
@ -233,28 +233,28 @@ static int try_to_bring_up_master(struct master *master,
|
|||
{
|
||||
int ret;
|
||||
|
||||
dev_dbg(master->dev, "trying to bring up master\n");
|
||||
dev_dbg(master->parent, "trying to bring up master\n");
|
||||
|
||||
if (find_components(master)) {
|
||||
dev_dbg(master->dev, "master has incomplete components\n");
|
||||
dev_dbg(master->parent, "master has incomplete components\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (component && component->master != master) {
|
||||
dev_dbg(master->dev, "master is not for this component (%s)\n",
|
||||
dev_dbg(master->parent, "master is not for this component (%s)\n",
|
||||
dev_name(component->dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!devres_open_group(master->dev, NULL, GFP_KERNEL))
|
||||
if (!devres_open_group(master->parent, NULL, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
/* Found all components */
|
||||
ret = master->ops->bind(master->dev);
|
||||
ret = master->ops->bind(master->parent);
|
||||
if (ret < 0) {
|
||||
devres_release_group(master->dev, NULL);
|
||||
devres_release_group(master->parent, NULL);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_info(master->dev, "master bind failed: %d\n", ret);
|
||||
dev_info(master->parent, "master bind failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -281,34 +281,28 @@ static int try_to_bring_up_masters(struct component *component)
|
|||
static void take_down_master(struct master *master)
|
||||
{
|
||||
if (master->bound) {
|
||||
master->ops->unbind(master->dev);
|
||||
devres_release_group(master->dev, NULL);
|
||||
master->ops->unbind(master->parent);
|
||||
devres_release_group(master->parent, NULL);
|
||||
master->bound = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void component_match_release(struct device *master,
|
||||
struct component_match *match)
|
||||
static void devm_component_match_release(struct device *parent, void *res)
|
||||
{
|
||||
struct component_match *match = res;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < match->num; i++) {
|
||||
struct component_match_array *mc = &match->compare[i];
|
||||
|
||||
if (mc->release)
|
||||
mc->release(master, mc->data);
|
||||
mc->release(parent, mc->data);
|
||||
}
|
||||
|
||||
kfree(match->compare);
|
||||
}
|
||||
|
||||
static void devm_component_match_release(struct device *dev, void *res)
|
||||
{
|
||||
component_match_release(dev, res);
|
||||
}
|
||||
|
||||
static int component_match_realloc(struct device *dev,
|
||||
struct component_match *match, size_t num)
|
||||
static int component_match_realloc(struct component_match *match, size_t num)
|
||||
{
|
||||
struct component_match_array *new;
|
||||
|
||||
|
@ -359,7 +353,7 @@ static void __component_match_add(struct device *master,
|
|||
size_t new_size = match->alloc + 16;
|
||||
int ret;
|
||||
|
||||
ret = component_match_realloc(master, match, new_size);
|
||||
ret = component_match_realloc(match, new_size);
|
||||
if (ret) {
|
||||
*matchptr = ERR_PTR(ret);
|
||||
return;
|
||||
|
@ -451,7 +445,7 @@ static void free_master(struct master *master)
|
|||
|
||||
/**
|
||||
* component_master_add_with_match - register an aggregate driver
|
||||
* @dev: device with the aggregate driver
|
||||
* @parent: parent device of the aggregate driver
|
||||
* @ops: callbacks for the aggregate driver
|
||||
* @match: component match list for the aggregate driver
|
||||
*
|
||||
|
@ -461,7 +455,7 @@ static void free_master(struct master *master)
|
|||
* &component_master_ops.bind from @ops. Must be unregistered by calling
|
||||
* component_master_del().
|
||||
*/
|
||||
int component_master_add_with_match(struct device *dev,
|
||||
int component_master_add_with_match(struct device *parent,
|
||||
const struct component_master_ops *ops,
|
||||
struct component_match *match)
|
||||
{
|
||||
|
@ -469,7 +463,7 @@ int component_master_add_with_match(struct device *dev,
|
|||
int ret;
|
||||
|
||||
/* Reallocate the match array for its true size */
|
||||
ret = component_match_realloc(dev, match, match->num);
|
||||
ret = component_match_realloc(match, match->num);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -477,7 +471,7 @@ int component_master_add_with_match(struct device *dev,
|
|||
if (!master)
|
||||
return -ENOMEM;
|
||||
|
||||
master->dev = dev;
|
||||
master->parent = parent;
|
||||
master->ops = ops;
|
||||
master->match = match;
|
||||
|
||||
|
@ -499,20 +493,20 @@ EXPORT_SYMBOL_GPL(component_master_add_with_match);
|
|||
|
||||
/**
|
||||
* component_master_del - unregister an aggregate driver
|
||||
* @dev: device with the aggregate driver
|
||||
* @parent: parent device of the aggregate driver
|
||||
* @ops: callbacks for the aggregate driver
|
||||
*
|
||||
* Unregisters an aggregate driver registered with
|
||||
* component_master_add_with_match(). If necessary the aggregate driver is first
|
||||
* disassembled by calling &component_master_ops.unbind from @ops.
|
||||
*/
|
||||
void component_master_del(struct device *dev,
|
||||
void component_master_del(struct device *parent,
|
||||
const struct component_master_ops *ops)
|
||||
{
|
||||
struct master *master;
|
||||
|
||||
mutex_lock(&component_mutex);
|
||||
master = __master_find(dev, ops);
|
||||
master = __master_find(parent, ops);
|
||||
if (master) {
|
||||
take_down_master(master);
|
||||
free_master(master);
|
||||
|
@ -527,7 +521,7 @@ static void component_unbind(struct component *component,
|
|||
WARN_ON(!component->bound);
|
||||
|
||||
if (component->ops && component->ops->unbind)
|
||||
component->ops->unbind(component->dev, master->dev, data);
|
||||
component->ops->unbind(component->dev, master->parent, data);
|
||||
component->bound = false;
|
||||
|
||||
/* Release all resources claimed in the binding of this component */
|
||||
|
@ -536,14 +530,14 @@ static void component_unbind(struct component *component,
|
|||
|
||||
/**
|
||||
* component_unbind_all - unbind all components of an aggregate driver
|
||||
* @master_dev: device with the aggregate driver
|
||||
* @parent: parent device of the aggregate driver
|
||||
* @data: opaque pointer, passed to all components
|
||||
*
|
||||
* Unbinds all components of the aggregate @dev by passing @data to their
|
||||
* Unbinds all components of the aggregate device by passing @data to their
|
||||
* &component_ops.unbind functions. Should be called from
|
||||
* &component_master_ops.unbind.
|
||||
*/
|
||||
void component_unbind_all(struct device *master_dev, void *data)
|
||||
void component_unbind_all(struct device *parent, void *data)
|
||||
{
|
||||
struct master *master;
|
||||
struct component *c;
|
||||
|
@ -551,7 +545,7 @@ void component_unbind_all(struct device *master_dev, void *data)
|
|||
|
||||
WARN_ON(!mutex_is_locked(&component_mutex));
|
||||
|
||||
master = __master_find(master_dev, NULL);
|
||||
master = __master_find(parent, NULL);
|
||||
if (!master)
|
||||
return;
|
||||
|
||||
|
@ -574,7 +568,7 @@ static int component_bind(struct component *component, struct master *master,
|
|||
* This allows us to roll-back a failed component without
|
||||
* affecting anything else.
|
||||
*/
|
||||
if (!devres_open_group(master->dev, NULL, GFP_KERNEL))
|
||||
if (!devres_open_group(master->parent, NULL, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
|
@ -583,14 +577,14 @@ static int component_bind(struct component *component, struct master *master,
|
|||
* at the appropriate moment.
|
||||
*/
|
||||
if (!devres_open_group(component->dev, component, GFP_KERNEL)) {
|
||||
devres_release_group(master->dev, NULL);
|
||||
devres_release_group(master->parent, NULL);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev_dbg(master->dev, "binding %s (ops %ps)\n",
|
||||
dev_dbg(master->parent, "binding %s (ops %ps)\n",
|
||||
dev_name(component->dev), component->ops);
|
||||
|
||||
ret = component->ops->bind(component->dev, master->dev, data);
|
||||
ret = component->ops->bind(component->dev, master->parent, data);
|
||||
if (!ret) {
|
||||
component->bound = true;
|
||||
|
||||
|
@ -601,16 +595,16 @@ static int component_bind(struct component *component, struct master *master,
|
|||
* can clean those resources up independently.
|
||||
*/
|
||||
devres_close_group(component->dev, NULL);
|
||||
devres_remove_group(master->dev, NULL);
|
||||
devres_remove_group(master->parent, NULL);
|
||||
|
||||
dev_info(master->dev, "bound %s (ops %ps)\n",
|
||||
dev_info(master->parent, "bound %s (ops %ps)\n",
|
||||
dev_name(component->dev), component->ops);
|
||||
} else {
|
||||
devres_release_group(component->dev, NULL);
|
||||
devres_release_group(master->dev, NULL);
|
||||
devres_release_group(master->parent, NULL);
|
||||
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(master->dev, "failed to bind %s (ops %ps): %d\n",
|
||||
dev_err(master->parent, "failed to bind %s (ops %ps): %d\n",
|
||||
dev_name(component->dev), component->ops, ret);
|
||||
}
|
||||
|
||||
|
@ -619,14 +613,14 @@ static int component_bind(struct component *component, struct master *master,
|
|||
|
||||
/**
|
||||
* component_bind_all - bind all components of an aggregate driver
|
||||
* @master_dev: device with the aggregate driver
|
||||
* @parent: parent device of the aggregate driver
|
||||
* @data: opaque pointer, passed to all components
|
||||
*
|
||||
* Binds all components of the aggregate @dev by passing @data to their
|
||||
* &component_ops.bind functions. Should be called from
|
||||
* &component_master_ops.bind.
|
||||
*/
|
||||
int component_bind_all(struct device *master_dev, void *data)
|
||||
int component_bind_all(struct device *parent, void *data)
|
||||
{
|
||||
struct master *master;
|
||||
struct component *c;
|
||||
|
@ -635,7 +629,7 @@ int component_bind_all(struct device *master_dev, void *data)
|
|||
|
||||
WARN_ON(!mutex_is_locked(&component_mutex));
|
||||
|
||||
master = __master_find(master_dev, NULL);
|
||||
master = __master_find(parent, NULL);
|
||||
if (!master)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -3442,7 +3442,7 @@ bool kill_device(struct device *dev)
|
|||
* to run while we are tearing out the bus/class/sysfs from
|
||||
* underneath the device.
|
||||
*/
|
||||
lockdep_assert_held(&dev->mutex);
|
||||
device_lock_assert(dev);
|
||||
|
||||
if (dev->p->dead)
|
||||
return false;
|
||||
|
|
|
@ -175,7 +175,7 @@ static struct attribute *crash_note_cpu_attrs[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group crash_note_cpu_attr_group = {
|
||||
static const struct attribute_group crash_note_cpu_attr_group = {
|
||||
.attrs = crash_note_cpu_attrs,
|
||||
};
|
||||
#endif
|
||||
|
@ -475,7 +475,7 @@ static struct attribute *cpu_root_attrs[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group cpu_root_attr_group = {
|
||||
static const struct attribute_group cpu_root_attr_group = {
|
||||
.attrs = cpu_root_attrs,
|
||||
};
|
||||
|
||||
|
|
|
@ -3,10 +3,6 @@
|
|||
* Copyright(c) 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2015 Intel Deutschland GmbH
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
* Author: Johannes Berg <johannes@sipsolutions.net>
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
|
|
|
@ -14,14 +14,13 @@
|
|||
#include <asm/sections.h>
|
||||
|
||||
#include "base.h"
|
||||
#include "trace.h"
|
||||
|
||||
struct devres_node {
|
||||
struct list_head entry;
|
||||
dr_release_t release;
|
||||
#ifdef CONFIG_DEBUG_DEVRES
|
||||
const char *name;
|
||||
size_t size;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct devres {
|
||||
|
@ -43,10 +42,6 @@ struct devres_group {
|
|||
/* -- 8 pointers */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DEBUG_DEVRES
|
||||
static int log_devres = 0;
|
||||
module_param_named(log, log_devres, int, S_IRUGO | S_IWUSR);
|
||||
|
||||
static void set_node_dbginfo(struct devres_node *node, const char *name,
|
||||
size_t size)
|
||||
{
|
||||
|
@ -54,7 +49,11 @@ static void set_node_dbginfo(struct devres_node *node, const char *name,
|
|||
node->size = size;
|
||||
}
|
||||
|
||||
static void devres_log(struct device *dev, struct devres_node *node,
|
||||
#ifdef CONFIG_DEBUG_DEVRES
|
||||
static int log_devres = 0;
|
||||
module_param_named(log, log_devres, int, S_IRUGO | S_IWUSR);
|
||||
|
||||
static void devres_dbg(struct device *dev, struct devres_node *node,
|
||||
const char *op)
|
||||
{
|
||||
if (unlikely(log_devres))
|
||||
|
@ -62,10 +61,16 @@ static void devres_log(struct device *dev, struct devres_node *node,
|
|||
op, node, node->name, node->size);
|
||||
}
|
||||
#else /* CONFIG_DEBUG_DEVRES */
|
||||
#define set_node_dbginfo(node, n, s) do {} while (0)
|
||||
#define devres_log(dev, node, op) do {} while (0)
|
||||
#define devres_dbg(dev, node, op) do {} while (0)
|
||||
#endif /* CONFIG_DEBUG_DEVRES */
|
||||
|
||||
static void devres_log(struct device *dev, struct devres_node *node,
|
||||
const char *op)
|
||||
{
|
||||
trace_devres_log(dev, op, node, node->name, node->size);
|
||||
devres_dbg(dev, node, op);
|
||||
}
|
||||
|
||||
/*
|
||||
* Release functions for devres group. These callbacks are used only
|
||||
* for identification.
|
||||
|
@ -134,9 +139,23 @@ static void replace_dr(struct device *dev,
|
|||
list_replace(&old->entry, &new->entry);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_DEVRES
|
||||
void * __devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid,
|
||||
const char *name)
|
||||
/**
|
||||
* __devres_alloc_node - Allocate device resource data
|
||||
* @release: Release function devres will be associated with
|
||||
* @size: Allocation size
|
||||
* @gfp: Allocation flags
|
||||
* @nid: NUMA node
|
||||
* @name: Name of the resource
|
||||
*
|
||||
* Allocate devres of @size bytes. The allocated area is zeroed, then
|
||||
* associated with @release. The returned pointer can be passed to
|
||||
* other devres_*() functions.
|
||||
*
|
||||
* RETURNS:
|
||||
* Pointer to allocated devres on success, NULL on failure.
|
||||
*/
|
||||
void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid,
|
||||
const char *name)
|
||||
{
|
||||
struct devres *dr;
|
||||
|
||||
|
@ -147,32 +166,6 @@ void * __devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid
|
|||
return dr->data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devres_alloc_node);
|
||||
#else
|
||||
/**
|
||||
* devres_alloc_node - Allocate device resource data
|
||||
* @release: Release function devres will be associated with
|
||||
* @size: Allocation size
|
||||
* @gfp: Allocation flags
|
||||
* @nid: NUMA node
|
||||
*
|
||||
* Allocate devres of @size bytes. The allocated area is zeroed, then
|
||||
* associated with @release. The returned pointer can be passed to
|
||||
* other devres_*() functions.
|
||||
*
|
||||
* RETURNS:
|
||||
* Pointer to allocated devres on success, NULL on failure.
|
||||
*/
|
||||
void * devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid)
|
||||
{
|
||||
struct devres *dr;
|
||||
|
||||
dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid);
|
||||
if (unlikely(!dr))
|
||||
return NULL;
|
||||
return dr->data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devres_alloc_node);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* devres_for_each_res - Resource iterator
|
||||
|
@ -438,20 +431,16 @@ static int remove_nodes(struct device *dev,
|
|||
struct list_head *first, struct list_head *end,
|
||||
struct list_head *todo)
|
||||
{
|
||||
struct devres_node *node, *n;
|
||||
int cnt = 0, nr_groups = 0;
|
||||
struct list_head *cur;
|
||||
|
||||
/* First pass - move normal devres entries to @todo and clear
|
||||
* devres_group colors.
|
||||
*/
|
||||
cur = first;
|
||||
while (cur != end) {
|
||||
struct devres_node *node;
|
||||
node = list_entry(first, struct devres_node, entry);
|
||||
list_for_each_entry_safe_from(node, n, end, entry) {
|
||||
struct devres_group *grp;
|
||||
|
||||
node = list_entry(cur, struct devres_node, entry);
|
||||
cur = cur->next;
|
||||
|
||||
grp = node_to_group(node);
|
||||
if (grp) {
|
||||
/* clear color of group markers in the first pass */
|
||||
|
@ -471,18 +460,14 @@ static int remove_nodes(struct device *dev,
|
|||
|
||||
/* Second pass - Scan groups and color them. A group gets
|
||||
* color value of two iff the group is wholly contained in
|
||||
* [cur, end). That is, for a closed group, both opening and
|
||||
* closing markers should be in the range, while just the
|
||||
* [current node, end). That is, for a closed group, both opening
|
||||
* and closing markers should be in the range, while just the
|
||||
* opening marker is enough for an open group.
|
||||
*/
|
||||
cur = first;
|
||||
while (cur != end) {
|
||||
struct devres_node *node;
|
||||
node = list_entry(first, struct devres_node, entry);
|
||||
list_for_each_entry_safe_from(node, n, end, entry) {
|
||||
struct devres_group *grp;
|
||||
|
||||
node = list_entry(cur, struct devres_node, entry);
|
||||
cur = cur->next;
|
||||
|
||||
grp = node_to_group(node);
|
||||
BUG_ON(!grp || list_empty(&grp->node[0].entry));
|
||||
|
||||
|
@ -492,7 +477,7 @@ static int remove_nodes(struct device *dev,
|
|||
|
||||
BUG_ON(grp->color <= 0 || grp->color > 2);
|
||||
if (grp->color == 2) {
|
||||
/* No need to update cur or end. The removed
|
||||
/* No need to update current node or end. The removed
|
||||
* nodes are always before both.
|
||||
*/
|
||||
list_move_tail(&grp->node[0].entry, todo);
|
||||
|
@ -503,28 +488,18 @@ static int remove_nodes(struct device *dev,
|
|||
return cnt;
|
||||
}
|
||||
|
||||
static int release_nodes(struct device *dev, struct list_head *first,
|
||||
struct list_head *end, unsigned long flags)
|
||||
__releases(&dev->devres_lock)
|
||||
static void release_nodes(struct device *dev, struct list_head *todo)
|
||||
{
|
||||
LIST_HEAD(todo);
|
||||
int cnt;
|
||||
struct devres *dr, *tmp;
|
||||
|
||||
cnt = remove_nodes(dev, first, end, &todo);
|
||||
|
||||
spin_unlock_irqrestore(&dev->devres_lock, flags);
|
||||
|
||||
/* Release. Note that both devres and devres_group are
|
||||
* handled as devres in the following loop. This is safe.
|
||||
*/
|
||||
list_for_each_entry_safe_reverse(dr, tmp, &todo, node.entry) {
|
||||
list_for_each_entry_safe_reverse(dr, tmp, todo, node.entry) {
|
||||
devres_log(dev, &dr->node, "REL");
|
||||
dr->node.release(dev, dr->data);
|
||||
kfree(dr);
|
||||
}
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -537,13 +512,23 @@ static int release_nodes(struct device *dev, struct list_head *first,
|
|||
int devres_release_all(struct device *dev)
|
||||
{
|
||||
unsigned long flags;
|
||||
LIST_HEAD(todo);
|
||||
int cnt;
|
||||
|
||||
/* Looks like an uninitialized device structure */
|
||||
if (WARN_ON(dev->devres_head.next == NULL))
|
||||
return -ENODEV;
|
||||
|
||||
/* Nothing to release if list is empty */
|
||||
if (list_empty(&dev->devres_head))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&dev->devres_lock, flags);
|
||||
return release_nodes(dev, dev->devres_head.next, &dev->devres_head,
|
||||
flags);
|
||||
cnt = remove_nodes(dev, dev->devres_head.next, &dev->devres_head, &todo);
|
||||
spin_unlock_irqrestore(&dev->devres_lock, flags);
|
||||
|
||||
release_nodes(dev, &todo);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -679,6 +664,7 @@ int devres_release_group(struct device *dev, void *id)
|
|||
{
|
||||
struct devres_group *grp;
|
||||
unsigned long flags;
|
||||
LIST_HEAD(todo);
|
||||
int cnt = 0;
|
||||
|
||||
spin_lock_irqsave(&dev->devres_lock, flags);
|
||||
|
@ -691,7 +677,10 @@ int devres_release_group(struct device *dev, void *id)
|
|||
if (!list_empty(&grp->node[1].entry))
|
||||
end = grp->node[1].entry.next;
|
||||
|
||||
cnt = release_nodes(dev, first, end, flags);
|
||||
cnt = remove_nodes(dev, first, end, &todo);
|
||||
spin_unlock_irqrestore(&dev->devres_lock, flags);
|
||||
|
||||
release_nodes(dev, &todo);
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
spin_unlock_irqrestore(&dev->devres_lock, flags);
|
||||
|
|
|
@ -8,7 +8,6 @@ fwdir := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir))
|
|||
obj-y := $(addsuffix .gen.o, $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE)))
|
||||
|
||||
FWNAME = $(patsubst $(obj)/%.gen.S,%,$@)
|
||||
comma := ,
|
||||
FWSTR = $(subst $(comma),_,$(subst /,_,$(subst .,_,$(subst -,_,$(FWNAME)))))
|
||||
ASM_WORD = $(if $(CONFIG_64BIT),.quad,.long)
|
||||
ASM_ALIGN = $(if $(CONFIG_64BIT),3,2)
|
||||
|
|
|
@ -596,7 +596,7 @@ static struct attribute *memory_memblk_attrs[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group memory_memblk_attr_group = {
|
||||
static const struct attribute_group memory_memblk_attr_group = {
|
||||
.attrs = memory_memblk_attrs,
|
||||
};
|
||||
|
||||
|
@ -772,7 +772,7 @@ static struct attribute *memory_root_attrs[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group memory_root_attr_group = {
|
||||
static const struct attribute_group memory_root_attr_group = {
|
||||
.attrs = memory_root_attrs,
|
||||
};
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ static ssize_t name##_show(struct device *dev, \
|
|||
return sysfs_emit(buf, fmt "\n", \
|
||||
to_cache_info(dev)->cache_attrs.name); \
|
||||
} \
|
||||
DEVICE_ATTR_RO(name);
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
CACHE_ATTR(size, "%llu")
|
||||
CACHE_ATTR(line_size, "%u")
|
||||
|
@ -1038,7 +1038,7 @@ static struct attribute *node_state_attrs[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group memory_root_attr_group = {
|
||||
static const struct attribute_group memory_root_attr_group = {
|
||||
.attrs = node_state_attrs,
|
||||
};
|
||||
|
||||
|
|
|
@ -124,26 +124,6 @@ void __iomem *devm_platform_ioremap_resource(struct platform_device *pdev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devm_platform_ioremap_resource);
|
||||
|
||||
/**
|
||||
* devm_platform_ioremap_resource_wc - write-combined variant of
|
||||
* devm_platform_ioremap_resource()
|
||||
*
|
||||
* @pdev: platform device to use both for memory resource lookup as well as
|
||||
* resource management
|
||||
* @index: resource index
|
||||
*
|
||||
* Return: a pointer to the remapped memory or an ERR_PTR() encoded error code
|
||||
* on failure.
|
||||
*/
|
||||
void __iomem *devm_platform_ioremap_resource_wc(struct platform_device *pdev,
|
||||
unsigned int index)
|
||||
{
|
||||
struct resource *res;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, index);
|
||||
return devm_ioremap_resource_wc(&pdev->dev, res);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_platform_ioremap_resource_byname - call devm_ioremap_resource for
|
||||
* a platform device, retrieve the
|
||||
|
@ -1355,7 +1335,7 @@ static umode_t platform_dev_attrs_visible(struct kobject *kobj, struct attribute
|
|||
return a->mode;
|
||||
}
|
||||
|
||||
static struct attribute_group platform_dev_group = {
|
||||
static const struct attribute_group platform_dev_group = {
|
||||
.attrs = platform_dev_attrs,
|
||||
.is_visible = platform_dev_attrs_visible,
|
||||
};
|
||||
|
|
|
@ -627,14 +627,15 @@ EXPORT_SYMBOL_GPL(fwnode_get_next_parent);
|
|||
*/
|
||||
struct device *fwnode_get_next_parent_dev(struct fwnode_handle *fwnode)
|
||||
{
|
||||
struct device *dev = NULL;
|
||||
struct device *dev;
|
||||
|
||||
fwnode_handle_get(fwnode);
|
||||
do {
|
||||
fwnode = fwnode_get_next_parent(fwnode);
|
||||
if (fwnode)
|
||||
dev = get_dev_from_fwnode(fwnode);
|
||||
} while (fwnode && !dev);
|
||||
if (!fwnode)
|
||||
return NULL;
|
||||
dev = get_dev_from_fwnode(fwnode);
|
||||
} while (!dev);
|
||||
fwnode_handle_put(fwnode);
|
||||
return dev;
|
||||
}
|
||||
|
@ -742,10 +743,9 @@ fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode,
|
|||
|
||||
do {
|
||||
next_child = fwnode_get_next_child_node(fwnode, next_child);
|
||||
|
||||
if (!next_child || fwnode_device_is_available(next_child))
|
||||
break;
|
||||
} while (next_child);
|
||||
if (!next_child)
|
||||
return NULL;
|
||||
} while (!fwnode_device_is_available(next_child));
|
||||
|
||||
return next_child;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Device core Trace Support
|
||||
* Copyright (C) 2021, Intel Corporation
|
||||
*
|
||||
* Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
*/
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "trace.h"
|
|
@ -0,0 +1,56 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Device core Trace Support
|
||||
* Copyright (C) 2021, Intel Corporation
|
||||
*
|
||||
* Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
*/
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM dev
|
||||
|
||||
#if !defined(__DEV_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __DEV_TRACE_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
DECLARE_EVENT_CLASS(devres,
|
||||
TP_PROTO(struct device *dev, const char *op, void *node, const char *name, size_t size),
|
||||
TP_ARGS(dev, op, node, name, size),
|
||||
TP_STRUCT__entry(
|
||||
__string(devname, dev_name(dev))
|
||||
__field(struct device *, dev)
|
||||
__field(const char *, op)
|
||||
__field(void *, node)
|
||||
__field(const char *, name)
|
||||
__field(size_t, size)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(devname, dev_name(dev));
|
||||
__entry->op = op;
|
||||
__entry->node = node;
|
||||
__entry->name = name;
|
||||
__entry->size = size;
|
||||
),
|
||||
TP_printk("%s %3s %p %s (%zu bytes)", __get_str(devname),
|
||||
__entry->op, __entry->node, __entry->name, __entry->size)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(devres, devres_log,
|
||||
TP_PROTO(struct device *dev, const char *op, void *node, const char *name, size_t size),
|
||||
TP_ARGS(dev, op, node, name, size)
|
||||
);
|
||||
|
||||
#endif /* __DEV_TRACE_H */
|
||||
|
||||
/* this part has to be here */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE trace
|
||||
|
||||
#include <trace/define_trace.h>
|
|
@ -1883,7 +1883,7 @@ static int sdma_get_firmware(struct sdma_engine *sdma,
|
|||
int ret;
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE,
|
||||
FW_ACTION_HOTPLUG, fw_name, sdma->dev,
|
||||
FW_ACTION_UEVENT, fw_name, sdma->dev,
|
||||
GFP_KERNEL, sdma, sdma_load_firmware);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -88,6 +88,7 @@ struct kvmgt_pgfn {
|
|||
struct hlist_node hnode;
|
||||
};
|
||||
|
||||
#define KVMGT_DEBUGFS_FILENAME "kvmgt_nr_cache_entries"
|
||||
struct kvmgt_guest_info {
|
||||
struct kvm *kvm;
|
||||
struct intel_vgpu *vgpu;
|
||||
|
@ -95,7 +96,6 @@ struct kvmgt_guest_info {
|
|||
#define NR_BKT (1 << 18)
|
||||
struct hlist_head ptable[NR_BKT];
|
||||
#undef NR_BKT
|
||||
struct dentry *debugfs_cache_entries;
|
||||
};
|
||||
|
||||
struct gvt_dma {
|
||||
|
@ -1947,16 +1947,15 @@ static int kvmgt_guest_init(struct mdev_device *mdev)
|
|||
info->track_node.track_flush_slot = kvmgt_page_track_flush_slot;
|
||||
kvm_page_track_register_notifier(kvm, &info->track_node);
|
||||
|
||||
info->debugfs_cache_entries = debugfs_create_ulong(
|
||||
"kvmgt_nr_cache_entries",
|
||||
0444, vgpu->debugfs,
|
||||
&vdev->nr_cache_entries);
|
||||
debugfs_create_ulong(KVMGT_DEBUGFS_FILENAME, 0444, vgpu->debugfs,
|
||||
&vdev->nr_cache_entries);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool kvmgt_guest_exit(struct kvmgt_guest_info *info)
|
||||
{
|
||||
debugfs_remove(info->debugfs_cache_entries);
|
||||
debugfs_remove(debugfs_lookup(KVMGT_DEBUGFS_FILENAME,
|
||||
info->vgpu->debugfs));
|
||||
|
||||
kvm_page_track_unregister_notifier(info->kvm, &info->track_node);
|
||||
kvm_put_kvm(info->kvm);
|
||||
|
|
|
@ -436,7 +436,7 @@ static void fimc_is_load_firmware(const struct firmware *fw, void *context)
|
|||
static int fimc_is_request_firmware(struct fimc_is *is, const char *fw_name)
|
||||
{
|
||||
return request_firmware_nowait(THIS_MODULE,
|
||||
FW_ACTION_HOTPLUG, fw_name, &is->pdev->dev,
|
||||
FW_ACTION_UEVENT, fw_name, &is->pdev->dev,
|
||||
GFP_KERNEL, is, fimc_is_load_firmware);
|
||||
}
|
||||
|
||||
|
|
|
@ -998,7 +998,7 @@ static int iqs62x_probe(struct i2c_client *client)
|
|||
|
||||
device_property_read_string(&client->dev, "firmware-name", &fw_name);
|
||||
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
fw_name ? : iqs62x->dev_desc->fw_name,
|
||||
&client->dev, GFP_KERNEL, iqs62x,
|
||||
iqs62x_firmware_load);
|
||||
|
|
|
@ -198,7 +198,7 @@ static int lattice_ecp3_probe(struct spi_device *spi)
|
|||
spi_set_drvdata(spi, data);
|
||||
|
||||
init_completion(&data->fw_loaded);
|
||||
err = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
err = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
FIRMWARE_NAME, &spi->dev,
|
||||
GFP_KERNEL, spi, firmware_load);
|
||||
if (err) {
|
||||
|
|
|
@ -341,6 +341,7 @@ static int sram_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct sram_dev *sram;
|
||||
int ret;
|
||||
struct resource *res;
|
||||
int (*init_func)(void);
|
||||
|
||||
sram = devm_kzalloc(&pdev->dev, sizeof(*sram), GFP_KERNEL);
|
||||
|
@ -349,10 +350,11 @@ static int sram_probe(struct platform_device *pdev)
|
|||
|
||||
sram->dev = &pdev->dev;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (of_property_read_bool(pdev->dev.of_node, "no-memory-wc"))
|
||||
sram->virt_base = devm_platform_ioremap_resource(pdev, 0);
|
||||
sram->virt_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
else
|
||||
sram->virt_base = devm_platform_ioremap_resource_wc(pdev, 0);
|
||||
sram->virt_base = devm_ioremap_resource_wc(&pdev->dev, res);
|
||||
if (IS_ERR(sram->virt_base)) {
|
||||
dev_err(&pdev->dev, "could not map SRAM registers\n");
|
||||
return PTR_ERR(sram->virt_base);
|
||||
|
|
|
@ -643,24 +643,14 @@ bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature)
|
|||
return enabled;
|
||||
}
|
||||
|
||||
static void b43_remove_dynamic_debug(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_dfsentry *e = dev->dfsentry;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < __B43_NR_DYNDBG; i++)
|
||||
debugfs_remove(e->dyn_debug_dentries[i]);
|
||||
}
|
||||
|
||||
static void b43_add_dynamic_debug(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_dfsentry *e = dev->dfsentry;
|
||||
|
||||
#define add_dyn_dbg(name, id, initstate) do { \
|
||||
e->dyn_debug[id] = (initstate); \
|
||||
e->dyn_debug_dentries[id] = \
|
||||
debugfs_create_bool(name, 0600, e->subdir, \
|
||||
&(e->dyn_debug[id])); \
|
||||
debugfs_create_bool(name, 0600, e->subdir, \
|
||||
&(e->dyn_debug[id])); \
|
||||
} while (0)
|
||||
|
||||
add_dyn_dbg("debug_xmitpower", B43_DBG_XMITPOWER, false);
|
||||
|
@ -713,10 +703,9 @@ void b43_debugfs_add_device(struct b43_wldev *dev)
|
|||
|
||||
#define ADD_FILE(name, mode) \
|
||||
do { \
|
||||
e->file_##name.dentry = \
|
||||
debugfs_create_file(__stringify(name), \
|
||||
mode, e->subdir, dev, \
|
||||
&fops_##name.fops); \
|
||||
debugfs_create_file(__stringify(name), \
|
||||
mode, e->subdir, dev, \
|
||||
&fops_##name.fops); \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
@ -746,19 +735,6 @@ void b43_debugfs_remove_device(struct b43_wldev *dev)
|
|||
e = dev->dfsentry;
|
||||
if (!e)
|
||||
return;
|
||||
b43_remove_dynamic_debug(dev);
|
||||
|
||||
debugfs_remove(e->file_shm16read.dentry);
|
||||
debugfs_remove(e->file_shm16write.dentry);
|
||||
debugfs_remove(e->file_shm32read.dentry);
|
||||
debugfs_remove(e->file_shm32write.dentry);
|
||||
debugfs_remove(e->file_mmio16read.dentry);
|
||||
debugfs_remove(e->file_mmio16write.dentry);
|
||||
debugfs_remove(e->file_mmio32read.dentry);
|
||||
debugfs_remove(e->file_mmio32write.dentry);
|
||||
debugfs_remove(e->file_txstat.dentry);
|
||||
debugfs_remove(e->file_restart.dentry);
|
||||
debugfs_remove(e->file_loctls.dentry);
|
||||
|
||||
debugfs_remove(e->subdir);
|
||||
kfree(e->txstatlog.log);
|
||||
|
|
|
@ -32,7 +32,6 @@ struct b43_txstatus_log {
|
|||
};
|
||||
|
||||
struct b43_dfs_file {
|
||||
struct dentry *dentry;
|
||||
char *buffer;
|
||||
size_t data_len;
|
||||
};
|
||||
|
@ -70,8 +69,6 @@ struct b43_dfsentry {
|
|||
|
||||
/* Enabled/Disabled list for the dynamic debugging features. */
|
||||
bool dyn_debug[__B43_NR_DYNDBG];
|
||||
/* Dentries for the dynamic debugging entries. */
|
||||
struct dentry *dyn_debug_dentries[__B43_NR_DYNDBG];
|
||||
};
|
||||
|
||||
bool b43_debug(struct b43_wldev *dev, enum b43_dyndbg feature);
|
||||
|
|
|
@ -336,24 +336,14 @@ int b43legacy_debug(struct b43legacy_wldev *dev, enum b43legacy_dyndbg feature)
|
|||
return !!(dev->dfsentry && dev->dfsentry->dyn_debug[feature]);
|
||||
}
|
||||
|
||||
static void b43legacy_remove_dynamic_debug(struct b43legacy_wldev *dev)
|
||||
{
|
||||
struct b43legacy_dfsentry *e = dev->dfsentry;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < __B43legacy_NR_DYNDBG; i++)
|
||||
debugfs_remove(e->dyn_debug_dentries[i]);
|
||||
}
|
||||
|
||||
static void b43legacy_add_dynamic_debug(struct b43legacy_wldev *dev)
|
||||
{
|
||||
struct b43legacy_dfsentry *e = dev->dfsentry;
|
||||
|
||||
#define add_dyn_dbg(name, id, initstate) do { \
|
||||
e->dyn_debug[id] = (initstate); \
|
||||
e->dyn_debug_dentries[id] = \
|
||||
debugfs_create_bool(name, 0600, e->subdir, \
|
||||
&(e->dyn_debug[id])); \
|
||||
debugfs_create_bool(name, 0600, e->subdir, \
|
||||
&(e->dyn_debug[id])); \
|
||||
} while (0)
|
||||
|
||||
add_dyn_dbg("debug_xmitpower", B43legacy_DBG_XMITPOWER, false);
|
||||
|
@ -396,11 +386,9 @@ void b43legacy_debugfs_add_device(struct b43legacy_wldev *dev)
|
|||
|
||||
#define ADD_FILE(name, mode) \
|
||||
do { \
|
||||
e->file_##name.dentry = \
|
||||
debugfs_create_file(__stringify(name), \
|
||||
mode, e->subdir, dev, \
|
||||
&fops_##name.fops); \
|
||||
e->file_##name.dentry = NULL; \
|
||||
debugfs_create_file(__stringify(name), mode, \
|
||||
e->subdir, dev, \
|
||||
&fops_##name.fops); \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
@ -424,13 +412,6 @@ void b43legacy_debugfs_remove_device(struct b43legacy_wldev *dev)
|
|||
e = dev->dfsentry;
|
||||
if (!e)
|
||||
return;
|
||||
b43legacy_remove_dynamic_debug(dev);
|
||||
|
||||
debugfs_remove(e->file_tsf.dentry);
|
||||
debugfs_remove(e->file_ucode_regs.dentry);
|
||||
debugfs_remove(e->file_shm.dentry);
|
||||
debugfs_remove(e->file_txstat.dentry);
|
||||
debugfs_remove(e->file_restart.dentry);
|
||||
|
||||
debugfs_remove(e->subdir);
|
||||
kfree(e->txstatlog.log);
|
||||
|
|
|
@ -28,7 +28,6 @@ struct b43legacy_txstatus_log {
|
|||
};
|
||||
|
||||
struct b43legacy_dfs_file {
|
||||
struct dentry *dentry;
|
||||
char *buffer;
|
||||
size_t data_len;
|
||||
};
|
||||
|
@ -49,8 +48,6 @@ struct b43legacy_dfsentry {
|
|||
|
||||
/* Enabled/Disabled list for the dynamic debugging features. */
|
||||
bool dyn_debug[__B43legacy_NR_DYNDBG];
|
||||
/* Dentries for the dynamic debugging entries. */
|
||||
struct dentry *dyn_debug_dentries[__B43legacy_NR_DYNDBG];
|
||||
};
|
||||
|
||||
int b43legacy_debug(struct b43legacy_wldev *dev,
|
||||
|
|
|
@ -6784,7 +6784,7 @@ int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
|
|||
|
||||
if (pdev_data->family && pdev_data->family->nvs_name) {
|
||||
nvs_name = pdev_data->family->nvs_name;
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
nvs_name, &pdev->dev, GFP_KERNEL,
|
||||
wl, wlcore_nvs_cb);
|
||||
if (ret < 0) {
|
||||
|
|
|
@ -573,7 +573,7 @@ static ssize_t image_type_write(struct file *filp, struct kobject *kobj,
|
|||
if (!rbu_data.entry_created) {
|
||||
spin_unlock(&rbu_data.lock);
|
||||
req_firm_rc = request_firmware_nowait(THIS_MODULE,
|
||||
FW_ACTION_NOHOTPLUG, "dell_rbu",
|
||||
FW_ACTION_NOUEVENT, "dell_rbu",
|
||||
&rbu_device->dev, GFP_KERNEL, &context,
|
||||
callbackfn_rbu);
|
||||
if (req_firm_rc) {
|
||||
|
|
|
@ -1789,7 +1789,7 @@ static int rproc_trigger_auto_boot(struct rproc *rproc)
|
|||
* We're initiating an asynchronous firmware loading, so we can
|
||||
* be built-in kernel code, without hanging the boot process.
|
||||
*/
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
rproc->firmware, &rproc->dev, GFP_KERNEL,
|
||||
rproc, rproc_auto_boot_callback);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -13146,7 +13146,7 @@ lpfc_sli4_request_firmware_update(struct lpfc_hba *phba, uint8_t fw_upgrade)
|
|||
snprintf(file_name, ELX_MODEL_NAME_SIZE, "%s.grp", phba->ModelName);
|
||||
|
||||
if (fw_upgrade == INT_FW_UPGRADE) {
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
file_name, &phba->pcidev->dev,
|
||||
GFP_KERNEL, (void *)phba,
|
||||
lpfc_write_firmware);
|
||||
|
|
|
@ -430,21 +430,19 @@ static const struct seq_operations snic_trc_sops = {
|
|||
|
||||
DEFINE_SEQ_ATTRIBUTE(snic_trc);
|
||||
|
||||
#define TRC_ENABLE_FILE "tracing_enable"
|
||||
#define TRC_FILE "trace"
|
||||
/*
|
||||
* snic_trc_debugfs_init : creates trace/tracing_enable files for trace
|
||||
* under debugfs
|
||||
*/
|
||||
void snic_trc_debugfs_init(void)
|
||||
{
|
||||
snic_glob->trc.trc_enable = debugfs_create_bool("tracing_enable",
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
snic_glob->trc_root,
|
||||
&snic_glob->trc.enable);
|
||||
debugfs_create_bool(TRC_ENABLE_FILE, S_IFREG | S_IRUGO | S_IWUSR,
|
||||
snic_glob->trc_root, &snic_glob->trc.enable);
|
||||
|
||||
snic_glob->trc.trc_file = debugfs_create_file("trace",
|
||||
S_IFREG | S_IRUGO | S_IWUSR,
|
||||
snic_glob->trc_root, NULL,
|
||||
&snic_trc_fops);
|
||||
debugfs_create_file(TRC_FILE, S_IFREG | S_IRUGO | S_IWUSR,
|
||||
snic_glob->trc_root, NULL, &snic_trc_fops);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -453,9 +451,6 @@ void snic_trc_debugfs_init(void)
|
|||
void
|
||||
snic_trc_debugfs_term(void)
|
||||
{
|
||||
debugfs_remove(snic_glob->trc.trc_file);
|
||||
snic_glob->trc.trc_file = NULL;
|
||||
|
||||
debugfs_remove(snic_glob->trc.trc_enable);
|
||||
snic_glob->trc.trc_enable = NULL;
|
||||
debugfs_remove(debugfs_lookup(TRC_FILE, snic_glob->trc_root));
|
||||
debugfs_remove(debugfs_lookup(TRC_ENABLE_FILE, snic_glob->trc_root));
|
||||
}
|
||||
|
|
|
@ -46,9 +46,6 @@ struct snic_trc {
|
|||
u32 rd_idx;
|
||||
u32 wr_idx;
|
||||
bool enable; /* Control Variable for Tracing */
|
||||
|
||||
struct dentry *trc_enable; /* debugfs file object */
|
||||
struct dentry *trc_file;
|
||||
};
|
||||
|
||||
int snic_trc_init(void);
|
||||
|
|
|
@ -1227,7 +1227,7 @@ static int soft_uart_init(struct platform_device *ofdev)
|
|||
* kernel, then we use it.
|
||||
*/
|
||||
ret = request_firmware_nowait(THIS_MODULE,
|
||||
FW_ACTION_HOTPLUG, filename, &ofdev->dev,
|
||||
FW_ACTION_UEVENT, filename, &ofdev->dev,
|
||||
GFP_KERNEL, &ofdev->dev, uart_firmware_cont);
|
||||
if (ret) {
|
||||
dev_err(&ofdev->dev,
|
||||
|
|
|
@ -582,22 +582,12 @@ DEFINE_DEBUGFS_ATTRIBUTE(fops_ulong_wo, NULL, debugfs_ulong_set, "%llu\n");
|
|||
* This function creates a file in debugfs with the given name that
|
||||
* contains the value of the variable @value. If the @mode variable is so
|
||||
* set, it can be read from, and written to.
|
||||
*
|
||||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the file is
|
||||
* to be removed (no automatic cleanup happens if your module is unloaded,
|
||||
* you are responsible here.) If an error occurs, ERR_PTR(-ERROR) will be
|
||||
* returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will
|
||||
* be returned.
|
||||
*/
|
||||
struct dentry *debugfs_create_ulong(const char *name, umode_t mode,
|
||||
struct dentry *parent, unsigned long *value)
|
||||
void debugfs_create_ulong(const char *name, umode_t mode, struct dentry *parent,
|
||||
unsigned long *value)
|
||||
{
|
||||
return debugfs_create_mode_unsafe(name, mode, parent, value,
|
||||
&fops_ulong, &fops_ulong_ro,
|
||||
&fops_ulong_wo);
|
||||
debugfs_create_mode_unsafe(name, mode, parent, value, &fops_ulong,
|
||||
&fops_ulong_ro, &fops_ulong_wo);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_create_ulong);
|
||||
|
||||
|
@ -846,20 +836,11 @@ static const struct file_operations fops_bool_wo = {
|
|||
* This function creates a file in debugfs with the given name that
|
||||
* contains the value of the variable @value. If the @mode variable is so
|
||||
* set, it can be read from, and written to.
|
||||
*
|
||||
* This function will return a pointer to a dentry if it succeeds. This
|
||||
* pointer must be passed to the debugfs_remove() function when the file is
|
||||
* to be removed (no automatic cleanup happens if your module is unloaded,
|
||||
* you are responsible here.) If an error occurs, ERR_PTR(-ERROR) will be
|
||||
* returned.
|
||||
*
|
||||
* If debugfs is not enabled in the kernel, the value ERR_PTR(-ENODEV) will
|
||||
* be returned.
|
||||
*/
|
||||
struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value)
|
||||
void debugfs_create_bool(const char *name, umode_t mode, struct dentry *parent,
|
||||
bool *value)
|
||||
{
|
||||
return debugfs_create_mode_unsafe(name, mode, parent, value, &fops_bool,
|
||||
debugfs_create_mode_unsafe(name, mode, parent, value, &fops_bool,
|
||||
&fops_bool_ro, &fops_bool_wo);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_create_bool);
|
||||
|
@ -980,7 +961,8 @@ static const struct file_operations fops_blob = {
|
|||
/**
|
||||
* debugfs_create_blob - create a debugfs file that is used to read a binary blob
|
||||
* @name: a pointer to a string containing the name of the file to create.
|
||||
* @mode: the permission that the file should have
|
||||
* @mode: the read permission that the file should have (other permissions are
|
||||
* masked out)
|
||||
* @parent: a pointer to the parent dentry for this file. This should be a
|
||||
* directory dentry if set. If this parameter is %NULL, then the
|
||||
* file will be created in the root of the debugfs filesystem.
|
||||
|
@ -1004,7 +986,7 @@ struct dentry *debugfs_create_blob(const char *name, umode_t mode,
|
|||
struct dentry *parent,
|
||||
struct debugfs_blob_wrapper *blob)
|
||||
{
|
||||
return debugfs_create_file_unsafe(name, mode, parent, blob, &fops_blob);
|
||||
return debugfs_create_file_unsafe(name, mode & 0444, parent, blob, &fops_blob);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(debugfs_create_blob);
|
||||
|
||||
|
|
|
@ -548,49 +548,6 @@ void kernfs_put(struct kernfs_node *kn)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(kernfs_put);
|
||||
|
||||
static int kernfs_dop_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
{
|
||||
struct kernfs_node *kn;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
/* Always perform fresh lookup for negatives */
|
||||
if (d_really_is_negative(dentry))
|
||||
goto out_bad_unlocked;
|
||||
|
||||
kn = kernfs_dentry_node(dentry);
|
||||
mutex_lock(&kernfs_mutex);
|
||||
|
||||
/* The kernfs node has been deactivated */
|
||||
if (!kernfs_active(kn))
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been moved? */
|
||||
if (kernfs_dentry_node(dentry->d_parent) != kn->parent)
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been renamed */
|
||||
if (strcmp(dentry->d_name.name, kn->name) != 0)
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been moved to a different namespace */
|
||||
if (kn->parent && kernfs_ns_enabled(kn->parent) &&
|
||||
kernfs_info(dentry->d_sb)->ns != kn->ns)
|
||||
goto out_bad;
|
||||
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
return 1;
|
||||
out_bad:
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
out_bad_unlocked:
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct dentry_operations kernfs_dops = {
|
||||
.d_revalidate = kernfs_dop_revalidate,
|
||||
};
|
||||
|
||||
/**
|
||||
* kernfs_node_from_dentry - determine kernfs_node associated with a dentry
|
||||
* @dentry: the dentry in question
|
||||
|
@ -1073,6 +1030,49 @@ struct kernfs_node *kernfs_create_empty_dir(struct kernfs_node *parent,
|
|||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
static int kernfs_dop_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
{
|
||||
struct kernfs_node *kn;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
|
||||
/* Always perform fresh lookup for negatives */
|
||||
if (d_really_is_negative(dentry))
|
||||
goto out_bad_unlocked;
|
||||
|
||||
kn = kernfs_dentry_node(dentry);
|
||||
mutex_lock(&kernfs_mutex);
|
||||
|
||||
/* The kernfs node has been deactivated */
|
||||
if (!kernfs_active(kn))
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been moved? */
|
||||
if (kernfs_dentry_node(dentry->d_parent) != kn->parent)
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been renamed */
|
||||
if (strcmp(dentry->d_name.name, kn->name) != 0)
|
||||
goto out_bad;
|
||||
|
||||
/* The kernfs node has been moved to a different namespace */
|
||||
if (kn->parent && kernfs_ns_enabled(kn->parent) &&
|
||||
kernfs_info(dentry->d_sb)->ns != kn->ns)
|
||||
goto out_bad;
|
||||
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
return 1;
|
||||
out_bad:
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
out_bad_unlocked:
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct dentry_operations kernfs_dops = {
|
||||
.d_revalidate = kernfs_dop_revalidate,
|
||||
};
|
||||
|
||||
static struct dentry *kernfs_iop_lookup(struct inode *dir,
|
||||
struct dentry *dentry,
|
||||
unsigned int flags)
|
||||
|
|
|
@ -112,8 +112,8 @@ void debugfs_create_u32(const char *name, umode_t mode, struct dentry *parent,
|
|||
u32 *value);
|
||||
void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent,
|
||||
u64 *value);
|
||||
struct dentry *debugfs_create_ulong(const char *name, umode_t mode,
|
||||
struct dentry *parent, unsigned long *value);
|
||||
void debugfs_create_ulong(const char *name, umode_t mode, struct dentry *parent,
|
||||
unsigned long *value);
|
||||
void debugfs_create_x8(const char *name, umode_t mode, struct dentry *parent,
|
||||
u8 *value);
|
||||
void debugfs_create_x16(const char *name, umode_t mode, struct dentry *parent,
|
||||
|
@ -126,8 +126,8 @@ void debugfs_create_size_t(const char *name, umode_t mode,
|
|||
struct dentry *parent, size_t *value);
|
||||
void debugfs_create_atomic_t(const char *name, umode_t mode,
|
||||
struct dentry *parent, atomic_t *value);
|
||||
struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value);
|
||||
void debugfs_create_bool(const char *name, umode_t mode, struct dentry *parent,
|
||||
bool *value);
|
||||
void debugfs_create_str(const char *name, umode_t mode,
|
||||
struct dentry *parent, char **value);
|
||||
|
||||
|
@ -266,13 +266,9 @@ static inline void debugfs_create_u32(const char *name, umode_t mode,
|
|||
static inline void debugfs_create_u64(const char *name, umode_t mode,
|
||||
struct dentry *parent, u64 *value) { }
|
||||
|
||||
static inline struct dentry *debugfs_create_ulong(const char *name,
|
||||
umode_t mode,
|
||||
struct dentry *parent,
|
||||
unsigned long *value)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
static inline void debugfs_create_ulong(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
unsigned long *value) { }
|
||||
|
||||
static inline void debugfs_create_x8(const char *name, umode_t mode,
|
||||
struct dentry *parent, u8 *value) { }
|
||||
|
@ -295,12 +291,8 @@ static inline void debugfs_create_atomic_t(const char *name, umode_t mode,
|
|||
atomic_t *value)
|
||||
{ }
|
||||
|
||||
static inline struct dentry *debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
bool *value)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
static inline void debugfs_create_bool(const char *name, umode_t mode,
|
||||
struct dentry *parent, bool *value) { }
|
||||
|
||||
static inline void debugfs_create_str(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
|
|
|
@ -165,21 +165,12 @@ void device_remove_bin_file(struct device *dev,
|
|||
typedef void (*dr_release_t)(struct device *dev, void *res);
|
||||
typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data);
|
||||
|
||||
#ifdef CONFIG_DEBUG_DEVRES
|
||||
void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp,
|
||||
int nid, const char *name) __malloc;
|
||||
#define devres_alloc(release, size, gfp) \
|
||||
__devres_alloc_node(release, size, gfp, NUMA_NO_NODE, #release)
|
||||
#define devres_alloc_node(release, size, gfp, nid) \
|
||||
__devres_alloc_node(release, size, gfp, nid, #release)
|
||||
#else
|
||||
void *devres_alloc_node(dr_release_t release, size_t size,
|
||||
gfp_t gfp, int nid) __malloc;
|
||||
static inline void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp)
|
||||
{
|
||||
return devres_alloc_node(release, size, gfp, NUMA_NO_NODE);
|
||||
}
|
||||
#endif
|
||||
|
||||
void devres_for_each_res(struct device *dev, dr_release_t release,
|
||||
dr_match_t match, void *match_data,
|
||||
|
|
|
@ -140,7 +140,12 @@ struct kernel_symbol {
|
|||
#define ___cond_export_sym(sym, sec, ns, enabled) \
|
||||
__cond_export_sym_##enabled(sym, sec, ns)
|
||||
#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns)
|
||||
|
||||
#ifdef __GENKSYMS__
|
||||
#define __cond_export_sym_0(sym, sec, ns) __GENKSYMS_EXPORT_SYMBOL(sym)
|
||||
#else
|
||||
#define __cond_export_sym_0(sym, sec, ns) /* nothing */
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <linux/gfp.h>
|
||||
|
||||
#define FW_ACTION_NOHOTPLUG 0
|
||||
#define FW_ACTION_HOTPLUG 1
|
||||
#define FW_ACTION_NOUEVENT 0
|
||||
#define FW_ACTION_UEVENT 1
|
||||
|
||||
struct firmware {
|
||||
size_t size;
|
||||
|
|
|
@ -66,9 +66,6 @@ extern void __iomem *
|
|||
devm_platform_ioremap_resource(struct platform_device *pdev,
|
||||
unsigned int index);
|
||||
extern void __iomem *
|
||||
devm_platform_ioremap_resource_wc(struct platform_device *pdev,
|
||||
unsigned int index);
|
||||
extern void __iomem *
|
||||
devm_platform_ioremap_resource_byname(struct platform_device *pdev,
|
||||
const char *name);
|
||||
extern int platform_get_irq(struct platform_device *, unsigned int);
|
||||
|
|
|
@ -157,8 +157,10 @@ __devm_ioremap_resource(struct device *dev, const struct resource *res,
|
|||
dev_name(dev), res->name);
|
||||
else
|
||||
pretty_name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
|
||||
if (!pretty_name)
|
||||
if (!pretty_name) {
|
||||
dev_err(dev, "can't generate pretty name for resource %pR\n", res);
|
||||
return IOMEM_ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
if (!devm_request_mem_region(dev, res->start, size, pretty_name)) {
|
||||
dev_err(dev, "can't request region for resource %pR\n", res);
|
||||
|
|
|
@ -260,8 +260,8 @@ static ssize_t config_show(struct device *dev,
|
|||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"send_uevent:\t\t%s\n",
|
||||
test_fw_config->send_uevent ?
|
||||
"FW_ACTION_HOTPLUG" :
|
||||
"FW_ACTION_NOHOTPLUG");
|
||||
"FW_ACTION_UEVENT" :
|
||||
"FW_ACTION_NOUEVENT");
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"into_buf:\t\t%s\n",
|
||||
test_fw_config->into_buf ? "true" : "false");
|
||||
|
@ -729,7 +729,7 @@ static ssize_t trigger_custom_fallback_store(struct device *dev,
|
|||
mutex_lock(&test_fw_mutex);
|
||||
release_firmware(test_firmware);
|
||||
test_firmware = NULL;
|
||||
rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG, name,
|
||||
rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, name,
|
||||
dev, GFP_KERNEL, NULL,
|
||||
trigger_async_request_cb);
|
||||
if (rc) {
|
||||
|
@ -938,8 +938,8 @@ ssize_t trigger_batched_requests_async_store(struct device *dev,
|
|||
pr_info("batched loading '%s' custom fallback mechanism %u times\n",
|
||||
test_fw_config->name, test_fw_config->num_requests);
|
||||
|
||||
send_uevent = test_fw_config->send_uevent ? FW_ACTION_HOTPLUG :
|
||||
FW_ACTION_NOHOTPLUG;
|
||||
send_uevent = test_fw_config->send_uevent ? FW_ACTION_UEVENT :
|
||||
FW_ACTION_NOUEVENT;
|
||||
|
||||
for (i = 0; i < test_fw_config->num_requests; i++) {
|
||||
req = &test_fw_config->reqs[i];
|
||||
|
|
|
@ -912,13 +912,13 @@ void wm8958_dsp2_init(struct snd_soc_component *component)
|
|||
|
||||
|
||||
/* We don't *require* firmware and don't want to delay boot */
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
"wm8958_mbc.wfw", component->dev, GFP_KERNEL,
|
||||
component, wm8958_mbc_loaded);
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
"wm8958_mbc_vss.wfw", component->dev, GFP_KERNEL,
|
||||
component, wm8958_mbc_vss_loaded);
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG,
|
||||
request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
|
||||
"wm8958_enh_eq.wfw", component->dev, GFP_KERNEL,
|
||||
component, wm8958_enh_eq_loaded);
|
||||
|
||||
|
|
Loading…
Reference in New Issue