0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/module.h>
0011 #include <linux/mod_devicetable.h>
0012 #include <linux/nfc.h>
0013 #include <net/nfc/llc.h>
0014
0015 #include "../mei_phy.h"
0016 #include "microread.h"
0017
0018 #define MICROREAD_DRIVER_NAME "microread"
0019
0020 static int microread_mei_probe(struct mei_cl_device *cldev,
0021 const struct mei_cl_device_id *id)
0022 {
0023 struct nfc_mei_phy *phy;
0024 int r;
0025
0026 phy = nfc_mei_phy_alloc(cldev);
0027 if (!phy)
0028 return -ENOMEM;
0029
0030 r = microread_probe(phy, &mei_phy_ops, LLC_NOP_NAME,
0031 MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,
0032 &phy->hdev);
0033 if (r < 0) {
0034 nfc_mei_phy_free(phy);
0035
0036 return r;
0037 }
0038
0039 return 0;
0040 }
0041
0042 static void microread_mei_remove(struct mei_cl_device *cldev)
0043 {
0044 struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev);
0045
0046 microread_remove(phy->hdev);
0047
0048 nfc_mei_phy_free(phy);
0049 }
0050
0051 static struct mei_cl_device_id microread_mei_tbl[] = {
0052 { MICROREAD_DRIVER_NAME, MEI_NFC_UUID, MEI_CL_VERSION_ANY},
0053
0054
0055 { }
0056 };
0057 MODULE_DEVICE_TABLE(mei, microread_mei_tbl);
0058
0059 static struct mei_cl_driver microread_driver = {
0060 .id_table = microread_mei_tbl,
0061 .name = MICROREAD_DRIVER_NAME,
0062
0063 .probe = microread_mei_probe,
0064 .remove = microread_mei_remove,
0065 };
0066
0067 module_mei_cl_driver(microread_driver);
0068
0069 MODULE_LICENSE("GPL");
0070 MODULE_DESCRIPTION(DRIVER_DESC);