18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * NCI based driver for Samsung S3FWRN5 NFC chip
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2015 Samsung Electrnoics
68c2ecf20Sopenharmony_ci * Robert Baldyga <r.baldyga@samsung.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __LOCAL_S3FWRN5_FIRMWARE_H_
108c2ecf20Sopenharmony_ci#define __LOCAL_S3FWRN5_FIRMWARE_H_
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* FW Message Types */
138c2ecf20Sopenharmony_ci#define S3FWRN5_FW_MSG_CMD			0x00
148c2ecf20Sopenharmony_ci#define S3FWRN5_FW_MSG_RSP			0x01
158c2ecf20Sopenharmony_ci#define S3FWRN5_FW_MSG_DATA			0x02
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/* FW Return Codes */
188c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_SUCCESS			0x00
198c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_MESSAGE_TYPE_INVALID	0x01
208c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_COMMAND_INVALID		0x02
218c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_PAGE_DATA_OVERFLOW	0x03
228c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_SECT_DATA_OVERFLOW	0x04
238c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_AUTHENTICATION_FAIL	0x05
248c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_FLASH_OPERATION_FAIL	0x06
258c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_ADDRESS_OUT_OF_RANGE	0x07
268c2ecf20Sopenharmony_ci#define S3FWRN5_FW_RET_PARAMETER_INVALID	0x08
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/* ---- FW Packet structures ---- */
298c2ecf20Sopenharmony_ci#define S3FWRN5_FW_HDR_SIZE 4
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistruct s3fwrn5_fw_header {
328c2ecf20Sopenharmony_ci	__u8 type;
338c2ecf20Sopenharmony_ci	__u8 code;
348c2ecf20Sopenharmony_ci	__u16 len;
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define S3FWRN5_FW_CMD_RESET			0x00
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define S3FWRN5_FW_CMD_GET_BOOTINFO		0x01
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistruct s3fwrn5_fw_cmd_get_bootinfo_rsp {
428c2ecf20Sopenharmony_ci	__u8 hw_version[4];
438c2ecf20Sopenharmony_ci	__u16 sector_size;
448c2ecf20Sopenharmony_ci	__u16 page_size;
458c2ecf20Sopenharmony_ci	__u16 frame_max_size;
468c2ecf20Sopenharmony_ci	__u16 hw_buffer_size;
478c2ecf20Sopenharmony_ci};
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define S3FWRN5_FW_CMD_ENTER_UPDATE_MODE	0x02
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistruct s3fwrn5_fw_cmd_enter_updatemode {
528c2ecf20Sopenharmony_ci	__u16 hashcode_size;
538c2ecf20Sopenharmony_ci	__u16 signature_size;
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#define S3FWRN5_FW_CMD_UPDATE_SECTOR		0x04
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistruct s3fwrn5_fw_cmd_update_sector {
598c2ecf20Sopenharmony_ci	__u32 base_address;
608c2ecf20Sopenharmony_ci};
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci#define S3FWRN5_FW_CMD_COMPLETE_UPDATE_MODE	0x05
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_cistruct s3fwrn5_fw_image {
658c2ecf20Sopenharmony_ci	const struct firmware *fw;
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	char date[13];
688c2ecf20Sopenharmony_ci	u32 version;
698c2ecf20Sopenharmony_ci	const void *sig;
708c2ecf20Sopenharmony_ci	u32 sig_size;
718c2ecf20Sopenharmony_ci	const void *image;
728c2ecf20Sopenharmony_ci	u32 image_sectors;
738c2ecf20Sopenharmony_ci	const void *custom_sig;
748c2ecf20Sopenharmony_ci	u32 custom_sig_size;
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistruct s3fwrn5_fw_info {
788c2ecf20Sopenharmony_ci	struct nci_dev *ndev;
798c2ecf20Sopenharmony_ci	struct s3fwrn5_fw_image fw;
808c2ecf20Sopenharmony_ci	char fw_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	const void *sig;
838c2ecf20Sopenharmony_ci	u32 sig_size;
848c2ecf20Sopenharmony_ci	u32 sector_size;
858c2ecf20Sopenharmony_ci	u32 base_addr;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	struct completion completion;
888c2ecf20Sopenharmony_ci	struct sk_buff *rsp;
898c2ecf20Sopenharmony_ci	char parity;
908c2ecf20Sopenharmony_ci};
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_civoid s3fwrn5_fw_init(struct s3fwrn5_fw_info *fw_info, const char *fw_name);
938c2ecf20Sopenharmony_ciint s3fwrn5_fw_setup(struct s3fwrn5_fw_info *fw_info);
948c2ecf20Sopenharmony_cibool s3fwrn5_fw_check_version(const struct s3fwrn5_fw_info *fw_info, u32 version);
958c2ecf20Sopenharmony_ciint s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info);
968c2ecf20Sopenharmony_civoid s3fwrn5_fw_cleanup(struct s3fwrn5_fw_info *fw_info);
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ciint s3fwrn5_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci#endif /* __LOCAL_S3FWRN5_FIRMWARE_H_ */
101