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. 15ceb18132SLuis R. Rodriguez * Useful to help debug a CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y 16ceb18132SLuis R. Rodriguez * functionality on a kernel where that config entry has been disabled. 17*2cd7a1c6SLuis R. Rodriguez * @ignore_sysfs_fallback: force to disable the sysfs fallback mechanism. 18*2cd7a1c6SLuis R. Rodriguez * This emulates the behaviour as if we had set the kernel 19*2cd7a1c6SLuis R. Rodriguez * config CONFIG_FW_LOADER_USER_HELPER=n. 205d6d1dddSLuis R. Rodriguez * @old_timeout: for internal use 215d6d1dddSLuis R. Rodriguez * @loading_timeout: the timeout to wait for the fallback mechanism before 225d6d1dddSLuis R. Rodriguez * giving up, in seconds. 235d6d1dddSLuis R. Rodriguez */ 245d6d1dddSLuis R. Rodriguez struct firmware_fallback_config { 25ceb18132SLuis R. Rodriguez unsigned int force_sysfs_fallback; 26*2cd7a1c6SLuis R. Rodriguez unsigned int ignore_sysfs_fallback; 275d6d1dddSLuis R. Rodriguez int old_timeout; 285d6d1dddSLuis R. Rodriguez int loading_timeout; 295d6d1dddSLuis R. Rodriguez }; 305d6d1dddSLuis R. Rodriguez 315d6d1dddSLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER 325d6d1dddSLuis R. Rodriguez int fw_sysfs_fallback(struct firmware *fw, const char *name, 335d6d1dddSLuis R. Rodriguez struct device *device, 345d6d1dddSLuis R. Rodriguez unsigned int opt_flags, 355d6d1dddSLuis R. Rodriguez int ret); 365d6d1dddSLuis R. Rodriguez void kill_pending_fw_fallback_reqs(bool only_kill_custom); 375d6d1dddSLuis R. Rodriguez 385d6d1dddSLuis R. Rodriguez void fw_fallback_set_cache_timeout(void); 395d6d1dddSLuis R. Rodriguez void fw_fallback_set_default_timeout(void); 405d6d1dddSLuis R. Rodriguez 415d6d1dddSLuis R. Rodriguez int register_sysfs_loader(void); 425d6d1dddSLuis R. Rodriguez void unregister_sysfs_loader(void); 435d6d1dddSLuis R. Rodriguez #else /* CONFIG_FW_LOADER_USER_HELPER */ 445d6d1dddSLuis R. Rodriguez static inline int fw_sysfs_fallback(struct firmware *fw, const char *name, 455d6d1dddSLuis R. Rodriguez struct device *device, 465d6d1dddSLuis R. Rodriguez unsigned int opt_flags, 475d6d1dddSLuis R. Rodriguez int ret) 485d6d1dddSLuis R. Rodriguez { 495d6d1dddSLuis R. Rodriguez /* Keep carrying over the same error */ 505d6d1dddSLuis R. Rodriguez return ret; 515d6d1dddSLuis R. Rodriguez } 525d6d1dddSLuis R. Rodriguez 535d6d1dddSLuis R. Rodriguez static inline void kill_pending_fw_fallback_reqs(bool only_kill_custom) { } 545d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_cache_timeout(void) { } 555d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_default_timeout(void) { } 565d6d1dddSLuis R. Rodriguez 575d6d1dddSLuis R. Rodriguez static inline int register_sysfs_loader(void) 585d6d1dddSLuis R. Rodriguez { 595d6d1dddSLuis R. Rodriguez return 0; 605d6d1dddSLuis R. Rodriguez } 615d6d1dddSLuis R. Rodriguez 625d6d1dddSLuis R. Rodriguez static inline void unregister_sysfs_loader(void) 635d6d1dddSLuis R. Rodriguez { 645d6d1dddSLuis R. Rodriguez } 655d6d1dddSLuis R. Rodriguez #endif /* CONFIG_FW_LOADER_USER_HELPER */ 665d6d1dddSLuis R. Rodriguez 675d6d1dddSLuis R. Rodriguez #endif /* __FIRMWARE_FALLBACK_H */ 68