高通wifi设备树修改
dts部分修改点
arch/arm/boot/dts/qcom/sa415m-ttp.dtsi
这里定义一个名字wlan-pwr-gpio是GPIO 89.
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;
}