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)(unsigned long mode); 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 * Enter system-wide suspend. 46 */ 47 int (*suspend)(void); 48 /* 49 * Restore state of privileged hardware after system-wide suspend. 50 */ 51 int (*resume)(void); 52 }; 53 54 /* Global pointer for current firmware_ops structure, can't be NULL. */ 55 extern const struct firmware_ops *firmware_ops; 56 57 /* 58 * call_firmware_op(op, ...) 59 * 60 * Checks if firmware operation is present and calls it, 61 * otherwise returns -ENOSYS 62 */ 63 #define call_firmware_op(op, ...) \ 64 ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS)) 65 66 /* 67 * register_firmware_ops(ops) 68 * 69 * A function to register platform firmware_ops struct. 70 */ 71 static inline void register_firmware_ops(const struct firmware_ops *ops) 72 { 73 BUG_ON(!ops); 74 75 firmware_ops = ops; 76 } 77 78 #endif 79