summaryrefslogtreecommitdiff
path: root/include/linux/arm-smccc-bus.h
blob: 05c0c850510e05d2ebe1f8ceb557e48c3c8d7011 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2026 Arm Limited
 */
#ifndef __LINUX_ARM_SMCCC_BUS_H
#define __LINUX_ARM_SMCCC_BUS_H

#include <linux/device.h>
#include <linux/device-id/arm_smccc.h>
#include <linux/module.h>

struct arm_smccc_device {
	struct device dev;
	u32 func_id;
};

#define to_arm_smccc_device(d) container_of_const(d, struct arm_smccc_device, dev)

struct arm_smccc_driver {
	struct device_driver driver;

	const char *name;
	int (*probe)(struct arm_smccc_device *sdev);
	void (*remove)(struct arm_smccc_device *sdev);
	const struct arm_smccc_device_id *id_table;
};

#define to_arm_smccc_driver(d) \
	container_of_const(d, struct arm_smccc_driver, driver)

int arm_smccc_driver_register(struct arm_smccc_driver *driver,
		struct module *owner, const char *mod_name);
void arm_smccc_driver_unregister(struct arm_smccc_driver *driver);
struct arm_smccc_device *arm_smccc_device_register(const char *name, u32 func_id);
void arm_smccc_device_unregister(struct arm_smccc_device *smcc_dev);

#define arm_smccc_register(driver) \
	arm_smccc_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
#define arm_smccc_unregister(driver) \
	arm_smccc_driver_unregister(driver)

#define module_arm_smccc_driver(__arm_smccc_driver) \
	module_driver(__arm_smccc_driver, arm_smccc_register, \
		      arm_smccc_unregister)

extern const struct bus_type arm_smccc_bus_type;

#endif /* __LINUX_ARM_SMCCC_BUS_H */