162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Marvell NFC driver: Firmware downloader 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015, Marvell International Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __NFCMRVL_FW_DNLD_H__ 962306a36Sopenharmony_ci#define __NFCMRVL_FW_DNLD_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/workqueue.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define NFCMRVL_FW_MAGIC 0x88888888 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define NCI_OP_PROP_BOOT_CMD 0x3A 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define NCI_CORE_LC_PROP_FW_DL 0xFD 1862306a36Sopenharmony_ci#define NCI_CORE_LC_CONNID_PROP_FW_DL 0x02 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define HELPER_CMD_ENTRY_POINT 0x04 2162306a36Sopenharmony_ci#define HELPER_CMD_PACKET_FORMAT 0xA5 2262306a36Sopenharmony_ci#define HELPER_ACK_PACKET_FORMAT 0x5A 2362306a36Sopenharmony_ci#define HELPER_RETRY_REQUESTED (1 << 15) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct nfcmrvl_private; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistruct nfcmrvl_fw_uart_config { 2862306a36Sopenharmony_ci uint8_t flow_control; 2962306a36Sopenharmony_ci uint32_t baudrate; 3062306a36Sopenharmony_ci} __packed; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct nfcmrvl_fw_i2c_config { 3362306a36Sopenharmony_ci uint32_t clk; 3462306a36Sopenharmony_ci} __packed; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct nfcmrvl_fw_spi_config { 3762306a36Sopenharmony_ci uint32_t clk; 3862306a36Sopenharmony_ci} __packed; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct nfcmrvl_fw_binary_config { 4162306a36Sopenharmony_ci uint32_t offset; 4262306a36Sopenharmony_ci union { 4362306a36Sopenharmony_ci void *config; 4462306a36Sopenharmony_ci struct nfcmrvl_fw_uart_config uart; 4562306a36Sopenharmony_ci struct nfcmrvl_fw_i2c_config i2c; 4662306a36Sopenharmony_ci struct nfcmrvl_fw_spi_config spi; 4762306a36Sopenharmony_ci uint8_t reserved[64]; 4862306a36Sopenharmony_ci }; 4962306a36Sopenharmony_ci} __packed; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct nfcmrvl_fw { 5262306a36Sopenharmony_ci uint32_t magic; 5362306a36Sopenharmony_ci uint32_t ref_clock; 5462306a36Sopenharmony_ci uint32_t phy; 5562306a36Sopenharmony_ci struct nfcmrvl_fw_binary_config bootrom; 5662306a36Sopenharmony_ci struct nfcmrvl_fw_binary_config helper; 5762306a36Sopenharmony_ci struct nfcmrvl_fw_binary_config firmware; 5862306a36Sopenharmony_ci uint8_t reserved[64]; 5962306a36Sopenharmony_ci} __packed; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct nfcmrvl_fw_dnld { 6262306a36Sopenharmony_ci char name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 6362306a36Sopenharmony_ci const struct firmware *fw; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci const struct nfcmrvl_fw *header; 6662306a36Sopenharmony_ci const struct nfcmrvl_fw_binary_config *binary_config; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci int state; 6962306a36Sopenharmony_ci int substate; 7062306a36Sopenharmony_ci int offset; 7162306a36Sopenharmony_ci int chunk_len; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci struct workqueue_struct *rx_wq; 7462306a36Sopenharmony_ci struct work_struct rx_work; 7562306a36Sopenharmony_ci struct sk_buff_head rx_q; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci struct timer_list timer; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ciint nfcmrvl_fw_dnld_init(struct nfcmrvl_private *priv); 8162306a36Sopenharmony_civoid nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv); 8262306a36Sopenharmony_civoid nfcmrvl_fw_dnld_abort(struct nfcmrvl_private *priv); 8362306a36Sopenharmony_ciint nfcmrvl_fw_dnld_start(struct nci_dev *ndev, const char *firmware_name); 8462306a36Sopenharmony_civoid nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv, 8562306a36Sopenharmony_ci struct sk_buff *skb); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#endif 88