/** * nci_allocate_device - allocate a new nci device * * @ops: device operations * @supported_protocols: NFC protocols supported by the device */ struct nci_dev *nci_allocate_device(struct nci_ops *ops, __u32 supported_protocols, int tx_headroom, int tx_tailroom) { struct nci_dev *ndev = NULL; nfc_dbg("entry, supported_protocols 0x%x", supported_protocols); if (!ops->open || !ops->close || !ops->send) goto exit; if (!supported_protocols) goto exit; ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL); if (!ndev) goto exit; ndev->ops = ops; ndev->tx_headroom = tx_headroom; ndev->tx_tailroom = tx_tailroom; ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops, supported_protocols, tx_headroom + NCI_DATA_HDR_SIZE, tx_tailroom); if (!ndev->nfc_dev) goto free_exit; nfc_set_drvdata(ndev->nfc_dev, ndev); goto exit; free_exit: kfree(ndev); exit: return ndev; }
/** * nci_allocate_device - allocate a new nci device * * @ops: device operations * @supported_protocols: NFC protocols supported by the device */ struct nci_dev *nci_allocate_device(struct nci_ops *ops, __u32 supported_protocols, int tx_headroom, int tx_tailroom) { struct nci_dev *ndev; pr_debug("supported_protocols 0x%x\n", supported_protocols); if (!ops->open || !ops->close || !ops->send) return NULL; if (!supported_protocols) return NULL; ndev = kzalloc(sizeof(struct nci_dev), GFP_KERNEL); if (!ndev) return NULL; ndev->ops = ops; ndev->tx_headroom = tx_headroom; ndev->tx_tailroom = tx_tailroom; init_completion(&ndev->req_completion); ndev->nfc_dev = nfc_allocate_device(&nci_nfc_ops, supported_protocols, tx_headroom + NCI_DATA_HDR_SIZE, tx_tailroom); if (!ndev->nfc_dev) goto free_exit; nfc_set_drvdata(ndev->nfc_dev, ndev); return ndev; free_exit: kfree(ndev); return NULL; }
static struct nfcsim *nfcsim_init_dev(void) { struct nfcsim *dev; int rc = -ENOMEM; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) return ERR_PTR(-ENOMEM); mutex_init(&dev->lock); INIT_DELAYED_WORK(&dev->recv_work, nfcsim_wq_recv); INIT_DELAYED_WORK(&dev->poll_work, nfcsim_wq_poll); dev->nfc_dev = nfc_allocate_device(&nfcsim_nfc_ops, NFC_PROTO_NFC_DEP_MASK, 0, 0); if (!dev->nfc_dev) goto error; nfc_set_drvdata(dev->nfc_dev, dev); rc = nfc_register_device(dev->nfc_dev); if (rc) goto free_nfc_dev; return dev; free_nfc_dev: nfc_free_device(dev->nfc_dev); error: kfree(dev); return ERR_PTR(rc); }