Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (61 commits) Dynamic debug: fix pr_fmt() build error Dynamic debug: allow simple quoting of words dynamic debug: update docs dynamic debug: combine dprintk and dynamic printk sysfs: fix some bin_vm_ops errors kobject: don't block for each kobject_uevent sysfs: only allow one scheduled removal callback per kobj Driver core: Fix device_move() vs. dpm list ordering, v2 Driver core: some cleanup on drivers/base/sys.c Driver core: implement uevent suppress in kobject vcs: hook sysfs devices into object lifetime instead of "binding" driver core: fix passing platform_data driver core: move platform_data into platform_device sysfs: don't block indefinitely for unmapped files. driver core: move knode_bus into private structure driver core: move knode_driver into private structure driver core: move klist_children into private structure driver core: create a private portion of struct device driver core: remove polling for driver_probe_done(v5) sysfs: reference sysfs_dirent from sysfs inodes ... Fixed conflicts in drivers/sh/maple/maple.c manually
This commit is contained in:
@@ -137,8 +137,8 @@ extern void resume_console(void);
|
||||
int mda_console_init(void);
|
||||
void prom_con_init(void);
|
||||
|
||||
void vcs_make_sysfs(struct tty_struct *tty);
|
||||
void vcs_remove_sysfs(struct tty_struct *tty);
|
||||
void vcs_make_sysfs(int index);
|
||||
void vcs_remove_sysfs(int index);
|
||||
|
||||
/* Some debug stub to catch some of the obvious races in the VT code */
|
||||
#if 1
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#define BUS_ID_SIZE 20
|
||||
|
||||
struct device;
|
||||
struct device_private;
|
||||
struct device_driver;
|
||||
struct driver_private;
|
||||
struct class;
|
||||
@@ -147,7 +148,7 @@ extern void put_driver(struct device_driver *drv);
|
||||
extern struct device_driver *driver_find(const char *name,
|
||||
struct bus_type *bus);
|
||||
extern int driver_probe_done(void);
|
||||
extern int wait_for_device_probe(void);
|
||||
extern void wait_for_device_probe(void);
|
||||
|
||||
|
||||
/* sysfs interface for exporting driver attributes */
|
||||
@@ -367,15 +368,11 @@ struct device_dma_parameters {
|
||||
};
|
||||
|
||||
struct device {
|
||||
struct klist klist_children;
|
||||
struct klist_node knode_parent; /* node in sibling list */
|
||||
struct klist_node knode_driver;
|
||||
struct klist_node knode_bus;
|
||||
struct device *parent;
|
||||
|
||||
struct device_private *p;
|
||||
|
||||
struct kobject kobj;
|
||||
char bus_id[BUS_ID_SIZE]; /* position on parent bus */
|
||||
unsigned uevent_suppress:1;
|
||||
const char *init_name; /* initial name of the device */
|
||||
struct device_type *type;
|
||||
|
||||
@@ -387,8 +384,13 @@ struct device {
|
||||
struct device_driver *driver; /* which driver has allocated this
|
||||
device */
|
||||
void *driver_data; /* data private to the driver */
|
||||
void *platform_data; /* Platform specific data, device
|
||||
core doesn't touch it */
|
||||
|
||||
void *platform_data; /* We will remove platform_data
|
||||
field if all platform devices
|
||||
pass its platform specific data
|
||||
from platform_device->platform_data,
|
||||
other kind of devices should not
|
||||
use platform_data. */
|
||||
struct dev_pm_info power;
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
@@ -427,8 +429,7 @@ struct device {
|
||||
|
||||
static inline const char *dev_name(const struct device *dev)
|
||||
{
|
||||
/* will be changed into kobject_name(&dev->kobj) in the near future */
|
||||
return dev->bus_id;
|
||||
return kobject_name(&dev->kobj);
|
||||
}
|
||||
|
||||
extern int dev_set_name(struct device *dev, const char *name, ...)
|
||||
@@ -463,6 +464,16 @@ static inline void dev_set_drvdata(struct device *dev, void *data)
|
||||
dev->driver_data = data;
|
||||
}
|
||||
|
||||
static inline unsigned int dev_get_uevent_suppress(const struct device *dev)
|
||||
{
|
||||
return dev->kobj.uevent_suppress;
|
||||
}
|
||||
|
||||
static inline void dev_set_uevent_suppress(struct device *dev, int val)
|
||||
{
|
||||
dev->kobj.uevent_suppress = val;
|
||||
}
|
||||
|
||||
static inline int device_is_registered(struct device *dev)
|
||||
{
|
||||
return dev->kobj.state_in_sysfs;
|
||||
@@ -483,7 +494,8 @@ extern int device_for_each_child(struct device *dev, void *data,
|
||||
extern struct device *device_find_child(struct device *dev, void *data,
|
||||
int (*match)(struct device *dev, void *data));
|
||||
extern int device_rename(struct device *dev, char *new_name);
|
||||
extern int device_move(struct device *dev, struct device *new_parent);
|
||||
extern int device_move(struct device *dev, struct device *new_parent,
|
||||
enum dpm_order dpm_order);
|
||||
|
||||
/*
|
||||
* Root device objects for grouping under /sys/devices
|
||||
@@ -570,7 +582,7 @@ extern const char *dev_driver_string(const struct device *dev);
|
||||
#if defined(DEBUG)
|
||||
#define dev_dbg(dev, format, arg...) \
|
||||
dev_printk(KERN_DEBUG , dev , format , ## arg)
|
||||
#elif defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
#elif defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define dev_dbg(dev, format, ...) do { \
|
||||
dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
88
include/linux/dynamic_debug.h
Normal file
88
include/linux/dynamic_debug.h
Normal file
@@ -0,0 +1,88 @@
|
||||
#ifndef _DYNAMIC_DEBUG_H
|
||||
#define _DYNAMIC_DEBUG_H
|
||||
|
||||
/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
|
||||
* bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
|
||||
* use independent hash functions, to reduce the chance of false positives.
|
||||
*/
|
||||
extern long long dynamic_debug_enabled;
|
||||
extern long long dynamic_debug_enabled2;
|
||||
|
||||
/*
|
||||
* An instance of this structure is created in a special
|
||||
* ELF section at every dynamic debug callsite. At runtime,
|
||||
* the special section is treated as an array of these.
|
||||
*/
|
||||
struct _ddebug {
|
||||
/*
|
||||
* These fields are used to drive the user interface
|
||||
* for selecting and displaying debug callsites.
|
||||
*/
|
||||
const char *modname;
|
||||
const char *function;
|
||||
const char *filename;
|
||||
const char *format;
|
||||
char primary_hash;
|
||||
char secondary_hash;
|
||||
unsigned int lineno:24;
|
||||
/*
|
||||
* The flags field controls the behaviour at the callsite.
|
||||
* The bits here are changed dynamically when the user
|
||||
* writes commands to <debugfs>/dynamic_debug/ddebug
|
||||
*/
|
||||
#define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */
|
||||
#define _DPRINTK_FLAGS_DEFAULT 0
|
||||
unsigned int flags:8;
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
|
||||
int ddebug_add_module(struct _ddebug *tab, unsigned int n,
|
||||
const char *modname);
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
extern int ddebug_remove_module(char *mod_name);
|
||||
|
||||
#define __dynamic_dbg_enabled(dd) ({ \
|
||||
int __ret = 0; \
|
||||
if (unlikely((dynamic_debug_enabled & (1LL << DEBUG_HASH)) && \
|
||||
(dynamic_debug_enabled2 & (1LL << DEBUG_HASH2)))) \
|
||||
if (unlikely(dd.flags)) \
|
||||
__ret = 1; \
|
||||
__ret; })
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) do { \
|
||||
static struct _ddebug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \
|
||||
DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \
|
||||
if (__dynamic_dbg_enabled(descriptor)) \
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ":" pr_fmt(fmt), \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define dynamic_dev_dbg(dev, fmt, ...) do { \
|
||||
static struct _ddebug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ KBUILD_MODNAME, __func__, __FILE__, fmt, DEBUG_HASH, \
|
||||
DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \
|
||||
if (__dynamic_dbg_enabled(descriptor)) \
|
||||
dev_printk(KERN_DEBUG, dev, \
|
||||
KBUILD_MODNAME ": " pr_fmt(fmt),\
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
static inline int ddebug_remove_module(char *mod)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) do { } while (0)
|
||||
#define dynamic_dev_dbg(dev, format, ...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
@@ -1,93 +0,0 @@
|
||||
#ifndef _DYNAMIC_PRINTK_H
|
||||
#define _DYNAMIC_PRINTK_H
|
||||
|
||||
#define DYNAMIC_DEBUG_HASH_BITS 6
|
||||
#define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS)
|
||||
|
||||
#define TYPE_BOOLEAN 1
|
||||
|
||||
#define DYNAMIC_ENABLED_ALL 0
|
||||
#define DYNAMIC_ENABLED_NONE 1
|
||||
#define DYNAMIC_ENABLED_SOME 2
|
||||
|
||||
extern int dynamic_enabled;
|
||||
|
||||
/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
|
||||
* bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
|
||||
* use independent hash functions, to reduce the chance of false positives.
|
||||
*/
|
||||
extern long long dynamic_printk_enabled;
|
||||
extern long long dynamic_printk_enabled2;
|
||||
|
||||
struct mod_debug {
|
||||
char *modname;
|
||||
char *logical_modname;
|
||||
char *flag_names;
|
||||
int type;
|
||||
int hash;
|
||||
int hash2;
|
||||
} __attribute__((aligned(8)));
|
||||
|
||||
int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
|
||||
char *flags, int hash, int hash2);
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
extern int unregister_dynamic_debug_module(char *mod_name);
|
||||
extern int __dynamic_dbg_enabled_helper(char *modname, int type,
|
||||
int value, int hash);
|
||||
|
||||
#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ \
|
||||
int __ret = 0; \
|
||||
if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) && \
|
||||
(dynamic_printk_enabled2 & (1LL << DEBUG_HASH2)))) \
|
||||
__ret = __dynamic_dbg_enabled_helper(module, type, \
|
||||
value, hash);\
|
||||
__ret; })
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) do { \
|
||||
static char mod_name[] \
|
||||
__attribute__((section("__verbose_strings"))) \
|
||||
= KBUILD_MODNAME; \
|
||||
static struct mod_debug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
|
||||
if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \
|
||||
0, 0, DEBUG_HASH)) \
|
||||
printk(KERN_DEBUG KBUILD_MODNAME ":" fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define dynamic_dev_dbg(dev, format, ...) do { \
|
||||
static char mod_name[] \
|
||||
__attribute__((section("__verbose_strings"))) \
|
||||
= KBUILD_MODNAME; \
|
||||
static struct mod_debug descriptor \
|
||||
__used \
|
||||
__attribute__((section("__verbose"), aligned(8))) = \
|
||||
{ mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
|
||||
if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN, \
|
||||
0, 0, DEBUG_HASH)) \
|
||||
dev_printk(KERN_DEBUG, dev, \
|
||||
KBUILD_MODNAME ": " format, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
|
||||
static inline int unregister_dynamic_debug_module(const char *mod_name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int __dynamic_dbg_enabled_helper(char *modname, int type,
|
||||
int value, int hash)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define __dynamic_dbg_enabled(module, type, value, level, hash) ({ 0; })
|
||||
#define dynamic_pr_debug(fmt, ...) do { } while (0)
|
||||
#define dynamic_dev_dbg(dev, format, ...) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif
|
@@ -16,7 +16,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/typecheck.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/dynamic_printk.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/bug.h>
|
||||
|
||||
@@ -358,9 +358,10 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
||||
#if defined(DEBUG)
|
||||
#define pr_debug(fmt, ...) \
|
||||
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#elif defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
|
||||
#elif defined(CONFIG_DYNAMIC_DEBUG)
|
||||
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
|
||||
#define pr_debug(fmt, ...) do { \
|
||||
dynamic_pr_debug(pr_fmt(fmt), ##__VA_ARGS__); \
|
||||
dynamic_pr_debug(fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#else
|
||||
#define pr_debug(fmt, ...) \
|
||||
|
@@ -68,10 +68,13 @@ struct kobject {
|
||||
unsigned int state_in_sysfs:1;
|
||||
unsigned int state_add_uevent_sent:1;
|
||||
unsigned int state_remove_uevent_sent:1;
|
||||
unsigned int uevent_suppress:1;
|
||||
};
|
||||
|
||||
extern int kobject_set_name(struct kobject *kobj, const char *name, ...)
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
extern int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
|
||||
va_list vargs);
|
||||
|
||||
static inline const char *kobject_name(const struct kobject *kobj)
|
||||
{
|
||||
|
@@ -454,4 +454,13 @@ struct dmi_system_id {
|
||||
|
||||
#define DMI_MATCH(a, b) { a, b }
|
||||
|
||||
#define PLATFORM_NAME_SIZE 20
|
||||
#define PLATFORM_MODULE_PREFIX "platform:"
|
||||
|
||||
struct platform_device_id {
|
||||
char name[PLATFORM_NAME_SIZE];
|
||||
kernel_ulong_t driver_data
|
||||
__attribute__((aligned(sizeof(kernel_ulong_t))));
|
||||
};
|
||||
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#define _PLATFORM_DEVICE_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
struct platform_device {
|
||||
const char * name;
|
||||
@@ -19,8 +20,13 @@ struct platform_device {
|
||||
struct device dev;
|
||||
u32 num_resources;
|
||||
struct resource * resource;
|
||||
void *platform_data;
|
||||
|
||||
struct platform_device_id *id_entry;
|
||||
};
|
||||
|
||||
#define platform_get_device_id(pdev) ((pdev)->id_entry)
|
||||
|
||||
#define to_platform_device(x) container_of((x), struct platform_device, dev)
|
||||
|
||||
extern int platform_device_register(struct platform_device *);
|
||||
@@ -56,6 +62,7 @@ struct platform_driver {
|
||||
int (*resume_early)(struct platform_device *);
|
||||
int (*resume)(struct platform_device *);
|
||||
struct device_driver driver;
|
||||
struct platform_device_id *id_table;
|
||||
};
|
||||
|
||||
extern int platform_driver_register(struct platform_driver *);
|
||||
|
@@ -400,6 +400,9 @@ extern void __suspend_report_result(const char *function, void *fn, int ret);
|
||||
|
||||
#else /* !CONFIG_PM_SLEEP */
|
||||
|
||||
#define device_pm_lock() do {} while (0)
|
||||
#define device_pm_unlock() do {} while (0)
|
||||
|
||||
static inline int device_suspend(pm_message_t state)
|
||||
{
|
||||
return 0;
|
||||
@@ -409,6 +412,14 @@ static inline int device_suspend(pm_message_t state)
|
||||
|
||||
#endif /* !CONFIG_PM_SLEEP */
|
||||
|
||||
/* How to reorder dpm_list after device_move() */
|
||||
enum dpm_order {
|
||||
DPM_ORDER_NONE,
|
||||
DPM_ORDER_DEV_AFTER_PARENT,
|
||||
DPM_ORDER_PARENT_BEFORE_DEV,
|
||||
DPM_ORDER_DEV_LAST,
|
||||
};
|
||||
|
||||
/*
|
||||
* Global Power Management flags
|
||||
* Used to keep APM and ACPI from both being active
|
||||
|
@@ -22,6 +22,7 @@ struct uio_map;
|
||||
|
||||
/**
|
||||
* struct uio_mem - description of a UIO memory region
|
||||
* @name: name of the memory region for identification
|
||||
* @addr: address of the device's memory
|
||||
* @size: size of IO
|
||||
* @memtype: type of memory addr points to
|
||||
@@ -29,6 +30,7 @@ struct uio_map;
|
||||
* @map: for use by the UIO core only.
|
||||
*/
|
||||
struct uio_mem {
|
||||
const char *name;
|
||||
unsigned long addr;
|
||||
unsigned long size;
|
||||
int memtype;
|
||||
@@ -42,12 +44,14 @@ struct uio_portio;
|
||||
|
||||
/**
|
||||
* struct uio_port - description of a UIO port region
|
||||
* @name: name of the port region for identification
|
||||
* @start: start of port region
|
||||
* @size: size of port region
|
||||
* @porttype: type of port (see UIO_PORT_* below)
|
||||
* @portio: for use by the UIO core only.
|
||||
*/
|
||||
struct uio_port {
|
||||
const char *name;
|
||||
unsigned long start;
|
||||
unsigned long size;
|
||||
int porttype;
|
||||
|
@@ -178,7 +178,7 @@ void __d_head(char *head, size_t head_size,
|
||||
WARN_ON(1);
|
||||
} else
|
||||
snprintf(head, head_size, "%s %s: ",
|
||||
dev_driver_string(dev), dev->bus_id);
|
||||
dev_driver_string(dev), dev_name(dev));
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user