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