Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83d9c5e5 authored by Balakrishna Godavarthi's avatar Balakrishna Godavarthi Committed by Marcel Holtmann
Browse files

Bluetooth: hci_qca: Add wrapper functions for setting UART speed



In function qca_setup, we set initial and operating speeds for Qualcomm
Bluetooth SoC's. This block of code is common across different
Qualcomm Bluetooth SoC's. Instead of duplicating the code, created
a wrapper function to set the speeds. So that future coming SoC's
can use these wrapper functions to set speeds.

Signed-off-by: default avatarBalakrishna Godavarthi <bgodavar@codeaurora.org>
Reviewed-by: default avatarMatthias Kaehlcke <mka@chromium.org>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent aadebac4
Loading
Loading
Loading
Loading
+70 −23
Original line number Diff line number Diff line
@@ -119,6 +119,11 @@ struct qca_data {
	u64 votes_off;
};

enum qca_speed_type {
	QCA_INIT_SPEED = 1,
	QCA_OPER_SPEED
};

struct qca_serdev {
	struct hci_uart	 serdev_hu;
	struct gpio_desc *bt_en;
@@ -923,6 +928,61 @@ static inline void host_set_baudrate(struct hci_uart *hu, unsigned int speed)
		hci_uart_set_baudrate(hu, speed);
}

static unsigned int qca_get_speed(struct hci_uart *hu,
				  enum qca_speed_type speed_type)
{
	unsigned int speed = 0;

	if (speed_type == QCA_INIT_SPEED) {
		if (hu->init_speed)
			speed = hu->init_speed;
		else if (hu->proto->init_speed)
			speed = hu->proto->init_speed;
	} else {
		if (hu->oper_speed)
			speed = hu->oper_speed;
		else if (hu->proto->oper_speed)
			speed = hu->proto->oper_speed;
	}

	return speed;
}

static int qca_check_speeds(struct hci_uart *hu)
{
	if (!qca_get_speed(hu, QCA_INIT_SPEED) ||
	    !qca_get_speed(hu, QCA_OPER_SPEED))
		return -EINVAL;

	return 0;
}

static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
{
	unsigned int speed, qca_baudrate;
	int ret;

	if (speed_type == QCA_INIT_SPEED) {
		speed = qca_get_speed(hu, QCA_INIT_SPEED);
		if (speed)
			host_set_baudrate(hu, speed);
	} else {
		speed = qca_get_speed(hu, QCA_OPER_SPEED);
		if (!speed)
			return 0;

		qca_baudrate = qca_get_baudrate_value(speed);
		bt_dev_info(hu->hdev, "Set UART speed to %d", speed);
		ret = qca_set_baudrate(hu->hdev, qca_baudrate);
		if (ret)
			return ret;

		host_set_baudrate(hu, speed);
	}

	return 0;
}

static int qca_setup(struct hci_uart *hu)
{
	struct hci_dev *hdev = hu->hdev;
@@ -933,37 +993,24 @@ static int qca_setup(struct hci_uart *hu)

	bt_dev_info(hdev, "ROME setup");

	ret = qca_check_speeds(hu);
	if (ret)
		return ret;

	/* Patch downloading has to be done without IBS mode */
	clear_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags);

	/* Setup initial baudrate */
	speed = 0;
	if (hu->init_speed)
		speed = hu->init_speed;
	else if (hu->proto->init_speed)
		speed = hu->proto->init_speed;

	if (speed)
		host_set_baudrate(hu, speed);
	qca_set_speed(hu, QCA_INIT_SPEED);

	/* Setup user speed if needed */
	speed = 0;
	if (hu->oper_speed)
		speed = hu->oper_speed;
	else if (hu->proto->oper_speed)
		speed = hu->proto->oper_speed;

	speed = qca_get_speed(hu, QCA_OPER_SPEED);
	if (speed) {
		qca_baudrate = qca_get_baudrate_value(speed);

		bt_dev_info(hdev, "Set UART speed to %d", speed);
		ret = qca_set_baudrate(hdev, qca_baudrate);
		if (ret) {
			bt_dev_err(hdev, "Failed to change the baud rate (%d)",
				   ret);
		ret = qca_set_speed(hu, QCA_OPER_SPEED);
		if (ret)
			return ret;
		}
		host_set_baudrate(hu, speed);

		qca_baudrate = qca_get_baudrate_value(speed);
	}

	/* Get QCA version information */