| --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c |
| +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c |
| @@ -541,6 +541,30 @@ out: |
| return err; |
| } |
| |
| +static int mtk_pinconf_bias_set_pd(struct mtk_pinctrl *hw, |
| + const struct mtk_pin_desc *desc, |
| + u32 pullup, u32 arg) |
| +{ |
| + int err, pd; |
| + |
| + if (arg == MTK_DISABLE) |
| + pd = 0; |
| + else if ((arg == MTK_ENABLE) && pullup) |
| + pd = 0; |
| + else if ((arg == MTK_ENABLE) && !pullup) |
| + pd = 1; |
| + else { |
| + err = -EINVAL; |
| + goto out; |
| + } |
| + |
| + err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PD, pd); |
| + |
| +out: |
| + return err; |
| + |
| +} |
| + |
| static int mtk_pinconf_bias_set_pullsel_pullen(struct mtk_pinctrl *hw, |
| const struct mtk_pin_desc *desc, |
| u32 pullup, u32 arg) |
| @@ -695,6 +719,12 @@ int mtk_pinconf_bias_set_combo(struct mt |
| return err; |
| } |
| |
| + if (try_all_type & MTK_PULL_PD_TYPE) { |
| + err = mtk_pinconf_bias_set_pd(hw, desc, pullup, arg); |
| + if (!err) |
| + return err; |
| + } |
| + |
| if (try_all_type & MTK_PULL_PU_PD_TYPE) { |
| err = mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, arg); |
| if (!err) |
| @@ -815,6 +845,29 @@ out: |
| return err; |
| } |
| |
| +static int mtk_pinconf_bias_get_pd(struct mtk_pinctrl *hw, |
| + const struct mtk_pin_desc *desc, |
| + u32 *pullup, u32 *enable) |
| +{ |
| + int err, pd; |
| + |
| + err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PD, &pd); |
| + if (err) |
| + goto out; |
| + |
| + if (pd == 0) { |
| + *pullup = 0; |
| + *enable = MTK_DISABLE; |
| + } else if (pd == 1) { |
| + *pullup = 0; |
| + *enable = MTK_ENABLE; |
| + } else |
| + err = -EINVAL; |
| + |
| +out: |
| + return err; |
| +} |
| + |
| static int mtk_pinconf_bias_get_pullsel_pullen(struct mtk_pinctrl *hw, |
| const struct mtk_pin_desc *desc, |
| u32 *pullup, u32 *enable) |
| @@ -883,6 +936,12 @@ int mtk_pinconf_bias_get_combo(struct mt |
| if (!err) |
| return err; |
| } |
| + |
| + if (try_all_type & MTK_PULL_PD_TYPE) { |
| + err = mtk_pinconf_bias_get_pd(hw, desc, pullup, enable); |
| + if (!err) |
| + return err; |
| + } |
| |
| if (try_all_type & MTK_PULL_PU_PD_TYPE) { |
| err = mtk_pinconf_bias_get_pu_pd(hw, desc, pullup, enable); |
| --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h |
| +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h |
| @@ -24,6 +24,7 @@ |
| * turned on/off itself. But it can't be selected pull up/down |
| */ |
| #define MTK_PULL_RSEL_TYPE BIT(3) |
| +#define MTK_PULL_PD_TYPE BIT(4) |
| /* MTK_PULL_PU_PD_RSEL_TYPE is a type which is controlled by |
| * MTK_PULL_PU_PD_TYPE and MTK_PULL_RSEL_TYPE. |
| */ |