static int nfcmrvl_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_endpoint_descriptor *ep_desc; struct nfcmrvl_usb_drv_data *drv_data; struct nfcmrvl_private *priv; int i; struct usb_device *udev = interface_to_usbdev(intf); nfc_info(&udev->dev, "intf %p id %p", intf, id); drv_data = devm_kzalloc(&intf->dev, sizeof(*drv_data), GFP_KERNEL); if (!drv_data) return -ENOMEM; for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { ep_desc = &intf->cur_altsetting->endpoint[i].desc; if (!drv_data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { drv_data->bulk_tx_ep = ep_desc; continue; } if (!drv_data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { drv_data->bulk_rx_ep = ep_desc; continue; } } if (!drv_data->bulk_tx_ep || !drv_data->bulk_rx_ep) return -ENODEV; drv_data->udev = udev; drv_data->intf = intf; INIT_WORK(&drv_data->waker, nfcmrvl_waker); spin_lock_init(&drv_data->txlock); init_usb_anchor(&drv_data->tx_anchor); init_usb_anchor(&drv_data->bulk_anchor); init_usb_anchor(&drv_data->deferred); priv = nfcmrvl_nci_register_dev(drv_data, &usb_ops, &drv_data->udev->dev); if (IS_ERR(priv)) return PTR_ERR(priv); drv_data->priv = priv; priv->dev = &drv_data->udev->dev; usb_set_intfdata(intf, drv_data); return 0; }
static int nfcmrvl_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct nfcmrvl_i2c_drv_data *drv_data; struct nfcmrvl_platform_data *pdata; struct nfcmrvl_platform_data config; int ret; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { nfc_err(&client->dev, "Need I2C_FUNC_I2C\n"); return -ENODEV; } drv_data = devm_kzalloc(&client->dev, sizeof(*drv_data), GFP_KERNEL); if (!drv_data) return -ENOMEM; drv_data->i2c = client; drv_data->dev = &client->dev; drv_data->priv = NULL; i2c_set_clientdata(client, drv_data); pdata = client->dev.platform_data; if (!pdata && client->dev.of_node) if (nfcmrvl_i2c_parse_dt(client->dev.of_node, &config) == 0) pdata = &config; if (!pdata) return -EINVAL; /* Request the read IRQ */ ret = devm_request_threaded_irq(&drv_data->i2c->dev, pdata->irq, NULL, nfcmrvl_i2c_int_irq_thread_fn, pdata->irq_polarity | IRQF_ONESHOT, "nfcmrvl_i2c_int", drv_data); if (ret < 0) { nfc_err(&drv_data->i2c->dev, "Unable to register IRQ handler\n"); return ret; } drv_data->priv = nfcmrvl_nci_register_dev(NFCMRVL_PHY_I2C, drv_data, &i2c_ops, &drv_data->i2c->dev, pdata); if (IS_ERR(drv_data->priv)) return PTR_ERR(drv_data->priv); drv_data->priv->support_fw_dnld = true; return 0; }