1*4882a593Smuzhiyun /** 2*4882a593Smuzhiyun * Marvell NFC driver: Firmware downloader 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2015, Marvell International Ltd. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This software file (the "File") is distributed by Marvell International 7*4882a593Smuzhiyun * Ltd. under the terms of the GNU General Public License Version 2, June 1991 8*4882a593Smuzhiyun * (the "License"). You may use, redistribute and/or modify this File in 9*4882a593Smuzhiyun * accordance with the terms and conditions of the License, a copy of which 10*4882a593Smuzhiyun * is available on the worldwide web at 11*4882a593Smuzhiyun * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE 14*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 15*4882a593Smuzhiyun * ARE EXPRESSLY DISCLAIMED. The License provides additional details about 16*4882a593Smuzhiyun * this warranty disclaimer. 17*4882a593Smuzhiyun **/ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifndef __NFCMRVL_FW_DNLD_H__ 20*4882a593Smuzhiyun #define __NFCMRVL_FW_DNLD_H__ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <linux/workqueue.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define NFCMRVL_FW_MAGIC 0x88888888 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define NCI_OP_PROP_BOOT_CMD 0x3A 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define NCI_CORE_LC_PROP_FW_DL 0xFD 29*4882a593Smuzhiyun #define NCI_CORE_LC_CONNID_PROP_FW_DL 0x02 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define HELPER_CMD_ENTRY_POINT 0x04 32*4882a593Smuzhiyun #define HELPER_CMD_PACKET_FORMAT 0xA5 33*4882a593Smuzhiyun #define HELPER_ACK_PACKET_FORMAT 0x5A 34*4882a593Smuzhiyun #define HELPER_RETRY_REQUESTED (1 << 15) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun struct nfcmrvl_private; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct nfcmrvl_fw_uart_config { 39*4882a593Smuzhiyun uint8_t flow_control; 40*4882a593Smuzhiyun uint32_t baudrate; 41*4882a593Smuzhiyun } __packed; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct nfcmrvl_fw_i2c_config { 44*4882a593Smuzhiyun uint32_t clk; 45*4882a593Smuzhiyun } __packed; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct nfcmrvl_fw_spi_config { 48*4882a593Smuzhiyun uint32_t clk; 49*4882a593Smuzhiyun } __packed; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct nfcmrvl_fw_binary_config { 52*4882a593Smuzhiyun uint32_t offset; 53*4882a593Smuzhiyun union { 54*4882a593Smuzhiyun void *config; 55*4882a593Smuzhiyun struct nfcmrvl_fw_uart_config uart; 56*4882a593Smuzhiyun struct nfcmrvl_fw_i2c_config i2c; 57*4882a593Smuzhiyun struct nfcmrvl_fw_spi_config spi; 58*4882a593Smuzhiyun uint8_t reserved[64]; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun } __packed; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct nfcmrvl_fw { 63*4882a593Smuzhiyun uint32_t magic; 64*4882a593Smuzhiyun uint32_t ref_clock; 65*4882a593Smuzhiyun uint32_t phy; 66*4882a593Smuzhiyun struct nfcmrvl_fw_binary_config bootrom; 67*4882a593Smuzhiyun struct nfcmrvl_fw_binary_config helper; 68*4882a593Smuzhiyun struct nfcmrvl_fw_binary_config firmware; 69*4882a593Smuzhiyun uint8_t reserved[64]; 70*4882a593Smuzhiyun } __packed; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct nfcmrvl_fw_dnld { 73*4882a593Smuzhiyun char name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 74*4882a593Smuzhiyun const struct firmware *fw; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun const struct nfcmrvl_fw *header; 77*4882a593Smuzhiyun const struct nfcmrvl_fw_binary_config *binary_config; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int state; 80*4882a593Smuzhiyun int substate; 81*4882a593Smuzhiyun int offset; 82*4882a593Smuzhiyun int chunk_len; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun struct workqueue_struct *rx_wq; 85*4882a593Smuzhiyun struct work_struct rx_work; 86*4882a593Smuzhiyun struct sk_buff_head rx_q; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct timer_list timer; 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun int nfcmrvl_fw_dnld_init(struct nfcmrvl_private *priv); 92*4882a593Smuzhiyun void nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv); 93*4882a593Smuzhiyun void nfcmrvl_fw_dnld_abort(struct nfcmrvl_private *priv); 94*4882a593Smuzhiyun int nfcmrvl_fw_dnld_start(struct nci_dev *ndev, const char *firmware_name); 95*4882a593Smuzhiyun void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv, 96*4882a593Smuzhiyun struct sk_buff *skb); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #endif 99