xref: /openbmc/linux/drivers/nfc/pn544/mei.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
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