blob: 23fe0bd405c708378292fc6bb988f00a8ab8f0e3 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Tomasz Figa7366b922012-12-11 13:58:43 +09002/*
3 * Copyright (C) 2012 Samsung Electronics.
4 * Kyungmin Park <kyungmin.park@samsung.com>
5 * Tomasz Figa <t.figa@samsung.com>
Tomasz Figa7366b922012-12-11 13:58:43 +09006 */
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 /*
Alexandre Courbotcd421452014-02-07 13:35:04 +090022 * Inform the firmware we intend to enter CPU idle mode
23 */
Dmitry Osipenko96446e22019-03-18 01:52:05 +030024 int (*prepare_idle)(unsigned long mode);
Alexandre Courbotcd421452014-02-07 13:35:04 +090025 /*
Tomasz Figa7366b922012-12-11 13:58:43 +090026 * Enters CPU idle mode
27 */
Bartlomiej Zolnierkiewicz0b7778a2014-09-25 17:59:41 +090028 int (*do_idle)(unsigned long mode);
Tomasz Figa7366b922012-12-11 13:58:43 +090029 /*
30 * Sets boot address of specified physical CPU
31 */
32 int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr);
33 /*
Bartlomiej Zolnierkiewicz1225ad72015-03-18 14:09:56 +010034 * Gets boot address of specified physical CPU
35 */
36 int (*get_cpu_boot_addr)(int cpu, unsigned long *boot_addr);
37 /*
Tomasz Figa7366b922012-12-11 13:58:43 +090038 * Boots specified physical CPU
39 */
40 int (*cpu_boot)(int cpu);
41 /*
42 * Initializes L2 cache
43 */
44 int (*l2x0_init)(void);
Tomasz Figa9c261f82014-09-24 01:24:35 +090045 /*
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);
Tomasz Figa7366b922012-12-11 13:58:43 +090053};
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