From patchwork Thu Apr 28 09:05:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 8967041 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 73C85BF29F for ; Thu, 28 Apr 2016 09:07:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7C69C20221 for ; Thu, 28 Apr 2016 09:07:46 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6CAB6202AE for ; Thu, 28 Apr 2016 09:07:45 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1avhtb-0006ZI-Rb; Thu, 28 Apr 2016 09:06:03 +0000 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1avhtR-0006T1-7f for linux-arm-kernel@lists.infradead.org; Thu, 28 Apr 2016 09:05:54 +0000 Received: by mail-wm0-x242.google.com with SMTP id e201so20931147wme.2 for ; Thu, 28 Apr 2016 02:05:35 -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=2MWfmdWa8T4CF+7Ts9bwMkyXeyWcVfbGpnclGVwpqa4=; b=Pc5IFFJlhGfYPL4r1qTF8iBWmwopGFKUQQrgAz1RBdTQNeE/QalfDHqBIMrB12oBP3 1WEWD9AW3v9KrHT1jwi+mgmfZ8rRgqHosKwGswU/k8uA5dnwP98eWC4TL43RLWtRUbEq 6te2NhwEjgy5YH3RbIEd/YDaB8OGxXZQWQImgewM6XF4DhR8eikG6g5frFFj8my56DC5 EeH0Ob5kKOeLc5KXd4VnQVxMnn762TbsIRAFwoB8BTcBasIN5nMrOfGdOlWu/PpBoAfk gdoMDFinF87bteuXx+8yfToy441Ug76Ge4xlRNGa1DkuvoPYvdwYhqoSIH0CPBPQQ8/2 865Q== 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=2MWfmdWa8T4CF+7Ts9bwMkyXeyWcVfbGpnclGVwpqa4=; b=XGHoX+e/Rwkl+CX6yXgimVbbBxArqbBi0jkBTwDNFijpliTdxFJFMKDsPmOgnycTks LZmFkLpnhs6j2ykz9MRbUHBr7PUk3rSR2YxyFZme3tSKO5JeWaT8jLERb873wA+7XVLI 8T54EDiGCeub79J4wxqIRD+dAYpfP3hQiG/NFJeZdo1Av5qwBRu2+jY3KtvfcVB7Kiyt MpWzMC/91fmcLY5W+Py3Yp6JpH94fQJWhqdmKstgS3dAyKYQ20msJtafTU5lmyAAmIUO f40i9BCfC2ZJGpuuzburcaQqEkmZgrMMQpHF0f/spRqdEEFrR9cXF+GGHE5ZBTBOMVih eQvA== X-Gm-Message-State: AOPr4FVK6b6tr/2jwEN49BBPdjucbrELrizX+BvURotL779K8a1Q+gsvxe1yi557mbipSA== X-Received: by 10.194.235.39 with SMTP id uj7mr13822571wjc.78.1461834334161; Thu, 28 Apr 2016 02:05:34 -0700 (PDT) Received: from debian64.daheim (p5B2E6CB2.dip0.t-ipconnect.de. [91.46.108.178]) by smtp.googlemail.com with ESMTPSA id i3sm8515715wjx.30.2016.04.28.02.05.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Apr 2016 02:05:31 -0700 (PDT) Received: from chuck by debian64.daheim with local (Exim 4.87) (envelope-from ) id 1avht4-0001w5-9w; Thu, 28 Apr 2016 11:05:30 +0200 From: Christian Lamparter To: linux-gpio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC v4 3/8] gpio: generic: add DT support for generic memory-mapped GPIOs Date: Thu, 28 Apr 2016 11:05:13 +0200 Message-Id: X-Mailer: git-send-email 2.8.1 In-Reply-To: References: In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160428_020553_576619_FEA3C18D X-CRM114-Status: GOOD ( 22.59 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Alexandre Courbot , =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= , Alexander Shiyan , Pawel Moll , Ian Campbell , Linus Walleij , Rob Herring , Kumar Gala , Christian Lamparter Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Álvaro Fernández Rojas This patch adds support for defining memory-mapped GPIOs which provide a compatible interface for the existing generic-gpio driver. Signed-off-by: Álvaro Fernández Rojas Signed-off-by: Christian Lamparter --- drivers/gpio/Kconfig | 3 ++ drivers/gpio/gpio-mmio-compat.h | 17 ++++++++ drivers/gpio/gpio-mmio.c | 95 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 drivers/gpio/gpio-mmio-compat.h diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f73f26b..d1f124e 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -212,6 +212,9 @@ config GPIO_GENERIC_PLATFORM help Say yes here to support basic platform_device memory-mapped GPIO controllers. +if GPIO_GENERIC_PLATFORM +endif + config GPIO_GRGPIO tristate "Aeroflex Gaisler GRGPIO support" depends on OF diff --git a/drivers/gpio/gpio-mmio-compat.h b/drivers/gpio/gpio-mmio-compat.h new file mode 100644 index 0000000..73c48bc --- /dev/null +++ b/drivers/gpio/gpio-mmio-compat.h @@ -0,0 +1,17 @@ +#ifndef GPIO_MMIO_COMPAT_H +#define GPIO_MMIO_COMPAT_H + +#include + +#define ADD(_name, _func) { .compatible = _name, .data = _func } + +#undef ADD + +static inline void set_resource_address(struct resource *res, + resource_size_t start, + resource_size_t len) +{ + res->start = start; + res->end = start + len - 1; +} +#endif /* GPIO_MMIO_COMPAT_H */ diff --git a/drivers/gpio/gpio-mmio.c b/drivers/gpio/gpio-mmio.c index 6c1cb3b..4de9846 100644 --- a/drivers/gpio/gpio-mmio.c +++ b/drivers/gpio/gpio-mmio.c @@ -61,6 +61,9 @@ o ` ~~~~\___/~~~~ ` controller in FPGA is ,.` #include #include #include +#include +#include +#include "gpio-mmio-compat.h" static void bgpio_write8(void __iomem *reg, unsigned long data) { @@ -569,6 +572,83 @@ static void __iomem *bgpio_map(struct platform_device *pdev, return devm_ioremap_resource(&pdev->dev, r); } +#ifdef CONFIG_OF +static int bgpio_basic_mmio_parse_dt(struct platform_device *pdev, + struct bgpio_pdata *pdata, + unsigned long *flags) +{ + struct device *dev = &pdev->dev; + int err; + + err = of_property_read_u32(dev->of_node, "ngpio", &pdata->ngpio); + if (err && err != -EINVAL) + return 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 0; +} + +#define ADD(_name, _func) { .compatible = _name, .data = _func } + +static const struct of_device_id bgpio_of_match[] = { + ADD("linux,gpio-mmio", bgpio_basic_mmio_parse_dt), + + { } +}; +#undef ADD +MODULE_DEVICE_TABLE(of, bgpio_of_match); + +static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev, + unsigned long *flags) +{ + int (*parse_dt)(struct platform_device *, + struct bgpio_pdata *, unsigned long *); + const struct device_node *node = pdev->dev.of_node; + const struct of_device_id *of_id; + struct bgpio_pdata *pdata; + int err = -ENODEV; + + of_id = of_match_node(bgpio_of_match, node); + if (!of_id) + return NULL; + + pdata = devm_kzalloc(&pdev->dev, sizeof(struct bgpio_pdata), + GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + parse_dt = of_id->data; + if (parse_dt) + err = parse_dt(pdev, pdata, flags); + if (err) + return ERR_PTR(err); + + return pdata; +} +#else +static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev, + unsigned long *flags) +{ + return NULL; +} +#endif /* CONFIG_OF */ + static int bgpio_pdev_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -579,10 +659,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(pdev, &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 +734,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,