static int pn532_uart_probe()

in pn533/uart.c [238:304]


static int pn532_uart_probe(struct serdev_device *serdev)
{
	struct pn532_uart_phy *pn532;
	struct pn533 *priv;
	int err;

	err = -ENOMEM;
	pn532 = kzalloc(sizeof(*pn532), GFP_KERNEL);
	if (!pn532)
		goto err_exit;

	pn532->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL);
	if (!pn532->recv_skb)
		goto err_free;

	pn532->serdev = serdev;
	serdev_device_set_drvdata(serdev, pn532);
	serdev_device_set_client_ops(serdev, &pn532_serdev_ops);
	err = serdev_device_open(serdev);
	if (err) {
		dev_err(&serdev->dev, "Unable to open device\n");
		goto err_skb;
	}

	err = serdev_device_set_baudrate(serdev, 115200);
	if (err != 115200) {
		err = -EINVAL;
		goto err_serdev;
	}

	serdev_device_set_flow_control(serdev, false);
	pn532->send_wakeup = PN532_SEND_WAKEUP;
	timer_setup(&pn532->cmd_timeout, pn532_cmd_timeout, 0);
	priv = pn53x_common_init(PN533_DEVICE_PN532_AUTOPOLL,
				     PN533_PROTO_REQ_ACK_RESP,
				     pn532, &uart_phy_ops, NULL,
				     &pn532->serdev->dev);
	if (IS_ERR(priv)) {
		err = PTR_ERR(priv);
		goto err_serdev;
	}

	pn532->priv = priv;
	err = pn533_finalize_setup(pn532->priv);
	if (err)
		goto err_clean;

	serdev_device_close(serdev);
	err = pn53x_register_nfc(priv, PN533_NO_TYPE_B_PROTOCOLS, &serdev->dev);
	if (err) {
		pn53x_common_clean(pn532->priv);
		goto err_skb;
	}

	return err;

err_clean:
	pn53x_common_clean(pn532->priv);
err_serdev:
	serdev_device_close(serdev);
err_skb:
	kfree_skb(pn532->recv_skb);
err_free:
	kfree(pn532);
err_exit:
	return err;
}