diff --git a/Documentation/devicetree/bindings/wcnss/wcnss-wlan.txt b/Documentation/devicetree/bindings/wcnss/wcnss-wlan.txt index 615eae840e082a0a2ca3e159113550b59134cba2..b836da0bb6b1ac7680fbcf686879a039312dddfe 100644 --- a/Documentation/devicetree/bindings/wcnss/wcnss-wlan.txt +++ b/Documentation/devicetree/bindings/wcnss/wcnss-wlan.txt @@ -34,6 +34,9 @@ Optional properties: should be performed during boot up. - qcom,wlan-rx-buff-count: WLAN RX buffer count is a configurable value, using a smaller count for this buffer will reduce the memory usage. +- qcom,is-pronto-vt: boolean flag to determine the pronto hardware version +in use. subsequently Pronto and IRIS voltage regulator range is configured +according to the ponto HW version Example: @@ -56,6 +59,7 @@ Example: gpios = <&msmgpio 36 0>, <&msmgpio 37 0>, <&msmgpio 38 0>, <&msmgpio 39 0>, <&msmgpio 40 0>; qcom,has-48mhz-xo; + qcom,is-pronto-vt; qcom,has-pronto-hw; qcom,wcnss-adc_tm = <&pm8226_adc_tm>; diff --git a/arch/arm/boot/dts/qcom/msm8916.dtsi b/arch/arm/boot/dts/qcom/msm8916.dtsi index ec04d2d162107192caaaa0467102284ce48d77e0..86a4c1677bcfc8f70d0b966cad5b084d4750c41b 100644 --- a/arch/arm/boot/dts/qcom/msm8916.dtsi +++ b/arch/arm/boot/dts/qcom/msm8916.dtsi @@ -1155,6 +1155,7 @@ pinctrl-1 = <&wcnss_sleep>; qcom,has-autodetect-xo; + qcom,is-pronto-vt; qcom,has-pronto-hw; }; diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c index eca1c3900a44e6f514986413589e8cecbd55b499..8055dcd7924b1e1918adfee19f902d483743f86f 100644 --- a/drivers/net/wireless/wcnss/wcnss_vreg.c +++ b/drivers/net/wireless/wcnss/wcnss_vreg.c @@ -112,6 +112,29 @@ static struct vregs_info pronto_vregs[] = { 1800000, 0, NULL}, }; +/* IRIS regulators for Pronto v2 hardware */ +static struct vregs_info iris_vregs_pronto_v2[] = { + {"qcom,iris-vddxo", VREG_NULL_CONFIG, 1800000, 0, + 1800000, 10000, NULL}, + {"qcom,iris-vddrfa", VREG_NULL_CONFIG, 1300000, 0, + 1300000, 100000, NULL}, + {"qcom,iris-vddpa", VREG_NULL_CONFIG, 3300000, 0, + 3300000, 515000, NULL}, + {"qcom,iris-vdddig", VREG_NULL_CONFIG, 1800000, 0, + 1800000, 10000, NULL}, +}; + +/* WCNSS regulators for Pronto v2 hardware */ +static struct vregs_info pronto_vregs_pronto_v2[] = { + {"qcom,pronto-vddmx", VREG_NULL_CONFIG, 1287500, 0, + 1287500, 0, NULL}, + {"qcom,pronto-vddcx", VREG_NULL_CONFIG, RPM_REGULATOR_CORNER_NORMAL, + RPM_REGULATOR_CORNER_NONE, RPM_REGULATOR_CORNER_SUPER_TURBO, + 0, NULL}, + {"qcom,pronto-vddpx", VREG_NULL_CONFIG, 1800000, 0, + 1800000, 0, NULL}, +}; + struct host_driver { char name[20]; @@ -418,15 +441,21 @@ fail: } -static void wcnss_iris_vregs_off(enum wcnss_hw_type hw_type) +static void wcnss_iris_vregs_off(enum wcnss_hw_type hw_type, + int is_pronto_vt) { switch (hw_type) { case WCNSS_RIVA_HW: wcnss_vregs_off(iris_vregs_riva, ARRAY_SIZE(iris_vregs_riva)); break; case WCNSS_PRONTO_HW: - wcnss_vregs_off(iris_vregs_pronto, + if (is_pronto_vt) { + wcnss_vregs_off(iris_vregs_pronto_v2, + ARRAY_SIZE(iris_vregs_pronto_v2)); + } else { + wcnss_vregs_off(iris_vregs_pronto, ARRAY_SIZE(iris_vregs_pronto)); + } break; default: pr_err("%s invalid hardware %d\n", __func__, hw_type); @@ -434,7 +463,9 @@ static void wcnss_iris_vregs_off(enum wcnss_hw_type hw_type) } } -static int wcnss_iris_vregs_on(struct device *dev, enum wcnss_hw_type hw_type) +static int wcnss_iris_vregs_on(struct device *dev, + enum wcnss_hw_type hw_type, + int is_pronto_vt) { int ret = -1; @@ -444,8 +475,13 @@ static int wcnss_iris_vregs_on(struct device *dev, enum wcnss_hw_type hw_type) ARRAY_SIZE(iris_vregs_riva)); break; case WCNSS_PRONTO_HW: - ret = wcnss_vregs_on(dev, iris_vregs_pronto, - ARRAY_SIZE(iris_vregs_pronto)); + if (is_pronto_vt) { + ret = wcnss_vregs_on(dev, iris_vregs_pronto_v2, + ARRAY_SIZE(iris_vregs_pronto_v2)); + } else { + ret = wcnss_vregs_on(dev, iris_vregs_pronto, + ARRAY_SIZE(iris_vregs_pronto)); + } break; default: pr_err("%s invalid hardware %d\n", __func__, hw_type); @@ -453,14 +489,21 @@ static int wcnss_iris_vregs_on(struct device *dev, enum wcnss_hw_type hw_type) return ret; } -static void wcnss_core_vregs_off(enum wcnss_hw_type hw_type) +static void wcnss_core_vregs_off(enum wcnss_hw_type hw_type, + int is_pronto_vt) { switch (hw_type) { case WCNSS_RIVA_HW: wcnss_vregs_off(riva_vregs, ARRAY_SIZE(riva_vregs)); break; case WCNSS_PRONTO_HW: - wcnss_vregs_off(pronto_vregs, ARRAY_SIZE(pronto_vregs)); + if (is_pronto_vt) { + wcnss_vregs_off(pronto_vregs_pronto_v2, + ARRAY_SIZE(pronto_vregs_pronto_v2)); + } else { + wcnss_vregs_off(pronto_vregs, + ARRAY_SIZE(pronto_vregs)); + } break; default: pr_err("%s invalid hardware %d\n", __func__, hw_type); @@ -468,7 +511,9 @@ static void wcnss_core_vregs_off(enum wcnss_hw_type hw_type) } -static int wcnss_core_vregs_on(struct device *dev, enum wcnss_hw_type hw_type) +static int wcnss_core_vregs_on(struct device *dev, + enum wcnss_hw_type hw_type, + int is_pronto_vt) { int ret = -1; @@ -477,8 +522,13 @@ static int wcnss_core_vregs_on(struct device *dev, enum wcnss_hw_type hw_type) ret = wcnss_vregs_on(dev, riva_vregs, ARRAY_SIZE(riva_vregs)); break; case WCNSS_PRONTO_HW: - ret = wcnss_vregs_on(dev, pronto_vregs, - ARRAY_SIZE(pronto_vregs)); + if (is_pronto_vt) { + ret = wcnss_vregs_on(dev, pronto_vregs_pronto_v2, + ARRAY_SIZE(pronto_vregs_pronto_v2)); + } else { + ret = wcnss_vregs_on(dev, pronto_vregs, + ARRAY_SIZE(pronto_vregs)); + } break; default: pr_err("%s invalid hardware %d\n", __func__, hw_type); @@ -498,12 +548,14 @@ int wcnss_wlan_power(struct device *dev, if (on) { down(&wcnss_power_on_lock); /* RIVA regulator settings */ - rc = wcnss_core_vregs_on(dev, hw_type); + rc = wcnss_core_vregs_on(dev, hw_type, + cfg->is_pronto_vt); if (rc) goto fail_wcnss_on; /* IRIS regulator settings */ - rc = wcnss_iris_vregs_on(dev, hw_type); + rc = wcnss_iris_vregs_on(dev, hw_type, + cfg->is_pronto_vt); if (rc) goto fail_iris_on; @@ -517,17 +569,17 @@ int wcnss_wlan_power(struct device *dev, } else { configure_iris_xo(dev, cfg, WCNSS_WLAN_SWITCH_OFF, NULL); - wcnss_iris_vregs_off(hw_type); - wcnss_core_vregs_off(hw_type); + wcnss_iris_vregs_off(hw_type, cfg->is_pronto_vt); + wcnss_core_vregs_off(hw_type, cfg->is_pronto_vt); } return rc; fail_iris_xo: - wcnss_iris_vregs_off(hw_type); + wcnss_iris_vregs_off(hw_type, cfg->is_pronto_vt); fail_iris_on: - wcnss_core_vregs_off(hw_type); + wcnss_core_vregs_off(hw_type, cfg->is_pronto_vt); fail_wcnss_on: up(&wcnss_power_on_lock); diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index c7af923c653bd5c238bf3be0f1a24ea146e90d37..34d8e5979e1c9b82adeb94da0a2c7a26685073e9 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -2160,10 +2160,14 @@ wcnss_trigger_config(struct platform_device *pdev) int ret; struct qcom_wcnss_opts *pdata; struct resource *res; + int is_pronto_vt; int pil_retry = 0; int has_pronto_hw = of_property_read_bool(pdev->dev.of_node, "qcom,has-pronto-hw"); + is_pronto_vt = of_property_read_bool(pdev->dev.of_node, + "qcom,is-pronto-vt"); + if (of_property_read_u32(pdev->dev.of_node, "qcom,wlan-rx-buff-count", &penv->wlan_rx_buff_count)) { penv->wlan_rx_buff_count = WCNSS_DEF_WLAN_RX_BUFF_COUNT; @@ -2186,6 +2190,7 @@ wcnss_trigger_config(struct platform_device *pdev) } penv->wcnss_hw_type = (has_pronto_hw) ? WCNSS_PRONTO_HW : WCNSS_RIVA_HW; penv->wlan_config.use_48mhz_xo = has_48mhz_xo; + penv->wlan_config.is_pronto_vt = is_pronto_vt; if (WCNSS_CONFIG_UNSPECIFIED == has_autodetect_xo && has_pronto_hw) { has_autodetect_xo = of_property_read_bool(pdev->dev.of_node, diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h index 6eb9f9e86809ec7d47e8b383ae4e3ecb3a57b3e3..53d8ca518643a2ea56be4ce74b096812afd94361 100644 --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -28,6 +28,7 @@ enum wcnss_hw_type { struct wcnss_wlan_config { int use_48mhz_xo; + int is_pronto_vt; void __iomem *msm_wcnss_base; };