18c2ecf20Sopenharmony_ci/* SPDX--License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#ifndef __PLATFORM_EARLY__
48c2ecf20Sopenharmony_ci#define __PLATFORM_EARLY__
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/types.h>
78c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
88c2ecf20Sopenharmony_ci#include <linux/pm_runtime.h>
98c2ecf20Sopenharmony_ci#include <linux/slab.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct sh_early_platform_driver {
128c2ecf20Sopenharmony_ci	const char *class_str;
138c2ecf20Sopenharmony_ci	struct platform_driver *pdrv;
148c2ecf20Sopenharmony_ci	struct list_head list;
158c2ecf20Sopenharmony_ci	int requested_id;
168c2ecf20Sopenharmony_ci	char *buffer;
178c2ecf20Sopenharmony_ci	int bufsize;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define EARLY_PLATFORM_ID_UNSET -2
218c2ecf20Sopenharmony_ci#define EARLY_PLATFORM_ID_ERROR -3
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciextern int sh_early_platform_driver_register(struct sh_early_platform_driver *epdrv,
248c2ecf20Sopenharmony_ci					  char *buf);
258c2ecf20Sopenharmony_ciextern void sh_early_platform_add_devices(struct platform_device **devs, int num);
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistatic inline int is_sh_early_platform_device(struct platform_device *pdev)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	return !pdev->dev.driver;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ciextern void sh_early_platform_driver_register_all(char *class_str);
338c2ecf20Sopenharmony_ciextern int sh_early_platform_driver_probe(char *class_str,
348c2ecf20Sopenharmony_ci				       int nr_probe, int user_only);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define sh_early_platform_init(class_string, platdrv)		\
378c2ecf20Sopenharmony_ci	sh_early_platform_init_buffer(class_string, platdrv, NULL, 0)
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#ifndef MODULE
408c2ecf20Sopenharmony_ci#define sh_early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
418c2ecf20Sopenharmony_cistatic __initdata struct sh_early_platform_driver early_driver = {		\
428c2ecf20Sopenharmony_ci	.class_str = class_string,					\
438c2ecf20Sopenharmony_ci	.buffer = buf,							\
448c2ecf20Sopenharmony_ci	.bufsize = bufsiz,						\
458c2ecf20Sopenharmony_ci	.pdrv = platdrv,						\
468c2ecf20Sopenharmony_ci	.requested_id = EARLY_PLATFORM_ID_UNSET,			\
478c2ecf20Sopenharmony_ci};									\
488c2ecf20Sopenharmony_cistatic int __init sh_early_platform_driver_setup_func(char *buffer)	\
498c2ecf20Sopenharmony_ci{									\
508c2ecf20Sopenharmony_ci	return sh_early_platform_driver_register(&early_driver, buffer);	\
518c2ecf20Sopenharmony_ci}									\
528c2ecf20Sopenharmony_ciearly_param(class_string, sh_early_platform_driver_setup_func)
538c2ecf20Sopenharmony_ci#else /* MODULE */
548c2ecf20Sopenharmony_ci#define sh_early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
558c2ecf20Sopenharmony_cistatic inline char *sh_early_platform_driver_setup_func(void)		\
568c2ecf20Sopenharmony_ci{									\
578c2ecf20Sopenharmony_ci	return bufsiz ? buf : NULL;					\
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ci#endif /* MODULE */
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#endif /* __PLATFORM_EARLY__ */
62