高通wifi设备树修改

高通wifi设备树修改

dts部分修改点

arch/arm/boot/dts/qcom/sa415m-ttp.dtsi
这里定义一个名字wlan-pwr-gpio是GPIO 89.
arch/arm/boot/dts/qcom/sa415m-ttp.dtsiarch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi
arch/arm/boot/dts/qcom/sdxpoorwills-pinctrl.dtsi

调用pinctrl部分代码


1
drivers/net/wireless/cnss2/main.h
struct cnss_pinctrl_info {
    
    
	struct pinctrl *pinctrl;
	struct pinctrl_state *bootstrap_active;
	struct pinctrl_state *wlan_en_active;
	struct pinctrl_state *wlan_en_sleep;
	
	struct pinctrl_state *wlan_pwr_active;
	struct pinctrl_state *wlan_pwr_sleep;
	u32 activated;
};

2
drivers/net/wireless/cnss2/power.c
#define WLAN_EN_GPIO			"wlan-en-gpio"
#define WLAN_EN_ACTIVE			"wlan_en_active"
#define WLAN_EN_SLEEP			"wlan_en_sleep"
++#define WLAN_PWR_GPIO			"wlan-pwr-gpio"
++#define WLAN_PWR_ACTIVE			"wlan_pwr_active"
++#define WLAN_PWR_SLEEP			"wlan_pwr_sleep"
......
int cnss_get_pinctrl(struct cnss_plat_data *plat_priv)
{
    
    
	int ret = 0;
	struct device *dev;
	struct cnss_pinctrl_info *pinctrl_info;
	dev = &plat_priv->plat_dev->dev;
	pinctrl_info = &plat_priv->pinctrl_info;
	pinctrl_info->pinctrl = devm_pinctrl_get(dev);
	if (IS_ERR_OR_NULL(pinctrl_info->pinctrl)) {
    
    
		ret = PTR_ERR(pinctrl_info->pinctrl);
		cnss_pr_err("Failed to get pinctrl, err = %d\n", ret);
		goto out;
	}
	if (of_find_property(dev->of_node, BOOTSTRAP_GPIO, NULL)) {
    
    
		pinctrl_info->bootstrap_active =
			pinctrl_lookup_state(pinctrl_info->pinctrl,
					     BOOTSTRAP_ACTIVE);
		if (IS_ERR_OR_NULL(pinctrl_info->bootstrap_active)) {
    
    
			ret = PTR_ERR(pinctrl_info->bootstrap_active);
			cnss_pr_err("Failed to get bootstrap active state, err = %d\n",
				    ret);
			goto out;
		}
	}
	if (of_find_property(dev->of_node, WLAN_EN_GPIO, NULL)) {
    
    
		pinctrl_info->wlan_en_active =
			pinctrl_lookup_state(pinctrl_info->pinctrl,
					     WLAN_EN_ACTIVE);
		if (IS_ERR_OR_NULL(pinctrl_info->wlan_en_active)) {
    
    
			ret = PTR_ERR(pinctrl_info->wlan_en_active);
			cnss_pr_err("Failed to get wlan_en active state, err = %d\n",
				    ret);
			goto out;
		}
		pinctrl_info->wlan_en_sleep =
			pinctrl_lookup_state(pinctrl_info->pinctrl,
					     WLAN_EN_SLEEP);
		if (IS_ERR_OR_NULL(pinctrl_info->wlan_en_sleep)) {
    
    
			ret = PTR_ERR(pinctrl_info->wlan_en_sleep);
			cnss_pr_err("Failed to get wlan_en sleep state, err = %d\n",
				    ret);
			goto out;
		}
	}
	///获取WLAN_PWR_GPIO属性
	if (of_find_property(dev->of_node, WLAN_PWR_GPIO, NULL)) {
    
    
	
			pinctrl_info->wlan_pwr_active =
	
				pinctrl_lookup_state(pinctrl_info->pinctrl,
	
							 WLAN_PWR_ACTIVE);
	
			if (IS_ERR_OR_NULL(pinctrl_info->wlan_pwr_active)) {
    
    
	
				ret = PTR_ERR(pinctrl_info->wlan_pwr_active);
	
				cnss_pr_err("Failed to get wlan_pwr active state, err = %d\n",
	
						ret);
	
				goto out;
	
			}
	
			pinctrl_info->wlan_pwr_sleep =
	
				pinctrl_lookup_state(pinctrl_info->pinctrl,
	
							 WLAN_PWR_SLEEP);
	
			if (IS_ERR_OR_NULL(pinctrl_info->wlan_pwr_sleep)) {
    
    
	
				ret = PTR_ERR(pinctrl_info->wlan_pwr_sleep);
	
				cnss_pr_err("Failed to get wlan_pwr sleep state, err = %d\n",
	
						ret);
	
				goto out;
			}
		}
	//
	......
	下面是具体实现
	static int cnss_select_pinctrl_state(struct cnss_plat_data *plat_priv,
				     bool state)
{
    
    
	int ret = 0;
	struct cnss_pinctrl_info *pinctrl_info;
	if (!plat_priv) {
    
    
		cnss_pr_err("plat_priv is NULL!\n");
		ret = -ENODEV;
		goto out;
	}
	pinctrl_info = &plat_priv->pinctrl_info;
	if (state) {
    
    
		if (pinctrl_info->activated) {
    
    
			cnss_pr_dbg("Pinctrl is already activated\n");
			goto out;
		}
		if (!IS_ERR_OR_NULL(pinctrl_info->bootstrap_active)) {
    
    
			ret = pinctrl_select_state(
				pinctrl_info->pinctrl,
				pinctrl_info->bootstrap_active);
			if (ret) {
    
    
				cnss_pr_err("Failed to select bootstrap active state, err = %d\n",
					    ret);
				goto out;
			}
			udelay(BOOTSTRAP_DELAY);
		}
		if (!IS_ERR_OR_NULL(pinctrl_info->wlan_en_active)) {
    
    
			ret = pinctrl_select_state(
				pinctrl_info->pinctrl,
				pinctrl_info->wlan_en_active);
			if (ret) {
    
    
				cnss_pr_err("Failed to select wlan_en active state, err = %d\n",
					    ret);
				goto out;
			}
			udelay(WLAN_ENABLE_DELAY);
		}
	
		
	
		if (!IS_ERR_OR_NULL(pinctrl_info->wlan_pwr_active)) {
    
    
	
			ret = pinctrl_select_state(
	
				pinctrl_info->pinctrl,
	
				pinctrl_info->wlan_pwr_active);
	
			if (ret) {
    
    
	
				cnss_pr_err("Failed to select wlan_pwr active state, err = %d\n",
	
					    ret);
	
				goto out;
	
			}
	
			udelay(WLAN_ENABLE_DELAY);
	
		}
	
		pinctrl_info->activated = true;
	} else {
    
    
		if (!pinctrl_info->activated) {
    
    
			cnss_pr_dbg("Pinctrl is already de-activated\n");
			goto out;
		}
	
		if (!IS_ERR_OR_NULL(pinctrl_info->wlan_en_sleep)) {
    
    
			ret = pinctrl_select_state(pinctrl_info->pinctrl,
						   pinctrl_info->wlan_en_sleep);
			if (ret) {
    
    
				cnss_pr_err("Failed to select wlan_en sleep state, err = %d\n",
					    ret);
				goto out;
			}
		}
	
		/*if (!IS_ERR_OR_NULL(pinctrl_info->wlan_pwr_sleep)) {
	
					ret = pinctrl_select_state(pinctrl_info->pinctrl,
	
								   pinctrl_info->wlan_pwr_sleep);
	
					if (ret) {
	
						cnss_pr_err("Failed to select wlan_pwr sleep state, err = %d\n",
	
								ret);
	
						goto out;
	
					}
	
				}*/
	
		pinctrl_info->activated = false;
	}
	return 0;
out:
	return ret;
}

猜你喜欢

转载自blog.csdn.net/beibei_xiansen/article/details/114113301