Skip to content

Commit

Permalink
Bluetooth: hci_qca: Add wrapper functions for setting UART speed
Browse files Browse the repository at this point in the history
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: Balakrishna Godavarthi <bgodavar@codeaurora.org>
Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Balakrishna Godavarthi authored and Marcel Holtmann committed Aug 3, 2018
1 parent aadebac commit 83d9c5e
Showing 1 changed file with 70 additions and 23 deletions.
93 changes: 70 additions & 23 deletions drivers/bluetooth/hci_qca.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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 */
Expand Down

0 comments on commit 83d9c5e

Please sign in to comment.