aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Stübner <heiko@sntech.de>2014-04-23 08:28:59 -0400
committerLinus Walleij <linus.walleij@linaro.org>2014-04-23 17:19:40 -0400
commita076e2ed3fd26f8877a3a010e3fae6b5306ba1b0 (patch)
treef9b0c39a742c6627f546d91b3bf7fee92f9110b4
parentdab3eba7c13cff58dbff767dd02ffb847255ddd3 (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.c40
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
332static 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
707static int rockchip_gpio_direction_output(struct gpio_chip *gc,
708 unsigned offset, int value);
709static 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 */
691static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, 712static 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;