1 /* 2 * Copyright (C) 2012 Samsung Electronics. 3 * Kyungmin Park <kyungmin.park@samsung.com> 4 * Tomasz Figa <t.figa@samsung.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #ifndef __ASM_ARM_FIRMWARE_H 12 #define __ASM_ARM_FIRMWARE_H 13 14 #include <linux/bug.h> 15 16 /* 17 * struct firmware_ops 18 * 19 * A structure to specify available firmware operations. 20 * 21 * A filled up structure can be registered with register_firmware_ops(). 22 */ 23 struct firmware_ops { 24 /* 25 * Inform the firmware we intend to enter CPU idle mode 26 */ 27 int (*prepare_idle)(void); 28 /* 29 * Enters CPU idle mode 30 */ 31 int (*do_idle)(void); 32 /* 33 * Sets boot address of specified physical CPU 34 */ 35 int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr); 36 /* 37 * Boots specified physical CPU 38 */ 39 int (*cpu_boot)(int cpu); 40 /* 41 * Initializes L2 cache 42 */ 43 int (*l2x0_init)(void); 44 }; 45 46 /* Global pointer for current firmware_ops structure, can't be NULL. */ 47 extern const struct firmware_ops *firmware_ops; 48 49 /* 50 * call_firmware_op(op, ...) 51 * 52 * Checks if firmware operation is present and calls it, 53 * otherwise returns -ENOSYS 54 */ 55 #define call_firmware_op(op, ...) \ 56 ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS)) 57 58 /* 59 * register_firmware_ops(ops) 60 * 61 * A function to register platform firmware_ops struct. 62 */ 63 static inline void register_firmware_ops(const struct firmware_ops *ops) 64 { 65 BUG_ON(!ops); 66 67 firmware_ops = ops; 68 } 69 70 #endif 71