155716d26SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2bbbf508dSRussell King /*
3bbbf508dSRussell King * platform_device.h - generic, centralized driver model
4bbbf508dSRussell King *
5bbbf508dSRussell King * Copyright (c) 2001-2003 Patrick Mochel <[email protected]>
6bbbf508dSRussell King *
7fe34c89dSMauro Carvalho Chehab * See Documentation/driver-api/driver-model/ for more information.
8bbbf508dSRussell King */
9bbbf508dSRussell King
10bbbf508dSRussell King #ifndef _PLATFORM_DEVICE_H_
11bbbf508dSRussell King #define _PLATFORM_DEVICE_H_
12bbbf508dSRussell King
13bbbf508dSRussell King #include <linux/device.h>
14bbbf508dSRussell King
15689ae231SJean Delvare #define PLATFORM_DEVID_NONE (-1)
16689ae231SJean Delvare #define PLATFORM_DEVID_AUTO (-2)
17689ae231SJean Delvare
18e15f2fa9SJohn Garry struct irq_affinity;
19e710d7d5SSamuel Ortiz struct mfd_cell;
20f4d05266SHeikki Krogerus struct property_entry;
21ac316725SRandy Dunlap struct platform_device_id;
22e710d7d5SSamuel Ortiz
23bbbf508dSRussell King struct platform_device {
24bbbf508dSRussell King const char *name;
251359555eSJean Delvare int id;
26689ae231SJean Delvare bool id_auto;
27bbbf508dSRussell King struct device dev;
28e3a36eb6SChristoph Hellwig u64 platform_dma_mask;
299495b7e9SUlf Hansson struct device_dma_parameters dma_parms;
30bbbf508dSRussell King u32 num_resources;
31bbbf508dSRussell King struct resource *resource;
3257fee4a5SEric Miao
333d03ba4dSEric Miao const struct platform_device_id *id_entry;
346c2f4211SKrzysztof Kozlowski /*
356c2f4211SKrzysztof Kozlowski * Driver name to force a match. Do not set directly, because core
366c2f4211SKrzysztof Kozlowski * frees it. Use driver_set_override() to set or clear it.
376c2f4211SKrzysztof Kozlowski */
386c2f4211SKrzysztof Kozlowski const char *driver_override;
39d7aacaddSMagnus Damm
40e710d7d5SSamuel Ortiz /* MFD cell pointer */
41e710d7d5SSamuel Ortiz struct mfd_cell *mfd_cell;
42e710d7d5SSamuel Ortiz
43d7aacaddSMagnus Damm /* arch specific additions */
44d7aacaddSMagnus Damm struct pdev_archdata archdata;
45bbbf508dSRussell King };
46bbbf508dSRussell King
4757fee4a5SEric Miao #define platform_get_device_id(pdev) ((pdev)->id_entry)
4857fee4a5SEric Miao
49719cf71cSAndy Shevchenko #define dev_is_platform(dev) ((dev)->bus == &platform_bus_type)
50bbbf508dSRussell King #define to_platform_device(x) container_of((x), struct platform_device, dev)
51bbbf508dSRussell King
52bbbf508dSRussell King extern int platform_device_register(struct platform_device *);
53bbbf508dSRussell King extern void platform_device_unregister(struct platform_device *);
54bbbf508dSRussell King
55*24e041e1SKunwu Chan extern const struct bus_type platform_bus_type;
56bbbf508dSRussell King extern struct device platform_bus;
57bbbf508dSRussell King
586ae07f27SFabio Porcedda extern struct resource *platform_get_resource(struct platform_device *,
596ae07f27SFabio Porcedda unsigned int, unsigned int);
600aec2da4SAndy Shevchenko extern struct resource *platform_get_mem_or_io(struct platform_device *,
610aec2da4SAndy Shevchenko unsigned int);
620aec2da4SAndy Shevchenko
6336f3313dSSuzuki K Poulose extern struct device *
6436f3313dSSuzuki K Poulose platform_find_device_by_driver(struct device *start,
6536f3313dSSuzuki K Poulose const struct device_driver *drv);
66a0c74f6cSMark Brown
67a0c74f6cSMark Brown #ifdef CONFIG_HAS_IOMEM
687945f929SBartosz Golaszewski extern void __iomem *
69890cc39aSDejin Zheng devm_platform_get_and_ioremap_resource(struct platform_device *pdev,
70890cc39aSDejin Zheng unsigned int index, struct resource **res);
71890cc39aSDejin Zheng extern void __iomem *
727945f929SBartosz Golaszewski devm_platform_ioremap_resource(struct platform_device *pdev,
737945f929SBartosz Golaszewski unsigned int index);
74bb6243b4SBartosz Golaszewski extern void __iomem *
75c9c8641dSBartosz Golaszewski devm_platform_ioremap_resource_byname(struct platform_device *pdev,
76c9c8641dSBartosz Golaszewski const char *name);
77a0c74f6cSMark Brown #else
78a0c74f6cSMark Brown
79a0c74f6cSMark Brown static inline void __iomem *
devm_platform_get_and_ioremap_resource(struct platform_device * pdev,unsigned int index,struct resource ** res)80a0c74f6cSMark Brown devm_platform_get_and_ioremap_resource(struct platform_device *pdev,
81a0c74f6cSMark Brown unsigned int index, struct resource **res)
82a0c74f6cSMark Brown {
83a0c74f6cSMark Brown return ERR_PTR(-EINVAL);
84a0c74f6cSMark Brown }
85a0c74f6cSMark Brown
86a0c74f6cSMark Brown
87a0c74f6cSMark Brown static inline void __iomem *
devm_platform_ioremap_resource(struct platform_device * pdev,unsigned int index)88a0c74f6cSMark Brown devm_platform_ioremap_resource(struct platform_device *pdev,
89a0c74f6cSMark Brown unsigned int index)
90a0c74f6cSMark Brown {
91a0c74f6cSMark Brown return ERR_PTR(-EINVAL);
92a0c74f6cSMark Brown }
93a0c74f6cSMark Brown
94a0c74f6cSMark Brown static inline void __iomem *
devm_platform_ioremap_resource_byname(struct platform_device * pdev,const char * name)95a0c74f6cSMark Brown devm_platform_ioremap_resource_byname(struct platform_device *pdev,
96a0c74f6cSMark Brown const char *name)
97a0c74f6cSMark Brown {
98a0c74f6cSMark Brown return ERR_PTR(-EINVAL);
99a0c74f6cSMark Brown }
100a0c74f6cSMark Brown
101a0c74f6cSMark Brown #endif
102a0c74f6cSMark Brown
103bbbf508dSRussell King extern int platform_get_irq(struct platform_device *, unsigned int);
1048973ea47SThierry Reding extern int platform_get_irq_optional(struct platform_device *, unsigned int);
1054b83555dSStephen Boyd extern int platform_irq_count(struct platform_device *);
106e15f2fa9SJohn Garry extern int devm_platform_get_irqs_affinity(struct platform_device *dev,
107e15f2fa9SJohn Garry struct irq_affinity *affd,
108e15f2fa9SJohn Garry unsigned int minvec,
109e15f2fa9SJohn Garry unsigned int maxvec,
110e15f2fa9SJohn Garry int **irqs);
1116ae07f27SFabio Porcedda extern struct resource *platform_get_resource_byname(struct platform_device *,
1126ae07f27SFabio Porcedda unsigned int,
1136ae07f27SFabio Porcedda const char *);
114c0afe7baSLinus Walleij extern int platform_get_irq_byname(struct platform_device *, const char *);
115f1da567fSHans de Goede extern int platform_get_irq_byname_optional(struct platform_device *dev,
116f1da567fSHans de Goede const char *name);
117bbbf508dSRussell King extern int platform_add_devices(struct platform_device **, int);
118bbbf508dSRussell King
11901dcc60aSUwe Kleine-König struct platform_device_info {
12001dcc60aSUwe Kleine-König struct device *parent;
121ce793486SRafael J. Wysocki struct fwnode_handle *fwnode;
1222c1ea6abSMans Rullgard bool of_node_reused;
12301dcc60aSUwe Kleine-König
12401dcc60aSUwe Kleine-König const char *name;
12501dcc60aSUwe Kleine-König int id;
12601dcc60aSUwe Kleine-König
12701dcc60aSUwe Kleine-König const struct resource *res;
12801dcc60aSUwe Kleine-König unsigned int num_res;
12901dcc60aSUwe Kleine-König
13001dcc60aSUwe Kleine-König const void *data;
13101dcc60aSUwe Kleine-König size_t size_data;
13201dcc60aSUwe Kleine-König u64 dma_mask;
13300bbc1d8SMika Westerberg
134469e1906STomas Winkler const struct property_entry *properties;
13501dcc60aSUwe Kleine-König };
13601dcc60aSUwe Kleine-König extern struct platform_device *platform_device_register_full(
1375a3072beSUwe Kleine-König const struct platform_device_info *pdevinfo);
13801dcc60aSUwe Kleine-König
13901dcc60aSUwe Kleine-König /**
14001dcc60aSUwe Kleine-König * platform_device_register_resndata - add a platform-level device with
14101dcc60aSUwe Kleine-König * resources and platform-specific data
14201dcc60aSUwe Kleine-König *
14301dcc60aSUwe Kleine-König * @parent: parent device for the device we're adding
14401dcc60aSUwe Kleine-König * @name: base name of the device we're adding
14501dcc60aSUwe Kleine-König * @id: instance id
14601dcc60aSUwe Kleine-König * @res: set of resources that needs to be allocated for the device
14701dcc60aSUwe Kleine-König * @num: number of resources
14801dcc60aSUwe Kleine-König * @data: platform specific data for this platform device
14901dcc60aSUwe Kleine-König * @size: size of platform specific data
15001dcc60aSUwe Kleine-König *
15101dcc60aSUwe Kleine-König * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
15201dcc60aSUwe Kleine-König */
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)15301dcc60aSUwe Kleine-König static inline struct platform_device *platform_device_register_resndata(
15444f28bdeSUwe Kleine-König struct device *parent, const char *name, int id,
15544f28bdeSUwe Kleine-König const struct resource *res, unsigned int num,
15601dcc60aSUwe Kleine-König const void *data, size_t size) {
15701dcc60aSUwe Kleine-König
15801dcc60aSUwe Kleine-König struct platform_device_info pdevinfo = {
15901dcc60aSUwe Kleine-König .parent = parent,
16001dcc60aSUwe Kleine-König .name = name,
16101dcc60aSUwe Kleine-König .id = id,
16201dcc60aSUwe Kleine-König .res = res,
16301dcc60aSUwe Kleine-König .num_res = num,
16401dcc60aSUwe Kleine-König .data = data,
16501dcc60aSUwe Kleine-König .size_data = size,
16601dcc60aSUwe Kleine-König .dma_mask = 0,
16701dcc60aSUwe Kleine-König };
16801dcc60aSUwe Kleine-König
16901dcc60aSUwe Kleine-König return platform_device_register_full(&pdevinfo);
17001dcc60aSUwe Kleine-König }
17144f28bdeSUwe Kleine-König
17244f28bdeSUwe Kleine-König /**
17344f28bdeSUwe Kleine-König * platform_device_register_simple - add a platform-level device and its resources
17444f28bdeSUwe Kleine-König * @name: base name of the device we're adding
17544f28bdeSUwe Kleine-König * @id: instance id
17644f28bdeSUwe Kleine-König * @res: set of resources that needs to be allocated for the device
17744f28bdeSUwe Kleine-König * @num: number of resources
17844f28bdeSUwe Kleine-König *
17944f28bdeSUwe Kleine-König * This function creates a simple platform device that requires minimal
18044f28bdeSUwe Kleine-König * resource and memory management. Canned release function freeing memory
18144f28bdeSUwe Kleine-König * allocated for the device allows drivers using such devices to be
18244f28bdeSUwe Kleine-König * unloaded without waiting for the last reference to the device to be
18344f28bdeSUwe Kleine-König * dropped.
18444f28bdeSUwe Kleine-König *
18544f28bdeSUwe Kleine-König * This interface is primarily intended for use with legacy drivers which
18644f28bdeSUwe Kleine-König * probe hardware directly. Because such drivers create sysfs device nodes
18744f28bdeSUwe Kleine-König * themselves, rather than letting system infrastructure handle such device
18844f28bdeSUwe Kleine-König * enumeration tasks, they don't fully conform to the Linux driver model.
18944f28bdeSUwe Kleine-König * In particular, when such drivers are built as modules, they can't be
19044f28bdeSUwe Kleine-König * "hotplugged".
19144f28bdeSUwe Kleine-König *
19244f28bdeSUwe Kleine-König * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
19344f28bdeSUwe Kleine-König */
platform_device_register_simple(const char * name,int id,const struct resource * res,unsigned int num)19444f28bdeSUwe Kleine-König static inline struct platform_device *platform_device_register_simple(
19544f28bdeSUwe Kleine-König const char *name, int id,
19644f28bdeSUwe Kleine-König const struct resource *res, unsigned int num)
19744f28bdeSUwe Kleine-König {
19844f28bdeSUwe Kleine-König return platform_device_register_resndata(NULL, name, id,
19944f28bdeSUwe Kleine-König res, num, NULL, 0);
20044f28bdeSUwe Kleine-König }
20144f28bdeSUwe Kleine-König
20244f28bdeSUwe Kleine-König /**
20344f28bdeSUwe Kleine-König * platform_device_register_data - add a platform-level device with platform-specific data
20444f28bdeSUwe Kleine-König * @parent: parent device for the device we're adding
20544f28bdeSUwe Kleine-König * @name: base name of the device we're adding
20644f28bdeSUwe Kleine-König * @id: instance id
20744f28bdeSUwe Kleine-König * @data: platform specific data for this platform device
20844f28bdeSUwe Kleine-König * @size: size of platform specific data
20944f28bdeSUwe Kleine-König *
21044f28bdeSUwe Kleine-König * This function creates a simple platform device that requires minimal
21144f28bdeSUwe Kleine-König * resource and memory management. Canned release function freeing memory
21244f28bdeSUwe Kleine-König * allocated for the device allows drivers using such devices to be
21344f28bdeSUwe Kleine-König * unloaded without waiting for the last reference to the device to be
21444f28bdeSUwe Kleine-König * dropped.
21544f28bdeSUwe Kleine-König *
21644f28bdeSUwe Kleine-König * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
21744f28bdeSUwe Kleine-König */
platform_device_register_data(struct device * parent,const char * name,int id,const void * data,size_t size)21844f28bdeSUwe Kleine-König static inline struct platform_device *platform_device_register_data(
21944f28bdeSUwe Kleine-König struct device *parent, const char *name, int id,
22044f28bdeSUwe Kleine-König const void *data, size_t size)
22144f28bdeSUwe Kleine-König {
22244f28bdeSUwe Kleine-König return platform_device_register_resndata(parent, name, id,
22344f28bdeSUwe Kleine-König NULL, 0, data, size);
22444f28bdeSUwe Kleine-König }
225bbbf508dSRussell King
2261359555eSJean Delvare extern struct platform_device *platform_device_alloc(const char *name, int id);
2270b7f1a7eSGeert Uytterhoeven extern int platform_device_add_resources(struct platform_device *pdev,
2280b7f1a7eSGeert Uytterhoeven const struct resource *res,
2290b7f1a7eSGeert Uytterhoeven unsigned int num);
2306ae07f27SFabio Porcedda extern int platform_device_add_data(struct platform_device *pdev,
2316ae07f27SFabio Porcedda const void *data, size_t size);
23237c12e74SRussell King extern int platform_device_add(struct platform_device *pdev);
23393ce3061SDmitry Torokhov extern void platform_device_del(struct platform_device *pdev);
23437c12e74SRussell King extern void platform_device_put(struct platform_device *pdev);
23537c12e74SRussell King
23600d3dcddSRussell King struct platform_driver {
23700d3dcddSRussell King int (*probe)(struct platform_device *);
2380edb555aSUwe Kleine-König void (*remove)(struct platform_device *);
23900d3dcddSRussell King void (*shutdown)(struct platform_device *);
24000d3dcddSRussell King int (*suspend)(struct platform_device *, pm_message_t state);
24100d3dcddSRussell King int (*resume)(struct platform_device *);
24200d3dcddSRussell King struct device_driver driver;
243831fad2fSUwe Kleine-König const struct platform_device_id *id_table;
2443f9120b0SJohan Hovold bool prevent_deferred_probe;
245512881eaSLu Baolu /*
246512881eaSLu Baolu * For most device drivers, no need to care about this flag as long as
247512881eaSLu Baolu * all DMAs are handled through the kernel DMA API. For some special
248512881eaSLu Baolu * ones, for example VFIO drivers, they know how to manage the DMA
249512881eaSLu Baolu * themselves and set this flag so that the IOMMU layer will allow them
250512881eaSLu Baolu * to setup and manage their own I/O address space.
251512881eaSLu Baolu */
252512881eaSLu Baolu bool driver_managed_dma;
25300d3dcddSRussell King };
25400d3dcddSRussell King
25510dbc5e3SRob Herring #define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
25610dbc5e3SRob Herring driver))
25710dbc5e3SRob Herring
2589447057eSLibo Chen /*
2599447057eSLibo Chen * use a macro to avoid include chaining to get THIS_MODULE
2609447057eSLibo Chen */
2619447057eSLibo Chen #define platform_driver_register(drv) \
2629447057eSLibo Chen __platform_driver_register(drv, THIS_MODULE)
2639447057eSLibo Chen extern int __platform_driver_register(struct platform_driver *,
2649447057eSLibo Chen struct module *);
26500d3dcddSRussell King extern void platform_driver_unregister(struct platform_driver *);
26600d3dcddSRussell King
267c67334fbSDavid Brownell /* non-hotpluggable platform devices may use this so that probe() and
268c67334fbSDavid Brownell * its support may live in __init sections, conserving runtime memory.
269c67334fbSDavid Brownell */
270c3b50dc2SWolfram Sang #define platform_driver_probe(drv, probe) \
271c3b50dc2SWolfram Sang __platform_driver_probe(drv, probe, THIS_MODULE)
272c3b50dc2SWolfram Sang extern int __platform_driver_probe(struct platform_driver *driver,
273c3b50dc2SWolfram Sang int (*probe)(struct platform_device *), struct module *module);
274c67334fbSDavid Brownell
platform_get_drvdata(const struct platform_device * pdev)27571d64290SMarc Kleine-Budde static inline void *platform_get_drvdata(const struct platform_device *pdev)
27671d64290SMarc Kleine-Budde {
27771d64290SMarc Kleine-Budde return dev_get_drvdata(&pdev->dev);
27871d64290SMarc Kleine-Budde }
27971d64290SMarc Kleine-Budde
platform_set_drvdata(struct platform_device * pdev,void * data)2806ae07f27SFabio Porcedda static inline void platform_set_drvdata(struct platform_device *pdev,
2816ae07f27SFabio Porcedda void *data)
28271d64290SMarc Kleine-Budde {
28371d64290SMarc Kleine-Budde dev_set_drvdata(&pdev->dev, data);
28471d64290SMarc Kleine-Budde }
28500d3dcddSRussell King
286940ab889SGrant Likely /* module_platform_driver() - Helper macro for drivers that don't do
287940ab889SGrant Likely * anything special in module init/exit. This eliminates a lot of
288940ab889SGrant Likely * boilerplate. Each module may only use this macro once, and
289940ab889SGrant Likely * calling it replaces module_init() and module_exit()
290940ab889SGrant Likely */
291940ab889SGrant Likely #define module_platform_driver(__platform_driver) \
292907d0ed1SLars-Peter Clausen module_driver(__platform_driver, platform_driver_register, \
293907d0ed1SLars-Peter Clausen platform_driver_unregister)
294940ab889SGrant Likely
295f309d444SPaul Gortmaker /* builtin_platform_driver() - Helper macro for builtin drivers that
296f309d444SPaul Gortmaker * don't do anything special in driver init. This eliminates some
297f309d444SPaul Gortmaker * boilerplate. Each driver may only use this macro once, and
298f309d444SPaul Gortmaker * calling it replaces device_initcall(). Note this is meant to be
299f309d444SPaul Gortmaker * a parallel of module_platform_driver() above, but w/o _exit stuff.
300f309d444SPaul Gortmaker */
301f309d444SPaul Gortmaker #define builtin_platform_driver(__platform_driver) \
302f309d444SPaul Gortmaker builtin_driver(__platform_driver, platform_driver_register)
303f309d444SPaul Gortmaker
304bab734fcSFabio Porcedda /* module_platform_driver_probe() - Helper macro for drivers that don't do
305bab734fcSFabio Porcedda * anything special in module init/exit. This eliminates a lot of
306bab734fcSFabio Porcedda * boilerplate. Each module may only use this macro once, and
307bab734fcSFabio Porcedda * calling it replaces module_init() and module_exit()
308bab734fcSFabio Porcedda */
309bab734fcSFabio Porcedda #define module_platform_driver_probe(__platform_driver, __platform_probe) \
310bab734fcSFabio Porcedda static int __init __platform_driver##_init(void) \
311bab734fcSFabio Porcedda { \
312bab734fcSFabio Porcedda return platform_driver_probe(&(__platform_driver), \
313bab734fcSFabio Porcedda __platform_probe); \
314bab734fcSFabio Porcedda } \
315bab734fcSFabio Porcedda module_init(__platform_driver##_init); \
316bab734fcSFabio Porcedda static void __exit __platform_driver##_exit(void) \
317bab734fcSFabio Porcedda { \
318bab734fcSFabio Porcedda platform_driver_unregister(&(__platform_driver)); \
319bab734fcSFabio Porcedda } \
320bab734fcSFabio Porcedda module_exit(__platform_driver##_exit);
321bab734fcSFabio Porcedda
322f309d444SPaul Gortmaker /* builtin_platform_driver_probe() - Helper macro for drivers that don't do
323f309d444SPaul Gortmaker * anything special in device init. This eliminates some boilerplate. Each
324f309d444SPaul Gortmaker * driver may only use this macro once, and using it replaces device_initcall.
325f309d444SPaul Gortmaker * This is meant to be a parallel of module_platform_driver_probe above, but
326f309d444SPaul Gortmaker * without the __exit parts.
327f309d444SPaul Gortmaker */
328f309d444SPaul Gortmaker #define builtin_platform_driver_probe(__platform_driver, __platform_probe) \
329f309d444SPaul Gortmaker static int __init __platform_driver##_init(void) \
330f309d444SPaul Gortmaker { \
331f309d444SPaul Gortmaker return platform_driver_probe(&(__platform_driver), \
332f309d444SPaul Gortmaker __platform_probe); \
333f309d444SPaul Gortmaker } \
334f309d444SPaul Gortmaker device_initcall(__platform_driver##_init); \
335f309d444SPaul Gortmaker
336291f653aSWolfram Sang #define platform_create_bundle(driver, probe, res, n_res, data, size) \
337291f653aSWolfram Sang __platform_create_bundle(driver, probe, res, n_res, data, size, THIS_MODULE)
338291f653aSWolfram Sang extern struct platform_device *__platform_create_bundle(
3396ae07f27SFabio Porcedda struct platform_driver *driver, int (*probe)(struct platform_device *),
340ecdf6cebSDmitry Torokhov struct resource *res, unsigned int n_res,
341291f653aSWolfram Sang const void *data, size_t size, struct module *module);
342ecdf6cebSDmitry Torokhov
343dbe2256dSThierry Reding int __platform_register_drivers(struct platform_driver * const *drivers,
344dbe2256dSThierry Reding unsigned int count, struct module *owner);
345dbe2256dSThierry Reding void platform_unregister_drivers(struct platform_driver * const *drivers,
346dbe2256dSThierry Reding unsigned int count);
347dbe2256dSThierry Reding
348dbe2256dSThierry Reding #define platform_register_drivers(drivers, count) \
349dbe2256dSThierry Reding __platform_register_drivers(drivers, count, THIS_MODULE)
350dbe2256dSThierry Reding
35169c9dd1eSRafael J. Wysocki #ifdef CONFIG_SUSPEND
35269c9dd1eSRafael J. Wysocki extern int platform_pm_suspend(struct device *dev);
35369c9dd1eSRafael J. Wysocki extern int platform_pm_resume(struct device *dev);
35469c9dd1eSRafael J. Wysocki #else
35569c9dd1eSRafael J. Wysocki #define platform_pm_suspend NULL
35669c9dd1eSRafael J. Wysocki #define platform_pm_resume NULL
35769c9dd1eSRafael J. Wysocki #endif
35869c9dd1eSRafael J. Wysocki
35969c9dd1eSRafael J. Wysocki #ifdef CONFIG_HIBERNATE_CALLBACKS
36069c9dd1eSRafael J. Wysocki extern int platform_pm_freeze(struct device *dev);
36169c9dd1eSRafael J. Wysocki extern int platform_pm_thaw(struct device *dev);
36269c9dd1eSRafael J. Wysocki extern int platform_pm_poweroff(struct device *dev);
36369c9dd1eSRafael J. Wysocki extern int platform_pm_restore(struct device *dev);
36469c9dd1eSRafael J. Wysocki #else
36569c9dd1eSRafael J. Wysocki #define platform_pm_freeze NULL
36669c9dd1eSRafael J. Wysocki #define platform_pm_thaw NULL
36769c9dd1eSRafael J. Wysocki #define platform_pm_poweroff NULL
36869c9dd1eSRafael J. Wysocki #define platform_pm_restore NULL
36969c9dd1eSRafael J. Wysocki #endif
37069c9dd1eSRafael J. Wysocki
37169c9dd1eSRafael J. Wysocki #ifdef CONFIG_PM_SLEEP
37269c9dd1eSRafael J. Wysocki #define USE_PLATFORM_PM_SLEEP_OPS \
37369c9dd1eSRafael J. Wysocki .suspend = platform_pm_suspend, \
37469c9dd1eSRafael J. Wysocki .resume = platform_pm_resume, \
37569c9dd1eSRafael J. Wysocki .freeze = platform_pm_freeze, \
37669c9dd1eSRafael J. Wysocki .thaw = platform_pm_thaw, \
37769c9dd1eSRafael J. Wysocki .poweroff = platform_pm_poweroff, \
3789b39e73dSRafael J. Wysocki .restore = platform_pm_restore,
37969c9dd1eSRafael J. Wysocki #else
38069c9dd1eSRafael J. Wysocki #define USE_PLATFORM_PM_SLEEP_OPS
38169c9dd1eSRafael J. Wysocki #endif
38269c9dd1eSRafael J. Wysocki
383507fd01dSBartosz Golaszewski #ifndef CONFIG_SUPERH
384507fd01dSBartosz Golaszewski /*
385507fd01dSBartosz Golaszewski * REVISIT: This stub is needed for all non-SuperH users of early platform
386507fd01dSBartosz Golaszewski * drivers. It should go away once we introduce the new platform_device-based
387507fd01dSBartosz Golaszewski * early driver framework.
388507fd01dSBartosz Golaszewski */
is_sh_early_platform_device(struct platform_device * pdev)389201e9109SBartosz Golaszewski static inline int is_sh_early_platform_device(struct platform_device *pdev)
390507fd01dSBartosz Golaszewski {
391507fd01dSBartosz Golaszewski return 0;
392507fd01dSBartosz Golaszewski }
393507fd01dSBartosz Golaszewski #endif /* CONFIG_SUPERH */
394507fd01dSBartosz Golaszewski
3951768289bSAndy Shevchenko /* For now only SuperH uses it */
3961768289bSAndy Shevchenko void early_platform_cleanup(void);
3971768289bSAndy Shevchenko
398bbbf508dSRussell King #endif /* _PLATFORM_DEVICE_H_ */
399