static int microread_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct microread_i2c_phy *phy; struct microread_nfc_platform_data *pdata = dev_get_platdata(&client->dev); int r; dev_dbg(&client->dev, "client %p\n", client); if (!pdata) { nfc_err(&client->dev, "client %p: missing platform data\n", client); return -EINVAL; } phy = devm_kzalloc(&client->dev, sizeof(struct microread_i2c_phy), GFP_KERNEL); if (!phy) return -ENOMEM; i2c_set_clientdata(client, phy); phy->i2c_dev = client; r = request_threaded_irq(client->irq, NULL, microread_i2c_irq_thread_fn, IRQF_TRIGGER_RISING | IRQF_ONESHOT, MICROREAD_I2C_DRIVER_NAME, phy); if (r) { nfc_err(&client->dev, "Unable to register IRQ handler\n"); return r; } r = microread_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME, MICROREAD_I2C_FRAME_HEADROOM, MICROREAD_I2C_FRAME_TAILROOM, MICROREAD_I2C_LLC_MAX_PAYLOAD, &phy->hdev); if (r < 0) goto err_irq; nfc_info(&client->dev, "Probed\n"); return 0; err_irq: free_irq(client->irq, phy); return r; }
static int microread_mei_probe(struct mei_cl_device *device, const struct mei_cl_device_id *id) { struct microread_mei_phy *phy; int r; pr_info("Probing NFC microread\n"); phy = kzalloc(sizeof(struct microread_mei_phy), GFP_KERNEL); if (!phy) { pr_err("Cannot allocate memory for microread mei phy.\n"); return -ENOMEM; } phy->device = device; mei_cl_set_drvdata(device, phy); r = mei_cl_register_event_cb(device, microread_event_cb, phy); if (r) { pr_err(MICROREAD_DRIVER_NAME ": event cb registration failed\n"); goto err_out; } r = microread_probe(phy, &mei_phy_ops, LLC_NOP_NAME, MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD, &phy->hdev); if (r < 0) goto err_out; return 0; err_out: kfree(phy); return r; }