diff options
author | Ilan Elias <ilane@ti.com> | 2011-09-18 04:19:33 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-09-20 14:43:49 -0400 |
commit | 8b3fe7b591b3c50061a8701f8eda14033420577b (patch) | |
tree | 1bdd98d750c12c6bdf6999d3f704a1f50e9db477 /net/nfc | |
parent | a7ce1c9446a7f7513211e4698d07357d20452909 (diff) |
NFC: Add dev_up and dev_down control operations
Add 2 new nfc control operations:
dev_up to turn on the nfc device
dev_down to turn off the nfc device
Signed-off-by: Ilan Elias <ilane@ti.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/nfc')
-rw-r--r-- | net/nfc/core.c | 77 | ||||
-rw-r--r-- | net/nfc/netlink.c | 56 | ||||
-rw-r--r-- | net/nfc/nfc.h | 4 |
3 files changed, 137 insertions, 0 deletions
diff --git a/net/nfc/core.c b/net/nfc/core.c index 284e2f6a14ff..47e02c1b8c02 100644 --- a/net/nfc/core.c +++ b/net/nfc/core.c | |||
@@ -53,6 +53,80 @@ int nfc_printk(const char *level, const char *format, ...) | |||
53 | EXPORT_SYMBOL(nfc_printk); | 53 | EXPORT_SYMBOL(nfc_printk); |
54 | 54 | ||
55 | /** | 55 | /** |
56 | * nfc_dev_up - turn on the NFC device | ||
57 | * | ||
58 | * @dev: The nfc device to be turned on | ||
59 | * | ||
60 | * The device remains up until the nfc_dev_down function is called. | ||
61 | */ | ||
62 | int nfc_dev_up(struct nfc_dev *dev) | ||
63 | { | ||
64 | int rc = 0; | ||
65 | |||
66 | nfc_dbg("dev_name=%s", dev_name(&dev->dev)); | ||
67 | |||
68 | device_lock(&dev->dev); | ||
69 | |||
70 | if (!device_is_registered(&dev->dev)) { | ||
71 | rc = -ENODEV; | ||
72 | goto error; | ||
73 | } | ||
74 | |||
75 | if (dev->dev_up) { | ||
76 | rc = -EALREADY; | ||
77 | goto error; | ||
78 | } | ||
79 | |||
80 | if (dev->ops->dev_up) | ||
81 | rc = dev->ops->dev_up(dev); | ||
82 | |||
83 | if (!rc) | ||
84 | dev->dev_up = true; | ||
85 | |||
86 | error: | ||
87 | device_unlock(&dev->dev); | ||
88 | return rc; | ||
89 | } | ||
90 | |||
91 | /** | ||
92 | * nfc_dev_down - turn off the NFC device | ||
93 | * | ||
94 | * @dev: The nfc device to be turned off | ||
95 | */ | ||
96 | int nfc_dev_down(struct nfc_dev *dev) | ||
97 | { | ||
98 | int rc = 0; | ||
99 | |||
100 | nfc_dbg("dev_name=%s", dev_name(&dev->dev)); | ||
101 | |||
102 | device_lock(&dev->dev); | ||
103 | |||
104 | if (!device_is_registered(&dev->dev)) { | ||
105 | rc = -ENODEV; | ||
106 | goto error; | ||
107 | } | ||
108 | |||
109 | if (!dev->dev_up) { | ||
110 | rc = -EALREADY; | ||
111 | goto error; | ||
112 | } | ||
113 | |||
114 | if (dev->polling || dev->remote_activated) { | ||
115 | rc = -EBUSY; | ||
116 | goto error; | ||
117 | } | ||
118 | |||
119 | if (dev->ops->dev_down) | ||
120 | dev->ops->dev_down(dev); | ||
121 | |||
122 | dev->dev_up = false; | ||
123 | |||
124 | error: | ||
125 | device_unlock(&dev->dev); | ||
126 | return rc; | ||
127 | } | ||
128 | |||
129 | /** | ||
56 | * nfc_start_poll - start polling for nfc targets | 130 | * nfc_start_poll - start polling for nfc targets |
57 | * | 131 | * |
58 | * @dev: The nfc device that must start polling | 132 | * @dev: The nfc device that must start polling |
@@ -144,6 +218,8 @@ int nfc_activate_target(struct nfc_dev *dev, u32 target_idx, u32 protocol) | |||
144 | } | 218 | } |
145 | 219 | ||
146 | rc = dev->ops->activate_target(dev, target_idx, protocol); | 220 | rc = dev->ops->activate_target(dev, target_idx, protocol); |
221 | if (!rc) | ||
222 | dev->remote_activated = true; | ||
147 | 223 | ||
148 | error: | 224 | error: |
149 | device_unlock(&dev->dev); | 225 | device_unlock(&dev->dev); |
@@ -170,6 +246,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 target_idx) | |||
170 | } | 246 | } |
171 | 247 | ||
172 | dev->ops->deactivate_target(dev, target_idx); | 248 | dev->ops->deactivate_target(dev, target_idx); |
249 | dev->remote_activated = false; | ||
173 | 250 | ||
174 | error: | 251 | error: |
175 | device_unlock(&dev->dev); | 252 | device_unlock(&dev->dev); |
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c index ccdff7953f7d..03f8818e1f16 100644 --- a/net/nfc/netlink.c +++ b/net/nfc/netlink.c | |||
@@ -367,6 +367,52 @@ out_putdev: | |||
367 | return rc; | 367 | return rc; |
368 | } | 368 | } |
369 | 369 | ||
370 | static int nfc_genl_dev_up(struct sk_buff *skb, struct genl_info *info) | ||
371 | { | ||
372 | struct nfc_dev *dev; | ||
373 | int rc; | ||
374 | u32 idx; | ||
375 | |||
376 | nfc_dbg("entry"); | ||
377 | |||
378 | if (!info->attrs[NFC_ATTR_DEVICE_INDEX]) | ||
379 | return -EINVAL; | ||
380 | |||
381 | idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]); | ||
382 | |||
383 | dev = nfc_get_device(idx); | ||
384 | if (!dev) | ||
385 | return -ENODEV; | ||
386 | |||
387 | rc = nfc_dev_up(dev); | ||
388 | |||
389 | nfc_put_device(dev); | ||
390 | return rc; | ||
391 | } | ||
392 | |||
393 | static int nfc_genl_dev_down(struct sk_buff *skb, struct genl_info *info) | ||
394 | { | ||
395 | struct nfc_dev *dev; | ||
396 | int rc; | ||
397 | u32 idx; | ||
398 | |||
399 | nfc_dbg("entry"); | ||
400 | |||
401 | if (!info->attrs[NFC_ATTR_DEVICE_INDEX]) | ||
402 | return -EINVAL; | ||
403 | |||
404 | idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]); | ||
405 | |||
406 | dev = nfc_get_device(idx); | ||
407 | if (!dev) | ||
408 | return -ENODEV; | ||
409 | |||
410 | rc = nfc_dev_down(dev); | ||
411 | |||
412 | nfc_put_device(dev); | ||
413 | return rc; | ||
414 | } | ||
415 | |||
370 | static int nfc_genl_start_poll(struct sk_buff *skb, struct genl_info *info) | 416 | static int nfc_genl_start_poll(struct sk_buff *skb, struct genl_info *info) |
371 | { | 417 | { |
372 | struct nfc_dev *dev; | 418 | struct nfc_dev *dev; |
@@ -441,6 +487,16 @@ static struct genl_ops nfc_genl_ops[] = { | |||
441 | .policy = nfc_genl_policy, | 487 | .policy = nfc_genl_policy, |
442 | }, | 488 | }, |
443 | { | 489 | { |
490 | .cmd = NFC_CMD_DEV_UP, | ||
491 | .doit = nfc_genl_dev_up, | ||
492 | .policy = nfc_genl_policy, | ||
493 | }, | ||
494 | { | ||
495 | .cmd = NFC_CMD_DEV_DOWN, | ||
496 | .doit = nfc_genl_dev_down, | ||
497 | .policy = nfc_genl_policy, | ||
498 | }, | ||
499 | { | ||
444 | .cmd = NFC_CMD_START_POLL, | 500 | .cmd = NFC_CMD_START_POLL, |
445 | .doit = nfc_genl_start_poll, | 501 | .doit = nfc_genl_start_poll, |
446 | .policy = nfc_genl_policy, | 502 | .policy = nfc_genl_policy, |
diff --git a/net/nfc/nfc.h b/net/nfc/nfc.h index aaf9832298f3..1a877de8e230 100644 --- a/net/nfc/nfc.h +++ b/net/nfc/nfc.h | |||
@@ -101,6 +101,10 @@ static inline void nfc_device_iter_exit(struct class_dev_iter *iter) | |||
101 | class_dev_iter_exit(iter); | 101 | class_dev_iter_exit(iter); |
102 | } | 102 | } |
103 | 103 | ||
104 | int nfc_dev_up(struct nfc_dev *dev); | ||
105 | |||
106 | int nfc_dev_down(struct nfc_dev *dev); | ||
107 | |||
104 | int nfc_start_poll(struct nfc_dev *dev, u32 protocols); | 108 | int nfc_start_poll(struct nfc_dev *dev, u32 protocols); |
105 | 109 | ||
106 | int nfc_stop_poll(struct nfc_dev *dev); | 110 | int nfc_stop_poll(struct nfc_dev *dev); |