Blame view

include/linux/platform_device.h 6.84 KB
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  /*
   * platform_device.h - generic, centralized driver model
   *
   * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org>
   *
   * This file is released under the GPLv2
   *
   * See Documentation/driver-model/ for more information.
   */
  
  #ifndef _PLATFORM_DEVICE_H_
  #define _PLATFORM_DEVICE_H_
  
  #include <linux/device.h>
57fee4a58   Eric Miao   platform: introdu...
15
  #include <linux/mod_devicetable.h>
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
16
17
18
  
  struct platform_device {
  	const char	* name;
1359555eb   Jean Delvare   Driver core: Make...
19
  	int		id;
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
20
21
22
  	struct device	dev;
  	u32		num_resources;
  	struct resource	* resource;
57fee4a58   Eric Miao   platform: introdu...
23

3d03ba4d1   Eric Miao   driver core: make...
24
  	const struct platform_device_id	*id_entry;
d7aacaddc   Magnus Damm   Driver Core: Add ...
25
26
27
  
  	/* arch specific additions */
  	struct pdev_archdata	archdata;
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
28
  };
57fee4a58   Eric Miao   platform: introdu...
29
  #define platform_get_device_id(pdev)	((pdev)->id_entry)
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
30
31
32
33
34
35
36
37
38
39
  #define to_platform_device(x) container_of((x), struct platform_device, dev)
  
  extern int platform_device_register(struct platform_device *);
  extern void platform_device_unregister(struct platform_device *);
  
  extern struct bus_type platform_bus_type;
  extern struct device platform_bus;
  
  extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
  extern int platform_get_irq(struct platform_device *, unsigned int);
c0afe7ba5   Linus Walleij   driver core: Cons...
40
41
  extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);
  extern int platform_get_irq_byname(struct platform_device *, const char *);
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
42
  extern int platform_add_devices(struct platform_device **, int);
44f28bdea   Uwe Kleine-König   Driver core: redu...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  extern struct platform_device *platform_device_register_resndata(
  		struct device *parent, const char *name, int id,
  		const struct resource *res, unsigned int num,
  		const void *data, size_t size);
  
  /**
   * platform_device_register_simple - add a platform-level device and its resources
   * @name: base name of the device we're adding
   * @id: instance id
   * @res: set of resources that needs to be allocated for the device
   * @num: number of resources
   *
   * This function creates a simple platform device that requires minimal
   * resource and memory management. Canned release function freeing memory
   * allocated for the device allows drivers using such devices to be
   * unloaded without waiting for the last reference to the device to be
   * dropped.
   *
   * This interface is primarily intended for use with legacy drivers which
   * probe hardware directly.  Because such drivers create sysfs device nodes
   * themselves, rather than letting system infrastructure handle such device
   * enumeration tasks, they don't fully conform to the Linux driver model.
   * In particular, when such drivers are built as modules, they can't be
   * "hotplugged".
   *
   * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
   */
  static inline struct platform_device *platform_device_register_simple(
  		const char *name, int id,
  		const struct resource *res, unsigned int num)
  {
  	return platform_device_register_resndata(NULL, name, id,
  			res, num, NULL, 0);
  }
  
  /**
   * platform_device_register_data - add a platform-level device with platform-specific data
   * @parent: parent device for the device we're adding
   * @name: base name of the device we're adding
   * @id: instance id
   * @data: platform specific data for this platform device
   * @size: size of platform specific data
   *
   * This function creates a simple platform device that requires minimal
   * resource and memory management. Canned release function freeing memory
   * allocated for the device allows drivers using such devices to be
   * unloaded without waiting for the last reference to the device to be
   * dropped.
   *
   * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
   */
  static inline struct platform_device *platform_device_register_data(
  		struct device *parent, const char *name, int id,
  		const void *data, size_t size)
  {
  	return platform_device_register_resndata(parent, name, id,
  			NULL, 0, data, size);
  }
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
101

1359555eb   Jean Delvare   Driver core: Make...
102
  extern struct platform_device *platform_device_alloc(const char *name, int id);
0b7f1a7ef   Geert Uytterhoeven   platform: Make pl...
103
104
105
  extern int platform_device_add_resources(struct platform_device *pdev,
  					 const struct resource *res,
  					 unsigned int num);
6eefd34fd   Scott Wood   Driver core: Make...
106
  extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size);
37c12e749   Russell King   [DRIVER MODEL] Im...
107
  extern int platform_device_add(struct platform_device *pdev);
93ce3061b   Dmitry Torokhov   [PATCH] Driver Co...
108
  extern void platform_device_del(struct platform_device *pdev);
37c12e749   Russell King   [DRIVER MODEL] Im...
109
  extern void platform_device_put(struct platform_device *pdev);
