111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/****************************************************************************
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   This header was automatically generated from a Linux kernel header
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   of the same name, to make information necessary for userspace to
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   call into the kernel available to libc.  It contains only constants,
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   structures, and macros generated from the original header, and thus,
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***   contains no copyrightable information.
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ***
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _DEVICE_H_
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEVICE_H_
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/ioport.h>
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/kobject.h>
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/klist.h>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/list.h>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/types.h>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/module.h>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/pm.h>
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/semaphore.h>
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <asm/atomic.h>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DEVICE_NAME_SIZE 50
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DEVICE_NAME_HALF __stringify(20)
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DEVICE_ID_SIZE 32
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BUS_ID_SIZE KOBJ_NAME_LEN
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device;
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device_driver;
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class;
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class_device;
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bus_type {
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char * name;
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct subsystem subsys;
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kset drivers;
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kset devices;
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist klist_devices;
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist klist_drivers;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bus_attribute * bus_attrs;
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device_attribute * dev_attrs;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct driver_attribute * drv_attrs;
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*match)(struct device * dev, struct device_driver * drv);
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*uevent)(struct device *dev, char **envp,
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int num_envp, char *buffer, int buffer_size);
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*probe)(struct device * dev);
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*remove)(struct device * dev);
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*shutdown)(struct device * dev);
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*suspend)(struct device * dev, pm_message_t state);
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*resume)(struct device * dev);
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device * bus_find_device(struct bus_type *bus, struct device *start,
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *data, int (*match)(struct device *, void *));
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct bus_attribute {
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(struct bus_type *, char * buf);
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BUS_ATTR(_name,_mode,_show,_store)  struct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store)
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device_driver {
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char * name;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bus_type * bus;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct completion unloaded;
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj;
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist klist_devices;
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist_node knode_bus;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct module * owner;
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*probe) (struct device * dev);
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*remove) (struct device * dev);
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*shutdown) (struct device * dev);
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*suspend) (struct device * dev, pm_message_t state);
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*resume) (struct device * dev);
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct driver_attribute {
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(struct device_driver *, char * buf);
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(struct device_driver *, const char * buf, size_t count);
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DRIVER_ATTR(_name,_mode,_show,_store)  struct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store)
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device * driver_find_device(struct device_driver *drv,
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device *start, void *data,
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*match)(struct device *, void *));
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class {
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char * name;
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct module * owner;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct subsystem subsys;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head children;
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head devices;
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head interfaces;
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct semaphore sem;
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class_attribute * class_attrs;
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class_device_attribute * class_dev_attrs;
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*uevent)(struct class_device *dev, char **envp,
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int num_envp, char *buffer, int buffer_size);
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*release)(struct class_device *dev);
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*class_release)(struct class *class);
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class_attribute {
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(struct class *, char * buf);
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(struct class *, const char * buf, size_t count);
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CLASS_ATTR(_name,_mode,_show,_store)  struct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store)
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class_device_attribute {
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(struct class_device *, char * buf);
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(struct class_device *, const char * buf, size_t count);
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store)  struct class_device_attribute class_device_attr_##_name =   __ATTR(_name,_mode,_show,_store)
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class_device {
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head node;
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj;
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class * class;
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dev_t devt;
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class_device_attribute *devt_attr;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class_device_attribute uevent_attr;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device * dev;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void * class_data;
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class_device *parent;
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute_group ** groups;
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*release)(struct class_device *dev);
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*uevent)(struct class_device *dev, char **envp,
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int num_envp, char *buffer, int buffer_size);
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char class_id[BUS_ID_SIZE];
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct class_interface {
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head node;
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class *class;
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int (*add) (struct class_device *, struct class_interface *);
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*remove) (struct class_device *, struct class_interface *);
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device_attribute {
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr;
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(struct device *dev, struct device_attribute *attr,
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char *buf);
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(struct device *dev, struct device_attribute *attr,
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const char *buf, size_t count);
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define DEVICE_ATTR(_name,_mode,_show,_store)  struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct device {
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist klist_children;
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist_node knode_parent;
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist_node knode_driver;
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct klist_node knode_bus;
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device * parent;
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj;
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char bus_id[BUS_ID_SIZE];
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device_attribute uevent_attr;
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device_attribute *devt_attr;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct semaphore sem;
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bus_type * bus;
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct device_driver *driver;
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *driver_data;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *platform_data;
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *firmware_data;
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct dev_pm_info power;
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert u64 *dma_mask;
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert u64 coherent_dma_mask;
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head dma_pools;
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct dma_coherent_mem *dma_mem;
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head node;
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct class *class;
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dev_t devt;
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void (*release)(struct device * dev);
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_printk(level, dev, format, arg...)   printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef DEBUG
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_dbg(dev, format, arg...)   dev_printk(KERN_DEBUG , dev , format , ## arg)
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#else
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0)
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_err(dev, format, arg...)   dev_printk(KERN_ERR , dev , format , ## arg)
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_info(dev, format, arg...)   dev_printk(KERN_INFO , dev , format , ## arg)
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_warn(dev, format, arg...)   dev_printk(KERN_WARNING , dev , format , ## arg)
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define dev_notice(dev, format, arg...)   dev_printk(KERN_NOTICE , dev , format , ## arg)
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MODULE_ALIAS_CHARDEV(major,minor)   MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MODULE_ALIAS_CHARDEV_MAJOR(major)   MODULE_ALIAS("char-major-" __stringify(major) "-*")
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
223