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

Commit 0e123a02 authored by Mahesh Kumar Sharma's avatar Mahesh Kumar Sharma Committed by Gerrit - the friendly Code Review server
Browse files

Bluetooth: Implement a minimum off-time for AON discharge issue



Sometimes it is seen that AON LDO output takes minimum
off-time (worst case 100ms) to fully discharge. If BT is
turned on in this timeframe when AON is not fully discharged
yet ,BT would fail to turn ON.

This fix ensures to
Toggle BT_EN high when WL_EN is already high.
Handle corner case if WL_EN goes low in step 1.
Add 100ms to toggle BT_EN high when WL_EN is low.

Change-Id: Ibe082165788bd9ddb553e6043696bebc5bf4b609
Signed-off-by: default avatarMahesh Kumar Sharma <smahesh@codeaurora.org>
parent 5168327a
Loading
Loading
Loading
Loading
+40 −7
Original line number Diff line number Diff line
@@ -297,6 +297,7 @@ static int bt_configure_gpios(int on)
{
	int rc = 0;
	int bt_reset_gpio = bt_power_pdata->bt_gpio_sys_rst;
	int wl_reset_gpio = bt_power_pdata->wl_gpio_sys_rst;
	int bt_sw_ctrl_gpio  =  bt_power_pdata->bt_gpio_sw_ctrl;
	int bt_debug_gpio  =  bt_power_pdata->bt_gpio_debug;
	int assert_dbg_gpio = 0;
@@ -327,14 +328,36 @@ static int bt_configure_gpios(int on)
				bt_sw_ctrl_gpio,
				bt_power_src_status[BT_SW_CTRL_GPIO]);
		}
		pr_debug("BTON:Turn Bt On wl-reset-gpio(%d) value(%d)\n",
			wl_reset_gpio, gpio_get_value(wl_reset_gpio));

		if ((wl_reset_gpio < 0) ||
			((wl_reset_gpio >= 0) && gpio_get_value(wl_reset_gpio))) {
			rc = gpio_direction_output(bt_reset_gpio, 1);
			if (rc) {
			pr_err("%s: Unable to set direction\n", __func__);
				pr_debug("%s: Unable to set direction\n", __func__);
				return rc;
			}
		bt_power_src_status[BT_RESET_GPIO] =
			gpio_get_value(bt_reset_gpio);
		}
		if ((wl_reset_gpio >= 0) && (gpio_get_value(wl_reset_gpio) == 0)) {
			if (gpio_get_value(bt_reset_gpio)) {
				pr_debug("%s: Wlan Off and BT On too close\n", __func__);
				pr_debug("%s: reset BT_EN, enable it after delay\n", __func__);
				rc = gpio_direction_output(bt_reset_gpio, 0);
				if (rc) {
					pr_debug("%s: Unable to set direction\n", __func__);
					return rc;
				}
			}
			pr_debug("%s:add 100ms delay for AON output to fully discharge\n",
				 __func__);
			msleep(100);
			rc = gpio_direction_output(bt_reset_gpio, 1);
			if (rc) {
				pr_debug("%s: Unable to set direction\n", __func__);
				return rc;
			}
		}
		msleep(50);
		/*  Check  if  SW_CTRL  is  asserted  */
		if  (bt_sw_ctrl_gpio  >=  0)  {
@@ -429,6 +452,8 @@ static int bluetooth_power(int on)
gpio_fail:
		if (bt_power_pdata->bt_gpio_sys_rst > 0)
			gpio_free(bt_power_pdata->bt_gpio_sys_rst);
		if (bt_power_pdata->wl_gpio_sys_rst > 0)
			gpio_free(bt_power_pdata->wl_gpio_sys_rst);
		if  (bt_power_pdata->bt_gpio_sw_ctrl  >  0)
			gpio_free(bt_power_pdata->bt_gpio_sw_ctrl);
		if  (bt_power_pdata->bt_gpio_debug  >  0)
@@ -720,6 +745,14 @@ static int bt_power_populate_dt_pinfo(struct platform_device *pdev)
		if (bt_power_pdata->bt_gpio_sys_rst < 0)
			pr_warn("bt-reset-gpio not provided in devicetree\n");

		bt_power_pdata->wl_gpio_sys_rst =
			of_get_named_gpio(pdev->dev.of_node,
						"qcom,wl-reset-gpio", 0);
		if (bt_power_pdata->wl_gpio_sys_rst < 0)
			pr_err("%s: wl-reset-gpio not provided in device tree\n",
				__func__);


		bt_power_pdata->bt_gpio_sw_ctrl  =
			of_get_named_gpio(pdev->dev.of_node,
						"qcom,bt-sw-ctrl-gpio",  0);
+1 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ struct btpower_tcs_table_info {
 */
struct bluetooth_power_platform_data {
	int bt_gpio_sys_rst;                   /* Bluetooth reset gpio */
	int wl_gpio_sys_rst;                   /* Wlan reset gpio */
	int bt_gpio_sw_ctrl;                   /* Bluetooth sw_ctrl gpio */
	int bt_gpio_debug;                     /* Bluetooth debug gpio */
	struct device *slim_dev;