diff options
author | Heiko Stübner <heiko@sntech.de> | 2014-04-23 08:28:59 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-04-23 17:19:40 -0400 |
commit | a076e2ed3fd26f8877a3a010e3fae6b5306ba1b0 (patch) | |
tree | f9b0c39a742c6627f546d91b3bf7fee92f9110b4 | |
parent | dab3eba7c13cff58dbff767dd02ffb847255ddd3 (diff) |
pinctrl: rockchip: implement PIN_CONFIG_OUTPUT handling
In some cases it is nice to be able to simply control a gpio output
via the PIN_CONFIG_OUTPUT option without having a driver control it.
Thus add support for it to the rockchip pinctrl driver.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index ae3dfe7642f1..2e198a41c7bb 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -329,6 +329,23 @@ static const struct pinctrl_ops rockchip_pctrl_ops = { | |||
329 | * Hardware access | 329 | * Hardware access |
330 | */ | 330 | */ |
331 | 331 | ||
332 | static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) | ||
333 | { | ||
334 | struct rockchip_pinctrl *info = bank->drvdata; | ||
335 | void __iomem *reg = info->reg_base + info->ctrl->mux_offset; | ||
336 | u8 bit; | ||
337 | |||
338 | if (bank->bank_type == RK3188_BANK0 && pin < 16) | ||
339 | return RK_FUNC_GPIO; | ||
340 | |||
341 | /* get basic quadrupel of mux registers and the correct reg inside */ | ||
342 | reg += bank->bank_num * 0x10; | ||
343 | reg += (pin / 8) * 4; | ||
344 | bit = (pin % 8) * 2; | ||
345 | |||
346 | return ((readl(reg) >> bit) & 3); | ||
347 | } | ||
348 | |||
332 | /* | 349 | /* |
333 | * Set a new mux function for a pin. | 350 | * Set a new mux function for a pin. |
334 | * | 351 | * |
@@ -687,6 +704,10 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, | |||
687 | return false; | 704 | return false; |
688 | } | 705 | } |
689 | 706 | ||
707 | static int rockchip_gpio_direction_output(struct gpio_chip *gc, | ||
708 | unsigned offset, int value); | ||
709 | static int rockchip_gpio_get(struct gpio_chip *gc, unsigned offset); | ||
710 | |||
690 | /* set the pin config settings for a specified pin */ | 711 | /* set the pin config settings for a specified pin */ |
691 | static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, | 712 | static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, |
692 | unsigned long *configs, unsigned num_configs) | 713 | unsigned long *configs, unsigned num_configs) |
@@ -724,6 +745,13 @@ static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, | |||
724 | if (rc) | 745 | if (rc) |
725 | return rc; | 746 | return rc; |
726 | break; | 747 | break; |
748 | case PIN_CONFIG_OUTPUT: | ||
749 | rc = rockchip_gpio_direction_output(&bank->gpio_chip, | ||
750 | pin - bank->pin_base, | ||
751 | arg); | ||
752 | if (rc) | ||
753 | return rc; | ||
754 | break; | ||
727 | default: | 755 | default: |
728 | return -ENOTSUPP; | 756 | return -ENOTSUPP; |
729 | break; | 757 | break; |
@@ -741,6 +769,7 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, | |||
741 | struct rockchip_pin_bank *bank = pin_to_bank(info, pin); | 769 | struct rockchip_pin_bank *bank = pin_to_bank(info, pin); |
742 | enum pin_config_param param = pinconf_to_config_param(*config); | 770 | enum pin_config_param param = pinconf_to_config_param(*config); |
743 | u16 arg; | 771 | u16 arg; |
772 | int rc; | ||
744 | 773 | ||
745 | switch (param) { | 774 | switch (param) { |
746 | case PIN_CONFIG_BIAS_DISABLE: | 775 | case PIN_CONFIG_BIAS_DISABLE: |
@@ -761,6 +790,17 @@ static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, | |||
761 | 790 | ||
762 | arg = 1; | 791 | arg = 1; |
763 | break; | 792 | break; |
793 | case PIN_CONFIG_OUTPUT: | ||
794 | rc = rockchip_get_mux(bank, pin - bank->pin_base); | ||
795 | if (rc != RK_FUNC_GPIO) | ||
796 | return -EINVAL; | ||
797 | |||
798 | rc = rockchip_gpio_get(&bank->gpio_chip, pin - bank->pin_base); | ||
799 | if (rc < 0) | ||
800 | return rc; | ||
801 | |||
802 | arg = rc ? 1 : 0; | ||
803 | break; | ||
764 | default: | 804 | default: |
765 | return -ENOTSUPP; | 805 | return -ENOTSUPP; |
766 | break; | 806 | break; |