18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2014 NXP Semiconductors All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Authors: Clément Perrochaud <clement.perrochaud@nxp.com> 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Derived from PN544 device driver: 88c2ecf20Sopenharmony_ci * Copyright (C) 2012 Intel Corporation. All rights reserved. 98c2ecf20Sopenharmony_ci*/ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __LOCAL_NXP_NCI_H_ 128c2ecf20Sopenharmony_ci#define __LOCAL_NXP_NCI_H_ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/completion.h> 158c2ecf20Sopenharmony_ci#include <linux/firmware.h> 168c2ecf20Sopenharmony_ci#include <linux/nfc.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <net/nfc/nci_core.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define NXP_NCI_FW_HDR_LEN 2 218c2ecf20Sopenharmony_ci#define NXP_NCI_FW_CRC_LEN 2 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define NXP_NCI_FW_FRAME_LEN_MASK 0x03FF 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cienum nxp_nci_mode { 268c2ecf20Sopenharmony_ci NXP_NCI_MODE_COLD, 278c2ecf20Sopenharmony_ci NXP_NCI_MODE_NCI, 288c2ecf20Sopenharmony_ci NXP_NCI_MODE_FW 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct nxp_nci_phy_ops { 328c2ecf20Sopenharmony_ci int (*set_mode)(void *id, enum nxp_nci_mode mode); 338c2ecf20Sopenharmony_ci int (*write)(void *id, struct sk_buff *skb); 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct nxp_nci_fw_info { 378c2ecf20Sopenharmony_ci char name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 388c2ecf20Sopenharmony_ci const struct firmware *fw; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci size_t size; 418c2ecf20Sopenharmony_ci size_t written; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci const u8 *data; 448c2ecf20Sopenharmony_ci size_t frame_size; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci struct work_struct work; 478c2ecf20Sopenharmony_ci struct completion cmd_completion; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci int cmd_result; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cistruct nxp_nci_info { 538c2ecf20Sopenharmony_ci struct nci_dev *ndev; 548c2ecf20Sopenharmony_ci void *phy_id; 558c2ecf20Sopenharmony_ci struct device *pdev; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci enum nxp_nci_mode mode; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci const struct nxp_nci_phy_ops *phy_ops; 608c2ecf20Sopenharmony_ci unsigned int max_payload; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci struct mutex info_lock; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci struct nxp_nci_fw_info fw_info; 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ciint nxp_nci_fw_download(struct nci_dev *ndev, const char *firmware_name); 688c2ecf20Sopenharmony_civoid nxp_nci_fw_work(struct work_struct *work); 698c2ecf20Sopenharmony_civoid nxp_nci_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); 708c2ecf20Sopenharmony_civoid nxp_nci_fw_work_complete(struct nxp_nci_info *info, int result); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ciint nxp_nci_probe(void *phy_id, struct device *pdev, 738c2ecf20Sopenharmony_ci const struct nxp_nci_phy_ops *phy_ops, 748c2ecf20Sopenharmony_ci unsigned int max_payload, 758c2ecf20Sopenharmony_ci struct nci_dev **ndev); 768c2ecf20Sopenharmony_civoid nxp_nci_remove(struct nci_dev *ndev); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#endif /* __LOCAL_NXP_NCI_H_ */ 79