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