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/mod_devicetable.h> |
10 | #include <linux/nfc.h> |
11 | #include <net/nfc/hci.h> |
12 | #include <net/nfc/llc.h> |
13 | |
14 | #include "../mei_phy.h" |
15 | #include "pn544.h" |
16 | |
17 | #define PN544_DRIVER_NAME "pn544" |
18 | |
19 | static int pn544_mei_probe(struct mei_cl_device *cldev, |
20 | const struct mei_cl_device_id *id) |
21 | { |
22 | struct nfc_mei_phy *phy; |
23 | int r; |
24 | |
25 | phy = nfc_mei_phy_alloc(device: cldev); |
26 | if (!phy) |
27 | return -ENOMEM; |
28 | |
29 | r = pn544_hci_probe(phy_id: phy, phy_ops: &mei_phy_ops, LLC_NOP_NAME, |
30 | MEI_NFC_HEADER_SIZE, phy_tailroom: 0, MEI_NFC_MAX_HCI_PAYLOAD, |
31 | NULL, hdev: &phy->hdev); |
32 | if (r < 0) { |
33 | nfc_mei_phy_free(phy); |
34 | |
35 | return r; |
36 | } |
37 | |
38 | return 0; |
39 | } |
40 | |
41 | static void pn544_mei_remove(struct mei_cl_device *cldev) |
42 | { |
43 | struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev); |
44 | |
45 | pn544_hci_remove(hdev: phy->hdev); |
46 | |
47 | nfc_mei_phy_free(phy); |
48 | } |
49 | |
50 | static struct mei_cl_device_id pn544_mei_tbl[] = { |
51 | { PN544_DRIVER_NAME, MEI_NFC_UUID, MEI_CL_VERSION_ANY}, |
52 | |
53 | /* required last entry */ |
54 | { } |
55 | }; |
56 | MODULE_DEVICE_TABLE(mei, pn544_mei_tbl); |
57 | |
58 | static struct mei_cl_driver pn544_driver = { |
59 | .id_table = pn544_mei_tbl, |
60 | .name = PN544_DRIVER_NAME, |
61 | |
62 | .probe = pn544_mei_probe, |
63 | .remove = pn544_mei_remove, |
64 | }; |
65 | |
66 | module_mei_cl_driver(pn544_driver); |
67 | |
68 | MODULE_LICENSE("GPL" ); |
69 | MODULE_DESCRIPTION(DRIVER_DESC); |
70 | |