162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2014  NXP Semiconductors  All rights reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Authors: Clément Perrochaud <clement.perrochaud@nxp.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Derived from PN544 device driver:
862306a36Sopenharmony_ci * Copyright (C) 2012  Intel Corporation. All rights reserved.
962306a36Sopenharmony_ci*/
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __LOCAL_NXP_NCI_H_
1262306a36Sopenharmony_ci#define __LOCAL_NXP_NCI_H_
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/completion.h>
1562306a36Sopenharmony_ci#include <linux/firmware.h>
1662306a36Sopenharmony_ci#include <linux/nfc.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <net/nfc/nci_core.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define NXP_NCI_FW_HDR_LEN	2
2162306a36Sopenharmony_ci#define NXP_NCI_FW_CRC_LEN	2
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define NXP_NCI_FW_FRAME_LEN_MASK	0x03FF
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cienum nxp_nci_mode {
2662306a36Sopenharmony_ci	NXP_NCI_MODE_COLD,
2762306a36Sopenharmony_ci	NXP_NCI_MODE_NCI,
2862306a36Sopenharmony_ci	NXP_NCI_MODE_FW
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct nxp_nci_phy_ops {
3262306a36Sopenharmony_ci	int (*set_mode)(void *id, enum nxp_nci_mode mode);
3362306a36Sopenharmony_ci	int (*write)(void *id, struct sk_buff *skb);
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistruct nxp_nci_fw_info {
3762306a36Sopenharmony_ci	char name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
3862306a36Sopenharmony_ci	const struct firmware *fw;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	size_t size;
4162306a36Sopenharmony_ci	size_t written;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	const u8 *data;
4462306a36Sopenharmony_ci	size_t frame_size;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	struct work_struct work;
4762306a36Sopenharmony_ci	struct completion cmd_completion;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	int cmd_result;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct nxp_nci_info {
5362306a36Sopenharmony_ci	struct nci_dev *ndev;
5462306a36Sopenharmony_ci	void *phy_id;
5562306a36Sopenharmony_ci	struct device *pdev;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	enum nxp_nci_mode mode;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	const struct nxp_nci_phy_ops *phy_ops;
6062306a36Sopenharmony_ci	unsigned int max_payload;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	struct mutex info_lock;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	struct nxp_nci_fw_info fw_info;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciint nxp_nci_fw_download(struct nci_dev *ndev, const char *firmware_name);
6862306a36Sopenharmony_civoid nxp_nci_fw_work(struct work_struct *work);
6962306a36Sopenharmony_civoid nxp_nci_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
7062306a36Sopenharmony_civoid nxp_nci_fw_work_complete(struct nxp_nci_info *info, int result);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciint nxp_nci_probe(void *phy_id, struct device *pdev,
7362306a36Sopenharmony_ci		  const struct nxp_nci_phy_ops *phy_ops,
7462306a36Sopenharmony_ci		  unsigned int max_payload,
7562306a36Sopenharmony_ci		  struct nci_dev **ndev);
7662306a36Sopenharmony_civoid nxp_nci_remove(struct nci_dev *ndev);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#endif /* __LOCAL_NXP_NCI_H_ */
79