Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <linux/config.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/klist.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
@@ -44,14 +45,15 @@ struct device;
|
||||
struct device_driver;
|
||||
struct class;
|
||||
struct class_device;
|
||||
struct class_simple;
|
||||
|
||||
struct bus_type {
|
||||
char * name;
|
||||
const char * name;
|
||||
|
||||
struct subsystem subsys;
|
||||
struct kset drivers;
|
||||
struct kset devices;
|
||||
struct klist klist_devices;
|
||||
struct klist klist_drivers;
|
||||
|
||||
struct bus_attribute * bus_attrs;
|
||||
struct device_attribute * dev_attrs;
|
||||
@@ -98,17 +100,18 @@ extern int bus_create_file(struct bus_type *, struct bus_attribute *);
|
||||
extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
|
||||
|
||||
struct device_driver {
|
||||
char * name;
|
||||
const char * name;
|
||||
struct bus_type * bus;
|
||||
|
||||
struct completion unloaded;
|
||||
struct kobject kobj;
|
||||
struct list_head devices;
|
||||
struct klist klist_devices;
|
||||
struct klist_node knode_bus;
|
||||
|
||||
struct module * owner;
|
||||
struct module * owner;
|
||||
|
||||
int (*probe) (struct device * dev);
|
||||
int (*remove) (struct device * dev);
|
||||
int (*remove) (struct device * dev);
|
||||
void (*shutdown) (struct device * dev);
|
||||
int (*suspend) (struct device * dev, pm_message_t state, u32 level);
|
||||
int (*resume) (struct device * dev, u32 level);
|
||||
@@ -137,12 +140,16 @@ struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
|
||||
extern int driver_create_file(struct device_driver *, struct driver_attribute *);
|
||||
extern void driver_remove_file(struct device_driver *, struct driver_attribute *);
|
||||
|
||||
extern int driver_for_each_device(struct device_driver * drv, struct device * start,
|
||||
void * data, int (*fn)(struct device *, void *));
|
||||
|
||||
|
||||
/*
|
||||
* device classes
|
||||
*/
|
||||
struct class {
|
||||
char * name;
|
||||
const char * name;
|
||||
struct module * owner;
|
||||
|
||||
struct subsystem subsys;
|
||||
struct list_head children;
|
||||
@@ -185,6 +192,7 @@ struct class_device {
|
||||
struct kobject kobj;
|
||||
struct class * class; /* required */
|
||||
dev_t devt; /* dev_t, creates the sysfs "dev" */
|
||||
struct class_device_attribute *devt_attr;
|
||||
struct device * dev; /* not necessary, but nice to have */
|
||||
void * class_data; /* class-specific data */
|
||||
|
||||
@@ -245,26 +253,28 @@ struct class_interface {
|
||||
extern int class_interface_register(struct class_interface *);
|
||||
extern void class_interface_unregister(struct class_interface *);
|
||||
|
||||
/* interface for class simple stuff */
|
||||
extern struct class_simple *class_simple_create(struct module *owner, char *name);
|
||||
extern void class_simple_destroy(struct class_simple *cs);
|
||||
extern struct class_device *class_simple_device_add(struct class_simple *cs, dev_t dev, struct device *device, const char *fmt, ...)
|
||||
__attribute__((format(printf,4,5)));
|
||||
extern int class_simple_set_hotplug(struct class_simple *,
|
||||
int (*hotplug)(struct class_device *dev, char **envp, int num_envp, char *buffer, int buffer_size));
|
||||
extern void class_simple_device_remove(dev_t dev);
|
||||
extern struct class *class_create(struct module *owner, char *name);
|
||||
extern void class_destroy(struct class *cls);
|
||||
extern struct class_device *class_device_create(struct class *cls, dev_t devt,
|
||||
struct device *device, char *fmt, ...)
|
||||
__attribute__((format(printf,4,5)));
|
||||
extern void class_device_destroy(struct class *cls, dev_t devt);
|
||||
|
||||
|
||||
struct device {
|
||||
struct list_head node; /* node in sibling list */
|
||||
struct list_head bus_list; /* node in bus's list */
|
||||
struct list_head driver_list;
|
||||
struct list_head children;
|
||||
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 kobject kobj;
|
||||
char bus_id[BUS_ID_SIZE]; /* position on parent bus */
|
||||
|
||||
struct semaphore sem; /* semaphore to synchronize calls to
|
||||
* its driver.
|
||||
*/
|
||||
|
||||
struct bus_type * bus; /* type of bus device is on */
|
||||
struct device_driver *driver; /* which driver has allocated this
|
||||
device */
|
||||
@@ -288,12 +298,6 @@ struct device {
|
||||
void (*release)(struct device * dev);
|
||||
};
|
||||
|
||||
static inline struct device *
|
||||
list_to_dev(struct list_head *node)
|
||||
{
|
||||
return list_entry(node, struct device, node);
|
||||
}
|
||||
|
||||
static inline void *
|
||||
dev_get_drvdata (struct device *dev)
|
||||
{
|
||||
@@ -321,7 +325,6 @@ extern int device_for_each_child(struct device *, void *,
|
||||
* Manual binding of a device to driver. See drivers/base/bus.c
|
||||
* for information on use.
|
||||
*/
|
||||
extern int driver_probe_device(struct device_driver * drv, struct device * dev);
|
||||
extern void device_bind_driver(struct device * dev);
|
||||
extern void device_release_driver(struct device * dev);
|
||||
extern int device_attach(struct device * dev);
|
||||
@@ -332,8 +335,10 @@ extern void driver_attach(struct device_driver * drv);
|
||||
|
||||
struct device_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct device * dev, char * buf);
|
||||
ssize_t (*store)(struct device * dev, const char * buf, size_t count);
|
||||
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
|
||||
char *buf);
|
||||
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count);
|
||||
};
|
||||
|
||||
#define DEVICE_ATTR(_name,_mode,_show,_store) \
|
||||
@@ -360,13 +365,12 @@ extern int (*platform_notify_remove)(struct device * dev);
|
||||
*/
|
||||
extern struct device * get_device(struct device * dev);
|
||||
extern void put_device(struct device * dev);
|
||||
extern struct device *device_find(const char *name, struct bus_type *bus);
|
||||
|
||||
|
||||
/* drivers/base/platform.c */
|
||||
|
||||
struct platform_device {
|
||||
char * name;
|
||||
const char * name;
|
||||
u32 id;
|
||||
struct device dev;
|
||||
u32 num_resources;
|
||||
|
@@ -1657,6 +1657,52 @@ static inline void simple_transaction_set(struct file *file, size_t n)
|
||||
ar->size = n;
|
||||
}
|
||||
|
||||
/*
|
||||
* simple attribute files
|
||||
*
|
||||
* These attributes behave similar to those in sysfs:
|
||||
*
|
||||
* Writing to an attribute immediately sets a value, an open file can be
|
||||
* written to multiple times.
|
||||
*
|
||||
* Reading from an attribute creates a buffer from the value that might get
|
||||
* read with multiple read calls. When the attribute has been read
|
||||
* completely, no further read calls are possible until the file is opened
|
||||
* again.
|
||||
*
|
||||
* All attributes contain a text representation of a numeric value
|
||||
* that are accessed with the get() and set() functions.
|
||||
*/
|
||||
#define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
||||
static int __fops ## _open(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
__simple_attr_check_format(__fmt, 0ull); \
|
||||
return simple_attr_open(inode, file, __get, __set, __fmt); \
|
||||
} \
|
||||
static struct file_operations __fops = { \
|
||||
.owner = THIS_MODULE, \
|
||||
.open = __fops ## _open, \
|
||||
.release = simple_attr_close, \
|
||||
.read = simple_attr_read, \
|
||||
.write = simple_attr_write, \
|
||||
};
|
||||
|
||||
static inline void __attribute__((format(printf, 1, 2)))
|
||||
__simple_attr_check_format(const char *fmt, ...)
|
||||
{
|
||||
/* don't do anything, just let the compiler check the arguments; */
|
||||
}
|
||||
|
||||
int simple_attr_open(struct inode *inode, struct file *file,
|
||||
u64 (*get)(void *), void (*set)(void *, u64),
|
||||
const char *fmt);
|
||||
int simple_attr_close(struct inode *inode, struct file *file);
|
||||
ssize_t simple_attr_read(struct file *file, char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
static inline char *alloc_secdata(void)
|
||||
{
|
||||
|
36
include/linux/i2c-sysfs.h
Normal file
36
include/linux/i2c-sysfs.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* i2c-sysfs.h - i2c chip driver sysfs defines
|
||||
*
|
||||
* Copyright (C) 2005 Yani Ioannou <yani.ioannou@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#ifndef _LINUX_I2C_SYSFS_H
|
||||
#define _LINUX_I2C_SYSFS_H
|
||||
|
||||
struct sensor_device_attribute{
|
||||
struct device_attribute dev_attr;
|
||||
int index;
|
||||
};
|
||||
#define to_sensor_dev_attr(_dev_attr) \
|
||||
container_of(_dev_attr, struct sensor_device_attribute, dev_attr)
|
||||
|
||||
#define SENSOR_DEVICE_ATTR(_name,_mode,_show,_store,_index) \
|
||||
struct sensor_device_attribute sensor_dev_attr_##_name = { \
|
||||
.dev_attr = __ATTR(_name,_mode,_show,_store), \
|
||||
.index = _index, \
|
||||
}
|
||||
|
||||
#endif /* _LINUX_I2C_SYSFS_H */
|
@@ -1015,7 +1015,7 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min
|
||||
dev->absbit[LONG(axis)] |= BIT(axis);
|
||||
}
|
||||
|
||||
extern struct class_simple *input_class;
|
||||
extern struct class *input_class;
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
55
include/linux/klist.h
Normal file
55
include/linux/klist.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* klist.h - Some generic list helpers, extending struct list_head a bit.
|
||||
*
|
||||
* Implementations are found in lib/klist.c
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2005 Patrick Mochel
|
||||
*
|
||||
* This file is rleased under the GPL v2.
|
||||
*/
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
|
||||
struct klist {
|
||||
spinlock_t k_lock;
|
||||
struct list_head k_list;
|
||||
};
|
||||
|
||||
|
||||
extern void klist_init(struct klist * k);
|
||||
|
||||
|
||||
struct klist_node {
|
||||
struct klist * n_klist;
|
||||
struct list_head n_node;
|
||||
struct kref n_ref;
|
||||
struct completion n_removed;
|
||||
};
|
||||
|
||||
extern void klist_add_tail(struct klist * k, struct klist_node * n);
|
||||
extern void klist_add_head(struct klist * k, struct klist_node * n);
|
||||
|
||||
extern void klist_del(struct klist_node * n);
|
||||
extern void klist_remove(struct klist_node * n);
|
||||
|
||||
extern int klist_node_attached(struct klist_node * n);
|
||||
|
||||
|
||||
struct klist_iter {
|
||||
struct klist * i_klist;
|
||||
struct list_head * i_head;
|
||||
struct klist_node * i_cur;
|
||||
};
|
||||
|
||||
|
||||
extern void klist_iter_init(struct klist * k, struct klist_iter * i);
|
||||
extern void klist_iter_init_node(struct klist * k, struct klist_iter * i,
|
||||
struct klist_node * n);
|
||||
extern void klist_iter_exit(struct klist_iter * i);
|
||||
extern struct klist_node * klist_next(struct klist_iter * i);
|
||||
|
@@ -33,7 +33,7 @@
|
||||
extern u64 hotplug_seqnum;
|
||||
|
||||
struct kobject {
|
||||
char * k_name;
|
||||
const char * k_name;
|
||||
char name[KOBJ_NAME_LEN];
|
||||
struct kref kref;
|
||||
struct list_head entry;
|
||||
@@ -46,7 +46,7 @@ struct kobject {
|
||||
extern int kobject_set_name(struct kobject *, const char *, ...)
|
||||
__attribute__((format(printf,2,3)));
|
||||
|
||||
static inline char * kobject_name(struct kobject * kobj)
|
||||
static inline const char * kobject_name(const struct kobject * kobj)
|
||||
{
|
||||
return kobj->k_name;
|
||||
}
|
||||
@@ -57,7 +57,7 @@ extern void kobject_cleanup(struct kobject *);
|
||||
extern int kobject_add(struct kobject *);
|
||||
extern void kobject_del(struct kobject *);
|
||||
|
||||
extern int kobject_rename(struct kobject *, char *new_name);
|
||||
extern int kobject_rename(struct kobject *, const char *new_name);
|
||||
|
||||
extern int kobject_register(struct kobject *);
|
||||
extern void kobject_unregister(struct kobject *);
|
||||
@@ -94,7 +94,7 @@ struct kobj_type {
|
||||
*/
|
||||
struct kset_hotplug_ops {
|
||||
int (*filter)(struct kset *kset, struct kobject *kobj);
|
||||
char *(*name)(struct kset *kset, struct kobject *kobj);
|
||||
const char *(*name)(struct kset *kset, struct kobject *kobj);
|
||||
int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size);
|
||||
};
|
||||
|
@@ -27,6 +27,7 @@ struct node {
|
||||
};
|
||||
|
||||
extern int register_node(struct node *, int, struct node *);
|
||||
extern void unregister_node(struct node *node);
|
||||
|
||||
#define to_node(sys_device) container_of(sys_device, struct node, sysdev)
|
||||
|
||||
|
@@ -16,13 +16,13 @@ struct kobject;
|
||||
struct module;
|
||||
|
||||
struct attribute {
|
||||
char * name;
|
||||
const char * name;
|
||||
struct module * owner;
|
||||
mode_t mode;
|
||||
};
|
||||
|
||||
struct attribute_group {
|
||||
char * name;
|
||||
const char * name;
|
||||
struct attribute ** attrs;
|
||||
};
|
||||
|
||||
@@ -73,6 +73,7 @@ struct sysfs_dirent {
|
||||
int s_type;
|
||||
umode_t s_mode;
|
||||
struct dentry * s_dentry;
|
||||
struct iattr * s_iattr;
|
||||
};
|
||||
|
||||
#define SYSFS_ROOT 0x0001
|
||||
@@ -105,11 +106,11 @@ sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode);
|
||||
extern void
|
||||
sysfs_remove_file(struct kobject *, const struct attribute *);
|
||||
|
||||
extern int
|
||||
sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name);
|
||||
extern int
|
||||
sysfs_create_link(struct kobject * kobj, struct kobject * target, const char * name);
|
||||
|
||||
extern void
|
||||
sysfs_remove_link(struct kobject *, char * name);
|
||||
sysfs_remove_link(struct kobject *, const char * name);
|
||||
|
||||
int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr);
|
||||
int sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr);
|
||||
@@ -153,12 +154,12 @@ static inline void sysfs_remove_file(struct kobject * k, const struct attribute
|
||||
;
|
||||
}
|
||||
|
||||
static inline int sysfs_create_link(struct kobject * k, struct kobject * t, char * n)
|
||||
static inline int sysfs_create_link(struct kobject * k, struct kobject * t, const char * n)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void sysfs_remove_link(struct kobject * k, char * name)
|
||||
static inline void sysfs_remove_link(struct kobject * k, const char * name)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
@@ -287,15 +287,14 @@ struct usb_bus {
|
||||
|
||||
struct dentry *usbfs_dentry; /* usbfs dentry entry for the bus */
|
||||
|
||||
struct class_device class_dev; /* class device for this bus */
|
||||
struct class_device *class_dev; /* class device for this bus */
|
||||
struct kref kref; /* handles reference counting this bus */
|
||||
void (*release)(struct usb_bus *bus); /* function to destroy this bus's memory */
|
||||
#if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)
|
||||
struct mon_bus *mon_bus; /* non-null when associated */
|
||||
int monitored; /* non-zero when monitored */
|
||||
#endif
|
||||
};
|
||||
#define to_usb_bus(d) container_of(d, struct usb_bus, class_dev)
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
|
Reference in New Issue
Block a user