2 * platform_device.h - generic, centralized driver model
6 * This file is released under the GPLv2
8 * See Documentation/driver-model/ for more information.
11 #ifndef _PLATFORM_DEVICE_H_
12 #define _PLATFORM_DEVICE_H_
14 #include <linux/device.h>
15 #include <linux/mod_devicetable.h>
17 #define PLATFORM_DEVID_NONE (-1)
18 #define PLATFORM_DEVID_AUTO (-2)
22 struct platform_device {
28 struct resource *resource;
30 const struct platform_device_id *id_entry;
31 char *driver_override; /* Driver name to force a match */
33 /* MFD cell pointer */
34 struct mfd_cell *mfd_cell;
36 /* arch specific additions */
37 struct pdev_archdata archdata;
40 #define platform_get_device_id(pdev) ((pdev)->id_entry)
42 #define to_platform_device(x) container_of((x), struct platform_device, dev)
44 extern int platform_device_register(struct platform_device *);
45 extern void platform_device_unregister(struct platform_device *);
47 extern struct bus_type platform_bus_type;
48 extern struct device platform_bus;
50 extern void arch_setup_pdev_archdata(struct platform_device *);
51 extern struct resource *platform_get_resource(struct platform_device *,
52 unsigned int, unsigned int);
53 extern int platform_get_irq(struct platform_device *, unsigned int);
54 extern int platform_irq_count(struct platform_device *);
55 extern struct resource *platform_get_resource_byname(struct platform_device *,
58 extern int platform_get_irq_byname(struct platform_device *, const char *);
59 extern int platform_add_devices(struct platform_device **, int);
61 struct platform_device_info {
62 struct device *parent;
63 struct fwnode_handle *fwnode;
68 const struct resource *res;
75 extern struct platform_device *platform_device_register_full(
76 const struct platform_device_info *pdevinfo);
79 * platform_device_register_resndata - add a platform-level device with
80 * resources and platform-specific data
82 * @parent: parent device for the device we're adding
83 * @name: base name of the device we're adding
85 * @res: set of resources that needs to be allocated for the device
86 * @num: number of resources
87 * @data: platform specific data for this platform device
88 * @size: size of platform specific data
90 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
92 static inline struct platform_device *platform_device_register_resndata(
93 struct device *parent, const char *name, int id,
94 const struct resource *res, unsigned int num,
95 const void *data, size_t size) {
97 struct platform_device_info pdevinfo = {
108 return platform_device_register_full(&pdevinfo);
112 * platform_device_register_simple - add a platform-level device and its resources
113 * @name: base name of the device we're adding
115 * @res: set of resources that needs to be allocated for the device
116 * @num: number of resources
118 * This function creates a simple platform device that requires minimal
119 * resource and memory management. Canned release function freeing memory
120 * allocated for the device allows drivers using such devices to be
121 * unloaded without waiting for the last reference to the device to be
124 * This interface is primarily intended for use with legacy drivers which
125 * probe hardware directly. Because such drivers create sysfs device nodes
126 * themselves, rather than letting system infrastructure handle such device
127 * enumeration tasks, they don't fully conform to the Linux driver model.
128 * In particular, when such drivers are built as modules, they can't be
131 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
133 static inline struct platform_device *platform_device_register_simple(
134 const char *name, int id,
135 const struct resource *res, unsigned int num)
137 return platform_device_register_resndata(NULL, name, id,
142 * platform_device_register_data - add a platform-level device with platform-specific data
143 * @parent: parent device for the device we're adding
144 * @name: base name of the device we're adding
146 * @data: platform specific data for this platform device
147 * @size: size of platform specific data
149 * This function creates a simple platform device that requires minimal
150 * resource and memory management. Canned release function freeing memory
151 * allocated for the device allows drivers using such devices to be
152 * unloaded without waiting for the last reference to the device to be
155 * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
157 static inline struct platform_device *platform_device_register_data(
158 struct device *parent, const char *name, int id,
159 const void *data, size_t size)
161 return platform_device_register_resndata(parent, name, id,
162 NULL, 0, data, size);
165 extern struct platform_device *platform_device_alloc(const char *name, int id);
166 extern int platform_device_add_resources(struct platform_device *pdev,
167 const struct resource *res,
169 extern int platform_device_add_data(struct platform_device *pdev,
170 const void *data, size_t size);
171 extern int platform_device_add(struct platform_device *pdev);
172 extern void platform_device_del(struct platform_device *pdev);
173 extern void platform_device_put(struct platform_device *pdev);
175 struct platform_driver {
176 int (*probe)(struct platform_device *);
177 int (*remove)(struct platform_device *);
178 void (*shutdown)(struct platform_device *);
179 int (*suspend)(struct platform_device *, pm_message_t state);
180 int (*resume)(struct platform_device *);
181 struct device_driver driver;
182 const struct platform_device_id *id_table;
183 bool prevent_deferred_probe;
186 #define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
190 * use a macro to avoid include chaining to get THIS_MODULE
192 #define platform_driver_register(drv) \
193 __platform_driver_register(drv, THIS_MODULE)
194 extern int __platform_driver_register(struct platform_driver *,
196 extern void platform_driver_unregister(struct platform_driver *);
198 /* non-hotpluggable platform devices may use this so that probe() and
199 * its support may live in __init sections, conserving runtime memory.
201 #define platform_driver_probe(drv, probe) \
202 __platform_driver_probe(drv, probe, THIS_MODULE)
203 extern int __platform_driver_probe(struct platform_driver *driver,
204 int (*probe)(struct platform_device *), struct module *module);
206 static inline void *platform_get_drvdata(const struct platform_device *pdev)
208 return dev_get_drvdata(&pdev->dev);
211 static inline void platform_set_drvdata(struct platform_device *pdev,
214 dev_set_drvdata(&pdev->dev, data);
217 /* module_platform_driver() - Helper macro for drivers that don't do
218 * anything special in module init/exit. This eliminates a lot of
219 * boilerplate. Each module may only use this macro once, and
220 * calling it replaces module_init() and module_exit()
222 #define module_platform_driver(__platform_driver) \
223 module_driver(__platform_driver, platform_driver_register, \
224 platform_driver_unregister)
226 /* builtin_platform_driver() - Helper macro for builtin drivers that
227 * don't do anything special in driver init. This eliminates some
228 * boilerplate. Each driver may only use this macro once, and
229 * calling it replaces device_initcall(). Note this is meant to be
230 * a parallel of module_platform_driver() above, but w/o _exit stuff.
232 #define builtin_platform_driver(__platform_driver) \
233 builtin_driver(__platform_driver, platform_driver_register)
235 /* module_platform_driver_probe() - Helper macro for drivers that don't do
236 * anything special in module init/exit. This eliminates a lot of
237 * boilerplate. Each module may only use this macro once, and
238 * calling it replaces module_init() and module_exit()
240 #define module_platform_driver_probe(__platform_driver, __platform_probe) \
241 static int __init __platform_driver##_init(void) \
243 return platform_driver_probe(&(__platform_driver), \
246 module_init(__platform_driver##_init); \
247 static void __exit __platform_driver##_exit(void) \
249 platform_driver_unregister(&(__platform_driver)); \
251 module_exit(__platform_driver##_exit);
253 /* builtin_platform_driver_probe() - Helper macro for drivers that don't do
254 * anything special in device init. This eliminates some boilerplate. Each
255 * driver may only use this macro once, and using it replaces device_initcall.
256 * This is meant to be a parallel of module_platform_driver_probe above, but
257 * without the __exit parts.
259 #define builtin_platform_driver_probe(__platform_driver, __platform_probe) \
260 static int __init __platform_driver##_init(void) \
262 return platform_driver_probe(&(__platform_driver), \
265 device_initcall(__platform_driver##_init); \
267 #define platform_create_bundle(driver, probe, res, n_res, data, size) \
268 __platform_create_bundle(driver, probe, res, n_res, data, size, THIS_MODULE)
269 extern struct platform_device *__platform_create_bundle(
270 struct platform_driver *driver, int (*probe)(struct platform_device *),
271 struct resource *res, unsigned int n_res,
272 const void *data, size_t size, struct module *module);
274 int __platform_register_drivers(struct platform_driver * const *drivers,
275 unsigned int count, struct module *owner);
276 void platform_unregister_drivers(struct platform_driver * const *drivers,
279 #define platform_register_drivers(drivers, count) \
280 __platform_register_drivers(drivers, count, THIS_MODULE)
282 /* early platform driver interface */
283 struct early_platform_driver {
284 const char *class_str;
285 struct platform_driver *pdrv;
286 struct list_head list;
292 #define EARLY_PLATFORM_ID_UNSET -2
293 #define EARLY_PLATFORM_ID_ERROR -3
295 extern int early_platform_driver_register(struct early_platform_driver *epdrv,
297 extern void early_platform_add_devices(struct platform_device **devs, int num);
299 static inline int is_early_platform_device(struct platform_device *pdev)
301 return !pdev->dev.driver;
304 extern void early_platform_driver_register_all(char *class_str);
305 extern int early_platform_driver_probe(char *class_str,
306 int nr_probe, int user_only);
307 extern void early_platform_cleanup(void);
309 #define early_platform_init(class_string, platdrv) \
310 early_platform_init_buffer(class_string, platdrv, NULL, 0)
313 #define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \
314 static __initdata struct early_platform_driver early_driver = { \
315 .class_str = class_string, \
319 .requested_id = EARLY_PLATFORM_ID_UNSET, \
321 static int __init early_platform_driver_setup_func(char *buffer) \
323 return early_platform_driver_register(&early_driver, buffer); \
325 early_param(class_string, early_platform_driver_setup_func)
327 #define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \
328 static inline char *early_platform_driver_setup_func(void) \
330 return bufsiz ? buf : NULL; \
334 #ifdef CONFIG_SUSPEND
335 extern int platform_pm_suspend(struct device *dev);
336 extern int platform_pm_resume(struct device *dev);
338 #define platform_pm_suspend NULL
339 #define platform_pm_resume NULL
342 #ifdef CONFIG_HIBERNATE_CALLBACKS
343 extern int platform_pm_freeze(struct device *dev);
344 extern int platform_pm_thaw(struct device *dev);
345 extern int platform_pm_poweroff(struct device *dev);
346 extern int platform_pm_restore(struct device *dev);
348 #define platform_pm_freeze NULL
349 #define platform_pm_thaw NULL
350 #define platform_pm_poweroff NULL
351 #define platform_pm_restore NULL
354 #ifdef CONFIG_PM_SLEEP
355 #define USE_PLATFORM_PM_SLEEP_OPS \
356 .suspend = platform_pm_suspend, \
357 .resume = platform_pm_resume, \
358 .freeze = platform_pm_freeze, \
359 .thaw = platform_pm_thaw, \
360 .poweroff = platform_pm_poweroff, \
361 .restore = platform_pm_restore,
363 #define USE_PLATFORM_PM_SLEEP_OPS
366 #endif /* _PLATFORM_DEVICE_H_ */