1191b0700STomas Winkler // SPDX-License-Identifier: GPL-2.0
2bb03dcebSSamuel Ortiz /*
3bb03dcebSSamuel Ortiz * Copyright (C) 2013 Intel Corporation. All rights reserved.
4bb03dcebSSamuel Ortiz *
5191b0700STomas Winkler * HCI based Driver for NXP pn544 NFC Chip
6bb03dcebSSamuel Ortiz */
7bb03dcebSSamuel Ortiz
8bb03dcebSSamuel Ortiz #include <linux/module.h>
9bb03dcebSSamuel Ortiz #include <linux/mod_devicetable.h>
10bb03dcebSSamuel Ortiz #include <linux/nfc.h>
11bb03dcebSSamuel Ortiz #include <net/nfc/hci.h>
12bb03dcebSSamuel Ortiz #include <net/nfc/llc.h>
13bb03dcebSSamuel Ortiz
14bb03dcebSSamuel Ortiz #include "../mei_phy.h"
15bb03dcebSSamuel Ortiz #include "pn544.h"
16bb03dcebSSamuel Ortiz
17bb03dcebSSamuel Ortiz #define PN544_DRIVER_NAME "pn544"
18bb03dcebSSamuel Ortiz
pn544_mei_probe(struct mei_cl_device * cldev,const struct mei_cl_device_id * id)1989391382STomas Winkler static int pn544_mei_probe(struct mei_cl_device *cldev,
20bb03dcebSSamuel Ortiz const struct mei_cl_device_id *id)
21bb03dcebSSamuel Ortiz {
22bb03dcebSSamuel Ortiz struct nfc_mei_phy *phy;
23bb03dcebSSamuel Ortiz int r;
24bb03dcebSSamuel Ortiz
2589391382STomas Winkler phy = nfc_mei_phy_alloc(cldev);
26*64758c63SKrzysztof Kozlowski if (!phy)
27bb03dcebSSamuel Ortiz return -ENOMEM;
28bb03dcebSSamuel Ortiz
29bb03dcebSSamuel Ortiz r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME,
30bb03dcebSSamuel Ortiz MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,
318bd7fc89SEric Lapuyade NULL, &phy->hdev);
3273f3adb9SSamuel Ortiz if (r < 0) {
33bb03dcebSSamuel Ortiz nfc_mei_phy_free(phy);
34bb03dcebSSamuel Ortiz
35bb03dcebSSamuel Ortiz return r;
36bb03dcebSSamuel Ortiz }
37bb03dcebSSamuel Ortiz
3873f3adb9SSamuel Ortiz return 0;
3973f3adb9SSamuel Ortiz }
4073f3adb9SSamuel Ortiz
pn544_mei_remove(struct mei_cl_device * cldev)41bf5c9cc8SUwe Kleine-König static void pn544_mei_remove(struct mei_cl_device *cldev)
42bb03dcebSSamuel Ortiz {
43d49dc5e7STomas Winkler struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev);
44bb03dcebSSamuel Ortiz
45bb03dcebSSamuel Ortiz pn544_hci_remove(phy->hdev);
46bb03dcebSSamuel Ortiz
47bb03dcebSSamuel Ortiz nfc_mei_phy_free(phy);
48bb03dcebSSamuel Ortiz }
49bb03dcebSSamuel Ortiz
50bb03dcebSSamuel Ortiz static struct mei_cl_device_id pn544_mei_tbl[] = {
51b26864caSTomas Winkler { PN544_DRIVER_NAME, MEI_NFC_UUID, MEI_CL_VERSION_ANY},
52bb03dcebSSamuel Ortiz
53bb03dcebSSamuel Ortiz /* required last entry */
54bb03dcebSSamuel Ortiz { }
55bb03dcebSSamuel Ortiz };
56bb03dcebSSamuel Ortiz MODULE_DEVICE_TABLE(mei, pn544_mei_tbl);
57bb03dcebSSamuel Ortiz
58bb03dcebSSamuel Ortiz static struct mei_cl_driver pn544_driver = {
59bb03dcebSSamuel Ortiz .id_table = pn544_mei_tbl,
60bb03dcebSSamuel Ortiz .name = PN544_DRIVER_NAME,
61bb03dcebSSamuel Ortiz
62bb03dcebSSamuel Ortiz .probe = pn544_mei_probe,
63bb03dcebSSamuel Ortiz .remove = pn544_mei_remove,
64bb03dcebSSamuel Ortiz };
65bb03dcebSSamuel Ortiz
66094dbffeSTomas Winkler module_mei_cl_driver(pn544_driver);
67bb03dcebSSamuel Ortiz
68bb03dcebSSamuel Ortiz MODULE_LICENSE("GPL");
69bb03dcebSSamuel Ortiz MODULE_DESCRIPTION(DRIVER_DESC);
70