1*97730bbbSRuss Weight /* SPDX-License-Identifier: GPL-2.0 */
2*97730bbbSRuss Weight #ifndef __FIRMWARE_UPLOAD_H
3*97730bbbSRuss Weight #define __FIRMWARE_UPLOAD_H
4*97730bbbSRuss Weight 
5*97730bbbSRuss Weight #include <linux/device.h>
6*97730bbbSRuss Weight 
7*97730bbbSRuss Weight /**
8*97730bbbSRuss Weight  * enum fw_upload_prog - firmware upload progress codes
9*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_IDLE: there is no firmware upload in progress
10*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_RECEIVING: worker thread is receiving firmware data
11*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_PREPARING: target device is preparing for firmware upload
12*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_TRANSFERRING: data is being copied to the device
13*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_PROGRAMMING: device is performing the firmware update
14*97730bbbSRuss Weight  * @FW_UPLOAD_PROG_MAX: Maximum progress code marker
15*97730bbbSRuss Weight  */
16*97730bbbSRuss Weight enum fw_upload_prog {
17*97730bbbSRuss Weight 	FW_UPLOAD_PROG_IDLE,
18*97730bbbSRuss Weight 	FW_UPLOAD_PROG_RECEIVING,
19*97730bbbSRuss Weight 	FW_UPLOAD_PROG_PREPARING,
20*97730bbbSRuss Weight 	FW_UPLOAD_PROG_TRANSFERRING,
21*97730bbbSRuss Weight 	FW_UPLOAD_PROG_PROGRAMMING,
22*97730bbbSRuss Weight 	FW_UPLOAD_PROG_MAX
23*97730bbbSRuss Weight };
24*97730bbbSRuss Weight 
25*97730bbbSRuss Weight struct fw_upload_priv {
26*97730bbbSRuss Weight 	struct fw_upload *fw_upload;
27*97730bbbSRuss Weight 	struct module *module;
28*97730bbbSRuss Weight 	const char *name;
29*97730bbbSRuss Weight 	const struct fw_upload_ops *ops;
30*97730bbbSRuss Weight 	struct mutex lock;		  /* protect data structure contents */
31*97730bbbSRuss Weight 	struct work_struct work;
32*97730bbbSRuss Weight 	const u8 *data;			  /* pointer to update data */
33*97730bbbSRuss Weight 	u32 remaining_size;		  /* size remaining to transfer */
34*97730bbbSRuss Weight 	enum fw_upload_prog progress;
35*97730bbbSRuss Weight 	enum fw_upload_prog err_progress; /* progress at time of failure */
36*97730bbbSRuss Weight 	enum fw_upload_err err_code;	  /* security manager error code */
37*97730bbbSRuss Weight };
38*97730bbbSRuss Weight 
39*97730bbbSRuss Weight #ifdef CONFIG_FW_UPLOAD
40*97730bbbSRuss Weight int fw_upload_start(struct fw_sysfs *fw_sysfs);
41*97730bbbSRuss Weight umode_t fw_upload_is_visible(struct kobject *kobj, struct attribute *attr, int n);
42*97730bbbSRuss Weight #else
43*97730bbbSRuss Weight static inline int fw_upload_start(struct fw_sysfs *fw_sysfs)
44*97730bbbSRuss Weight {
45*97730bbbSRuss Weight 	return 0;
46*97730bbbSRuss Weight }
47*97730bbbSRuss Weight #endif
48*97730bbbSRuss Weight 
49*97730bbbSRuss Weight #endif /* __FIRMWARE_UPLOAD_H */
50