xref: /linux/include/linux/arm-smccc-bus.h (revision 303bff3637d13f0ecbb280c7cb403470c440a2a6)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2026 Arm Limited
4  */
5 #ifndef __LINUX_ARM_SMCCC_BUS_H
6 #define __LINUX_ARM_SMCCC_BUS_H
7 
8 #include <linux/device.h>
9 #include <linux/device-id/arm_smccc.h>
10 #include <linux/module.h>
11 
12 struct arm_smccc_device {
13 	struct device dev;
14 	u32 func_id;
15 };
16 
17 #define to_arm_smccc_device(d) container_of_const(d, struct arm_smccc_device, dev)
18 
19 struct arm_smccc_driver {
20 	struct device_driver driver;
21 
22 	const char *name;
23 	int (*probe)(struct arm_smccc_device *sdev);
24 	void (*remove)(struct arm_smccc_device *sdev);
25 	const struct arm_smccc_device_id *id_table;
26 };
27 
28 #define to_arm_smccc_driver(d) \
29 	container_of_const(d, struct arm_smccc_driver, driver)
30 
31 int arm_smccc_driver_register(struct arm_smccc_driver *driver,
32 		struct module *owner, const char *mod_name);
33 void arm_smccc_driver_unregister(struct arm_smccc_driver *driver);
34 struct arm_smccc_device *arm_smccc_device_register(const char *name, u32 func_id);
35 void arm_smccc_device_unregister(struct arm_smccc_device *smcc_dev);
36 
37 #define arm_smccc_register(driver) \
38 	arm_smccc_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
39 #define arm_smccc_unregister(driver) \
40 	arm_smccc_driver_unregister(driver)
41 
42 #define module_arm_smccc_driver(__arm_smccc_driver) \
43 	module_driver(__arm_smccc_driver, arm_smccc_register, \
44 		      arm_smccc_unregister)
45 
46 extern const struct bus_type arm_smccc_bus_type;
47 
48 #endif /* __LINUX_ARM_SMCCC_BUS_H */
49