From d603e191bfd7da5dd2dcc28cef384b7aa0174ab7 Mon Sep 17 00:00:00 2001 From: Harish Bandi Date: Fri, 17 Jul 2020 22:27:06 +0530 Subject: [PATCH] Bluetooth: Add the support for wcn3980 in SDM429w Enable the new msm GPIO's to enable eLDO for 3.3v and 1.3v to turn on wcn3980. Change-Id: Id476b187336906cddd66621471afa20dd8924b40 Signed-off-by: Harish Bandi --- drivers/bluetooth/bluetooth-power.c | 85 +++++++++++++++++++++++++++++ include/linux/bluetooth-power.h | 6 +- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/drivers/bluetooth/bluetooth-power.c b/drivers/bluetooth/bluetooth-power.c index d675fd83476e..b074c9c15279 100644 --- a/drivers/bluetooth/bluetooth-power.c +++ b/drivers/bluetooth/bluetooth-power.c @@ -242,6 +242,64 @@ static int bt_clk_disable(struct bt_power_clk_data *clk) return rc; } +static int bt_configure_gpios_2wcn(int on) +{ + int rc = 0; + int bt_3p3_en_gpio = bt_power_pdata->bt_gpio_3p3_en; + int bt_1p3_en_gpio = bt_power_pdata->bt_gpio_1p3_en; + + BT_PWR_DBG("2wcn - bt_gpio= %d on: %d", bt_3p3_en_gpio, on); + + if (on) { + rc = gpio_request(bt_3p3_en_gpio, "bt_3p3_en_n"); + if (rc) { + BT_PWR_ERR("unable to request gpio %d (%d)\n", + bt_3p3_en_gpio, rc); + return rc; + } + + rc = gpio_direction_output(bt_3p3_en_gpio, 0); + if (rc) { + BT_PWR_ERR("Unable to set direction\n"); + return rc; + } + msleep(50); + rc = gpio_direction_output(bt_3p3_en_gpio, 1); + if (rc) { + BT_PWR_ERR("Unable to set direction\n"); + return rc; + } + msleep(50); + + rc = gpio_request(bt_1p3_en_gpio, "bt_1p3_en_n"); + if (rc) { + BT_PWR_ERR("unable to request gpio %d (%d)\n", + bt_1p3_en_gpio, rc); + return rc; + } + + rc = gpio_direction_output(bt_1p3_en_gpio, 0); + if (rc) { + BT_PWR_ERR("Unable to set direction\n"); + return rc; + } + msleep(50); + rc = gpio_direction_output(bt_1p3_en_gpio, 1); + if (rc) { + BT_PWR_ERR("Unable to set direction\n"); + return rc; + } + msleep(50); + } else { + gpio_set_value(bt_3p3_en_gpio, 0); + msleep(100); + gpio_set_value(bt_1p3_en_gpio, 0); + msleep(100); + } + return rc; +} + + static int bt_configure_gpios(int on) { int rc = 0; @@ -305,12 +363,27 @@ static int bluetooth_power(int on) goto gpio_fail; } } + if (bt_power_pdata->bt_gpio_3p3_en > 0) { + BT_PWR_ERR( + "bt_power gpio config start for 2wcn gpios"); + rc = bt_configure_gpios_2wcn(on); + if (rc < 0) { + BT_PWR_ERR("bt_power gpio config failed"); + goto gpio_fail; + } + } } else { if (bt_power_pdata->bt_gpio_sys_rst > 0) bt_configure_gpios(on); + if (bt_power_pdata->bt_gpio_3p3_en > 0) + bt_configure_gpios_2wcn(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->bt_gpio_3p3_en > 0) + gpio_free(bt_power_pdata->bt_gpio_3p3_en); + if (bt_power_pdata->bt_gpio_1p3_en > 0) + gpio_free(bt_power_pdata->bt_gpio_1p3_en); if (bt_power_pdata->bt_chip_clk) bt_clk_disable(bt_power_pdata->bt_chip_clk); clk_fail: @@ -584,6 +657,18 @@ static int bt_power_populate_dt_pinfo(struct platform_device *pdev) if (bt_power_pdata->bt_gpio_sys_rst < 0) BT_PWR_ERR("bt-reset-gpio not provided in device tree"); + bt_power_pdata->bt_gpio_3p3_en = + of_get_named_gpio(pdev->dev.of_node, + "qca,bt-3P3-en-gpio", 0); + if (bt_power_pdata->bt_gpio_3p3_en < 0) + BT_PWR_INFO("bt-3P3-gpio not provided in devicetree"); + + bt_power_pdata->bt_gpio_1p3_en = + of_get_named_gpio(pdev->dev.of_node, + "qca,bt-1P3-en-gpio", 0); + if (bt_power_pdata->bt_gpio_1p3_en < 0) + BT_PWR_INFO("bt-1P3-gpio not provided in devicetree"); + rc = bt_dt_parse_clk_info(&pdev->dev, &bt_power_pdata->bt_chip_clk); if (rc < 0) diff --git a/include/linux/bluetooth-power.h b/include/linux/bluetooth-power.h index 397c70578b90..5f72fc4e3e13 100644 --- a/include/linux/bluetooth-power.h +++ b/include/linux/bluetooth-power.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018,2020, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -59,6 +59,10 @@ struct bt_power_clk_data { struct bluetooth_power_platform_data { /* Bluetooth reset gpio */ int bt_gpio_sys_rst; + /* Bluetooth 3p3 gpio */ + int bt_gpio_3p3_en; + /* Bluetooth 1p3 gpio */ + int bt_gpio_1p3_en; struct device *slim_dev; /* VDDIO voltage regulator */ struct bt_power_vreg_data *vreg_info;