diff options
author | Sean Wang <sean.wang@mediatek.com> | 2018-09-08 07:07:25 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2018-09-18 17:52:57 -0400 |
commit | 0d7ca772148fe89149426bde59aaedcb3081d92d (patch) | |
tree | b970b1b56dbf44da2bafa5a11becaaa1981d3173 /drivers/pinctrl/mediatek | |
parent | 85430152ba468acbfc2d7bc81c57bb2f93a24641 (diff) |
pinctrl: mediatek: add advanced pull related support to pinctrl-mtk-common-v2.c
There are some specific pins (i.e. MMC/SD) need specific registers to
turn on/off the 10K & 50k(75K) resistors when pull up/down.
Therefore, this patch adds the custom prarmeters so that the user could
control it through device tree.
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 | 33 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 55 | ||||
-rw-r--r-- | drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h | 17 |
3 files changed, 105 insertions, 0 deletions
diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c index d69f024c416d..400932959727 100644 --- a/drivers/pinctrl/mediatek/pinctrl-moore.c +++ b/drivers/pinctrl/mediatek/pinctrl-moore.c | |||
@@ -15,16 +15,22 @@ | |||
15 | /* Custom pinconf parameters */ | 15 | /* Custom pinconf parameters */ |
16 | #define MTK_PIN_CONFIG_TDSEL (PIN_CONFIG_END + 1) | 16 | #define MTK_PIN_CONFIG_TDSEL (PIN_CONFIG_END + 1) |
17 | #define MTK_PIN_CONFIG_RDSEL (PIN_CONFIG_END + 2) | 17 | #define MTK_PIN_CONFIG_RDSEL (PIN_CONFIG_END + 2) |
18 | #define MTK_PIN_CONFIG_PU_ADV (PIN_CONFIG_END + 3) | ||
19 | #define MTK_PIN_CONFIG_PD_ADV (PIN_CONFIG_END + 4) | ||
18 | 20 | ||
19 | static const struct pinconf_generic_params mtk_custom_bindings[] = { | 21 | static const struct pinconf_generic_params mtk_custom_bindings[] = { |
20 | {"mediatek,tdsel", MTK_PIN_CONFIG_TDSEL, 0}, | 22 | {"mediatek,tdsel", MTK_PIN_CONFIG_TDSEL, 0}, |
21 | {"mediatek,rdsel", MTK_PIN_CONFIG_RDSEL, 0}, | 23 | {"mediatek,rdsel", MTK_PIN_CONFIG_RDSEL, 0}, |
24 | {"mediatek,pull-up-adv", MTK_PIN_CONFIG_PU_ADV, 1}, | ||
25 | {"mediatek,pull-down-adv", MTK_PIN_CONFIG_PD_ADV, 1}, | ||
22 | }; | 26 | }; |
23 | 27 | ||
24 | #ifdef CONFIG_DEBUG_FS | 28 | #ifdef CONFIG_DEBUG_FS |
25 | static const struct pin_config_item mtk_conf_items[] = { | 29 | static const struct pin_config_item mtk_conf_items[] = { |
26 | PCONFDUMP(MTK_PIN_CONFIG_TDSEL, "tdsel", NULL, true), | 30 | PCONFDUMP(MTK_PIN_CONFIG_TDSEL, "tdsel", NULL, true), |
27 | PCONFDUMP(MTK_PIN_CONFIG_RDSEL, "rdsel", NULL, true), | 31 | PCONFDUMP(MTK_PIN_CONFIG_RDSEL, "rdsel", NULL, true), |
32 | PCONFDUMP(MTK_PIN_CONFIG_PU_ADV, "pu-adv", NULL, true), | ||
33 | PCONFDUMP(MTK_PIN_CONFIG_PD_ADV, "pd-adv", NULL, true), | ||
28 | }; | 34 | }; |
29 | #endif | 35 | #endif |
30 | 36 | ||
@@ -169,6 +175,19 @@ static int mtk_pinconf_get(struct pinctrl_dev *pctldev, | |||
169 | ret = val; | 175 | ret = val; |
170 | 176 | ||
171 | break; | 177 | break; |
178 | case MTK_PIN_CONFIG_PU_ADV: | ||
179 | case MTK_PIN_CONFIG_PD_ADV: | ||
180 | if (hw->soc->adv_pull_get) { | ||
181 | bool pullup; | ||
182 | |||
183 | pullup = param == MTK_PIN_CONFIG_PU_ADV; | ||
184 | err = hw->soc->adv_pull_get(hw, desc, pullup, &ret); | ||
185 | if (err) | ||
186 | return err; | ||
187 | } else { | ||
188 | return -ENOTSUPP; | ||
189 | } | ||
190 | break; | ||
172 | default: | 191 | default: |
173 | return -ENOTSUPP; | 192 | return -ENOTSUPP; |
174 | } | 193 | } |
@@ -282,6 +301,20 @@ static int mtk_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, | |||
282 | if (err) | 301 | if (err) |
283 | goto err; | 302 | goto err; |
284 | break; | 303 | break; |
304 | case MTK_PIN_CONFIG_PU_ADV: | ||
305 | case MTK_PIN_CONFIG_PD_ADV: | ||
306 | if (hw->soc->adv_pull_set) { | ||
307 | bool pullup; | ||
308 | |||
309 | pullup = param == MTK_PIN_CONFIG_PU_ADV; | ||
310 | err = hw->soc->adv_pull_set(hw, desc, pullup, | ||
311 | arg); | ||
312 | if (err) | ||
313 | return err; | ||
314 | } else { | ||
315 | return -ENOTSUPP; | ||
316 | } | ||
317 | break; | ||
285 | default: | 318 | default: |
286 | err = -ENOTSUPP; | 319 | err = -ENOTSUPP; |
287 | } | 320 | } |
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c index 67c95ef85ba9..e66bf49a8c4c 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | |||
@@ -358,3 +358,58 @@ int mtk_pinconf_drive_get_rev1(struct mtk_pinctrl *hw, | |||
358 | 358 | ||
359 | return 0; | 359 | return 0; |
360 | } | 360 | } |
361 | |||
362 | int mtk_pinconf_adv_pull_set(struct mtk_pinctrl *hw, | ||
363 | const struct mtk_pin_desc *desc, bool pullup, | ||
364 | u32 arg) | ||
365 | { | ||
366 | int err; | ||
367 | |||
368 | /* 10K off & 50K (75K) off, when (R0, R1) = (0, 0); | ||
369 | * 10K off & 50K (75K) on, when (R0, R1) = (0, 1); | ||
370 | * 10K on & 50K (75K) off, when (R0, R1) = (1, 0); | ||
371 | * 10K on & 50K (75K) on, when (R0, R1) = (1, 1) | ||
372 | */ | ||
373 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_R0, arg & 1); | ||
374 | if (err) | ||
375 | return 0; | ||
376 | |||
377 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_R1, | ||
378 | !!(arg & 2)); | ||
379 | if (err) | ||
380 | return 0; | ||
381 | |||
382 | arg = pullup ? 0 : 1; | ||
383 | |||
384 | err = mtk_hw_set_value(hw, desc->number, PINCTRL_PIN_REG_PUPD, arg); | ||
385 | |||
386 | return err; | ||
387 | } | ||
388 | |||
389 | int mtk_pinconf_adv_pull_get(struct mtk_pinctrl *hw, | ||
390 | const struct mtk_pin_desc *desc, bool pullup, | ||
391 | u32 *val) | ||
392 | { | ||
393 | u32 t, t2; | ||
394 | int err; | ||
395 | |||
396 | err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_PUPD, &t); | ||
397 | if (err) | ||
398 | return err; | ||
399 | |||
400 | /* t == 0 supposes PULLUP for the customized PULL setup */ | ||
401 | if (pullup ^ !t) | ||
402 | return -EINVAL; | ||
403 | |||
404 | err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_R0, &t); | ||
405 | if (err) | ||
406 | return err; | ||
407 | |||
408 | err = mtk_hw_get_value(hw, desc->number, PINCTRL_PIN_REG_R1, &t2); | ||
409 | if (err) | ||
410 | return err; | ||
411 | |||
412 | *val = (t | t2 << 1) & 0x7; | ||
413 | |||
414 | return 0; | ||
415 | } | ||
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h index 3a55ef70e01b..ce364a1a28a6 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.h | |||
@@ -51,6 +51,9 @@ enum { | |||
51 | PINCTRL_PIN_REG_TDSEL, | 51 | PINCTRL_PIN_REG_TDSEL, |
52 | PINCTRL_PIN_REG_RDSEL, | 52 | PINCTRL_PIN_REG_RDSEL, |
53 | PINCTRL_PIN_REG_DRV, | 53 | PINCTRL_PIN_REG_DRV, |
54 | PINCTRL_PIN_REG_PUPD, | ||
55 | PINCTRL_PIN_REG_R0, | ||
56 | PINCTRL_PIN_REG_R1, | ||
54 | PINCTRL_PIN_REG_MAX, | 57 | PINCTRL_PIN_REG_MAX, |
55 | }; | 58 | }; |
56 | 59 | ||
@@ -163,6 +166,13 @@ struct mtk_pin_soc { | |||
163 | const struct mtk_pin_desc *desc, u32 arg); | 166 | const struct mtk_pin_desc *desc, u32 arg); |
164 | int (*drive_get)(struct mtk_pinctrl *hw, | 167 | int (*drive_get)(struct mtk_pinctrl *hw, |
165 | const struct mtk_pin_desc *desc, int *val); | 168 | const struct mtk_pin_desc *desc, int *val); |
169 | |||
170 | int (*adv_pull_set)(struct mtk_pinctrl *hw, | ||
171 | const struct mtk_pin_desc *desc, bool pullup, | ||
172 | u32 arg); | ||
173 | int (*adv_pull_get)(struct mtk_pinctrl *hw, | ||
174 | const struct mtk_pin_desc *desc, bool pullup, | ||
175 | u32 *val); | ||
166 | }; | 176 | }; |
167 | 177 | ||
168 | struct mtk_pinctrl { | 178 | struct mtk_pinctrl { |
@@ -199,4 +209,11 @@ int mtk_pinconf_drive_set_rev1(struct mtk_pinctrl *hw, | |||
199 | int mtk_pinconf_drive_get_rev1(struct mtk_pinctrl *hw, | 209 | int mtk_pinconf_drive_get_rev1(struct mtk_pinctrl *hw, |
200 | const struct mtk_pin_desc *desc, int *val); | 210 | const struct mtk_pin_desc *desc, int *val); |
201 | 211 | ||
212 | int mtk_pinconf_adv_pull_set(struct mtk_pinctrl *hw, | ||
213 | const struct mtk_pin_desc *desc, bool pullup, | ||
214 | u32 arg); | ||
215 | int mtk_pinconf_adv_pull_get(struct mtk_pinctrl *hw, | ||
216 | const struct mtk_pin_desc *desc, bool pullup, | ||
217 | u32 *val); | ||
218 | |||
202 | #endif /* __PINCTRL_MTK_COMMON_V2_H */ | 219 | #endif /* __PINCTRL_MTK_COMMON_V2_H */ |