Merge tag 'riscv-for-linus-5.9-mw1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / arch / arm / include / asm / firmware.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 Samsung Electronics.
4  * Kyungmin Park <kyungmin.park@samsung.com>
5  * Tomasz Figa <t.figa@samsung.com>
6  */
7
8 #ifndef __ASM_ARM_FIRMWARE_H
9 #define __ASM_ARM_FIRMWARE_H
10
11 #include <linux/bug.h>
12
13 /*
14  * struct firmware_ops
15  *
16  * A structure to specify available firmware operations.
17  *
18  * A filled up structure can be registered with register_firmware_ops().
19  */
20 struct firmware_ops {
21         /*
22          * Inform the firmware we intend to enter CPU idle mode
23          */
24         int (*prepare_idle)(unsigned long mode);
25         /*
26          * Enters CPU idle mode
27          */
28         int (*do_idle)(unsigned long mode);
29         /*
30          * Sets boot address of specified physical CPU
31          */
32         int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr);
33         /*
34          * Gets boot address of specified physical CPU
35          */
36         int (*get_cpu_boot_addr)(int cpu, unsigned long *boot_addr);
37         /*
38          * Boots specified physical CPU
39          */
40         int (*cpu_boot)(int cpu);
41         /*
42          * Initializes L2 cache
43          */
44         int (*l2x0_init)(void);
45         /*
46          * Enter system-wide suspend.
47          */
48         int (*suspend)(void);
49         /*
50          * Restore state of privileged hardware after system-wide suspend.
51          */
52         int (*resume)(void);
53 };
54
55 /* Global pointer for current firmware_ops structure, can't be NULL. */
56 extern const struct firmware_ops *firmware_ops;
57
58 /*
59  * call_firmware_op(op, ...)
60  *
61  * Checks if firmware operation is present and calls it,
62  * otherwise returns -ENOSYS
63  */
64 #define call_firmware_op(op, ...)                                       \
65         ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS))
66
67 /*
68  * register_firmware_ops(ops)
69  *
70  * A function to register platform firmware_ops struct.
71  */
72 static inline void register_firmware_ops(const struct firmware_ops *ops)
73 {
74         BUG_ON(!ops);
75
76         firmware_ops = ops;
77 }
78
79 #endif