15d6d1dddSLuis R. Rodriguez /* SPDX-License-Identifier: GPL-2.0 */ 25d6d1dddSLuis R. Rodriguez #ifndef __FIRMWARE_FALLBACK_H 35d6d1dddSLuis R. Rodriguez #define __FIRMWARE_FALLBACK_H 45d6d1dddSLuis R. Rodriguez 55d6d1dddSLuis R. Rodriguez #include <linux/firmware.h> 65d6d1dddSLuis R. Rodriguez #include <linux/device.h> 75d6d1dddSLuis R. Rodriguez 8*eb33eb04SAndres Rodriguez #include "firmware.h" 9*eb33eb04SAndres Rodriguez 105d6d1dddSLuis R. Rodriguez /** 11b93815d0SAndres Rodriguez * struct firmware_fallback_config - firmware fallback configuration settings 125d6d1dddSLuis R. Rodriguez * 135d6d1dddSLuis R. Rodriguez * Helps describe and fine tune the fallback mechanism. 145d6d1dddSLuis R. Rodriguez * 155d6d1dddSLuis R. Rodriguez * @force_sysfs_fallback: force the sysfs fallback mechanism to be used 165d6d1dddSLuis R. Rodriguez * as if one had enabled CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y. 17ceb18132SLuis R. Rodriguez * Useful to help debug a CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y 18ceb18132SLuis R. Rodriguez * functionality on a kernel where that config entry has been disabled. 192cd7a1c6SLuis R. Rodriguez * @ignore_sysfs_fallback: force to disable the sysfs fallback mechanism. 202cd7a1c6SLuis R. Rodriguez * This emulates the behaviour as if we had set the kernel 212cd7a1c6SLuis R. Rodriguez * config CONFIG_FW_LOADER_USER_HELPER=n. 225d6d1dddSLuis R. Rodriguez * @old_timeout: for internal use 235d6d1dddSLuis R. Rodriguez * @loading_timeout: the timeout to wait for the fallback mechanism before 245d6d1dddSLuis R. Rodriguez * giving up, in seconds. 255d6d1dddSLuis R. Rodriguez */ 265d6d1dddSLuis R. Rodriguez struct firmware_fallback_config { 27ceb18132SLuis R. Rodriguez unsigned int force_sysfs_fallback; 282cd7a1c6SLuis R. Rodriguez unsigned int ignore_sysfs_fallback; 295d6d1dddSLuis R. Rodriguez int old_timeout; 305d6d1dddSLuis R. Rodriguez int loading_timeout; 315d6d1dddSLuis R. Rodriguez }; 325d6d1dddSLuis R. Rodriguez 335d6d1dddSLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER 345d6d1dddSLuis R. Rodriguez int fw_sysfs_fallback(struct firmware *fw, const char *name, 355d6d1dddSLuis R. Rodriguez struct device *device, 36*eb33eb04SAndres Rodriguez enum fw_opt opt_flags, 375d6d1dddSLuis R. Rodriguez int ret); 385d6d1dddSLuis R. Rodriguez void kill_pending_fw_fallback_reqs(bool only_kill_custom); 395d6d1dddSLuis R. Rodriguez 405d6d1dddSLuis R. Rodriguez void fw_fallback_set_cache_timeout(void); 415d6d1dddSLuis R. Rodriguez void fw_fallback_set_default_timeout(void); 425d6d1dddSLuis R. Rodriguez 435d6d1dddSLuis R. Rodriguez int register_sysfs_loader(void); 445d6d1dddSLuis R. Rodriguez void unregister_sysfs_loader(void); 455d6d1dddSLuis R. Rodriguez #else /* CONFIG_FW_LOADER_USER_HELPER */ 465d6d1dddSLuis R. Rodriguez static inline int fw_sysfs_fallback(struct firmware *fw, const char *name, 475d6d1dddSLuis R. Rodriguez struct device *device, 48*eb33eb04SAndres Rodriguez enum fw_opt opt_flags, 495d6d1dddSLuis R. Rodriguez int ret) 505d6d1dddSLuis R. Rodriguez { 515d6d1dddSLuis R. Rodriguez /* Keep carrying over the same error */ 525d6d1dddSLuis R. Rodriguez return ret; 535d6d1dddSLuis R. Rodriguez } 545d6d1dddSLuis R. Rodriguez 555d6d1dddSLuis R. Rodriguez static inline void kill_pending_fw_fallback_reqs(bool only_kill_custom) { } 565d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_cache_timeout(void) { } 575d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_default_timeout(void) { } 585d6d1dddSLuis R. Rodriguez 595d6d1dddSLuis R. Rodriguez static inline int register_sysfs_loader(void) 605d6d1dddSLuis R. Rodriguez { 615d6d1dddSLuis R. Rodriguez return 0; 625d6d1dddSLuis R. Rodriguez } 635d6d1dddSLuis R. Rodriguez 645d6d1dddSLuis R. Rodriguez static inline void unregister_sysfs_loader(void) 655d6d1dddSLuis R. Rodriguez { 665d6d1dddSLuis R. Rodriguez } 675d6d1dddSLuis R. Rodriguez #endif /* CONFIG_FW_LOADER_USER_HELPER */ 685d6d1dddSLuis R. Rodriguez 695d6d1dddSLuis R. Rodriguez #endif /* __FIRMWARE_FALLBACK_H */ 70