Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed118a5f authored by Bjorn Andersson's avatar Bjorn Andersson Committed by Linus Walleij
Browse files

pinctrl-msm: Support output-{high,low} configuration



Add support for configuring pins as output with value as from the
pinconf-generic interface.

Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@sonymobile.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 58ffe7a0
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -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);