pinctrl-msm: Support output-{high,low} configuration
authorBjorn Andersson <bjorn@kryo.se>
Wed, 5 Feb 2014 03:55:31 +0000 (19:55 -0800)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 11 Feb 2014 08:35:18 +0000 (09:35 +0100)
Add support for configuring pins as output with value as from the
pinconf-generic interface.

Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-msm.c

index ef2bf31..2cfb1d4 100644 (file)
@@ -228,6 +228,11 @@ static int msm_config_reg(struct msm_pinctrl *pctrl,
                *bit = g->drv_bit;
                *mask = 7;
                break;
+       case PIN_CONFIG_OUTPUT:
+               *reg = g->ctl_reg;
+               *bit = g->oe_bit;
+               *mask = 1;
+               break;
        default:
                dev_err(pctrl->dev, "Invalid config param %04x\n", param);
                return -ENOTSUPP;
@@ -301,6 +306,14 @@ static int msm_config_group_get(struct pinctrl_dev *pctldev,
        case PIN_CONFIG_DRIVE_STRENGTH:
                arg = msm_regval_to_drive[arg];
                break;
+       case PIN_CONFIG_OUTPUT:
+               /* Pin is not output */
+               if (!arg)
+                       return -EINVAL;
+
+               val = readl(pctrl->regs + g->io_reg);
+               arg = !!(val & BIT(g->in_bit));
+               break;
        default:
                dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
                        param);
@@ -357,6 +370,20 @@ static int msm_config_group_set(struct pinctrl_dev *pctldev,
                        else
                                arg = msm_drive_to_regval[arg];
                        break;
+               case PIN_CONFIG_OUTPUT:
+                       /* set output value */
+                       spin_lock_irqsave(&pctrl->lock, flags);
+                       val = readl(pctrl->regs + g->io_reg);
+                       if (arg)
+                               val |= BIT(g->out_bit);
+                       else
+                               val &= ~BIT(g->out_bit);
+                       writel(val, pctrl->regs + g->io_reg);
+                       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+                       /* enable output */
+                       arg = 1;
+                       break;
                default:
                        dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
                                param);