diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2013-04-10 21:03:30 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-04-10 21:56:53 -0400 |
commit | 91a6b95f20e338ef63e55422b1f037665fc6440a (patch) | |
tree | c6c35d55de8699d4ee949652922764350ac2c100 | |
parent | 59fcd7c63abf0340f551f487264b67ff5f7a0b86 (diff) |
mei: nfc: Add NFC device to the MEI bus
After building its bus name as a string based on its vendor id and radio
type, we can add it to the bus.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/misc/mei/nfc.c | 75 |
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 | ||
107 | static struct mei_nfc_dev nfc_dev; | 108 | static 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 | |||
118 | static void mei_nfc_free(struct mei_nfc_dev *ndev) | 127 | static 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 | ||
142 | static 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 | |||
133 | static int mei_nfc_if_version(struct mei_nfc_dev *ndev) | 187 | static 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: | |||
184 | static void mei_nfc_init(struct work_struct *work) | 238 | static 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 | ||
231 | err: | 303 | err: |
@@ -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 | } |