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 85d6d1dddSLuis R. Rodriguez /** 95d6d1dddSLuis R. Rodriguez * struct firmware_fallback_config - firmware fallback configuratioon settings 105d6d1dddSLuis R. Rodriguez * 115d6d1dddSLuis R. Rodriguez * Helps describe and fine tune the fallback mechanism. 125d6d1dddSLuis R. Rodriguez * 135d6d1dddSLuis R. Rodriguez * @force_sysfs_fallback: force the sysfs fallback mechanism to be used 145d6d1dddSLuis R. Rodriguez * as if one had enabled CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y. 15*ceb18132SLuis R. Rodriguez * Useful to help debug a CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y 16*ceb18132SLuis R. Rodriguez * functionality on a kernel where that config entry has been disabled. 175d6d1dddSLuis R. Rodriguez * @old_timeout: for internal use 185d6d1dddSLuis R. Rodriguez * @loading_timeout: the timeout to wait for the fallback mechanism before 195d6d1dddSLuis R. Rodriguez * giving up, in seconds. 205d6d1dddSLuis R. Rodriguez */ 215d6d1dddSLuis R. Rodriguez struct firmware_fallback_config { 22*ceb18132SLuis R. Rodriguez unsigned int force_sysfs_fallback; 235d6d1dddSLuis R. Rodriguez int old_timeout; 245d6d1dddSLuis R. Rodriguez int loading_timeout; 255d6d1dddSLuis R. Rodriguez }; 265d6d1dddSLuis R. Rodriguez 275d6d1dddSLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER 285d6d1dddSLuis R. Rodriguez int fw_sysfs_fallback(struct firmware *fw, const char *name, 295d6d1dddSLuis R. Rodriguez struct device *device, 305d6d1dddSLuis R. Rodriguez unsigned int opt_flags, 315d6d1dddSLuis R. Rodriguez int ret); 325d6d1dddSLuis R. Rodriguez void kill_pending_fw_fallback_reqs(bool only_kill_custom); 335d6d1dddSLuis R. Rodriguez 345d6d1dddSLuis R. Rodriguez void fw_fallback_set_cache_timeout(void); 355d6d1dddSLuis R. Rodriguez void fw_fallback_set_default_timeout(void); 365d6d1dddSLuis R. Rodriguez 375d6d1dddSLuis R. Rodriguez int register_sysfs_loader(void); 385d6d1dddSLuis R. Rodriguez void unregister_sysfs_loader(void); 395d6d1dddSLuis R. Rodriguez #else /* CONFIG_FW_LOADER_USER_HELPER */ 405d6d1dddSLuis R. Rodriguez static inline int fw_sysfs_fallback(struct firmware *fw, const char *name, 415d6d1dddSLuis R. Rodriguez struct device *device, 425d6d1dddSLuis R. Rodriguez unsigned int opt_flags, 435d6d1dddSLuis R. Rodriguez int ret) 445d6d1dddSLuis R. Rodriguez { 455d6d1dddSLuis R. Rodriguez /* Keep carrying over the same error */ 465d6d1dddSLuis R. Rodriguez return ret; 475d6d1dddSLuis R. Rodriguez } 485d6d1dddSLuis R. Rodriguez 495d6d1dddSLuis R. Rodriguez static inline void kill_pending_fw_fallback_reqs(bool only_kill_custom) { } 505d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_cache_timeout(void) { } 515d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_default_timeout(void) { } 525d6d1dddSLuis R. Rodriguez 535d6d1dddSLuis R. Rodriguez static inline int register_sysfs_loader(void) 545d6d1dddSLuis R. Rodriguez { 555d6d1dddSLuis R. Rodriguez return 0; 565d6d1dddSLuis R. Rodriguez } 575d6d1dddSLuis R. Rodriguez 585d6d1dddSLuis R. Rodriguez static inline void unregister_sysfs_loader(void) 595d6d1dddSLuis R. Rodriguez { 605d6d1dddSLuis R. Rodriguez } 615d6d1dddSLuis R. Rodriguez #endif /* CONFIG_FW_LOADER_USER_HELPER */ 625d6d1dddSLuis R. Rodriguez 635d6d1dddSLuis R. Rodriguez #endif /* __FIRMWARE_FALLBACK_H */ 64