00d3dcdd9   Russell King   [DRIVER MODEL] Ad...
110
111
112
113
114
115
116
  struct platform_driver {
  	int (*probe)(struct platform_device *);
  	int (*remove)(struct platform_device *);
  	void (*shutdown)(struct platform_device *);
  	int (*suspend)(struct platform_device *, pm_message_t state);
  	int (*resume)(struct platform_device *);
  	struct device_driver driver;
831fad2f7   Uwe Kleine-König   Driver core: make...
117
  	const struct platform_device_id *id_table;
00d3dcdd9   Russell King   [DRIVER MODEL] Ad...
118
119
120
121
  };
  
  extern int platform_driver_register(struct platform_driver *);
  extern void platform_driver_unregister(struct platform_driver *);
c67334fbd   David Brownell   Driver core: plat...
122
123
124
125
126
  /* non-hotpluggable platform devices may use this so that probe() and
   * its support may live in __init sections, conserving runtime memory.
   */
  extern int platform_driver_probe(struct platform_driver *driver,
  		int (*probe)(struct platform_device *));
00d3dcdd9   Russell King   [DRIVER MODEL] Ad...
127
128
  #define platform_get_drvdata(_dev)	dev_get_drvdata(&(_dev)->dev)
  #define platform_set_drvdata(_dev,data)	dev_set_drvdata(&(_dev)->dev, (data))
ecdf6ceb8   Dmitry Torokhov   Driver core: add ...
129
130
131
132
  extern struct platform_device *platform_create_bundle(struct platform_driver *driver,
  					int (*probe)(struct platform_device *),
  					struct resource *res, unsigned int n_res,
  					const void *data, size_t size);
13977091a   Magnus Damm   Driver Core: earl...
133
134
135
136
137
138
  /* early platform driver interface */
  struct early_platform_driver {
  	const char *class_str;
  	struct platform_driver *pdrv;
  	struct list_head list;
  	int requested_id;
c60e0504c   Magnus Damm   Driver Core: Earl...
139
140
  	char *buffer;
  	int bufsize;
13977091a   Magnus Damm   Driver Core: earl...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  };
  
  #define EARLY_PLATFORM_ID_UNSET -2
  #define EARLY_PLATFORM_ID_ERROR -3
  
  extern int early_platform_driver_register(struct early_platform_driver *epdrv,
  					  char *buf);
  extern void early_platform_add_devices(struct platform_device **devs, int num);
  
  static inline int is_early_platform_device(struct platform_device *pdev)
  {
  	return !pdev->dev.driver;
  }
  
  extern void early_platform_driver_register_all(char *class_str);
  extern int early_platform_driver_probe(char *class_str,
  				       int nr_probe, int user_only);
  extern void early_platform_cleanup(void);
c60e0504c   Magnus Damm   Driver Core: Earl...
159
160
  #define early_platform_init(class_string, platdrv)		\
  	early_platform_init_buffer(class_string, platdrv, NULL, 0)
13977091a   Magnus Damm   Driver Core: earl...
161
162
  
  #ifndef MODULE
c60e0504c   Magnus Damm   Driver Core: Earl...
163
  #define early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
13977091a   Magnus Damm   Driver Core: earl...
164
165
  static __initdata struct early_platform_driver early_driver = {		\
  	.class_str = class_string,					\
c60e0504c   Magnus Damm   Driver Core: Earl...
166
167
168
  	.buffer = buf,							\
  	.bufsize = bufsiz,						\
  	.pdrv = platdrv,						\
13977091a   Magnus Damm   Driver Core: earl...
169
170
  	.requested_id = EARLY_PLATFORM_ID_UNSET,			\
  };									\
c60e0504c   Magnus Damm   Driver Core: Earl...
171
  static int __init early_platform_driver_setup_func(char *buffer)	\
13977091a   Magnus Damm   Driver Core: earl...
172
  {									\
c60e0504c   Magnus Damm   Driver Core: Earl...
173
  	return early_platform_driver_register(&early_driver, buffer);	\
13977091a   Magnus Damm   Driver Core: earl...
174
175
176
  }									\
  early_param(class_string, early_platform_driver_setup_func)
  #else /* MODULE */
c60e0504c   Magnus Damm   Driver Core: Earl...
177
178
179
180
181
  #define early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
  static inline char *early_platform_driver_setup_func(void)		\
  {									\
  	return bufsiz ? buf : NULL;					\
  }
13977091a   Magnus Damm   Driver Core: earl...
182
  #endif /* MODULE */
bbbf508d6   Russell King   [DRIVER MODEL] Ad...
183
  #endif /* _PLATFORM_DEVICE_H_ */