mirror of https://gitee.com/openkylin/linux.git
NFC: Add HCI/SHDLC support to let driver check for tag presence
Signed-off-by: Eric Lapuyade <eric.lapuyade@intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d4ccb13280
commit
1676f75159
|
@ -39,6 +39,8 @@ struct nfc_hci_ops {
|
||||||
int (*data_exchange) (struct nfc_hci_dev *hdev,
|
int (*data_exchange) (struct nfc_hci_dev *hdev,
|
||||||
struct nfc_target *target,
|
struct nfc_target *target,
|
||||||
struct sk_buff *skb, struct sk_buff **res_skb);
|
struct sk_buff *skb, struct sk_buff **res_skb);
|
||||||
|
int (*check_presence)(struct nfc_hci_dev *hdev,
|
||||||
|
struct nfc_target *target);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NFC_HCI_MAX_CUSTOM_GATES 15
|
#define NFC_HCI_MAX_CUSTOM_GATES 15
|
||||||
|
|
|
@ -35,6 +35,8 @@ struct nfc_shdlc_ops {
|
||||||
int (*data_exchange) (struct nfc_shdlc *shdlc,
|
int (*data_exchange) (struct nfc_shdlc *shdlc,
|
||||||
struct nfc_target *target,
|
struct nfc_target *target,
|
||||||
struct sk_buff *skb, struct sk_buff **res_skb);
|
struct sk_buff *skb, struct sk_buff **res_skb);
|
||||||
|
int (*check_presence)(struct nfc_shdlc *shdlc,
|
||||||
|
struct nfc_target *target);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum shdlc_state {
|
enum shdlc_state {
|
||||||
|
|
|
@ -574,6 +574,17 @@ static int hci_data_exchange(struct nfc_dev *nfc_dev, struct nfc_target *target,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hci_check_presence(struct nfc_dev *nfc_dev,
|
||||||
|
struct nfc_target *target)
|
||||||
|
{
|
||||||
|
struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev);
|
||||||
|
|
||||||
|
if (hdev->ops->check_presence)
|
||||||
|
return hdev->ops->check_presence(hdev, target);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct nfc_ops hci_nfc_ops = {
|
struct nfc_ops hci_nfc_ops = {
|
||||||
.dev_up = hci_dev_up,
|
.dev_up = hci_dev_up,
|
||||||
.dev_down = hci_dev_down,
|
.dev_down = hci_dev_down,
|
||||||
|
@ -582,6 +593,7 @@ struct nfc_ops hci_nfc_ops = {
|
||||||
.activate_target = hci_activate_target,
|
.activate_target = hci_activate_target,
|
||||||
.deactivate_target = hci_deactivate_target,
|
.deactivate_target = hci_deactivate_target,
|
||||||
.data_exchange = hci_data_exchange,
|
.data_exchange = hci_data_exchange,
|
||||||
|
.check_presence = hci_check_presence,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
|
struct nfc_hci_dev *nfc_hci_allocate_device(struct nfc_hci_ops *ops,
|
||||||
|
|
|
@ -816,6 +816,17 @@ static int nfc_shdlc_data_exchange(struct nfc_hci_dev *hdev,
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nfc_shdlc_check_presence(struct nfc_hci_dev *hdev,
|
||||||
|
struct nfc_target *target)
|
||||||
|
{
|
||||||
|
struct nfc_shdlc *shdlc = nfc_hci_get_clientdata(hdev);
|
||||||
|
|
||||||
|
if (shdlc->ops->check_presence)
|
||||||
|
return shdlc->ops->check_presence(shdlc, target);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct nfc_hci_ops shdlc_ops = {
|
static struct nfc_hci_ops shdlc_ops = {
|
||||||
.open = nfc_shdlc_open,
|
.open = nfc_shdlc_open,
|
||||||
.close = nfc_shdlc_close,
|
.close = nfc_shdlc_close,
|
||||||
|
@ -825,6 +836,7 @@ static struct nfc_hci_ops shdlc_ops = {
|
||||||
.target_from_gate = nfc_shdlc_target_from_gate,
|
.target_from_gate = nfc_shdlc_target_from_gate,
|
||||||
.complete_target_discovered = nfc_shdlc_complete_target_discovered,
|
.complete_target_discovered = nfc_shdlc_complete_target_discovered,
|
||||||
.data_exchange = nfc_shdlc_data_exchange,
|
.data_exchange = nfc_shdlc_data_exchange,
|
||||||
|
.check_presence = nfc_shdlc_check_presence,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
|
struct nfc_shdlc *nfc_shdlc_allocate(struct nfc_shdlc_ops *ops,
|
||||||
|
|
Loading…
Reference in New Issue