1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2013 Intel Corporation. All rights reserved.
4 *
5 * HCI based Driver for NXP pn544 NFC Chip
6 */
7
8 #include <linux/module.h>
9 #include <linux/nfc.h>
10 #include <net/nfc/hci.h>
11 #include <net/nfc/llc.h>
12
13 #include "../mei_phy.h"
14 #include "pn544.h"
15
16 #define PN544_DRIVER_NAME "pn544"
17
pn544_mei_probe(struct mei_cl_device * cldev,const struct mei_cl_device_id * id)18 static int pn544_mei_probe(struct mei_cl_device *cldev,
19 const struct mei_cl_device_id *id)
20 {
21 struct nfc_mei_phy *phy;
22 int r;
23
24 phy = nfc_mei_phy_alloc(cldev);
25 if (!phy)
26 return -ENOMEM;
27
28 r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME,
29 MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,
30 NULL, &phy->hdev);
31 if (r < 0) {
32 nfc_mei_phy_free(phy);
33
34 return r;
35 }
36
37 return 0;
38 }
39
pn544_mei_remove(struct mei_cl_device * cldev)40 static void pn544_mei_remove(struct mei_cl_device *cldev)
41 {
42 struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev);
43
44 pn544_hci_remove(phy->hdev);
45
46 nfc_mei_phy_free(phy);
47 }
48
49 static struct mei_cl_device_id pn544_mei_tbl[] = {
50 {
51 .name = PN544_DRIVER_NAME,
52 .uuid = MEI_NFC_UUID,
53 .version = MEI_CL_VERSION_ANY,
54 },
55 { /* required last entry */ }
56 };
57 MODULE_DEVICE_TABLE(mei, pn544_mei_tbl);
58
59 static struct mei_cl_driver pn544_driver = {
60 .id_table = pn544_mei_tbl,
61 .name = PN544_DRIVER_NAME,
62
63 .probe = pn544_mei_probe,
64 .remove = pn544_mei_remove,
65 };
66
67 module_mei_cl_driver(pn544_driver);
68
69 MODULE_LICENSE("GPL");
70 MODULE_DESCRIPTION(DRIVER_DESC);
71