summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheney Ni <cheneyni@google.com>2022-02-18 00:32:25 +0800
committerCheney Ni <cheneyni@google.com>2022-02-18 02:43:06 +0800
commitda7e6b32a2f10cd5f65244678495f7a40d5e86d6 (patch)
tree5c8209bbba0cb30bf0e6a2a41d1794dd1904eeb6
parentfa9bdcb11ba229f130d8ba045621a4b7956ef7d4 (diff)
downloadqcom-da7e6b32a2f10cd5f65244678495f7a40d5e86d6.tar.gz
btpower: apply preferred BT pinctrl state
Configure our power GPIO pins while probing to prevent from unexpected hardware errors. Bug: 220142775 Signed-off-by: Cheney Ni <cheneyni@google.com> Change-Id: I390e02c402250f7d52f7dc0188e2eecdf51154ef
-rw-r--r--btpower.c19
-rw-r--r--linux/btpower.h5
2 files changed, 23 insertions, 1 deletions
diff --git a/btpower.c b/btpower.c
index 1faf64e..bab68ad 100644
--- a/btpower.c
+++ b/btpower.c
@@ -937,6 +937,14 @@ static int btpower_gpios_source_initialize(struct btpower_platform_data *drvdata
{
int rc = 0;
+ if (!IS_ERR_OR_NULL(drvdata->pinctrl_default_state)) {
+ rc = pinctrl_select_state(drvdata->pinctrls,
+ drvdata->pinctrl_default_state);
+ if (unlikely(rc))
+ pr_warn("%s: failed to set default pinctrl state rc=%d\n",
+ __func__, rc);
+ }
+
rc = btpower_gpio_acquire_output(drvdata->bt_gpio_sys_rst,
"bt_sys_rst_n", 0);
if (rc) {
@@ -1000,6 +1008,17 @@ static int bt_power_populate_dt_pinfo(struct platform_device *pdev,
if (rc)
return rc;
+ drvdata->pinctrls = devm_pinctrl_get(&pdev->dev);
+ if (IS_ERR(drvdata->pinctrls)) {
+ pr_warn("%s: pinctrls not provided in device tree\n", __func__);
+ } else {
+ drvdata->pinctrl_default_state =
+ pinctrl_lookup_state(drvdata->pinctrls, "default");
+ }
+ if (IS_ERR(drvdata->pinctrl_default_state))
+ pr_warn("%s: default pinctrl state not provided in device tree\n",
+ __func__);
+
drvdata->bt_gpio_sys_rst =
of_get_named_gpio(pdev->dev.of_node, "qcom,bt-reset-gpio", 0);
if (!gpio_is_valid(drvdata->bt_gpio_sys_rst)) {
diff --git a/linux/btpower.h b/linux/btpower.h
index 98f30aa..48efd2f 100644
--- a/linux/btpower.h
+++ b/linux/btpower.h
@@ -7,9 +7,10 @@
#define __LINUX_BLUETOOTH_POWER_H
#include <linux/cdev.h>
-#include <linux/types.h>
#include <linux/mailbox_client.h>
#include <linux/mailbox/qmp.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/types.h>
/*
* voltage regulator information required for configuring the
@@ -67,6 +68,8 @@ struct btpower_platform_data {
char compatible[MAX_PROP_SIZE]; /*Bluetooth SoC name */
/* GPIOs */
+ struct pinctrl *pinctrls;
+ struct pinctrl_state *pinctrl_default_state;
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 */