162306a36Sopenharmony_ci/* SPDX--License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __PLATFORM_EARLY__
462306a36Sopenharmony_ci#define __PLATFORM_EARLY__
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci#include <linux/platform_device.h>
862306a36Sopenharmony_ci#include <linux/pm_runtime.h>
962306a36Sopenharmony_ci#include <linux/slab.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct sh_early_platform_driver {
1262306a36Sopenharmony_ci	const char *class_str;
1362306a36Sopenharmony_ci	struct platform_driver *pdrv;
1462306a36Sopenharmony_ci	struct list_head list;
1562306a36Sopenharmony_ci	int requested_id;
1662306a36Sopenharmony_ci	char *buffer;
1762306a36Sopenharmony_ci	int bufsize;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define EARLY_PLATFORM_ID_UNSET -2
2162306a36Sopenharmony_ci#define EARLY_PLATFORM_ID_ERROR -3
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciextern int sh_early_platform_driver_register(struct sh_early_platform_driver *epdrv,
2462306a36Sopenharmony_ci					  char *buf);
2562306a36Sopenharmony_ciextern void sh_early_platform_add_devices(struct platform_device **devs, int num);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic inline int is_sh_early_platform_device(struct platform_device *pdev)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	return !pdev->dev.driver;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciextern void sh_early_platform_driver_register_all(char *class_str);
3362306a36Sopenharmony_ciextern int sh_early_platform_driver_probe(char *class_str,
3462306a36Sopenharmony_ci				       int nr_probe, int user_only);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define sh_early_platform_init(class_string, platdrv)		\
3762306a36Sopenharmony_ci	sh_early_platform_init_buffer(class_string, platdrv, NULL, 0)
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#ifndef MODULE
4062306a36Sopenharmony_ci#define sh_early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
4162306a36Sopenharmony_cistatic __initdata struct sh_early_platform_driver early_driver = {		\
4262306a36Sopenharmony_ci	.class_str = class_string,					\
4362306a36Sopenharmony_ci	.buffer = buf,							\
4462306a36Sopenharmony_ci	.bufsize = bufsiz,						\
4562306a36Sopenharmony_ci	.pdrv = platdrv,						\
4662306a36Sopenharmony_ci	.requested_id = EARLY_PLATFORM_ID_UNSET,			\
4762306a36Sopenharmony_ci};									\
4862306a36Sopenharmony_cistatic int __init sh_early_platform_driver_setup_func(char *buffer)	\
4962306a36Sopenharmony_ci{									\
5062306a36Sopenharmony_ci	return sh_early_platform_driver_register(&early_driver, buffer);	\
5162306a36Sopenharmony_ci}									\
5262306a36Sopenharmony_ciearly_param(class_string, sh_early_platform_driver_setup_func)
5362306a36Sopenharmony_ci#else /* MODULE */
5462306a36Sopenharmony_ci#define sh_early_platform_init_buffer(class_string, platdrv, buf, bufsiz)	\
5562306a36Sopenharmony_cistatic inline char *sh_early_platform_driver_setup_func(void)		\
5662306a36Sopenharmony_ci{									\
5762306a36Sopenharmony_ci	return bufsiz ? buf : NULL;					\
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci#endif /* MODULE */
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#endif /* __PLATFORM_EARLY__ */
62