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  */
register_firmware_ops(const struct firmware_ops * ops)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
80