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