From patchwork Wed Jan 13 23:25:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 567198 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 395891401CA for ; Thu, 14 Jan 2016 10:46:41 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=ov7Opylt; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 48AE8622BC; Thu, 14 Jan 2016 00:46:39 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 82sM8pZC2bmR; Thu, 14 Jan 2016 00:46:39 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 80D95622BB; Thu, 14 Jan 2016 00:40:47 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D2E37621F5 for ; Thu, 14 Jan 2016 00:36:30 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 359hM60UwAq9 for ; Thu, 14 Jan 2016 00:36:30 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-oi0-f43.google.com (mail-oi0-f43.google.com [209.85.218.43]) by theia.denx.de (Postfix) with ESMTPS id CDD4362235 for ; Thu, 14 Jan 2016 00:33:31 +0100 (CET) Received: by mail-oi0-f43.google.com with SMTP id k206so104907005oia.1 for ; Wed, 13 Jan 2016 15:33:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=T06flABZ0Er9Cdwo1GzQa7BvWtI0x9LwnHbmLBsa8p8=; b=ov7OpyltUhMoCFcJ9lldzj/Qyzna5+0Iq4TLbeeH13kiMy3RbLs5wttOwOU17PTotZ xNgamrczalNjn3I26c/WDz5nSY0b3rJA/unShD5i5SLxXgjoqGaLMfFWJ+Tdndx4MspB tSAzc06G8up8XDajztXzJUIrnc0COeVKBLCacjX0xzMui7XTA/Xp0zxAKnzlIAw2P5PC t9Z2xJZWl8Twh3uT0Vdoko3R82JS3Fcqh/In3ymWl7REfkMYyE3/fjY8lWbQyNdpXc6U n8ZF+vWpY/5IezzWZKLzuY0/1RbDvRllA37eQwaJmIwjiFWj9vTtENlKQ0PO/N6075bF ezxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=T06flABZ0Er9Cdwo1GzQa7BvWtI0x9LwnHbmLBsa8p8=; b=HJImym/dj1uQKonVvlYz8Ynxvo3b1JiXbHkWK86ro6NFPLw0OTfIX6UVsxl9SnF3xJ btwgyl7P03mxJwEwNdZCupUOCrQNuJ4AAuQB0K/O18x4F5rliBk1BdDiXILPOeSv/17w Yj7xjKP0cv9iAfdmfgRMjSgoswKONROMtpXORJF01aUZe4RMnRE7qNFnyezs9fluW+Qw OdUc46CtWo67XjsqwBhSj3o7ZHIsTn4RJPe8Zz5BjUa5ALQ+llNPRuag2VlXOCdMO/AI f0vJ24FU3UI0ZaPsKi2YNMwm3R1cXToxIInf+CXqVeZzYnhcsd5sJj6fJYhRIIJ/CX/K YklQ== X-Gm-Message-State: ALoCoQlpcf+Gdrqh1OaDYPSwzWzXnASDPn3fWETWmRnJNUnmfZ4BLWOAoz0fQJB70NYu0OdeGpOR0VbEVfI+jj5C9zxeycQ49g== X-Received: by 10.202.230.197 with SMTP id d188mr669989oih.59.1452728010467; Wed, 13 Jan 2016 15:33:30 -0800 (PST) Received: from kaki.bld.corp.google.com ([172.29.216.32]) by smtp.gmail.com with ESMTPSA id l19sm1873872oig.27.2016.01.13.15.33.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 13 Jan 2016 15:33:26 -0800 (PST) Received: by kaki.bld.corp.google.com (Postfix, from userid 121222) id 2C81A2222B1; Wed, 13 Jan 2016 16:26:26 -0700 (MST) From: Simon Glass To: U-Boot Mailing List Date: Wed, 13 Jan 2016 16:25:34 -0700 Message-Id: <1452727540-3249-45-git-send-email-sjg@chromium.org> X-Mailer: git-send-email 2.6.0.rc2.230.g3dd15c0 In-Reply-To: <1452727540-3249-1-git-send-email-sjg@chromium.org> References: <1452727540-3249-1-git-send-email-sjg@chromium.org> Cc: Jeffy Chen Subject: [U-Boot] [PATCH 44/50] rockchip: pinctrl: Implement the get_gpio_mux() method X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Implement this so that the GPIO command will be able to report whether a GPIO is used for input or output. Signed-off-by: Simon Glass --- drivers/pinctrl/rockchip/pinctrl_rk3288.c | 68 +++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/drivers/pinctrl/rockchip/pinctrl_rk3288.c b/drivers/pinctrl/rockchip/pinctrl_rk3288.c index 53b8cf2..8356786 100644 --- a/drivers/pinctrl/rockchip/pinctrl_rk3288.c +++ b/drivers/pinctrl/rockchip/pinctrl_rk3288.c @@ -520,18 +520,16 @@ static int rk3288_pinctrl_set_state_simple(struct udevice *dev, } #ifndef CONFIG_SPL_BUILD -static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index, - int muxval, int flags) +int rk3288_pinctrl_get_pin_info(struct rk3288_pinctrl_priv *priv, + int banknum, int ind, u32 **addrp, uint *shiftp, + uint *maskp) { - struct rk3288_pinctrl_priv *priv = dev_get_priv(dev); struct rockchip_pin_bank *bank = &rk3288_pin_banks[banknum]; - uint shift, muxnum, ind = index; + uint muxnum; u32 *addr; - debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags); for (muxnum = 0; muxnum < 4; muxnum++) { struct rockchip_iomux *mux = &bank->iomux[muxnum]; - uint mask; if (ind >= 8) { ind -= 8; @@ -543,24 +541,61 @@ static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index, else addr = (u32 *)priv->grf - 4; addr += mux->offset; - shift = ind & 7; + *shiftp = ind & 7; if (mux->type & IOMUX_WIDTH_4BIT) { - mask = 0xf; - shift *= 4; - if (shift >= 16) { - shift -= 16; + *maskp = 0xf; + *shiftp *= 4; + if (*shiftp >= 16) { + *shiftp -= 16; addr++; } } else { - mask = 3; - shift *= 2; + *maskp = 3; + *shiftp *= 2; } debug("%s: addr=%p, mask=%x, shift=%x\n", __func__, addr, - mask, shift); - rk_clrsetreg(addr, mask << shift, muxval << shift); - break; + *maskp, *shiftp); + *addrp = addr; + return 0; } + + return -EINVAL; +} + +static int rk3288_pinctrl_get_gpio_mux(struct udevice *dev, int banknum, + int index) +{ + struct rk3288_pinctrl_priv *priv = dev_get_priv(dev); + uint shift; + uint mask; + u32 *addr; + int ret; + + ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift, + &mask); + if (ret) + return ret; + return (readl(addr) & mask) >> shift; +} + +static int rk3288_pinctrl_set_pins(struct udevice *dev, int banknum, int index, + int muxval, int flags) +{ + struct rk3288_pinctrl_priv *priv = dev_get_priv(dev); + uint shift, ind = index; + uint mask; + u32 *addr; + int ret; + + debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags); + ret = rk3288_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift, + &mask); + if (ret) + return ret; + rk_clrsetreg(addr, mask << shift, muxval << shift); + + /* Handle pullup/pulldown */ if (flags) { uint val = 0; @@ -618,6 +653,7 @@ static int rk3288_pinctrl_set_state(struct udevice *dev, struct udevice *config) static struct pinctrl_ops rk3288_pinctrl_ops = { #ifndef CONFIG_SPL_BUILD .set_state = rk3288_pinctrl_set_state, + .get_gpio_mux = rk3288_pinctrl_get_gpio_mux, #endif .set_state_simple = rk3288_pinctrl_set_state_simple, .request = rk3288_pinctrl_request,