xref: /OK3568_Linux_fs/kernel/drivers/nfc/nfcmrvl/fw_dnld.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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