1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * device.h - generic, centralized driver model 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org> 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This file is released under the GPLv2 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * See Documentation/driver-model/ for more information. 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _DEVICE_H_ 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _DEVICE_H_ 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/ioport.h> 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/kobject.h> 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/klist.h> 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/types.h> 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/module.h> 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/pm.h> 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/semaphore.h> 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/atomic.h> 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEVICE_NAME_SIZE 50 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEVICE_NAME_HALF __stringify(20) /* Less than half to accommodate slop */ 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEVICE_ID_SIZE 32 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BUS_ID_SIZE KOBJ_NAME_LEN 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device; 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device_driver; 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class; 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_device; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct bus_type { 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char * name; 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct subsystem subsys; 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kset drivers; 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kset devices; 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist klist_devices; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist klist_drivers; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bus_attribute * bus_attrs; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device_attribute * dev_attrs; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct driver_attribute * drv_attrs; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*match)(struct device * dev, struct device_driver * drv); 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*uevent)(struct device *dev, char **envp, 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int num_envp, char *buffer, int buffer_size); 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*probe)(struct device * dev); 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*remove)(struct device * dev); 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*shutdown)(struct device * dev); 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*suspend)(struct device * dev, pm_message_t state); 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*resume)(struct device * dev); 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bus_register(struct bus_type * bus); 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void bus_unregister(struct bus_type * bus); 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void bus_rescan_devices(struct bus_type * bus); 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* iterator helpers for buses */ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint bus_for_each_dev(struct bus_type * bus, struct device * start, void * data, 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*fn)(struct device *, void *)); 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device * bus_find_device(struct bus_type *bus, struct device *start, 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *data, int (*match)(struct device *, void *)); 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint bus_for_each_drv(struct bus_type * bus, struct device_driver * start, 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void * data, int (*fn)(struct device_driver *, void *)); 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* driverfs interface for exporting bus attributes */ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct bus_attribute { 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(struct bus_type *, char * buf); 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(struct bus_type *, const char * buf, size_t count); 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define BUS_ATTR(_name,_mode,_show,_store) \ 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct bus_attribute bus_attr_##_name = __ATTR(_name,_mode,_show,_store) 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int bus_create_file(struct bus_type *, struct bus_attribute *); 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void bus_remove_file(struct bus_type *, struct bus_attribute *); 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device_driver { 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char * name; 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bus_type * bus; 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct completion unloaded; 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kobject kobj; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist klist_devices; 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist_node knode_bus; 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module * owner; 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*probe) (struct device * dev); 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*remove) (struct device * dev); 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*shutdown) (struct device * dev); 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*suspend) (struct device * dev, pm_message_t state); 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*resume) (struct device * dev); 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int driver_register(struct device_driver * drv); 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void driver_unregister(struct device_driver * drv); 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct device_driver * get_driver(struct device_driver * drv); 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void put_driver(struct device_driver * drv); 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct device_driver *driver_find(const char *name, struct bus_type *bus); 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* driverfs interface for exporting driver attributes */ 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct driver_attribute { 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(struct device_driver *, char * buf); 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(struct device_driver *, const char * buf, size_t count); 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DRIVER_ATTR(_name,_mode,_show,_store) \ 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct driver_attribute driver_attr_##_name = __ATTR(_name,_mode,_show,_store) 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int driver_create_file(struct device_driver *, struct driver_attribute *); 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void driver_remove_file(struct device_driver *, struct driver_attribute *); 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int driver_for_each_device(struct device_driver * drv, struct device * start, 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void * data, int (*fn)(struct device *, void *)); 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device * driver_find_device(struct device_driver *drv, 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device *start, void *data, 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*match)(struct device *, void *)); 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * device classes 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class { 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char * name; 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module * owner; 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct subsystem subsys; 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head children; 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head devices; 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head interfaces; 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct semaphore sem; /* locks both the children and interfaces lists */ 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_attribute * class_attrs; 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device_attribute * class_dev_attrs; 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*uevent)(struct class_device *dev, char **envp, 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int num_envp, char *buffer, int buffer_size); 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*release)(struct class_device *dev); 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*class_release)(struct class *class); 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_register(struct class *); 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_unregister(struct class *); 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 163c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_attribute { 164c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 165c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(struct class *, char * buf); 166c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(struct class *, const char * buf, size_t count); 167c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 168c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 169c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define CLASS_ATTR(_name,_mode,_show,_store) \ 170c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_attribute class_attr_##_name = __ATTR(_name,_mode,_show,_store) 171c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 172c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_create_file(struct class *, const struct class_attribute *); 173c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_remove_file(struct class *, const struct class_attribute *); 174c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 175c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_device_attribute { 176c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 177c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(struct class_device *, char * buf); 178c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(struct class_device *, const char * buf, size_t count); 179c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 180c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 181c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define CLASS_DEVICE_ATTR(_name,_mode,_show,_store) \ 182c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_device_attribute class_device_attr_##_name = \ 183c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ATTR(_name,_mode,_show,_store) 184c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 185c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_device_create_file(struct class_device *, 186c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct class_device_attribute *); 187c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 188c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 189c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct class_device - class devices 190c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @class: pointer to the parent class for this class device. This is required. 191c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @devt: for internal use by the driver core only. 192c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @node: for internal use by the driver core only. 193c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @kobj: for internal use by the driver core only. 194c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @devt_attr: for internal use by the driver core only. 195c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @groups: optional additional groups to be created 196c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @dev: if set, a symlink to the struct device is created in the sysfs 197c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * directory for this struct class device. 198c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @class_data: pointer to whatever you want to store here for this struct 199c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * class_device. Use class_get_devdata() and class_set_devdata() to get and 200c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * set this pointer. 201c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @parent: pointer to a struct class_device that is the parent of this struct 202c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * class_device. If NULL, this class_device will show up at the root of the 203c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * struct class in sysfs (which is probably what you want to have happen.) 204c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @release: pointer to a release function for this struct class_device. If 205c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * set, this will be called instead of the class specific release function. 206c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Only use this if you want to override the default release function, like 207c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * when you are nesting class_device structures. 208c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @uevent: pointer to a uevent function for this struct class_device. If 209c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * set, this will be called instead of the class specific uevent function. 210c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Only use this if you want to override the default uevent function, like 211c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * when you are nesting class_device structures. 212c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 213c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_device { 214c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head node; 215c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 216c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kobject kobj; 217c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class * class; /* required */ 218c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_t devt; /* dev_t, creates the sysfs "dev" */ 219c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device_attribute *devt_attr; 220c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device_attribute uevent_attr; 221c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device * dev; /* not necessary, but nice to have */ 222c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void * class_data; /* class-specific data */ 223c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device *parent; /* parent of this child device, if there is one */ 224c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute_group ** groups; /* optional groups */ 225c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 226c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*release)(struct class_device *dev); 227c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*uevent)(struct class_device *dev, char **envp, 228c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int num_envp, char *buffer, int buffer_size); 229c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char class_id[BUS_ID_SIZE]; /* unique to this class */ 230c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 231c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 232c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void * 233c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruclass_get_devdata (struct class_device *dev) 234c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 235c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return dev->class_data; 236c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 237c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 238c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 239c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruclass_set_devdata (struct class_device *dev, void *data) 240c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 241c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->class_data = data; 242c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 243c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 244c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 245c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_device_register(struct class_device *); 246c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_unregister(struct class_device *); 247c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_initialize(struct class_device *); 248c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_device_add(struct class_device *); 249c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_del(struct class_device *); 250c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 251c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_device_rename(struct class_device *, char *); 252c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 253c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct class_device * class_device_get(struct class_device *); 254c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_put(struct class_device *); 255c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 256c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_remove_file(struct class_device *, 257c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const struct class_device_attribute *); 258c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_device_create_bin_file(struct class_device *, 259c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bin_attribute *); 260c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_remove_bin_file(struct class_device *, 261c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bin_attribute *); 262c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 263c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct class_interface { 264c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head node; 265c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class *class; 266c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 267c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*add) (struct class_device *, struct class_interface *); 268c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*remove) (struct class_device *, struct class_interface *); 269c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 270c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 271c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int class_interface_register(struct class_interface *); 272c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_interface_unregister(struct class_interface *); 273c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 274c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct class *class_create(struct module *owner, char *name); 275c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_destroy(struct class *cls); 276c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct class_device *class_device_create(struct class *cls, 277c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class_device *parent, 278c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_t devt, 279c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device *device, 280c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char *fmt, ...) 281c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __attribute__((format(printf,5,6))); 282c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void class_device_destroy(struct class *cls, dev_t devt); 283c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 284c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 285c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* interface for exporting device attributes */ 286c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device_attribute { 287c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct attribute attr; 288c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*show)(struct device *dev, struct device_attribute *attr, 289c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char *buf); 290c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ssize_t (*store)(struct device *dev, struct device_attribute *attr, 291c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru const char *buf, size_t count); 292c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 293c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 294c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEVICE_ATTR(_name,_mode,_show,_store) \ 295c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store) 296c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 297c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int device_create_file(struct device *device, struct device_attribute * entry); 298c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_remove_file(struct device * dev, struct device_attribute * attr); 299c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct device { 300c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist klist_children; 301c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist_node knode_parent; /* node in sibling list */ 302c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist_node knode_driver; 303c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct klist_node knode_bus; 304c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device * parent; 305c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 306c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct kobject kobj; 307c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char bus_id[BUS_ID_SIZE]; /* position on parent bus */ 308c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device_attribute uevent_attr; 309c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device_attribute *devt_attr; 310c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 311c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct semaphore sem; /* semaphore to synchronize calls to 312c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * its driver. 313c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 314c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 315c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bus_type * bus; /* type of bus device is on */ 316c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct device_driver *driver; /* which driver has allocated this 317c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru device */ 318c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *driver_data; /* data private to the driver */ 319c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *platform_data; /* Platform specific data, device 320c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru core doesn't touch it */ 321c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *firmware_data; /* Firmware specific data (e.g. ACPI, 322c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru BIOS data),reserved for device core*/ 323c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dev_pm_info power; 324c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 325c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u64 *dma_mask; /* dma mask (if dma'able device) */ 326c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru u64 coherent_dma_mask;/* Like dma_mask, but for 327c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru alloc_coherent mappings as 328c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru not all hardware supports 329c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 64 bit addresses for consistent 330c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru allocations such descriptors. */ 331c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 332c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head dma_pools; /* dma pools (if dma'ble) */ 333c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 334c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct dma_coherent_mem *dma_mem; /* internal for coherent mem 335c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru override */ 336c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 337c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* class_device migration path */ 338c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct list_head node; 339c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct class *class; /* optional*/ 340c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_t devt; /* dev_t, creates the sysfs "dev" */ 341c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 342c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void (*release)(struct device * dev); 343c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 344c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 345c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void * 346c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudev_get_drvdata (struct device *dev) 347c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 348c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return dev->driver_data; 349c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 350c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 351c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void 352c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querudev_set_drvdata (struct device *dev, void *data) 353c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 354c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev->driver_data = data; 355c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 356c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 357c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int device_is_registered(struct device *dev) 358c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 359c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru return klist_node_attached(&dev->knode_bus); 360c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 361c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 362c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 363c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * High level routines for use by the bus drivers 364c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 365c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int device_register(struct device * dev); 366c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_unregister(struct device * dev); 367c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_initialize(struct device * dev); 368c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int device_add(struct device * dev); 369c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_del(struct device * dev); 370c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int device_for_each_child(struct device *, void *, 371c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*fn)(struct device *, void *)); 372c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 373c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 374c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Manual binding of a device to driver. See drivers/base/bus.c 375c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * for information on use. 376c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 377c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_bind_driver(struct device * dev); 378c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_release_driver(struct device * dev); 379c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int device_attach(struct device * dev); 380c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void driver_attach(struct device_driver * drv); 381c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_reprobe(struct device *dev); 382c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 383c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 384c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Easy functions for dynamically creating devices on the fly 385c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 386c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct device *device_create(struct class *cls, struct device *parent, 387c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_t devt, char *fmt, ...) 388c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __attribute__((format(printf,4,5))); 389c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_destroy(struct class *cls, dev_t devt); 390c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 391c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 392c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Platform "fixup" functions - allow the platform to have their say 393c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * about devices and actions that the general device layer doesn't 394c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * know about. 395c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 396c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Notify platform of device discovery */ 397c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int (*platform_notify)(struct device * dev); 398c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 399c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int (*platform_notify_remove)(struct device * dev); 400c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 401c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 402c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/** 403c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * get_device - atomically increment the reference count for the device. 404c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 405c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 406c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct device * get_device(struct device * dev); 407c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void put_device(struct device * dev); 408c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 409c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 410c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* drivers/base/power/shutdown.c */ 411c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void device_shutdown(void); 412c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 413c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 414c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* drivers/base/firmware.c */ 415c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int firmware_register(struct subsystem *); 416c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void firmware_unregister(struct subsystem *); 417c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 418c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* debugging and troubleshooting/diagnostic helpers. */ 419c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern const char *dev_driver_string(struct device *dev); 420c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_printk(level, dev, format, arg...) \ 421c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg) 422c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 423c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef DEBUG 424c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_dbg(dev, format, arg...) \ 425c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_printk(KERN_DEBUG , dev , format , ## arg) 426c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else 427c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0) 428c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 429c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 430c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_err(dev, format, arg...) \ 431c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_printk(KERN_ERR , dev , format , ## arg) 432c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_info(dev, format, arg...) \ 433c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_printk(KERN_INFO , dev , format , ## arg) 434c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_warn(dev, format, arg...) \ 435c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_printk(KERN_WARNING , dev , format , ## arg) 436c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define dev_notice(dev, format, arg...) \ 437c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru dev_printk(KERN_NOTICE , dev , format , ## arg) 438c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 439c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Create alias, so I can be autoloaded. */ 440c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MODULE_ALIAS_CHARDEV(major,minor) \ 441c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor)) 442c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MODULE_ALIAS_CHARDEV_MAJOR(major) \ 443c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru MODULE_ALIAS("char-major-" __stringify(major) "-*") 444c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _DEVICE_H_ */ 445