aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/mei
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/mei')
-rw-r--r--drivers/misc/mei/nfc.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c
index 37d4b09bc795..33354d94c0c2 100644
--- a/drivers/misc/mei/nfc.c
+++ b/drivers/misc/mei/nfc.c
@@ -102,6 +102,7 @@ struct mei_nfc_dev {
102 u8 fw_ivn; 102 u8 fw_ivn;
103 u8 vendor_id; 103 u8 vendor_id;
104 u8 radio_type; 104 u8 radio_type;
105 char *bus_name;
105}; 106};
106 107
107static struct mei_nfc_dev nfc_dev; 108static struct mei_nfc_dev nfc_dev;
@@ -115,6 +116,14 @@ static const uuid_le mei_nfc_info_guid = UUID_LE(0xd2de1625, 0x382d, 0x417d,
115 0x48, 0xa4, 0xef, 0xab, 116 0x48, 0xa4, 0xef, 0xab,
116 0xba, 0x8a, 0x12, 0x06); 117 0xba, 0x8a, 0x12, 0x06);
117 118
119/* Vendors */
120#define MEI_NFC_VENDOR_INSIDE 0x00
121#define MEI_NFC_VENDOR_NXP 0x01
122
123/* Radio types */
124#define MEI_NFC_VENDOR_INSIDE_UREAD 0x00
125#define MEI_NFC_VENDOR_NXP_PN544 0x01
126
118static void mei_nfc_free(struct mei_nfc_dev *ndev) 127static void mei_nfc_free(struct mei_nfc_dev *ndev)
119{ 128{
120 if (ndev->cl) { 129 if (ndev->cl) {
@@ -130,6 +139,51 @@ static void mei_nfc_free(struct mei_nfc_dev *ndev)
130 } 139 }
131} 140}
132 141
142static int mei_nfc_build_bus_name(struct mei_nfc_dev *ndev)
143{
144 struct mei_device *dev;
145
146 if (!ndev->cl)
147 return -ENODEV;
148
149 dev = ndev->cl->dev;
150
151 switch (ndev->vendor_id) {
152 case MEI_NFC_VENDOR_INSIDE:
153 switch (ndev->radio_type) {
154 case MEI_NFC_VENDOR_INSIDE_UREAD:
155 ndev->bus_name = "microread";
156 return 0;
157
158 default:
159 dev_err(&dev->pdev->dev, "Unknow radio type 0x%x\n",
160 ndev->radio_type);
161
162 return -EINVAL;
163 }
164
165 case MEI_NFC_VENDOR_NXP:
166 switch (ndev->radio_type) {
167 case MEI_NFC_VENDOR_NXP_PN544:
168 ndev->bus_name = "pn544";
169 return 0;
170 default:
171 dev_err(&dev->pdev->dev, "Unknow radio type 0x%x\n",
172 ndev->radio_type);
173
174 return -EINVAL;
175 }
176
177 default:
178 dev_err(&dev->pdev->dev, "Unknow vendor ID 0x%x\n",
179 ndev->vendor_id);
180
181 return -EINVAL;
182 }
183
184 return 0;
185}
186
133static int mei_nfc_if_version(struct mei_nfc_dev *ndev) 187static int mei_nfc_if_version(struct mei_nfc_dev *ndev)
134{ 188{
135 struct mei_device *dev; 189 struct mei_device *dev;
@@ -184,6 +238,7 @@ err:
184static void mei_nfc_init(struct work_struct *work) 238static void mei_nfc_init(struct work_struct *work)
185{ 239{
186 struct mei_device *dev; 240 struct mei_device *dev;
241 struct mei_cl_device *cldev;
187 struct mei_nfc_dev *ndev; 242 struct mei_nfc_dev *ndev;
188 struct mei_cl *cl_info; 243 struct mei_cl *cl_info;
189 244
@@ -226,6 +281,23 @@ static void mei_nfc_init(struct work_struct *work)
226 281
227 mutex_unlock(&dev->device_lock); 282 mutex_unlock(&dev->device_lock);
228 283
284 if (mei_nfc_build_bus_name(ndev) < 0) {
285 dev_err(&dev->pdev->dev,
286 "Could not build the bus ID name\n");
287 return;
288 }
289
290 cldev = mei_cl_add_device(dev, mei_nfc_guid, ndev->bus_name, NULL);
291 if (!cldev) {
292 dev_err(&dev->pdev->dev,
293 "Could not add the NFC device to the MEI bus\n");
294
295 goto err;
296 }
297
298 cldev->priv_data = ndev;
299
300
229 return; 301 return;
230 302
231err: 303err:
@@ -307,5 +379,8 @@ void mei_nfc_host_exit(void)
307{ 379{
308 struct mei_nfc_dev *ndev = &nfc_dev; 380 struct mei_nfc_dev *ndev = &nfc_dev;
309 381
382 if (ndev->cl && ndev->cl->device)
383 mei_cl_remove_device(ndev->cl->device);
384
310 mei_nfc_free(ndev); 385 mei_nfc_free(ndev);
311} 386}