static int s3fwrn82_uart_probe()

in s3fwrn5/uart.c [111:172]


static int s3fwrn82_uart_probe(struct serdev_device *serdev)
{
	struct s3fwrn82_uart_phy *phy;
	int ret = -ENOMEM;

	phy = devm_kzalloc(&serdev->dev, sizeof(*phy), GFP_KERNEL);
	if (!phy)
		goto err_exit;

	phy->recv_skb = alloc_skb(NCI_SKB_BUFF_LEN, GFP_KERNEL);
	if (!phy->recv_skb)
		goto err_exit;

	mutex_init(&phy->common.mutex);
	phy->common.mode = S3FWRN5_MODE_COLD;

	phy->ser_dev = serdev;
	serdev_device_set_drvdata(serdev, phy);
	serdev_device_set_client_ops(serdev, &s3fwrn82_serdev_ops);
	ret = serdev_device_open(serdev);
	if (ret) {
		dev_err(&serdev->dev, "Unable to open device\n");
		goto err_skb;
	}

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

	serdev_device_set_flow_control(serdev, false);

	ret = s3fwrn82_uart_parse_dt(serdev);
	if (ret < 0)
		goto err_serdev;

	ret = devm_gpio_request_one(&phy->ser_dev->dev, phy->common.gpio_en,
				    GPIOF_OUT_INIT_HIGH, "s3fwrn82_en");
	if (ret < 0)
		goto err_serdev;

	ret = devm_gpio_request_one(&phy->ser_dev->dev,
				    phy->common.gpio_fw_wake,
				    GPIOF_OUT_INIT_LOW, "s3fwrn82_fw_wake");
	if (ret < 0)
		goto err_serdev;

	ret = s3fwrn5_probe(&phy->common.ndev, phy, &phy->ser_dev->dev,
			    &uart_phy_ops);
	if (ret < 0)
		goto err_serdev;

	return ret;

err_serdev:
	serdev_device_close(serdev);
err_skb:
	kfree_skb(phy->recv_skb);
err_exit:
	return ret;
}