162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * NCI based driver for Samsung S3FWRN5 NFC chip
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2015 Samsung Electrnoics
662306a36Sopenharmony_ci * Robert Baldyga <r.baldyga@samsung.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __LOCAL_S3FWRN5_FIRMWARE_H_
1062306a36Sopenharmony_ci#define __LOCAL_S3FWRN5_FIRMWARE_H_
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* FW Message Types */
1362306a36Sopenharmony_ci#define S3FWRN5_FW_MSG_CMD			0x00
1462306a36Sopenharmony_ci#define S3FWRN5_FW_MSG_RSP			0x01
1562306a36Sopenharmony_ci#define S3FWRN5_FW_MSG_DATA			0x02
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/* FW Return Codes */
1862306a36Sopenharmony_ci#define S3FWRN5_FW_RET_SUCCESS			0x00
1962306a36Sopenharmony_ci#define S3FWRN5_FW_RET_MESSAGE_TYPE_INVALID	0x01
2062306a36Sopenharmony_ci#define S3FWRN5_FW_RET_COMMAND_INVALID		0x02
2162306a36Sopenharmony_ci#define S3FWRN5_FW_RET_PAGE_DATA_OVERFLOW	0x03
2262306a36Sopenharmony_ci#define S3FWRN5_FW_RET_SECT_DATA_OVERFLOW	0x04
2362306a36Sopenharmony_ci#define S3FWRN5_FW_RET_AUTHENTICATION_FAIL	0x05
2462306a36Sopenharmony_ci#define S3FWRN5_FW_RET_FLASH_OPERATION_FAIL	0x06
2562306a36Sopenharmony_ci#define S3FWRN5_FW_RET_ADDRESS_OUT_OF_RANGE	0x07
2662306a36Sopenharmony_ci#define S3FWRN5_FW_RET_PARAMETER_INVALID	0x08
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* ---- FW Packet structures ---- */
2962306a36Sopenharmony_ci#define S3FWRN5_FW_HDR_SIZE 4
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct s3fwrn5_fw_header {
3262306a36Sopenharmony_ci	__u8 type;
3362306a36Sopenharmony_ci	__u8 code;
3462306a36Sopenharmony_ci	__u16 len;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define S3FWRN5_FW_CMD_RESET			0x00
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define S3FWRN5_FW_CMD_GET_BOOTINFO		0x01
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct s3fwrn5_fw_cmd_get_bootinfo_rsp {
4262306a36Sopenharmony_ci	__u8 hw_version[4];
4362306a36Sopenharmony_ci	__u16 sector_size;
4462306a36Sopenharmony_ci	__u16 page_size;
4562306a36Sopenharmony_ci	__u16 frame_max_size;
4662306a36Sopenharmony_ci	__u16 hw_buffer_size;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define S3FWRN5_FW_CMD_ENTER_UPDATE_MODE	0x02
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct s3fwrn5_fw_cmd_enter_updatemode {
5262306a36Sopenharmony_ci	__u16 hashcode_size;
5362306a36Sopenharmony_ci	__u16 signature_size;
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define S3FWRN5_FW_CMD_UPDATE_SECTOR		0x04
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct s3fwrn5_fw_cmd_update_sector {
5962306a36Sopenharmony_ci	__u32 base_address;
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define S3FWRN5_FW_CMD_COMPLETE_UPDATE_MODE	0x05
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistruct s3fwrn5_fw_image {
6562306a36Sopenharmony_ci	const struct firmware *fw;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	char date[13];
6862306a36Sopenharmony_ci	u32 version;
6962306a36Sopenharmony_ci	const void *sig;
7062306a36Sopenharmony_ci	u32 sig_size;
7162306a36Sopenharmony_ci	const void *image;
7262306a36Sopenharmony_ci	u32 image_sectors;
7362306a36Sopenharmony_ci	const void *custom_sig;
7462306a36Sopenharmony_ci	u32 custom_sig_size;
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct s3fwrn5_fw_info {
7862306a36Sopenharmony_ci	struct nci_dev *ndev;
7962306a36Sopenharmony_ci	struct s3fwrn5_fw_image fw;
8062306a36Sopenharmony_ci	char fw_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	const void *sig;
8362306a36Sopenharmony_ci	u32 sig_size;
8462306a36Sopenharmony_ci	u32 sector_size;
8562306a36Sopenharmony_ci	u32 base_addr;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	struct completion completion;
8862306a36Sopenharmony_ci	struct sk_buff *rsp;
8962306a36Sopenharmony_ci	char parity;
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ciint s3fwrn5_fw_request_firmware(struct s3fwrn5_fw_info *fw_info);
9362306a36Sopenharmony_civoid s3fwrn5_fw_init(struct s3fwrn5_fw_info *fw_info, const char *fw_name);
9462306a36Sopenharmony_ciint s3fwrn5_fw_setup(struct s3fwrn5_fw_info *fw_info);
9562306a36Sopenharmony_cibool s3fwrn5_fw_check_version(const struct s3fwrn5_fw_info *fw_info, u32 version);
9662306a36Sopenharmony_ciint s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info);
9762306a36Sopenharmony_civoid s3fwrn5_fw_cleanup(struct s3fwrn5_fw_info *fw_info);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ciint s3fwrn5_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#endif /* __LOCAL_S3FWRN5_FIRMWARE_H_ */
102