*
  */
 
+#include <dt-bindings/pinctrl/mt65xx.h>
 #include <linux/gpio/driver.h>
 
 #include <linux/pinctrl/consumer.h>
 {
        struct mtk_pinctrl *hw = pinctrl_dev_get_drvdata(pctldev);
        u32 param = pinconf_to_config_param(*config);
-       int val, val2, err, reg, ret = 1;
+       int val, val2, err, pullup, reg, ret = 1;
        const struct mtk_pin_desc *desc;
 
        desc = (const struct mtk_pin_desc *)&hw->soc->pins[pin];
 
        switch (param) {
        case PIN_CONFIG_BIAS_DISABLE:
-               if (hw->soc->bias_disable_get) {
+               if (hw->soc->bias_get_combo) {
+                       err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret);
+                       if (err)
+                               return err;
+                       if (ret != MTK_PUPD_SET_R1R0_00 && ret != MTK_DISABLE)
+                               return -EINVAL;
+               } else if (hw->soc->bias_disable_get) {
                        err = hw->soc->bias_disable_get(hw, desc, &ret);
                        if (err)
                                return err;
                }
                break;
        case PIN_CONFIG_BIAS_PULL_UP:
-               if (hw->soc->bias_get) {
+               if (hw->soc->bias_get_combo) {
+                       err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret);
+                       if (err)
+                               return err;
+                       if (ret == MTK_PUPD_SET_R1R0_00 || ret == MTK_DISABLE)
+                               return -EINVAL;
+                       if (!pullup)
+                               return -EINVAL;
+               } else if (hw->soc->bias_get) {
                        err = hw->soc->bias_get(hw, desc, 1, &ret);
                        if (err)
                                return err;
                }
                break;
        case PIN_CONFIG_BIAS_PULL_DOWN:
-               if (hw->soc->bias_get) {
+               if (hw->soc->bias_get_combo) {
+                       err = hw->soc->bias_get_combo(hw, desc, &pullup, &ret);
+                       if (err)
+                               return err;
+                       if (ret == MTK_PUPD_SET_R1R0_00 || ret == MTK_DISABLE)
+                               return -EINVAL;
+                       if (pullup)
+                               return -EINVAL;
+               } else if (hw->soc->bias_get) {
                        err = hw->soc->bias_get(hw, desc, 0, &ret);
                        if (err)
                                return err;
 
                switch (param) {
                case PIN_CONFIG_BIAS_DISABLE:
-                       if (hw->soc->bias_disable_set) {
+                       if (hw->soc->bias_set_combo) {
+                               err = hw->soc->bias_set_combo(hw, desc, 0, MTK_DISABLE);
+                               if (err)
+                                       return err;
+                       } else if (hw->soc->bias_disable_set) {
                                err = hw->soc->bias_disable_set(hw, desc);
                                if (err)
                                        return err;
                        }
                        break;
                case PIN_CONFIG_BIAS_PULL_UP:
-                       if (hw->soc->bias_set) {
+                       if (hw->soc->bias_set_combo) {
+                               err = hw->soc->bias_set_combo(hw, desc, 1, arg);
+                               if (err)
+                                       return err;
+                       } else if (hw->soc->bias_set) {
                                err = hw->soc->bias_set(hw, desc, 1);
                                if (err)
                                        return err;
                        }
                        break;
                case PIN_CONFIG_BIAS_PULL_DOWN:
-                       if (hw->soc->bias_set) {
+                       if (hw->soc->bias_set_combo) {
+                               err = hw->soc->bias_set_combo(hw, desc, 0, arg);
+                               if (err)
+                                       return err;
+                       } else if (hw->soc->bias_set) {
                                err = hw->soc->bias_set(hw, desc, 0);
                                if (err)
                                        return err;