1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Marvell NFC driver: Firmware downloader 4 * 5 * Copyright (C) 2015, Marvell International Ltd. 6 */ 7 8 #ifndef __NFCMRVL_FW_DNLD_H__ 9 #define __NFCMRVL_FW_DNLD_H__ 10 11 #include <linux/workqueue.h> 12 13 #define NFCMRVL_FW_MAGIC 0x88888888 14 15 #define NCI_OP_PROP_BOOT_CMD 0x3A 16 17 #define NCI_CORE_LC_PROP_FW_DL 0xFD 18 #define NCI_CORE_LC_CONNID_PROP_FW_DL 0x02 19 20 #define HELPER_CMD_ENTRY_POINT 0x04 21 #define HELPER_CMD_PACKET_FORMAT 0xA5 22 #define HELPER_ACK_PACKET_FORMAT 0x5A 23 #define HELPER_RETRY_REQUESTED (1 << 15) 24 25 struct nfcmrvl_private; 26 27 struct nfcmrvl_fw_uart_config { 28 uint8_t flow_control; 29 uint32_t baudrate; 30 } __packed; 31 32 struct nfcmrvl_fw_i2c_config { 33 uint32_t clk; 34 } __packed; 35 36 struct nfcmrvl_fw_spi_config { 37 uint32_t clk; 38 } __packed; 39 40 struct nfcmrvl_fw_binary_config { 41 uint32_t offset; 42 union { 43 void *config; 44 struct nfcmrvl_fw_uart_config uart; 45 struct nfcmrvl_fw_i2c_config i2c; 46 struct nfcmrvl_fw_spi_config spi; 47 uint8_t reserved[64]; 48 }; 49 } __packed; 50 51 struct nfcmrvl_fw { 52 uint32_t magic; 53 uint32_t ref_clock; 54 uint32_t phy; 55 struct nfcmrvl_fw_binary_config bootrom; 56 struct nfcmrvl_fw_binary_config helper; 57 struct nfcmrvl_fw_binary_config firmware; 58 uint8_t reserved[64]; 59 } __packed; 60 61 struct nfcmrvl_fw_dnld { 62 char name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 63 const struct firmware *fw; 64 65 const struct nfcmrvl_fw *header; 66 const struct nfcmrvl_fw_binary_config *binary_config; 67 68 int state; 69 int substate; 70 int offset; 71 int chunk_len; 72 73 struct workqueue_struct *rx_wq; 74 struct work_struct rx_work; 75 struct sk_buff_head rx_q; 76 77 struct timer_list timer; 78 }; 79 80 int nfcmrvl_fw_dnld_init(struct nfcmrvl_private *priv); 81 void nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv); 82 void nfcmrvl_fw_dnld_abort(struct nfcmrvl_private *priv); 83 int nfcmrvl_fw_dnld_start(struct nci_dev *ndev, const char *firmware_name); 84 void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv, 85 struct sk_buff *skb); 86 87 #endif 88