19dd0abd2SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2c04c674fSRobert Baldyga /* 3c04c674fSRobert Baldyga * NCI based driver for Samsung S3FWRN5 NFC chip 4c04c674fSRobert Baldyga * 5c04c674fSRobert Baldyga * Copyright (C) 2015 Samsung Electrnoics 6c04c674fSRobert Baldyga * Robert Baldyga <r.baldyga@samsung.com> 7c04c674fSRobert Baldyga */ 8c04c674fSRobert Baldyga 9c04c674fSRobert Baldyga #ifndef __LOCAL_S3FWRN5_FIRMWARE_H_ 10c04c674fSRobert Baldyga #define __LOCAL_S3FWRN5_FIRMWARE_H_ 11c04c674fSRobert Baldyga 12c04c674fSRobert Baldyga /* FW Message Types */ 13c04c674fSRobert Baldyga #define S3FWRN5_FW_MSG_CMD 0x00 14c04c674fSRobert Baldyga #define S3FWRN5_FW_MSG_RSP 0x01 15c04c674fSRobert Baldyga #define S3FWRN5_FW_MSG_DATA 0x02 16c04c674fSRobert Baldyga 17c04c674fSRobert Baldyga /* FW Return Codes */ 18c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_SUCCESS 0x00 19c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_MESSAGE_TYPE_INVALID 0x01 20c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_COMMAND_INVALID 0x02 21c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_PAGE_DATA_OVERFLOW 0x03 22c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_SECT_DATA_OVERFLOW 0x04 23c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_AUTHENTICATION_FAIL 0x05 24c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_FLASH_OPERATION_FAIL 0x06 25c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_ADDRESS_OUT_OF_RANGE 0x07 26c04c674fSRobert Baldyga #define S3FWRN5_FW_RET_PARAMETER_INVALID 0x08 27c04c674fSRobert Baldyga 28c04c674fSRobert Baldyga /* ---- FW Packet structures ---- */ 29c04c674fSRobert Baldyga #define S3FWRN5_FW_HDR_SIZE 4 30c04c674fSRobert Baldyga 31c04c674fSRobert Baldyga struct s3fwrn5_fw_header { 32c04c674fSRobert Baldyga __u8 type; 33c04c674fSRobert Baldyga __u8 code; 34c04c674fSRobert Baldyga __u16 len; 35c04c674fSRobert Baldyga }; 36c04c674fSRobert Baldyga 37c04c674fSRobert Baldyga #define S3FWRN5_FW_CMD_RESET 0x00 38c04c674fSRobert Baldyga 39c04c674fSRobert Baldyga #define S3FWRN5_FW_CMD_GET_BOOTINFO 0x01 40c04c674fSRobert Baldyga 41c04c674fSRobert Baldyga struct s3fwrn5_fw_cmd_get_bootinfo_rsp { 42c04c674fSRobert Baldyga __u8 hw_version[4]; 43c04c674fSRobert Baldyga __u16 sector_size; 44c04c674fSRobert Baldyga __u16 page_size; 45c04c674fSRobert Baldyga __u16 frame_max_size; 46c04c674fSRobert Baldyga __u16 hw_buffer_size; 47c04c674fSRobert Baldyga }; 48c04c674fSRobert Baldyga 49c04c674fSRobert Baldyga #define S3FWRN5_FW_CMD_ENTER_UPDATE_MODE 0x02 50c04c674fSRobert Baldyga 51c04c674fSRobert Baldyga struct s3fwrn5_fw_cmd_enter_updatemode { 52c04c674fSRobert Baldyga __u16 hashcode_size; 53c04c674fSRobert Baldyga __u16 signature_size; 54c04c674fSRobert Baldyga }; 55c04c674fSRobert Baldyga 56c04c674fSRobert Baldyga #define S3FWRN5_FW_CMD_UPDATE_SECTOR 0x04 57c04c674fSRobert Baldyga 58c04c674fSRobert Baldyga struct s3fwrn5_fw_cmd_update_sector { 59c04c674fSRobert Baldyga __u32 base_address; 60c04c674fSRobert Baldyga }; 61c04c674fSRobert Baldyga 62c04c674fSRobert Baldyga #define S3FWRN5_FW_CMD_COMPLETE_UPDATE_MODE 0x05 63c04c674fSRobert Baldyga 64c04c674fSRobert Baldyga struct s3fwrn5_fw_image { 65c04c674fSRobert Baldyga const struct firmware *fw; 66c04c674fSRobert Baldyga 67c04c674fSRobert Baldyga char date[13]; 68c04c674fSRobert Baldyga u32 version; 69c04c674fSRobert Baldyga const void *sig; 70c04c674fSRobert Baldyga u32 sig_size; 71c04c674fSRobert Baldyga const void *image; 72c04c674fSRobert Baldyga u32 image_sectors; 73c04c674fSRobert Baldyga const void *custom_sig; 74c04c674fSRobert Baldyga u32 custom_sig_size; 75c04c674fSRobert Baldyga }; 76c04c674fSRobert Baldyga 77c04c674fSRobert Baldyga struct s3fwrn5_fw_info { 78c04c674fSRobert Baldyga struct nci_dev *ndev; 79c04c674fSRobert Baldyga struct s3fwrn5_fw_image fw; 80c04c674fSRobert Baldyga char fw_name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 81c04c674fSRobert Baldyga 82c04c674fSRobert Baldyga const void *sig; 83c04c674fSRobert Baldyga u32 sig_size; 84c04c674fSRobert Baldyga u32 sector_size; 85c04c674fSRobert Baldyga u32 base_addr; 86c04c674fSRobert Baldyga 87c04c674fSRobert Baldyga struct completion completion; 88c04c674fSRobert Baldyga struct sk_buff *rsp; 89c04c674fSRobert Baldyga char parity; 90c04c674fSRobert Baldyga }; 91c04c674fSRobert Baldyga 92*4fb7b98cSBongsu Jeon int s3fwrn5_fw_request_firmware(struct s3fwrn5_fw_info *fw_info); 93c04c674fSRobert Baldyga void s3fwrn5_fw_init(struct s3fwrn5_fw_info *fw_info, const char *fw_name); 94c04c674fSRobert Baldyga int s3fwrn5_fw_setup(struct s3fwrn5_fw_info *fw_info); 95171a7000SKrzysztof Kozlowski bool s3fwrn5_fw_check_version(const struct s3fwrn5_fw_info *fw_info, u32 version); 96c04c674fSRobert Baldyga int s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info); 97c04c674fSRobert Baldyga void s3fwrn5_fw_cleanup(struct s3fwrn5_fw_info *fw_info); 98c04c674fSRobert Baldyga 99c04c674fSRobert Baldyga int s3fwrn5_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); 100c04c674fSRobert Baldyga 101c04c674fSRobert Baldyga #endif /* __LOCAL_S3FWRN5_FIRMWARE_H_ */ 102