OOBS enanchment changes for Bluetooth Driver

- Handling GPIO and UART clock throw State machine.

Change-Id: I9b10b15f2150c51823e5eb670954d5b6a97a606e
This commit is contained in:
Girish BN
2022-01-27 17:14:31 +05:30
committed by Balakrishna Godavarthi
parent 07f6a6064d
commit 633df0b2ed
2 changed files with 46 additions and 10 deletions

View File

@@ -95,6 +95,20 @@ int btpower_aop_mbox_init(struct btpower_platform_data *pdata);
#ifdef CONFIG_MSM_BT_OOBS #ifdef CONFIG_MSM_BT_OOBS
#define BT_CMD_OBS_SIGNAL_TASK 0xbfd0 #define BT_CMD_OBS_SIGNAL_TASK 0xbfd0
#define BT_CMD_OBS_VOTE_CLOCK 0xbfd1 #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
#endif /* __LINUX_BLUETOOTH_POWER_H */ #endif /* __LINUX_BLUETOOTH_POWER_H */

View File

@@ -1173,7 +1173,9 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
int chipset_version = 0; int chipset_version = 0;
int itr, num_vregs; int itr, num_vregs;
struct bt_power_vreg_data *vreg_info = NULL; 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) { if (!bt_power_pdata || !probe_finished) {
pr_err("%s: BTPower Probing Pending.Try Again\n", __func__); pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
return -EAGAIN; 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: case BT_CMD_OBS_SIGNAL_TASK:
bt_power_pdata->reffilp_obs = file; bt_power_pdata->reffilp_obs = file;
bt_power_pdata->reftask_obs = get_current(); 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); __func__, bt_power_pdata->reftask_obs->pid, file);
break; break;
case BT_CMD_OBS_VOTE_CLOCK: case BT_CMD_OBS_VOTE_CLOCK:
if (!gpio_is_valid(bt_power_pdata->bt_gpio_dev_wake)) { 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); __func__, bt_power_pdata->bt_gpio_dev_wake);
return -EIO; return -EIO;
} }
pwr_cntrl = (int)arg; clk_cntrl = (enum btpower_obs_param)arg;
btpower_uart_transport_locked(bt_power_pdata, (pwr_cntrl == 1 ? true : switch (clk_cntrl) {
false)); case BTPOWER_OBS_CLK_OFF:
gpio_set_value(bt_power_pdata->bt_gpio_dev_wake, pwr_cntrl); btpower_uart_transport_locked(bt_power_pdata, false);
pr_debug("%s: BT_CMD_OBS_VOTE_CLOCK cntrl(%d) %s\n", __func__, ret = 0;
pwr_cntrl, gpio_get_value(bt_power_pdata->bt_gpio_dev_wake) ? break;
"Assert" : "Deassert"); 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; break;
#endif #endif
case BT_CMD_SLIM_TEST: case BT_CMD_SLIM_TEST: