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 */
20struct 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. */
56extern 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 */
72static 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