| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /*
- * Marvell NFC driver: major functions
- *
- * Copyright (C) 2014, Marvell International Ltd.
- *
- * This software file (the "File") is distributed by Marvell International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License"). You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available on the worldwide web at
- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
- * this warranty disclaimer.
- */
- #include <linux/module.h>
- #include <linux/nfc.h>
- #include <net/nfc/nci.h>
- #include <net/nfc/nci_core.h>
- #include "nfcmrvl.h"
- #define VERSION "1.0"
- static int nfcmrvl_nci_open(struct nci_dev *ndev)
- {
- struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
- int err;
- if (test_and_set_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
- return 0;
- err = priv->if_ops->nci_open(priv);
- if (err)
- clear_bit(NFCMRVL_NCI_RUNNING, &priv->flags);
- return err;
- }
- static int nfcmrvl_nci_close(struct nci_dev *ndev)
- {
- struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
- if (!test_and_clear_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
- return 0;
- priv->if_ops->nci_close(priv);
- return 0;
- }
- static int nfcmrvl_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
- {
- struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
- nfc_info(priv->dev, "send entry, len %d\n", skb->len);
- skb->dev = (void *)ndev;
- if (!test_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
- return -EBUSY;
- return priv->if_ops->nci_send(priv, skb);
- }
- static int nfcmrvl_nci_setup(struct nci_dev *ndev)
- {
- __u8 val;
- val = NFCMRVL_GPIO_PIN_NFC_NOT_ALLOWED;
- nci_set_config(ndev, NFCMRVL_NOT_ALLOWED_ID, 1, &val);
- val = NFCMRVL_GPIO_PIN_NFC_ACTIVE;
- nci_set_config(ndev, NFCMRVL_ACTIVE_ID, 1, &val);
- val = NFCMRVL_EXT_COEX_ENABLE;
- nci_set_config(ndev, NFCMRVL_EXT_COEX_ID, 1, &val);
- return 0;
- }
- static struct nci_ops nfcmrvl_nci_ops = {
- .open = nfcmrvl_nci_open,
- .close = nfcmrvl_nci_close,
- .send = nfcmrvl_nci_send,
- .setup = nfcmrvl_nci_setup,
- };
- struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
- struct nfcmrvl_if_ops *ops,
- struct device *dev)
- {
- struct nfcmrvl_private *priv;
- int rc;
- u32 protocols;
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return ERR_PTR(-ENOMEM);
- priv->drv_data = drv_data;
- priv->if_ops = ops;
- priv->dev = dev;
- protocols = NFC_PROTO_JEWEL_MASK
- | NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK
- | NFC_PROTO_ISO14443_MASK
- | NFC_PROTO_ISO14443_B_MASK
- | NFC_PROTO_NFC_DEP_MASK;
- priv->ndev = nci_allocate_device(&nfcmrvl_nci_ops, protocols, 0, 0);
- if (!priv->ndev) {
- nfc_err(dev, "nci_allocate_device failed");
- rc = -ENOMEM;
- goto error;
- }
- nci_set_drvdata(priv->ndev, priv);
- rc = nci_register_device(priv->ndev);
- if (rc) {
- nfc_err(dev, "nci_register_device failed %d", rc);
- nci_free_device(priv->ndev);
- goto error;
- }
- nfc_info(dev, "registered with nci successfully\n");
- return priv;
- error:
- kfree(priv);
- return ERR_PTR(rc);
- }
- EXPORT_SYMBOL_GPL(nfcmrvl_nci_register_dev);
- void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
- {
- struct nci_dev *ndev = priv->ndev;
- nci_unregister_device(ndev);
- nci_free_device(ndev);
- kfree(priv);
- }
- EXPORT_SYMBOL_GPL(nfcmrvl_nci_unregister_dev);
- int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, void *data, int count)
- {
- struct sk_buff *skb;
- skb = nci_skb_alloc(priv->ndev, count, GFP_ATOMIC);
- if (!skb)
- return -ENOMEM;
- memcpy(skb_put(skb, count), data, count);
- nci_recv_frame(priv->ndev, skb);
- return count;
- }
- EXPORT_SYMBOL_GPL(nfcmrvl_nci_recv_frame);
- MODULE_AUTHOR("Marvell International Ltd.");
- MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION);
- MODULE_VERSION(VERSION);
- MODULE_LICENSE("GPL v2");
|