linux/include/linux/platform_device.h
<<
>>
Prefs
   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_set;
  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                const struct property_set *pset;
  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_set *pset);
 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_ */
 372