diff options
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.patch | 111 |
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 + |