at v4.13 13 kB view raw
1/* 2 * platform_device.h - generic, centralized driver model 3 * 4 * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org> 5 * 6 * This file is released under the GPLv2 7 * 8 * See Documentation/driver-model/ for more information. 9 */ 10 11#ifndef _PLATFORM_DEVICE_H_ 12#define _PLATFORM_DEVICE_H_ 13 14#include <linux/device.h> 15#include <linux/mod_devicetable.h> 16 17#define PLATFORM_DEVID_NONE (-1) 18#define PLATFORM_DEVID_AUTO (-2) 19 20struct mfd_cell; 21struct property_entry; 22 23struct platform_device { 24 const char *name; 25 int id; 26 bool id_auto; 27 struct device dev; 28 u32 num_resources; 29 struct resource *resource; 30 31 const struct platform_device_id *id_entry; 32 char *driver_override; /* Driver name to force a match */ 33 34 /* MFD cell pointer */ 35 struct mfd_cell *mfd_cell; 36 37 /* arch specific additions */ 38 struct pdev_archdata archdata; 39}; 40 41#define platform_get_device_id(pdev) ((pdev)->id_entry) 42 43#define to_platform_device(x) container_of((x), struct platform_device, dev) 44 45extern int platform_device_register(struct platform_device *); 46extern void platform_device_unregister(struct platform_device *); 47 48extern struct bus_type platform_bus_type; 49extern struct device platform_bus; 50 51extern void arch_setup_pdev_archdata(struct platform_device *); 52extern struct resource *platform_get_resource(struct platform_device *, 53 unsigned int, unsigned int); 54extern int platform_get_irq(struct platform_device *, unsigned int); 55extern int platform_irq_count(struct platform_device *); 56extern struct resource *platform_get_resource_byname(struct platform_device *, 57 unsigned int, 58 const char *); 59extern int platform_get_irq_byname(struct platform_device *, const char *); 60extern int platform_add_devices(struct platform_device **, int); 61 62struct platform_device_info { 63 struct device *parent; 64 struct fwnode_handle *fwnode; 65 66 const char *name; 67 int id; 68 69 const struct resource *res; 70 unsigned int num_res; 71 72 const void *data; 73 size_t size_data; 74 u64 dma_mask; 75 76 struct property_entry *properties; 77}; 78extern struct platform_device *platform_device_register_full( 79 const struct platform_device_info *pdevinfo); 80 81/** 82 * platform_device_register_resndata - add a platform-level device with 83 * resources and platform-specific data 84 * 85 * @parent: parent device for the device we're adding 86 * @name: base name of the device we're adding 87 * @id: instance id 88 * @res: set of resources that needs to be allocated for the device 89 * @num: number of resources 90 * @data: platform specific data for this platform device 91 * @size: size of platform specific data 92 * 93 * Returns &struct platform_device pointer on success, or ERR_PTR() on error. 94 */ 95static inline struct platform_device *platform_device_register_resndata( 96 struct device *parent, const char *name, int id, 97 const struct resource *res, unsigned int num, 98 const void *data, size_t size) { 99 100 struct platform_device_info pdevinfo = { 101 .parent = parent, 102 .name = name, 103 .id = id, 104 .res = res, 105 .num_res = num, 106 .data = data, 107 .size_data = size, 108 .dma_mask = 0, 109 }; 110 111 return platform_device_register_full(&pdevinfo); 112} 113 114/** 115 * platform_device_register_simple - add a platform-level device and its resources 116 * @name: base name of the device we're adding 117 * @id: instance id 118 * @res: set of resources that needs to be allocated for the device 119 * @num: number of resources 120 * 121 * This function creates a simple platform device that requires minimal 122 * resource and memory management. Canned release function freeing memory 123 * allocated for the device allows drivers using such devices to be 124 * unloaded without waiting for the last reference to the device to be 125 * dropped. 126 * 127 * This interface is primarily intended for use with legacy drivers which 128 * probe hardware directly. Because such drivers create sysfs device nodes 129 * themselves, rather than letting system infrastructure handle such device 130 * enumeration tasks, they don't fully conform to the Linux driver model. 131 * In particular, when such drivers are built as modules, they can't be 132 * "hotplugged". 133 * 134 * Returns &struct platform_device pointer on success, or ERR_PTR() on error. 135 */ 136static inline struct platform_device *platform_device_register_simple( 137 const char *name, int id, 138 const struct resource *res, unsigned int num) 139{ 140 return platform_device_register_resndata(NULL, name, id, 141 res, num, NULL, 0); 142} 143 144/** 145 * platform_device_register_data - add a platform-level device with platform-specific data 146 * @parent: parent device for the device we're adding 147 * @name: base name of the device we're adding 148 * @id: instance id 149 * @data: platform specific data for this platform device 150 * @size: size of platform specific data 151 * 152 * This function creates a simple platform device that requires minimal 153 * resource and memory management. Canned release function freeing memory 154 * allocated for the device allows drivers using such devices to be 155 * unloaded without waiting for the last reference to the device to be 156 * dropped. 157 * 158 * Returns &struct platform_device pointer on success, or ERR_PTR() on error. 159 */ 160static inline struct platform_device *platform_device_register_data( 161 struct device *parent, const char *name, int id, 162 const void *data, size_t size) 163{ 164 return platform_device_register_resndata(parent, name, id, 165 NULL, 0, data, size); 166} 167 168extern struct platform_device *platform_device_alloc(const char *name, int id); 169extern int platform_device_add_resources(struct platform_device *pdev, 170 const struct resource *res, 171 unsigned int num); 172extern int platform_device_add_data(struct platform_device *pdev, 173 const void *data, size_t size); 174extern int platform_device_add_properties(struct platform_device *pdev, 175 const struct property_entry *properties); 176extern int platform_device_add(struct platform_device *pdev); 177extern void platform_device_del(struct platform_device *pdev); 178extern void platform_device_put(struct platform_device *pdev); 179 180struct platform_driver { 181 int (*probe)(struct platform_device *); 182 int (*remove)(struct platform_device *); 183 void (*shutdown)(struct platform_device *); 184 int (*suspend)(struct platform_device *, pm_message_t state); 185 int (*resume)(struct platform_device *); 186 struct device_driver driver; 187 const struct platform_device_id *id_table; 188 bool prevent_deferred_probe; 189}; 190 191#define to_platform_driver(drv) (container_of((drv), struct platform_driver, \ 192 driver)) 193 194/* 195 * use a macro to avoid include chaining to get THIS_MODULE 196 */ 197#define platform_driver_register(drv) \ 198 __platform_driver_register(drv, THIS_MODULE) 199extern int __platform_driver_register(struct platform_driver *, 200 struct module *); 201extern void platform_driver_unregister(struct platform_driver *); 202 203/* non-hotpluggable platform devices may use this so that probe() and 204 * its support may live in __init sections, conserving runtime memory. 205 */ 206#define platform_driver_probe(drv, probe) \ 207 __platform_driver_probe(drv, probe, THIS_MODULE) 208extern int __platform_driver_probe(struct platform_driver *driver, 209 int (*probe)(struct platform_device *), struct module *module); 210 211static inline void *platform_get_drvdata(const struct platform_device *pdev) 212{ 213 return dev_get_drvdata(&pdev->dev); 214} 215 216static inline void platform_set_drvdata(struct platform_device *pdev, 217 void *data) 218{ 219 dev_set_drvdata(&pdev->dev, data); 220} 221 222/* module_platform_driver() - Helper macro for drivers that don't do 223 * anything special in module init/exit. This eliminates a lot of 224 * boilerplate. Each module may only use this macro once, and 225 * calling it replaces module_init() and module_exit() 226 */ 227#define module_platform_driver(__platform_driver) \ 228 module_driver(__platform_driver, platform_driver_register, \ 229 platform_driver_unregister) 230 231/* builtin_platform_driver() - Helper macro for builtin drivers that 232 * don't do anything special in driver init. This eliminates some 233 * boilerplate. Each driver may only use this macro once, and 234 * calling it replaces device_initcall(). Note this is meant to be 235 * a parallel of module_platform_driver() above, but w/o _exit stuff. 236 */ 237#define builtin_platform_driver(__platform_driver) \ 238 builtin_driver(__platform_driver, platform_driver_register) 239 240/* module_platform_driver_probe() - Helper macro for drivers that don't do 241 * anything special in module init/exit. This eliminates a lot of 242 * boilerplate. Each module may only use this macro once, and 243 * calling it replaces module_init() and module_exit() 244 */ 245#define module_platform_driver_probe(__platform_driver, __platform_probe) \ 246static int __init __platform_driver##_init(void) \ 247{ \ 248 return platform_driver_probe(&(__platform_driver), \ 249 __platform_probe); \ 250} \ 251module_init(__platform_driver##_init); \ 252static void __exit __platform_driver##_exit(void) \ 253{ \ 254 platform_driver_unregister(&(__platform_driver)); \ 255} \ 256module_exit(__platform_driver##_exit); 257 258/* builtin_platform_driver_probe() - Helper macro for drivers that don't do 259 * anything special in device init. This eliminates some boilerplate. Each 260 * driver may only use this macro once, and using it replaces device_initcall. 261 * This is meant to be a parallel of module_platform_driver_probe above, but 262 * without the __exit parts. 263 */ 264#define builtin_platform_driver_probe(__platform_driver, __platform_probe) \ 265static int __init __platform_driver##_init(void) \ 266{ \ 267 return platform_driver_probe(&(__platform_driver), \ 268 __platform_probe); \ 269} \ 270device_initcall(__platform_driver##_init); \ 271 272#define platform_create_bundle(driver, probe, res, n_res, data, size) \ 273 __platform_create_bundle(driver, probe, res, n_res, data, size, THIS_MODULE) 274extern struct platform_device *__platform_create_bundle( 275 struct platform_driver *driver, int (*probe)(struct platform_device *), 276 struct resource *res, unsigned int n_res, 277 const void *data, size_t size, struct module *module); 278 279int __platform_register_drivers(struct platform_driver * const *drivers, 280 unsigned int count, struct module *owner); 281void platform_unregister_drivers(struct platform_driver * const *drivers, 282 unsigned int count); 283 284#define platform_register_drivers(drivers, count) \ 285 __platform_register_drivers(drivers, count, THIS_MODULE) 286 287/* early platform driver interface */ 288struct early_platform_driver { 289 const char *class_str; 290 struct platform_driver *pdrv; 291 struct list_head list; 292 int requested_id; 293 char *buffer; 294 int bufsize; 295}; 296 297#define EARLY_PLATFORM_ID_UNSET -2 298#define EARLY_PLATFORM_ID_ERROR -3 299 300extern int early_platform_driver_register(struct early_platform_driver *epdrv, 301 char *buf); 302extern void early_platform_add_devices(struct platform_device **devs, int num); 303 304static inline int is_early_platform_device(struct platform_device *pdev) 305{ 306 return !pdev->dev.driver; 307} 308 309extern void early_platform_driver_register_all(char *class_str); 310extern int early_platform_driver_probe(char *class_str, 311 int nr_probe, int user_only); 312extern void early_platform_cleanup(void); 313 314#define early_platform_init(class_string, platdrv) \ 315 early_platform_init_buffer(class_string, platdrv, NULL, 0) 316 317#ifndef MODULE 318#define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \ 319static __initdata struct early_platform_driver early_driver = { \ 320 .class_str = class_string, \ 321 .buffer = buf, \ 322 .bufsize = bufsiz, \ 323 .pdrv = platdrv, \ 324 .requested_id = EARLY_PLATFORM_ID_UNSET, \ 325}; \ 326static int __init early_platform_driver_setup_func(char *buffer) \ 327{ \ 328 return early_platform_driver_register(&early_driver, buffer); \ 329} \ 330early_param(class_string, early_platform_driver_setup_func) 331#else /* MODULE */ 332#define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \ 333static inline char *early_platform_driver_setup_func(void) \ 334{ \ 335 return bufsiz ? buf : NULL; \ 336} 337#endif /* MODULE */ 338 339#ifdef CONFIG_SUSPEND 340extern int platform_pm_suspend(struct device *dev); 341extern int platform_pm_resume(struct device *dev); 342#else 343#define platform_pm_suspend NULL 344#define platform_pm_resume NULL 345#endif 346 347#ifdef CONFIG_HIBERNATE_CALLBACKS 348extern int platform_pm_freeze(struct device *dev); 349extern int platform_pm_thaw(struct device *dev); 350extern int platform_pm_poweroff(struct device *dev); 351extern int platform_pm_restore(struct device *dev); 352#else 353#define platform_pm_freeze NULL 354#define platform_pm_thaw NULL 355#define platform_pm_poweroff NULL 356#define platform_pm_restore NULL 357#endif 358 359#ifdef CONFIG_PM_SLEEP 360#define USE_PLATFORM_PM_SLEEP_OPS \ 361 .suspend = platform_pm_suspend, \ 362 .resume = platform_pm_resume, \ 363 .freeze = platform_pm_freeze, \ 364 .thaw = platform_pm_thaw, \ 365 .poweroff = platform_pm_poweroff, \ 366 .restore = platform_pm_restore, 367#else 368#define USE_PLATFORM_PM_SLEEP_OPS 369#endif 370 371#endif /* _PLATFORM_DEVICE_H_ */