From patchwork Tue Apr 26 22:51:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 615390 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qvddf0DPRz9t61 for ; Wed, 27 Apr 2016 08:52:22 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=googlemail.com header.i=@googlemail.com header.b=fY8GkSvw; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752281AbcDZWwT (ORCPT ); Tue, 26 Apr 2016 18:52:19 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33490 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752400AbcDZWwR (ORCPT ); Tue, 26 Apr 2016 18:52:17 -0400 Received: by mail-wm0-f66.google.com with SMTP id r12so8172259wme.0; Tue, 26 Apr 2016 15:52:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references:mime-version:content-transfer-encoding; bh=SVctoxQZWUw32XrIPzUILlv0eaEKCxBp0WSgqRs19FI=; b=fY8GkSvwOiZE9HHP+eqlDDATm+PbSCgdeigSMXvxOlFgCbur7aD9+XYl5HC9cpLNzq JJXTuIVcbERAZVfd2rx+UUhoTWIdh9eb0Q2YKUFt5oow2k4cf21FgRAoQE4EWziU//We DQluNmREFPsRr3J4Ye/Msb5epjvi39QuVIxvg8T19hNVDgInkB+AYj6BMVlmGUo8JoIX kkuFKtEGmHk01J41GhmvBKX5p/77HoPamfeATl+NIwdRNLr1rmJLxYnSjer3M5vz4/2t 585/T8q97VLw/VpG4poZso0N/HFGMH/mu1MozXpiES2q/rqjafJ5dr5bbfEfIQ4S1rEA 7j7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references:mime-version :content-transfer-encoding; bh=SVctoxQZWUw32XrIPzUILlv0eaEKCxBp0WSgqRs19FI=; b=gcRKxXlauK0OYzojXr2WzhQtJRb//XBFheEivwOJjAuQDFXcI+rCcKND93Hqq4ZsIs +V70WhUBFjdruceDEGA654HOdUhzZqpvAqpro1brhKQli/tpEPjOjS9sOcIJyMFmSX2q G3Ep/tZ/4etXiKHi6OsGyQIAIb6ZIeasBsjNKBqm1MhToXdBiGoDdlYjdZ9DhJMLSn4J TRyhGfYdqZzsAFSYvMiN3LBvdILwMQ7t+8pm/cJHSZn+Vd1moOLiWKHXRTRaTKRLoupm dyKICwcLkcnt/5HlPknnEs3a/U5kBSHtsOeEGyLQnrB1/h9Sd90LY34N3gmJ1Nn+8U+0 5iVg== X-Gm-Message-State: AOPr4FWVxUPnwATIkwlMyOnd8VB1uI+cRhLB7xU+MgtDHPQXvJi4x5Sgd5qusH5kgox+/g== X-Received: by 10.28.146.135 with SMTP id u129mr6000504wmd.8.1461711135455; Tue, 26 Apr 2016 15:52:15 -0700 (PDT) Received: from debian64.daheim (p5B2E60BB.dip0.t-ipconnect.de. [91.46.96.187]) by smtp.googlemail.com with ESMTPSA id r10sm900217wjf.2.2016.04.26.15.52.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Apr 2016 15:52:12 -0700 (PDT) Received: from chuck by debian64.daheim with local (Exim 4.87) (envelope-from ) id 1avBpz-0006Ki-CF; Wed, 27 Apr 2016 00:52:11 +0200 From: Christian Lamparter To: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org Cc: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= , Kumar Gala , Ian Campbell , Mark Rutland , Pawel Moll , Rob Herring , Alexandre Courbot , Linus Walleij , Christian Lamparter Subject: [RFC v3 2/3] gpio: generic: add DT support for basic memory-mapped GPIOs Date: Wed, 27 Apr 2016 00:51:53 +0200 Message-Id: X-Mailer: git-send-email 2.8.1 In-Reply-To: References: In-Reply-To: References: MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org From: Álvaro Fernández Rojas This patch adds support for defining basic memory-mapped GPIOs within the device tree framework. Signed-off-by: Álvaro Fernández Rojas Signed-off-by: Christian Lamparter --- drivers/gpio/gpio-generic.c | 70 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-generic.c b/drivers/gpio/gpio-generic.c index 54cddfa..f535299 100644 --- a/drivers/gpio/gpio-generic.c +++ b/drivers/gpio/gpio-generic.c @@ -61,6 +61,8 @@ o ` ~~~~\___/~~~~ ` controller in FPGA is ,.` #include #include #include +#include +#include static void bgpio_write8(void __iomem *reg, unsigned long data) { @@ -569,6 +571,59 @@ static void __iomem *bgpio_map(struct platform_device *pdev, return devm_ioremap_resource(&pdev->dev, r); } +#ifdef CONFIG_OF +static const struct of_device_id bgpio_of_match[] = { + { .compatible = "basic-mmio-gpio" }, + { } +}; +MODULE_DEVICE_TABLE(of, bgpio_of_match); + +static struct bgpio_pdata *bgpio_parse_dt(struct device *dev, + unsigned long *flags) +{ + struct bgpio_pdata *pdata; + int err; + + if (!of_match_node(bgpio_of_match, dev->of_node)) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(struct bgpio_pdata), + GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + err = of_property_read_u32(dev->of_node, "ngpio", &pdata->ngpio); + if (err && err != -EINVAL) + return ERR_PTR(err); + + if (of_device_is_big_endian(dev->of_node)) + *flags |= BGPIOF_BIG_ENDIAN_BYTE_ORDER; + + if (of_property_read_bool(dev->of_node, "unreadable-reg-set")) + *flags |= BGPIOF_UNREADABLE_REG_SET; + + if (of_property_read_bool(dev->of_node, "unreadable-reg-dir")) + *flags |= BGPIOF_UNREADABLE_REG_DIR; + + if (of_property_read_bool(dev->of_node, "big-endian-byte-order")) + *flags |= BGPIOF_BIG_ENDIAN; + + if (of_property_read_bool(dev->of_node, "read-output-reg-set")) + *flags |= BGPIOF_READ_OUTPUT_REG_SET; + + if (of_property_read_bool(dev->of_node, "no-output")) + *flags |= BGPIOF_NO_OUTPUT; + + return pdata; +} +#else +static struct bgpio_data *bgpio_parse_dt(struct device *dev, + unsigned long *flags) +{ + return NULL; +} +#endif /* CONFIG_OF */ + static int bgpio_pdev_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -579,10 +634,18 @@ static int bgpio_pdev_probe(struct platform_device *pdev) void __iomem *dirout; void __iomem *dirin; unsigned long sz; - unsigned long flags = pdev->id_entry->driver_data; + unsigned long flags = 0; int err; struct gpio_chip *gc; - struct bgpio_pdata *pdata = dev_get_platdata(dev); + struct bgpio_pdata *pdata; + + pdata = bgpio_parse_dt(dev, &flags); + if (IS_ERR(pdata)) { + return PTR_ERR(pdata); + } else if (!pdata) { + pdata = dev_get_platdata(dev); + flags = pdev->id_entry->driver_data; + } r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat"); if (!r) @@ -646,6 +709,9 @@ MODULE_DEVICE_TABLE(platform, bgpio_id_table); static struct platform_driver bgpio_driver = { .driver = { .name = "basic-mmio-gpio", +#ifdef CONFIG_OF + .of_match_table = of_match_ptr(bgpio_of_match), +#endif }, .id_table = bgpio_id_table, .probe = bgpio_pdev_probe,