18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2012 Samsung Electronics. 48c2ecf20Sopenharmony_ci * Kyungmin Park <kyungmin.park@samsung.com> 58c2ecf20Sopenharmony_ci * Tomasz Figa <t.figa@samsung.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef __ASM_ARM_FIRMWARE_H 98c2ecf20Sopenharmony_ci#define __ASM_ARM_FIRMWARE_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/bug.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* 148c2ecf20Sopenharmony_ci * struct firmware_ops 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * A structure to specify available firmware operations. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * A filled up structure can be registered with register_firmware_ops(). 198c2ecf20Sopenharmony_ci */ 208c2ecf20Sopenharmony_cistruct firmware_ops { 218c2ecf20Sopenharmony_ci /* 228c2ecf20Sopenharmony_ci * Inform the firmware we intend to enter CPU idle mode 238c2ecf20Sopenharmony_ci */ 248c2ecf20Sopenharmony_ci int (*prepare_idle)(unsigned long mode); 258c2ecf20Sopenharmony_ci /* 268c2ecf20Sopenharmony_ci * Enters CPU idle mode 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci int (*do_idle)(unsigned long mode); 298c2ecf20Sopenharmony_ci /* 308c2ecf20Sopenharmony_ci * Sets boot address of specified physical CPU 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci int (*set_cpu_boot_addr)(int cpu, unsigned long boot_addr); 338c2ecf20Sopenharmony_ci /* 348c2ecf20Sopenharmony_ci * Gets boot address of specified physical CPU 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_ci int (*get_cpu_boot_addr)(int cpu, unsigned long *boot_addr); 378c2ecf20Sopenharmony_ci /* 388c2ecf20Sopenharmony_ci * Boots specified physical CPU 398c2ecf20Sopenharmony_ci */ 408c2ecf20Sopenharmony_ci int (*cpu_boot)(int cpu); 418c2ecf20Sopenharmony_ci /* 428c2ecf20Sopenharmony_ci * Initializes L2 cache 438c2ecf20Sopenharmony_ci */ 448c2ecf20Sopenharmony_ci int (*l2x0_init)(void); 458c2ecf20Sopenharmony_ci /* 468c2ecf20Sopenharmony_ci * Enter system-wide suspend. 478c2ecf20Sopenharmony_ci */ 488c2ecf20Sopenharmony_ci int (*suspend)(void); 498c2ecf20Sopenharmony_ci /* 508c2ecf20Sopenharmony_ci * Restore state of privileged hardware after system-wide suspend. 518c2ecf20Sopenharmony_ci */ 528c2ecf20Sopenharmony_ci int (*resume)(void); 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* Global pointer for current firmware_ops structure, can't be NULL. */ 568c2ecf20Sopenharmony_ciextern const struct firmware_ops *firmware_ops; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci/* 598c2ecf20Sopenharmony_ci * call_firmware_op(op, ...) 608c2ecf20Sopenharmony_ci * 618c2ecf20Sopenharmony_ci * Checks if firmware operation is present and calls it, 628c2ecf20Sopenharmony_ci * otherwise returns -ENOSYS 638c2ecf20Sopenharmony_ci */ 648c2ecf20Sopenharmony_ci#define call_firmware_op(op, ...) \ 658c2ecf20Sopenharmony_ci ((firmware_ops->op) ? firmware_ops->op(__VA_ARGS__) : (-ENOSYS)) 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* 688c2ecf20Sopenharmony_ci * register_firmware_ops(ops) 698c2ecf20Sopenharmony_ci * 708c2ecf20Sopenharmony_ci * A function to register platform firmware_ops struct. 718c2ecf20Sopenharmony_ci */ 728c2ecf20Sopenharmony_cistatic inline void register_firmware_ops(const struct firmware_ops *ops) 738c2ecf20Sopenharmony_ci{ 748c2ecf20Sopenharmony_ci BUG_ON(!ops); 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci firmware_ops = ops; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci#endif 80