Loading arch/arm/boot/dts/qcom/mdmfermium-cdp.dtsi +12 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,18 @@ #include "mdmfermium.dtsi" #include "mdmfermium-pinctrl.dtsi" / { bluetooth: bt_qca6174 { compatible = "qca,qca6174"; qca,bt-reset-gpio = <&pm8019_gpios 2 0>; /* BT_EN */ qca,bt-vdd-pa-supply = <&rome_vreg>; qca,bt-vdd-io-supply = <&mdmfermium_l11>; qca,bt-vdd-xtal-supply = <&mdmfermium_l2>; qca,bt-vdd-io-voltage-level = <1800000 1800000>; qca,bt-vdd-xtal-voltage-level = <1800000 1800000>; }; }; &soc { }; Loading arch/arm/boot/dts/qcom/mdmfermium-mtp.dtsi +12 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,18 @@ #include "mdmfermium.dtsi" #include "mdmfermium-pinctrl.dtsi" / { bluetooth: bt_qca6174 { compatible = "qca,qca6174"; qca,bt-reset-gpio = <&pm8019_gpios 2 0>; /* BT_EN */ qca,bt-vdd-pa-supply = <&rome_vreg>; qca,bt-vdd-io-supply = <&mdmfermium_l11>; qca,bt-vdd-xtal-supply = <&mdmfermium_l2>; qca,bt-vdd-io-voltage-level = <1800000 1800000>; qca,bt-vdd-xtal-voltage-level = <1800000 1800000>; }; }; &soc { }; Loading arch/arm/boot/dts/qcom/mdmfermium-regulator.dtsi +8 −0 Original line number Diff line number Diff line Loading @@ -378,4 +378,12 @@ enable-active-high; gpio = <&pm8019_gpios 4 0>; }; /* Rome 3.3V supply */ rome_vreg: rome_vreg { compatible = "regulator-fixed"; regulator-name = "rome_vreg"; startup-delay-us = <4000>; enable-active-high; gpio = <&pm8019_gpios 3 0>; }; }; arch/arm/boot/dts/qcom/mdmfermium.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -492,7 +492,7 @@ qcom,cnss-sdio { compatible = "qcom,cnss_sdio"; cnss_sdio,wlan-pmic-gpio = <&pm8019_gpios 3 0>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-io-supply = <&mdmfermium_l11>; vdd-wlan-xtal-supply = <&mdmfermium_l2>; }; Loading drivers/net/wireless/cnss/cnss_sdio.c +86 −49 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/delay.h> #include <linux/err.h> #define WLAN_VREG_NAME "vdd-wlan" #define WLAN_VREG_IO_NAME "vdd-wlan-io" #define WLAN_VREG_XTAL_NAME "vdd-wlan-xtal" Loading @@ -35,9 +36,14 @@ struct cnss_sdio_wlan_gpio_info { u32 flags; }; struct cnss_sdio_regulator { struct regulator *wlan_io; struct regulator *wlan_xtal; struct regulator *wlan_vreg; }; static struct cnss_sdio_data { struct regulator *wlan_reg_io; struct regulator *wlan_reg_xtal; struct cnss_sdio_regulator regulator; struct platform_device *pdev; struct cnss_sdio_wlan_gpio_info pmic_gpio; } *cnss_pdata; Loading Loading @@ -72,6 +78,37 @@ err_pmic_gpio: return error; } static int cnss_sdio_configure_wlan_enable_regulator(void) { int error; struct device *dev = &cnss_pdata->pdev->dev; if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_NAME "-supply", NULL)) { cnss_pdata->regulator.wlan_vreg = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_NAME); if (IS_ERR(cnss_pdata->regulator.wlan_vreg)) { error = PTR_ERR(cnss_pdata->regulator.wlan_vreg); dev_err(dev, "VDD-VREG get failed error=%d\n", error); return error; } error = regulator_enable(cnss_pdata->regulator.wlan_vreg); if (error) { dev_err(dev, "VDD-VREG enable failed error=%d\n", error); goto err_vdd_vreg_regulator; } } return 0; err_vdd_vreg_regulator: regulator_put(cnss_pdata->regulator.wlan_vreg); return error; } static int cnss_sdio_configure_regulator(void) { int error; Loading @@ -80,22 +117,22 @@ static int cnss_sdio_configure_regulator(void) if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_IO_NAME "-supply", NULL)) { cnss_pdata->wlan_reg_io = regulator_get( cnss_pdata->regulator.wlan_io = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_IO_NAME); if (IS_ERR(cnss_pdata->wlan_reg_io)) { error = PTR_ERR(cnss_pdata->wlan_reg_io); if (IS_ERR(cnss_pdata->regulator.wlan_io)) { error = PTR_ERR(cnss_pdata->regulator.wlan_io); dev_err(dev, "VDD-IO get failed error=%d\n", error); return error; } error = regulator_set_voltage( cnss_pdata->wlan_reg_io, cnss_pdata->regulator.wlan_io, WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX); if (error) { dev_err(dev, "VDD-IO set failed error=%d\n", error); goto err_vdd_io_regulator; } else { error = regulator_enable(cnss_pdata->wlan_reg_io); error = regulator_enable(cnss_pdata->regulator.wlan_io); if (error) { dev_err(dev, "VDD-IO enable failed error=%d\n", error); Loading @@ -107,22 +144,23 @@ static int cnss_sdio_configure_regulator(void) if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_XTAL_NAME "-supply", NULL)) { cnss_pdata->wlan_reg_xtal = regulator_get( cnss_pdata->regulator.wlan_xtal = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_XTAL_NAME); if (IS_ERR(cnss_pdata->wlan_reg_xtal)) { error = PTR_ERR(cnss_pdata->wlan_reg_xtal); if (IS_ERR(cnss_pdata->regulator.wlan_xtal)) { error = PTR_ERR(cnss_pdata->regulator.wlan_xtal); dev_err(dev, "VDD-XTAL get failed error=%d\n", error); goto err_vdd_xtal_regulator; } error = regulator_set_voltage( cnss_pdata->wlan_reg_xtal, cnss_pdata->regulator.wlan_xtal, WLAN_VREG_XTAL_MIN, WLAN_VREG_XTAL_MAX); if (error) { dev_err(dev, "VDD-XTAL set failed error=%d\n", error); goto err_vdd_xtal_regulator; } else { error = regulator_enable(cnss_pdata->wlan_reg_xtal); error = regulator_enable( cnss_pdata->regulator.wlan_xtal); if (error) { dev_err(dev, "VDD-XTAL enable failed err=%d\n", error); Loading @@ -134,40 +172,24 @@ static int cnss_sdio_configure_regulator(void) return 0; err_vdd_xtal_regulator: regulator_put(cnss_pdata->wlan_reg_xtal); regulator_put(cnss_pdata->regulator.wlan_xtal); err_vdd_io_regulator: regulator_put(cnss_pdata->wlan_reg_io); regulator_put(cnss_pdata->regulator.wlan_io); return error; } static int cnss_sdio_get_resource(struct device *dev) { struct device_node *np = dev->of_node; /* wlan enable pmic gpio info */ cnss_pdata->pmic_gpio.num = of_get_named_gpio_flags(np, "cnss_sdio,wlan-pmic-gpio", 0, &cnss_pdata->pmic_gpio.flags); if (cnss_pdata->pmic_gpio.num < 0) return cnss_pdata->pmic_gpio.num; return 0; } static void cnss_sdio_release_regulator(void) { if (cnss_pdata->wlan_reg_xtal) regulator_put(cnss_pdata->wlan_reg_xtal); if (cnss_pdata->wlan_reg_io) regulator_put(cnss_pdata->wlan_reg_io); } static void cnss_sdio_release_resourse(void) static void cnss_sdio_release_resource(void) { if (gpio_is_valid(cnss_pdata->pmic_gpio.num)) { gpio_set_value_cansleep(cnss_pdata->pmic_gpio.num, 0); gpio_free(cnss_pdata->pmic_gpio.num); } cnss_sdio_release_regulator(); if (cnss_pdata->regulator.wlan_xtal) regulator_put(cnss_pdata->regulator.wlan_xtal); if (cnss_pdata->regulator.wlan_vreg) regulator_put(cnss_pdata->regulator.wlan_xtal); if (cnss_pdata->regulator.wlan_io) regulator_put(cnss_pdata->regulator.wlan_io); } static int cnss_sdio_probe(struct platform_device *pdev) Loading @@ -179,10 +201,6 @@ static int cnss_sdio_probe(struct platform_device *pdev) &pdev->dev, sizeof(*cnss_pdata), GFP_KERNEL); if (!cnss_pdata) return -ENOMEM; error = cnss_sdio_get_resource(&pdev->dev); if (error) return error; } else { cnss_pdata = pdev->dev.platform_data; } Loading @@ -197,23 +215,42 @@ static int cnss_sdio_probe(struct platform_device *pdev) return error; } cnss_pdata->pmic_gpio.num = of_get_named_gpio_flags(pdev->dev.of_node, "cnss_sdio,wlan-pmic-gpio", 0, &cnss_pdata->pmic_gpio.flags); if (cnss_pdata->pmic_gpio.num) { error = cnss_sdio_configure_gpio(); if (error) { dev_err(&pdev->dev, "Failed to config gpio\n"); goto err_gpio_config; dev_err(&pdev->dev, "Failed to enable wlan enable gpio\n"); goto err_wlan_enable_gpio; } } if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_NAME "-supply", NULL)) { error = cnss_sdio_configure_wlan_enable_regulator(); if (error) { dev_err(&pdev->dev, "Failed to enable wlan enable regulator\n"); goto err_wlan_enable_regulator; } } dev_dbg(&pdev->dev, "CNSS SDIO Driver registered"); dev_info(&pdev->dev, "CNSS SDIO Driver registered"); return 0; err_gpio_config: cnss_sdio_release_regulator(); err_wlan_enable_regulator: regulator_put(cnss_pdata->regulator.wlan_vreg); err_wlan_enable_gpio: regulator_put(cnss_pdata->regulator.wlan_xtal); regulator_put(cnss_pdata->regulator.wlan_io); return error; } static int cnss_sdio_remove(struct platform_device *pdev) { cnss_sdio_release_resourse(); cnss_sdio_release_resource(); return 0; } Loading Loading
arch/arm/boot/dts/qcom/mdmfermium-cdp.dtsi +12 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,18 @@ #include "mdmfermium.dtsi" #include "mdmfermium-pinctrl.dtsi" / { bluetooth: bt_qca6174 { compatible = "qca,qca6174"; qca,bt-reset-gpio = <&pm8019_gpios 2 0>; /* BT_EN */ qca,bt-vdd-pa-supply = <&rome_vreg>; qca,bt-vdd-io-supply = <&mdmfermium_l11>; qca,bt-vdd-xtal-supply = <&mdmfermium_l2>; qca,bt-vdd-io-voltage-level = <1800000 1800000>; qca,bt-vdd-xtal-voltage-level = <1800000 1800000>; }; }; &soc { }; Loading
arch/arm/boot/dts/qcom/mdmfermium-mtp.dtsi +12 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,18 @@ #include "mdmfermium.dtsi" #include "mdmfermium-pinctrl.dtsi" / { bluetooth: bt_qca6174 { compatible = "qca,qca6174"; qca,bt-reset-gpio = <&pm8019_gpios 2 0>; /* BT_EN */ qca,bt-vdd-pa-supply = <&rome_vreg>; qca,bt-vdd-io-supply = <&mdmfermium_l11>; qca,bt-vdd-xtal-supply = <&mdmfermium_l2>; qca,bt-vdd-io-voltage-level = <1800000 1800000>; qca,bt-vdd-xtal-voltage-level = <1800000 1800000>; }; }; &soc { }; Loading
arch/arm/boot/dts/qcom/mdmfermium-regulator.dtsi +8 −0 Original line number Diff line number Diff line Loading @@ -378,4 +378,12 @@ enable-active-high; gpio = <&pm8019_gpios 4 0>; }; /* Rome 3.3V supply */ rome_vreg: rome_vreg { compatible = "regulator-fixed"; regulator-name = "rome_vreg"; startup-delay-us = <4000>; enable-active-high; gpio = <&pm8019_gpios 3 0>; }; };
arch/arm/boot/dts/qcom/mdmfermium.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -492,7 +492,7 @@ qcom,cnss-sdio { compatible = "qcom,cnss_sdio"; cnss_sdio,wlan-pmic-gpio = <&pm8019_gpios 3 0>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-io-supply = <&mdmfermium_l11>; vdd-wlan-xtal-supply = <&mdmfermium_l2>; }; Loading
drivers/net/wireless/cnss/cnss_sdio.c +86 −49 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/delay.h> #include <linux/err.h> #define WLAN_VREG_NAME "vdd-wlan" #define WLAN_VREG_IO_NAME "vdd-wlan-io" #define WLAN_VREG_XTAL_NAME "vdd-wlan-xtal" Loading @@ -35,9 +36,14 @@ struct cnss_sdio_wlan_gpio_info { u32 flags; }; struct cnss_sdio_regulator { struct regulator *wlan_io; struct regulator *wlan_xtal; struct regulator *wlan_vreg; }; static struct cnss_sdio_data { struct regulator *wlan_reg_io; struct regulator *wlan_reg_xtal; struct cnss_sdio_regulator regulator; struct platform_device *pdev; struct cnss_sdio_wlan_gpio_info pmic_gpio; } *cnss_pdata; Loading Loading @@ -72,6 +78,37 @@ err_pmic_gpio: return error; } static int cnss_sdio_configure_wlan_enable_regulator(void) { int error; struct device *dev = &cnss_pdata->pdev->dev; if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_NAME "-supply", NULL)) { cnss_pdata->regulator.wlan_vreg = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_NAME); if (IS_ERR(cnss_pdata->regulator.wlan_vreg)) { error = PTR_ERR(cnss_pdata->regulator.wlan_vreg); dev_err(dev, "VDD-VREG get failed error=%d\n", error); return error; } error = regulator_enable(cnss_pdata->regulator.wlan_vreg); if (error) { dev_err(dev, "VDD-VREG enable failed error=%d\n", error); goto err_vdd_vreg_regulator; } } return 0; err_vdd_vreg_regulator: regulator_put(cnss_pdata->regulator.wlan_vreg); return error; } static int cnss_sdio_configure_regulator(void) { int error; Loading @@ -80,22 +117,22 @@ static int cnss_sdio_configure_regulator(void) if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_IO_NAME "-supply", NULL)) { cnss_pdata->wlan_reg_io = regulator_get( cnss_pdata->regulator.wlan_io = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_IO_NAME); if (IS_ERR(cnss_pdata->wlan_reg_io)) { error = PTR_ERR(cnss_pdata->wlan_reg_io); if (IS_ERR(cnss_pdata->regulator.wlan_io)) { error = PTR_ERR(cnss_pdata->regulator.wlan_io); dev_err(dev, "VDD-IO get failed error=%d\n", error); return error; } error = regulator_set_voltage( cnss_pdata->wlan_reg_io, cnss_pdata->regulator.wlan_io, WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX); if (error) { dev_err(dev, "VDD-IO set failed error=%d\n", error); goto err_vdd_io_regulator; } else { error = regulator_enable(cnss_pdata->wlan_reg_io); error = regulator_enable(cnss_pdata->regulator.wlan_io); if (error) { dev_err(dev, "VDD-IO enable failed error=%d\n", error); Loading @@ -107,22 +144,23 @@ static int cnss_sdio_configure_regulator(void) if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_XTAL_NAME "-supply", NULL)) { cnss_pdata->wlan_reg_xtal = regulator_get( cnss_pdata->regulator.wlan_xtal = regulator_get( &cnss_pdata->pdev->dev, WLAN_VREG_XTAL_NAME); if (IS_ERR(cnss_pdata->wlan_reg_xtal)) { error = PTR_ERR(cnss_pdata->wlan_reg_xtal); if (IS_ERR(cnss_pdata->regulator.wlan_xtal)) { error = PTR_ERR(cnss_pdata->regulator.wlan_xtal); dev_err(dev, "VDD-XTAL get failed error=%d\n", error); goto err_vdd_xtal_regulator; } error = regulator_set_voltage( cnss_pdata->wlan_reg_xtal, cnss_pdata->regulator.wlan_xtal, WLAN_VREG_XTAL_MIN, WLAN_VREG_XTAL_MAX); if (error) { dev_err(dev, "VDD-XTAL set failed error=%d\n", error); goto err_vdd_xtal_regulator; } else { error = regulator_enable(cnss_pdata->wlan_reg_xtal); error = regulator_enable( cnss_pdata->regulator.wlan_xtal); if (error) { dev_err(dev, "VDD-XTAL enable failed err=%d\n", error); Loading @@ -134,40 +172,24 @@ static int cnss_sdio_configure_regulator(void) return 0; err_vdd_xtal_regulator: regulator_put(cnss_pdata->wlan_reg_xtal); regulator_put(cnss_pdata->regulator.wlan_xtal); err_vdd_io_regulator: regulator_put(cnss_pdata->wlan_reg_io); regulator_put(cnss_pdata->regulator.wlan_io); return error; } static int cnss_sdio_get_resource(struct device *dev) { struct device_node *np = dev->of_node; /* wlan enable pmic gpio info */ cnss_pdata->pmic_gpio.num = of_get_named_gpio_flags(np, "cnss_sdio,wlan-pmic-gpio", 0, &cnss_pdata->pmic_gpio.flags); if (cnss_pdata->pmic_gpio.num < 0) return cnss_pdata->pmic_gpio.num; return 0; } static void cnss_sdio_release_regulator(void) { if (cnss_pdata->wlan_reg_xtal) regulator_put(cnss_pdata->wlan_reg_xtal); if (cnss_pdata->wlan_reg_io) regulator_put(cnss_pdata->wlan_reg_io); } static void cnss_sdio_release_resourse(void) static void cnss_sdio_release_resource(void) { if (gpio_is_valid(cnss_pdata->pmic_gpio.num)) { gpio_set_value_cansleep(cnss_pdata->pmic_gpio.num, 0); gpio_free(cnss_pdata->pmic_gpio.num); } cnss_sdio_release_regulator(); if (cnss_pdata->regulator.wlan_xtal) regulator_put(cnss_pdata->regulator.wlan_xtal); if (cnss_pdata->regulator.wlan_vreg) regulator_put(cnss_pdata->regulator.wlan_xtal); if (cnss_pdata->regulator.wlan_io) regulator_put(cnss_pdata->regulator.wlan_io); } static int cnss_sdio_probe(struct platform_device *pdev) Loading @@ -179,10 +201,6 @@ static int cnss_sdio_probe(struct platform_device *pdev) &pdev->dev, sizeof(*cnss_pdata), GFP_KERNEL); if (!cnss_pdata) return -ENOMEM; error = cnss_sdio_get_resource(&pdev->dev); if (error) return error; } else { cnss_pdata = pdev->dev.platform_data; } Loading @@ -197,23 +215,42 @@ static int cnss_sdio_probe(struct platform_device *pdev) return error; } cnss_pdata->pmic_gpio.num = of_get_named_gpio_flags(pdev->dev.of_node, "cnss_sdio,wlan-pmic-gpio", 0, &cnss_pdata->pmic_gpio.flags); if (cnss_pdata->pmic_gpio.num) { error = cnss_sdio_configure_gpio(); if (error) { dev_err(&pdev->dev, "Failed to config gpio\n"); goto err_gpio_config; dev_err(&pdev->dev, "Failed to enable wlan enable gpio\n"); goto err_wlan_enable_gpio; } } if (of_get_property( cnss_pdata->pdev->dev.of_node, WLAN_VREG_NAME "-supply", NULL)) { error = cnss_sdio_configure_wlan_enable_regulator(); if (error) { dev_err(&pdev->dev, "Failed to enable wlan enable regulator\n"); goto err_wlan_enable_regulator; } } dev_dbg(&pdev->dev, "CNSS SDIO Driver registered"); dev_info(&pdev->dev, "CNSS SDIO Driver registered"); return 0; err_gpio_config: cnss_sdio_release_regulator(); err_wlan_enable_regulator: regulator_put(cnss_pdata->regulator.wlan_vreg); err_wlan_enable_gpio: regulator_put(cnss_pdata->regulator.wlan_xtal); regulator_put(cnss_pdata->regulator.wlan_io); return error; } static int cnss_sdio_remove(struct platform_device *pdev) { cnss_sdio_release_resourse(); cnss_sdio_release_resource(); return 0; } Loading