1*46fe7771SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 2dece4585SClément Perrochaud /* 3dece4585SClément Perrochaud * Copyright (C) 2014 NXP Semiconductors All rights reserved. 4dece4585SClément Perrochaud * 5dece4585SClément Perrochaud * Authors: Clément Perrochaud <clement.perrochaud@nxp.com> 6dece4585SClément Perrochaud * 7dece4585SClément Perrochaud * Derived from PN544 device driver: 8dece4585SClément Perrochaud * Copyright (C) 2012 Intel Corporation. All rights reserved. 9dece4585SClément Perrochaud */ 10dece4585SClément Perrochaud 11dece4585SClément Perrochaud #ifndef __LOCAL_NXP_NCI_H_ 12dece4585SClément Perrochaud #define __LOCAL_NXP_NCI_H_ 13dece4585SClément Perrochaud 14dece4585SClément Perrochaud #include <linux/completion.h> 15dece4585SClément Perrochaud #include <linux/firmware.h> 16dece4585SClément Perrochaud #include <linux/nfc.h> 17dece4585SClément Perrochaud 18dece4585SClément Perrochaud #include <net/nfc/nci_core.h> 19dece4585SClément Perrochaud 20dece4585SClément Perrochaud #define NXP_NCI_FW_HDR_LEN 2 21dece4585SClément Perrochaud #define NXP_NCI_FW_CRC_LEN 2 22dece4585SClément Perrochaud 23dece4585SClément Perrochaud #define NXP_NCI_FW_FRAME_LEN_MASK 0x03FF 24dece4585SClément Perrochaud 25dece4585SClément Perrochaud enum nxp_nci_mode { 26dece4585SClément Perrochaud NXP_NCI_MODE_COLD, 27dece4585SClément Perrochaud NXP_NCI_MODE_NCI, 28dece4585SClément Perrochaud NXP_NCI_MODE_FW 29dece4585SClément Perrochaud }; 30dece4585SClément Perrochaud 31dece4585SClément Perrochaud struct nxp_nci_phy_ops { 32dece4585SClément Perrochaud int (*set_mode)(void *id, enum nxp_nci_mode mode); 33dece4585SClément Perrochaud int (*write)(void *id, struct sk_buff *skb); 34dece4585SClément Perrochaud }; 35dece4585SClément Perrochaud 36dece4585SClément Perrochaud struct nxp_nci_fw_info { 37dece4585SClément Perrochaud char name[NFC_FIRMWARE_NAME_MAXSIZE + 1]; 38dece4585SClément Perrochaud const struct firmware *fw; 39dece4585SClément Perrochaud 40dece4585SClément Perrochaud size_t size; 41dece4585SClément Perrochaud size_t written; 42dece4585SClément Perrochaud 43dece4585SClément Perrochaud const u8 *data; 44dece4585SClément Perrochaud size_t frame_size; 45dece4585SClément Perrochaud 46dece4585SClément Perrochaud struct work_struct work; 47dece4585SClément Perrochaud struct completion cmd_completion; 48dece4585SClément Perrochaud 49dece4585SClément Perrochaud int cmd_result; 50dece4585SClément Perrochaud }; 51dece4585SClément Perrochaud 52dece4585SClément Perrochaud struct nxp_nci_info { 53dece4585SClément Perrochaud struct nci_dev *ndev; 54dece4585SClément Perrochaud void *phy_id; 55dece4585SClément Perrochaud struct device *pdev; 56dece4585SClément Perrochaud 57dece4585SClément Perrochaud enum nxp_nci_mode mode; 58dece4585SClément Perrochaud 597cf6d08cSJulia Lawall const struct nxp_nci_phy_ops *phy_ops; 60dece4585SClément Perrochaud unsigned int max_payload; 61dece4585SClément Perrochaud 62dece4585SClément Perrochaud struct mutex info_lock; 63dece4585SClément Perrochaud 64dece4585SClément Perrochaud struct nxp_nci_fw_info fw_info; 65dece4585SClément Perrochaud }; 66dece4585SClément Perrochaud 67dece4585SClément Perrochaud int nxp_nci_fw_download(struct nci_dev *ndev, const char *firmware_name); 68dece4585SClément Perrochaud void nxp_nci_fw_work(struct work_struct *work); 69dece4585SClément Perrochaud void nxp_nci_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); 70dece4585SClément Perrochaud void nxp_nci_fw_work_complete(struct nxp_nci_info *info, int result); 71dece4585SClément Perrochaud 72dece4585SClément Perrochaud int nxp_nci_probe(void *phy_id, struct device *pdev, 737cf6d08cSJulia Lawall const struct nxp_nci_phy_ops *phy_ops, 747cf6d08cSJulia Lawall unsigned int max_payload, 75dece4585SClément Perrochaud struct nci_dev **ndev); 76dece4585SClément Perrochaud void nxp_nci_remove(struct nci_dev *ndev); 77dece4585SClément Perrochaud 78dece4585SClément Perrochaud #endif /* __LOCAL_NXP_NCI_H_ */ 79