From 633df0b2edf7d0b175fdf8ced4c4132f2c1b3093 Mon Sep 17 00:00:00 2001 From: Girish BN Date: Thu, 27 Jan 2022 17:14:31 +0530 Subject: [PATCH] OOBS enanchment changes for Bluetooth Driver - Handling GPIO and UART clock throw State machine. Change-Id: I9b10b15f2150c51823e5eb670954d5b6a97a606e --- include/btpower.h | 14 ++++++++++++++ pwr/btpower.c | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/include/btpower.h b/include/btpower.h index f3befbd397..03c8451c43 100644 --- a/include/btpower.h +++ b/include/btpower.h @@ -95,6 +95,20 @@ int btpower_aop_mbox_init(struct btpower_platform_data *pdata); #ifdef CONFIG_MSM_BT_OOBS #define BT_CMD_OBS_SIGNAL_TASK 0xbfd0 #define BT_CMD_OBS_VOTE_CLOCK 0xbfd1 + +/** + * enum btpower_obs_param: OOBS low power param + * @BTPOWER_OBS_CLK_OFF: Transport bus is no longer acquired + * @BTPOWER_OBS_CLK_ON: Acquire transport bus for either transmitting or receiving + * @BTPOWER_OBS_DEV_OFF: Bluetooth is released because of no more transmission + * @BTPOWER_OBS_DEV_ON: Wake up the Bluetooth controller for transmission + */ +enum btpower_obs_param { + BTPOWER_OBS_CLK_OFF = 0, + BTPOWER_OBS_CLK_ON, + BTPOWER_OBS_DEV_OFF, + BTPOWER_OBS_DEV_ON, +}; #endif #endif /* __LINUX_BLUETOOTH_POWER_H */ diff --git a/pwr/btpower.c b/pwr/btpower.c index 45bf9ddc3a..9ab5b3abdf 100644 --- a/pwr/btpower.c +++ b/pwr/btpower.c @@ -1173,7 +1173,9 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) int chipset_version = 0; int itr, num_vregs; struct bt_power_vreg_data *vreg_info = NULL; - +#ifdef CONFIG_MSM_BT_OOBS + enum btpower_obs_param clk_cntrl; +#endif if (!bt_power_pdata || !probe_finished) { pr_err("%s: BTPower Probing Pending.Try Again\n", __func__); return -EAGAIN; @@ -1184,22 +1186,42 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case BT_CMD_OBS_SIGNAL_TASK: bt_power_pdata->reffilp_obs = file; bt_power_pdata->reftask_obs = get_current(); - pr_info("%s: BT_CMD_OBS_SIGNAL_TASK tid %d filp %pK\n", + pr_info("%s: BT_CMD_OBS_SIGNAL_TASK tid %d file %pK\n", __func__, bt_power_pdata->reftask_obs->pid, file); break; case BT_CMD_OBS_VOTE_CLOCK: if (!gpio_is_valid(bt_power_pdata->bt_gpio_dev_wake)) { - pr_warn("%s: BT_CMD_OBS_VOTE_CLOCK bt_dev_wake_n(%d) not configured\n", + pr_debug("%s: BT_CMD_OBS_VOTE_CLOCK bt_dev_wake_n(%d) not configured\n", __func__, bt_power_pdata->bt_gpio_dev_wake); return -EIO; } - pwr_cntrl = (int)arg; - btpower_uart_transport_locked(bt_power_pdata, (pwr_cntrl == 1 ? true : - false)); - gpio_set_value(bt_power_pdata->bt_gpio_dev_wake, pwr_cntrl); - pr_debug("%s: BT_CMD_OBS_VOTE_CLOCK cntrl(%d) %s\n", __func__, - pwr_cntrl, gpio_get_value(bt_power_pdata->bt_gpio_dev_wake) ? - "Assert" : "Deassert"); + clk_cntrl = (enum btpower_obs_param)arg; + switch (clk_cntrl) { + case BTPOWER_OBS_CLK_OFF: + btpower_uart_transport_locked(bt_power_pdata, false); + ret = 0; + break; + case BTPOWER_OBS_CLK_ON: + btpower_uart_transport_locked(bt_power_pdata, true); + ret = 0; + break; + case BTPOWER_OBS_DEV_OFF: + gpio_set_value(bt_power_pdata->bt_gpio_dev_wake, 0); + ret = 0; + break; + case BTPOWER_OBS_DEV_ON: + gpio_set_value(bt_power_pdata->bt_gpio_dev_wake, 1); + ret = 0; + break; + default: + pr_debug("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d)\n", + __func__, clk_cntrl); + return -EINVAL; + } + pr_debug("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d) %s\n", + __func__, clk_cntrl, + gpio_get_value(bt_power_pdata->bt_gpio_dev_wake) ? + "Assert" : "Deassert"); break; #endif case BT_CMD_SLIM_TEST: