diff options
author | Sean Wang <sean.wang@mediatek.com> | 2018-09-08 07:07:24 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2018-09-18 17:52:55 -0400 |
commit | 85430152ba468acbfc2d7bc81c57bb2f93a24641 (patch) | |
tree | 5a05e6648fafee814f14703fdd600d7411e7e5e1 /drivers/pinctrl/mediatek | |
parent | 3ad38a14e13c10f19d4a6ca9ed3d90b003e21a45 (diff) |
pinctrl: mediatek: add pull related support to pinctrl-mtk-common-v2.c
Put pull control support related functions to pinctrl-mtk-common-v2.c
as these operations might be different by chips and allow different
type of driver to reuse them.
Signed-off-by: Ryder.Lee <ryder.lee@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/mediatek')
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-moore.c | 76 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mt7622.c | 4 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 78 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h | 19 |
4 files changed, 148 insertions, 29 deletions
diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c index 1f0cd306a940..d69f024c416d 100644 --- a/drivers/pinctrl/mediatek/pinctrl-moore.c +++ b/drivers/pinctrl/mediatek/pinctrl-moore.c | |||
@@ -88,27 +88,34 @@ static int mtk_pinconf_get(struct pinctrl_dev *pctldev, | |||
88 | 88 | ||
89 | switch (param) { | 89 | switch (param) { |
90 | case PIN_CONFIG_BIAS_DISABLE: | 90 | case PIN_CONFIG_BIAS_DISABLE: |
91 | err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PU, &val); | 91 | if (hw->soc->bias_disable_get) { |
92 | if (err) | 92 | err = hw->soc->bias_disable_get(hw, desc, &ret); |
93 | return err; | 93 | if (err) |
94 | 94 | return err; | |
95 | err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_PD, &val2); | 95 | } else { |
96 | if (err) | 96 | return -ENOTSUPP; |
97 | return err; | 97 | } |
98 | |||
99 | if (val || val2) | ||
100 | return -EINVAL; | ||
101 | |||
102 | break; | 98 | break; |
103 | case PIN_CONFIG_BIAS_PULL_UP: | 99 | case PIN_CONFIG_BIAS_PULL_UP: |
100 | if (hw->soc->bias_get) { | ||
101 | err = hw->soc->bias_get(hw, desc, 1, &ret); | ||
102 | if (err) | ||
103 | return err; | ||
104 | } else { | ||
105 | return -ENOTSUPP; | ||
106 | } | ||
107 | break; | ||
104 | case PIN_CONFIG_BIAS_PULL_DOWN: | 108 | case PIN_CONFIG_BIAS_PULL_DOWN: |
109 | if (hw->soc->bias_get) { | ||
110 | err = hw->soc->bias_get(hw, desc, 0, &ret); | ||
111 | if (err) | ||
112 | return err; | ||
113 | } else { | ||
114 | return -ENOTSUPP; | ||
115 | } | ||
116 | break; | ||
105 | case PIN_CONFIG_SLEW_RATE: | 117 | case PIN_CONFIG_SLEW_RATE: |
106 | reg = (param == PIN_CONFIG_BIAS_PULL_UP) ? | 118 | err = mtk_hw_get_value(hw, pin, PINCTRL_PIN_REG_SR, &val); |
107 | PINCTRL_PIN_REG_PU : | ||
108 | (param == PIN_CONFIG_BIAS_PULL_DOWN) ? | ||
109 | PINCTRL_PIN_REG_PD : PINCTRL_PIN_REG_SR; | ||
110 | |||
111 | err = mtk_hw_get_value(hw, pin, reg, &val); | ||
112 | if (err) | 119 | if (err) |
113 | return err; | 120 | return err; |
114 | 121 | ||
@@ -187,20 +194,31 @@ static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, | |||
187 | 194 | ||
188 | switch (param) { | 195 | switch (param) { |
189 | case PIN_CONFIG_BIAS_DISABLE: | 196 | case PIN_CONFIG_BIAS_DISABLE: |
197 | if (hw->soc->bias_disable_set) { | ||
198 | err = hw->soc->bias_disable_set(hw, desc); | ||
199 | if (err) | ||
200 | return err; | ||
201 | } else { | ||
202 | return -ENOTSUPP; | ||
203 | } | ||
204 | break; | ||
190 | case PIN_CONFIG_BIAS_PULL_UP: | 205 | case PIN_CONFIG_BIAS_PULL_UP: |
206 | if (hw->soc->bias_set) { | ||
207 | err = hw->soc->bias_set(hw, desc, 1); | ||
208 | if (err) | ||
209 | return err; | ||
210 | } else { | ||
211 | return -ENOTSUPP; | ||
212 | } | ||
213 | break; | ||
191 | case PIN_CONFIG_BIAS_PULL_DOWN: | 214 | case PIN_CONFIG_BIAS_PULL_DOWN: |
192 | arg = (param == PIN_CONFIG_BIAS_DISABLE) ? 0 : | 215 | if (hw->soc->bias_set) { |
193 | (param == PIN_CONFIG_BIAS_PULL_UP) ? 1 : 2; | 216 | err = hw->soc->bias_set(hw, desc, 0); |
194 | 217 | if (err) | |
195 | err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PU, | 218 | return err; |
196 | arg & 1); | 219 | } else { |
197 | if (err) | 220 | return -ENOTSUPP; |
198 | goto err; | 221 | } |
199 | |||
200 | err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_PD, | ||
201 | !!(arg & 2)); | ||
202 | if (err) | ||
203 | goto err; | ||
204 | break; | 222 | break; |
205 | case PIN_CONFIG_OUTPUT_ENABLE: | 223 | case PIN_CONFIG_OUTPUT_ENABLE: |
206 | err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT, | 224 | err = mtk_hw_set_value(hw, pin, PINCTRL_PIN_REG_SMT, |
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7622.c b/drivers/pinctrl/mediatek/pinctrl-mt7622.c index f6904a925755..9a5b13a2826e 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mt7622.c +++ b/drivers/pinctrl/mediatek/pinctrl-mt7622.c | |||
@@ -767,6 +767,10 @@ static const struct mtk_pin_soc mt7622_data = { | |||
767 | .eint_hw = &mt7622_eint_hw, | 767 | .eint_hw = &mt7622_eint_hw, |
768 | .gpio_m = 1, | 768 | .gpio_m = 1, |
769 | .eint_m = 1, | 769 | .eint_m = 1, |
770 | .bias_disable_set = mtk_pinconf_bias_disable_set, | ||
771 | .bias_disable_get = mtk_pinconf_bias_disable_get, | ||
772 | .bias_set = mtk_pinconf_bias_set, | ||
773 | .bias_get = mtk_pinconf_bias_get, | ||
770 | .drive_set = mtk_pinconf_drive_set, | 774 | .drive_set = mtk_pinconf_drive_set, |
771 | .drive_get = mtk_pinconf_drive_get, | 775 | .drive_get = mtk_pinconf_drive_get, |
772 | }; | 776 | }; |
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c index 3f0917967f2a..67c95ef85ba9 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | |||
@@ -190,6 +190,84 @@ int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value) | |||
190 | return 0; | 190 | return 0; |
191 | } | 191 | } |
192 | 192 | ||
193 | int mtk_pinconf_bias_disable_set(struct mtk_pinctrl *hw, | ||
194 | const struct mtk_pin_desc *desc) | ||
195 | { | ||
196 | int err; | ||
197 | |||
198 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PU, | ||
199 | MTK_DISABLE); | ||
200 | if (err) | ||
201 | return err; | ||
202 | |||
203 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PD, | ||
204 | MTK_DISABLE); | ||
205 | if (err) | ||
206 | return err; | ||
207 | |||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | int mtk_pinconf_bias_disable_get(struct mtk_pinctrl *hw, | ||
212 | const struct mtk_pin_desc *desc, int *res) | ||
213 | { | ||
214 | int v, v2; | ||
215 | int err; | ||
216 | |||
217 | err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_PU, &v); | ||
218 | if (err) | ||
219 | return err; | ||
220 | |||
221 | err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_PD, &v2); | ||
222 | if (err) | ||
223 | return err; | ||
224 | |||
225 | if (v == MTK_ENABLE || v2 == MTK_ENABLE) | ||
226 | return -EINVAL; | ||
227 | |||
228 | *res = 1; | ||
229 | |||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | int mtk_pinconf_bias_set(struct mtk_pinctrl *hw, | ||
234 | const struct mtk_pin_desc *desc, bool pullup) | ||
235 | { | ||
236 | int err, arg; | ||
237 | |||
238 | arg = pullup ? 1 : 2; | ||
239 | |||
240 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PU, arg & 1); | ||
241 | if (err) | ||
242 | return err; | ||
243 | |||
244 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PD, | ||
245 | !!(arg & 2)); | ||
246 | if (err) | ||
247 | return err; | ||
248 | |||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | int mtk_pinconf_bias_get(struct mtk_pinctrl *hw, | ||
253 | const struct mtk_pin_desc *desc, bool pullup, int *res) | ||
254 | { | ||
255 | int reg, err, v; | ||
256 | |||
257 | reg = pullup ? PINCTRL_PIN_REG_PU : PINCTRL_PIN_REG_PD; | ||
258 | |||
259 | err = mtk_hw_get_value(hw, desc->number, reg, &v); | ||
260 | if (err) | ||
261 | return err; | ||
262 | |||
263 | if (!v) | ||
264 | return -EINVAL; | ||
265 | |||
266 | *res = 1; | ||
267 | |||
268 | return 0; | ||
269 | } | ||
270 | |||
193 | /* Revision 0 */ | 271 | /* Revision 0 */ |
194 | int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, | 272 | int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, |
195 | const struct mtk_pin_desc *desc, u32 arg) | 273 | const struct mtk_pin_desc *desc, u32 arg) |
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h index cbc9a720d516..3a55ef70e01b 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h | |||
@@ -150,6 +150,15 @@ struct mtk_pin_soc { | |||
150 | u8 eint_m; | 150 | u8 eint_m; |
151 | 151 | ||
152 | /* Specific pinconfig operations */ | 152 | /* Specific pinconfig operations */ |
153 | int (*bias_disable_set)(struct mtk_pinctrl *hw, | ||
154 | const struct mtk_pin_desc *desc); | ||
155 | int (*bias_disable_get)(struct mtk_pinctrl *hw, | ||
156 | const struct mtk_pin_desc *desc, int *res); | ||
157 | int (*bias_set)(struct mtk_pinctrl *hw, | ||
158 | const struct mtk_pin_desc *desc, bool pullup); | ||
159 | int (*bias_get)(struct mtk_pinctrl *hw, | ||
160 | const struct mtk_pin_desc *desc, bool pullup, int *res); | ||
161 | |||
153 | int (*drive_set)(struct mtk_pinctrl *hw, | 162 | int (*drive_set)(struct mtk_pinctrl *hw, |
154 | const struct mtk_pin_desc *desc, u32 arg); | 163 | const struct mtk_pin_desc *desc, u32 arg); |
155 | int (*drive_get)(struct mtk_pinctrl *hw, | 164 | int (*drive_get)(struct mtk_pinctrl *hw, |
@@ -170,6 +179,16 @@ void mtk_rmw(struct mtk_pinctrl *pctl, u32 reg, u32 mask, u32 set); | |||
170 | int mtk_hw_set_value(struct mtk_pinctrl *hw, int pin, int field, int value); | 179 | int mtk_hw_set_value(struct mtk_pinctrl *hw, int pin, int field, int value); |
171 | int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value); | 180 | int mtk_hw_get_value(struct mtk_pinctrl *hw, int pin, int field, int *value); |
172 | 181 | ||
182 | int mtk_pinconf_bias_disable_set(struct mtk_pinctrl *hw, | ||
183 | const struct mtk_pin_desc *desc); | ||
184 | int mtk_pinconf_bias_disable_get(struct mtk_pinctrl *hw, | ||
185 | const struct mtk_pin_desc *desc, int *res); | ||
186 | int mtk_pinconf_bias_set(struct mtk_pinctrl *hw, | ||
187 | const struct mtk_pin_desc *desc, bool pullup); | ||
188 | int mtk_pinconf_bias_get(struct mtk_pinctrl *hw, | ||
189 | const struct mtk_pin_desc *desc, bool pullup, | ||
190 | int *res); | ||
191 | |||
173 | int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, | 192 | int mtk_pinconf_drive_set(struct mtk_pinctrl *hw, |
174 | const struct mtk_pin_desc *desc, u32 arg); | 193 | const struct mtk_pin_desc *desc, u32 arg); |
175 | int mtk_pinconf_drive_get(struct mtk_pinctrl *hw, | 194 | int mtk_pinconf_drive_get(struct mtk_pinctrl *hw, |