From patchwork Thu Apr 6 05:38:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Balean X-Patchwork-Id: 747599 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3vzBN211PQz9s85 for ; Thu, 6 Apr 2017 15:38:57 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" (0-bit key; unprotected) header.d=balean.com.au header.i=@balean.com.au header.b="NvIM7A9B"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id B67E4C21C35; Thu, 6 Apr 2017 05:38:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 37C36C21C37; Thu, 6 Apr 2017 05:38:51 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 3836EC21C37; Thu, 6 Apr 2017 05:38:50 +0000 (UTC) Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by lists.denx.de (Postfix) with ESMTPS id D8922C21BE6 for ; Thu, 6 Apr 2017 05:38:48 +0000 (UTC) Received: by mail-pg0-f66.google.com with SMTP id 79so5958159pgf.0 for ; Wed, 05 Apr 2017 22:38:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=balean.com.au; s=google; h=from:to:cc:subject:date:message-id:references:in-reply-to; bh=uG22jdzWg0ZJGEzvOR3zUhHx6rjLydDx6dngmKY/7K8=; b=NvIM7A9BWkAja9kRB1AUGNjxFSeizXAPojelxmkcGzUBy3TeiwBNBG/bu8LxCMHUbf Ynqv0VM65hXTinKoCDrqg0JclYQwBDu+IeJhxBuohqUoC1M6oQXsmLV5LYvZgBUkFoIH OtcSUMd3y1u0hO244AKB31VN87pc9GoVciHLI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:references :in-reply-to; bh=uG22jdzWg0ZJGEzvOR3zUhHx6rjLydDx6dngmKY/7K8=; b=Abon0caUZ9yRLUf0j/A9KtDidv301eCGrF2GEbjs/D07XyUdRxH9ahXlaVzHhQfFSg +6Jk97UMsAoqUCHjzFNtfKiMjB75EoUd/vy3b8Lb3IXSHEmH20KLMdjDAtagQc3xKpvX v+9Z3lDwfmBB1jDhmUjNulJl9TJMsz2RFkKbnJkiU/quA7wN72B+/fVg1qhl1Y6iI+Wn Ekf8Bl6GyxiGFREo1AUOeqe5InQgap8q1bmJON+Yvbh4FqSX4oVS/0aAUHj1gx4txe1B uC2RBjLjrIeogcvq2MTQWgPuvZZwEMEnQ6c7uDgZbnwYlmPcAoHN1jlAPkdegSxXjncX NI5w== X-Gm-Message-State: AFeK/H04x8Fl8hFKp3FjFHekEYLg5N4YWCmpXtr/TEBCOQ+WbzAyyEomhp/W58bW1DxL1A== X-Received: by 10.98.223.133 with SMTP id d5mr10965584pfl.222.1491457127487; Wed, 05 Apr 2017 22:38:47 -0700 (PDT) Received: from logic.local (249.120.96.58.static.exetel.com.au. [58.96.120.249]) by smtp.gmail.com with ESMTPSA id b195sm1007824pfb.106.2017.04.05.22.38.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Apr 2017 22:38:47 -0700 (PDT) From: James Balean To: U-Boot Mailing List Date: Thu, 6 Apr 2017 00:38:28 -0500 Message-Id: <1491457108-11185-1-git-send-email-james@balean.com.au> X-Mailer: git-send-email 2.7.4 References: <1490594146-4562-1-git-send-email-james@balean.com.au> <760ef132-6b3b-b219-e5f6-00e95927dcbe@ltec.ch> <1491456859-11010-1-git-send-email-james@balean.com.au> In-reply-to: <1491456859-11010-1-git-send-email-james@balean.com.au> Cc: James Balean Subject: [U-Boot] [PATCH v2] Add 16-bit single register pin controller support X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 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" Enables the pinctrl-single driver to support 16-bit registers. Only 32-bit registers were supported previously. Reduced width registers are required for some platforms, such as OMAP. Signed-off-by: James Balean Cc: Felix Brack Cc: Simon Glass --- Changes for v2: - Added explanation of why this patch is needed. - Changed fdt32_t to ulong type. - Removed 8-bit support. - Now with a single read and write function, instead of one for each register width. drivers/pinctrl/pinctrl-single.c | 45 ++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index d2dcec0..defb66f 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -24,6 +24,30 @@ struct single_fdt_pin_cfg { fdt32_t val; /* configuration register value */ }; +static ulong single_read(ulong reg, int width) { + switch (size) { + case 16: + return readw(reg); + case 32: + return readl(reg); + default: + dev_warn(dev, "unsupported register width %i\n", width); + } +} + +static void single_write(ulong val, ulong reg, int width) { + switch (width) { + case 16: + writew(val, reg); + break; + case 32: + writel(val, reg); + break; + default: + dev_warn(dev, "unsupported register width %i\n", width; + } +} + /** * single_configure_pins() - Configure pins based on FDT data * @@ -47,28 +71,19 @@ static int single_configure_pins(struct udevice *dev, int n, reg; u32 val; - for (n = 0; n < count; n++) { + for (n = 0; n < count; n++, pins++) { reg = fdt32_to_cpu(pins->reg); if ((reg < 0) || (reg > pdata->offset)) { dev_dbg(dev, " invalid register offset 0x%08x\n", reg); - pins++; continue; } reg += pdata->base; - switch (pdata->width) { - case 32: - val = readl(reg) & ~pdata->mask; - val |= fdt32_to_cpu(pins->val) & pdata->mask; - writel(val, reg); - dev_dbg(dev, " reg/val 0x%08x/0x%08x\n", - reg, val); - break; - default: - dev_warn(dev, "unsupported register width %i\n", - pdata->width); - } - pins++; + val = single_read(reg, pdata->width) & ~pdata->mask; + val |= fdt32_to_cpu(pins->val) & pdata->mask; + single_write(val, reg, pdata->width); + dev_dbg(dev, " reg/val 0x%08x/0x%08x\n", reg, val); } + return 0; }