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