1*5d6d1dddSLuis R. Rodriguez /* SPDX-License-Identifier: GPL-2.0 */
2*5d6d1dddSLuis R. Rodriguez #ifndef __FIRMWARE_FALLBACK_H
3*5d6d1dddSLuis R. Rodriguez #define __FIRMWARE_FALLBACK_H
4*5d6d1dddSLuis R. Rodriguez 
5*5d6d1dddSLuis R. Rodriguez #include <linux/firmware.h>
6*5d6d1dddSLuis R. Rodriguez #include <linux/device.h>
7*5d6d1dddSLuis R. Rodriguez 
8*5d6d1dddSLuis R. Rodriguez /**
9*5d6d1dddSLuis R. Rodriguez  * struct firmware_fallback_config - firmware fallback configuratioon settings
10*5d6d1dddSLuis R. Rodriguez  *
11*5d6d1dddSLuis R. Rodriguez  * Helps describe and fine tune the fallback mechanism.
12*5d6d1dddSLuis R. Rodriguez  *
13*5d6d1dddSLuis R. Rodriguez  * @force_sysfs_fallback: force the sysfs fallback mechanism to be used
14*5d6d1dddSLuis R. Rodriguez  * 	as if one had enabled CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y.
15*5d6d1dddSLuis R. Rodriguez  * @old_timeout: for internal use
16*5d6d1dddSLuis R. Rodriguez  * @loading_timeout: the timeout to wait for the fallback mechanism before
17*5d6d1dddSLuis R. Rodriguez  * 	giving up, in seconds.
18*5d6d1dddSLuis R. Rodriguez  */
19*5d6d1dddSLuis R. Rodriguez struct firmware_fallback_config {
20*5d6d1dddSLuis R. Rodriguez 	const bool force_sysfs_fallback;
21*5d6d1dddSLuis R. Rodriguez 	int old_timeout;
22*5d6d1dddSLuis R. Rodriguez 	int loading_timeout;
23*5d6d1dddSLuis R. Rodriguez };
24*5d6d1dddSLuis R. Rodriguez 
25*5d6d1dddSLuis R. Rodriguez #ifdef CONFIG_FW_LOADER_USER_HELPER
26*5d6d1dddSLuis R. Rodriguez int fw_sysfs_fallback(struct firmware *fw, const char *name,
27*5d6d1dddSLuis R. Rodriguez 		      struct device *device,
28*5d6d1dddSLuis R. Rodriguez 		      unsigned int opt_flags,
29*5d6d1dddSLuis R. Rodriguez 		      int ret);
30*5d6d1dddSLuis R. Rodriguez void kill_pending_fw_fallback_reqs(bool only_kill_custom);
31*5d6d1dddSLuis R. Rodriguez 
32*5d6d1dddSLuis R. Rodriguez void fw_fallback_set_cache_timeout(void);
33*5d6d1dddSLuis R. Rodriguez void fw_fallback_set_default_timeout(void);
34*5d6d1dddSLuis R. Rodriguez 
35*5d6d1dddSLuis R. Rodriguez int register_sysfs_loader(void);
36*5d6d1dddSLuis R. Rodriguez void unregister_sysfs_loader(void);
37*5d6d1dddSLuis R. Rodriguez #else /* CONFIG_FW_LOADER_USER_HELPER */
38*5d6d1dddSLuis R. Rodriguez static inline int fw_sysfs_fallback(struct firmware *fw, const char *name,
39*5d6d1dddSLuis R. Rodriguez 				    struct device *device,
40*5d6d1dddSLuis R. Rodriguez 				    unsigned int opt_flags,
41*5d6d1dddSLuis R. Rodriguez 				    int ret)
42*5d6d1dddSLuis R. Rodriguez {
43*5d6d1dddSLuis R. Rodriguez 	/* Keep carrying over the same error */
44*5d6d1dddSLuis R. Rodriguez 	return ret;
45*5d6d1dddSLuis R. Rodriguez }
46*5d6d1dddSLuis R. Rodriguez 
47*5d6d1dddSLuis R. Rodriguez static inline void kill_pending_fw_fallback_reqs(bool only_kill_custom) { }
48*5d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_cache_timeout(void) { }
49*5d6d1dddSLuis R. Rodriguez static inline void fw_fallback_set_default_timeout(void) { }
50*5d6d1dddSLuis R. Rodriguez 
51*5d6d1dddSLuis R. Rodriguez static inline int register_sysfs_loader(void)
52*5d6d1dddSLuis R. Rodriguez {
53*5d6d1dddSLuis R. Rodriguez 	return 0;
54*5d6d1dddSLuis R. Rodriguez }
55*5d6d1dddSLuis R. Rodriguez 
56*5d6d1dddSLuis R. Rodriguez static inline void unregister_sysfs_loader(void)
57*5d6d1dddSLuis R. Rodriguez {
58*5d6d1dddSLuis R. Rodriguez }
59*5d6d1dddSLuis R. Rodriguez #endif /* CONFIG_FW_LOADER_USER_HELPER */
60*5d6d1dddSLuis R. Rodriguez 
61*5d6d1dddSLuis R. Rodriguez #endif /* __FIRMWARE_FALLBACK_H */
62