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 80