aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch')
-rw-r--r--recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch111
1 files changed, 111 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch b/recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch
new file mode 100644
index 0000000..734e778
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto/qca6390-driver/0005-mfd-qcom-qca639x-Add-support-for-WCN6855.patch
@@ -0,0 +1,111 @@
+From 87c18e7aa2071dc0c95b76360671c3b3f2dcedec Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Date: Sat, 26 Feb 2022 21:52:08 +0300
+Subject: [PATCH 5/5] mfd: qcom-qca639x: Add support for WCN6855
+
+Add support for powering up WCN6855 WiFi/BT chip.
+
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Upstream-Status: Inappropriate
+---
+ drivers/mfd/qcom-qca639x.c | 49 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 49 insertions(+)
+
+diff --git a/drivers/mfd/qcom-qca639x.c b/drivers/mfd/qcom-qca639x.c
+index 4de860e9bbd0..16ff767a34b0 100644
+--- a/drivers/mfd/qcom-qca639x.c
++++ b/drivers/mfd/qcom-qca639x.c
+@@ -44,10 +44,38 @@ static const struct qca_cfg_data qca6390_cfg_data = {
+ .num_vregs = ARRAY_SIZE(qca6390_vregs),
+ };
+
++static const struct vreg wcn6855_vregs[] = {
++ /* 2.8 V */
++ { "vddasd" }, /* external antenna switch */
++
++ /* 0.95 V */
++ { "vddaon" },
++ { "vddcx" },
++ { "vddmx" },
++
++ /* 1.9 V - 2.1 V */
++ { "vddrfa1" },
++
++ /* 1.35 V */
++ { "vddrfa2" },
++
++ /* 2.2 V, optional */
++ { "vddrfa3" },
++
++ /* 1.8 V */
++ { "vddio" },
++};
++
++static const struct qca_cfg_data wcn6855_cfg_data = {
++ .vregs = wcn6855_vregs,
++ .num_vregs = ARRAY_SIZE(wcn6855_vregs),
++};
++
+ struct qca_data {
+ size_t num_vregs;
+ struct device *dev;
+ struct generic_pm_domain pd;
++ struct gpio_desc *xo_clk_gpio;
+ struct gpio_desc *wlan_en_gpio;
+ struct gpio_desc *bt_en_gpio;
+ struct regulator_bulk_data regulators[];
+@@ -71,11 +99,24 @@ static int qca_power_on(struct generic_pm_domain *domain)
+ /* Wait for 1ms before toggling enable pins. */
+ msleep(1);
+
++ if (data->xo_clk_gpio) {
++ gpiod_set_value(data->xo_clk_gpio, 1);
++
++ /*XO CLK must be asserted for some time before WLAN_EN */
++ usleep_range(100, 200);
++ }
++
+ if (data->wlan_en_gpio)
+ gpiod_set_value(data->wlan_en_gpio, 1);
+ if (data->bt_en_gpio)
+ gpiod_set_value(data->bt_en_gpio, 1);
+
++ if (data->xo_clk_gpio) {
++ /* Assert XO CLK ~(2-5)ms before off for valid latch in HW */
++ usleep_range(2000, 5000);
++ gpiod_set_value(data->xo_clk_gpio, 0);
++ }
++
+ /* Wait for all power levels to stabilize */
+ msleep(6);
+
+@@ -126,11 +167,18 @@ static int qca_probe(struct platform_device *pdev)
+ return ret;
+
+ for (i = 0; i < data->num_vregs; i++) {
++ if (!cfg->vregs[i].load_uA)
++ continue;
++
+ ret = regulator_set_load(data->regulators[i].consumer, cfg->vregs[i].load_uA);
+ if (ret)
+ return ret;
+ }
+
++ data->xo_clk_gpio = devm_gpiod_get_optional(&pdev->dev, "xo-clk", GPIOD_OUT_LOW);
++ if (IS_ERR(data->xo_clk_gpio))
++ return PTR_ERR(data->xo_clk_gpio);
++
+ data->wlan_en_gpio = devm_gpiod_get_optional(&pdev->dev, "wlan-en", GPIOD_OUT_LOW);
+ if (IS_ERR(data->wlan_en_gpio))
+ return PTR_ERR(data->wlan_en_gpio);
+@@ -169,6 +217,7 @@ static int qca_remove(struct platform_device *pdev)
+
+ static const struct of_device_id qca_of_match[] = {
+ { .compatible = "qcom,qca6390", .data = &qca6390_cfg_data },
++ { .compatible = "qcom,wcn6855", .data = &wcn6855_cfg_data },
+ { },
+ };
+
+--
+2.39.2
+