mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 05:43:28 -04:00
Merge tag 'driver-core-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
Pull driver core updates from Greg KH: "Here is the driver core / firmware changes for 4.2-rc1. A number of small changes all over the place in the driver core, and in the firmware subsystem. Nothing really major, full details in the shortlog. Some of it is a bit of churn, given that the platform driver probing changes was found to not work well, so they were reverted. All of these have been in linux-next for a while with no reported issues" * tag 'driver-core-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (31 commits) Revert "base/platform: Only insert MEM and IO resources" Revert "base/platform: Continue on insert_resource() error" Revert "of/platform: Use platform_device interface" Revert "base/platform: Remove code duplication" firmware: add missing kfree for work on async call fs: sysfs: don't pass count == 0 to bin file readers base:dd - Fix for typo in comment to function driver_deferred_probe_trigger(). base/platform: Remove code duplication of/platform: Use platform_device interface base/platform: Continue on insert_resource() error base/platform: Only insert MEM and IO resources firmware: use const for remaining firmware names firmware: fix possible use after free on name on asynchronous request firmware: check for file truncation on direct firmware loading firmware: fix __getname() missing failure check drivers: of/base: move of_init to driver_init drivers/base: cacheinfo: fix annoying typo when DT nodes are absent sysfs: disambiguate between "error code" and "failure" in comments driver-core: fix build for !CONFIG_MODULES driver-core: make __device_attach() static ...
This commit is contained in:
@@ -19,7 +19,7 @@ enum cache_type {
|
||||
/**
|
||||
* struct cacheinfo - represent a cache leaf node
|
||||
* @type: type of the cache - data, inst or unified
|
||||
* @level: represents the hierarcy in the multi-level cache
|
||||
* @level: represents the hierarchy in the multi-level cache
|
||||
* @coherency_line_size: size of each cache line usually representing
|
||||
* the minimum amount of data that gets transferred from memory
|
||||
* @number_of_sets: total number of sets, a set is a collection of cache
|
||||
|
||||
@@ -195,6 +195,34 @@ extern int bus_unregister_notifier(struct bus_type *bus,
|
||||
extern struct kset *bus_get_kset(struct bus_type *bus);
|
||||
extern struct klist *bus_get_device_klist(struct bus_type *bus);
|
||||
|
||||
/**
|
||||
* enum probe_type - device driver probe type to try
|
||||
* Device drivers may opt in for special handling of their
|
||||
* respective probe routines. This tells the core what to
|
||||
* expect and prefer.
|
||||
*
|
||||
* @PROBE_DEFAULT_STRATEGY: Used by drivers that work equally well
|
||||
* whether probed synchronously or asynchronously.
|
||||
* @PROBE_PREFER_ASYNCHRONOUS: Drivers for "slow" devices which
|
||||
* probing order is not essential for booting the system may
|
||||
* opt into executing their probes asynchronously.
|
||||
* @PROBE_FORCE_SYNCHRONOUS: Use this to annotate drivers that need
|
||||
* their probe routines to run synchronously with driver and
|
||||
* device registration (with the exception of -EPROBE_DEFER
|
||||
* handling - re-probing always ends up being done asynchronously).
|
||||
*
|
||||
* Note that the end goal is to switch the kernel to use asynchronous
|
||||
* probing by default, so annotating drivers with
|
||||
* %PROBE_PREFER_ASYNCHRONOUS is a temporary measure that allows us
|
||||
* to speed up boot process while we are validating the rest of the
|
||||
* drivers.
|
||||
*/
|
||||
enum probe_type {
|
||||
PROBE_DEFAULT_STRATEGY,
|
||||
PROBE_PREFER_ASYNCHRONOUS,
|
||||
PROBE_FORCE_SYNCHRONOUS,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct device_driver - The basic device driver structure
|
||||
* @name: Name of the device driver.
|
||||
@@ -202,6 +230,7 @@ extern struct klist *bus_get_device_klist(struct bus_type *bus);
|
||||
* @owner: The module owner.
|
||||
* @mod_name: Used for built-in modules.
|
||||
* @suppress_bind_attrs: Disables bind/unbind via sysfs.
|
||||
* @probe_type: Type of the probe (synchronous or asynchronous) to use.
|
||||
* @of_match_table: The open firmware table.
|
||||
* @acpi_match_table: The ACPI match table.
|
||||
* @probe: Called to query the existence of a specific device,
|
||||
@@ -235,6 +264,7 @@ struct device_driver {
|
||||
const char *mod_name; /* used for built-in modules */
|
||||
|
||||
bool suppress_bind_attrs; /* disables bind/unbind via sysfs */
|
||||
enum probe_type probe_type;
|
||||
|
||||
const struct of_device_id *of_match_table;
|
||||
const struct acpi_device_id *acpi_match_table;
|
||||
@@ -975,6 +1005,7 @@ extern int __must_check device_bind_driver(struct device *dev);
|
||||
extern void device_release_driver(struct device *dev);
|
||||
extern int __must_check device_attach(struct device *dev);
|
||||
extern int __must_check driver_attach(struct device_driver *drv);
|
||||
extern void device_initial_probe(struct device *dev);
|
||||
extern int __must_check device_reprobe(struct device *dev);
|
||||
|
||||
/*
|
||||
|
||||
@@ -257,6 +257,8 @@ struct module {
|
||||
bool sig_ok;
|
||||
#endif
|
||||
|
||||
bool async_probe_requested;
|
||||
|
||||
/* symbols that will be GPL-only in the near future. */
|
||||
const struct kernel_symbol *gpl_future_syms;
|
||||
const unsigned long *gpl_future_crcs;
|
||||
@@ -508,6 +510,11 @@ int unregister_module_notifier(struct notifier_block *nb);
|
||||
|
||||
extern void print_modules(void);
|
||||
|
||||
static inline bool module_requested_async_probing(struct module *module)
|
||||
{
|
||||
return module && module->async_probe_requested;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_MODULES... */
|
||||
|
||||
/* Given an address, look for it in the exception tables. */
|
||||
@@ -618,6 +625,12 @@ static inline int unregister_module_notifier(struct notifier_block *nb)
|
||||
static inline void print_modules(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool module_requested_async_probing(struct module *module)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
|
||||
@@ -310,6 +310,15 @@ static inline void __kernel_param_unlock(void)
|
||||
#define core_param(name, var, type, perm) \
|
||||
param_check_##type(name, &(var)); \
|
||||
__module_param_call("", name, ¶m_ops_##type, &var, perm, -1, 0)
|
||||
|
||||
/**
|
||||
* core_param_unsafe - same as core_param but taints kernel
|
||||
*/
|
||||
#define core_param_unsafe(name, var, type, perm) \
|
||||
param_check_##type(name, &(var)); \
|
||||
__module_param_call("", name, ¶m_ops_##type, &var, perm, \
|
||||
-1, KERNEL_PARAM_FL_UNSAFE)
|
||||
|
||||
#endif /* !MODULE */
|
||||
|
||||
/**
|
||||
@@ -357,8 +366,9 @@ extern char *parse_args(const char *name,
|
||||
unsigned num,
|
||||
s16 level_min,
|
||||
s16 level_max,
|
||||
void *arg,
|
||||
int (*unknown)(char *param, char *val,
|
||||
const char *doing));
|
||||
const char *doing, void *arg));
|
||||
|
||||
/* Called by module remove. */
|
||||
#ifdef CONFIG_SYSFS
|
||||
|
||||
Reference in New Issue
Block a user