From patchwork Tue Dec 16 22:41:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= X-Patchwork-Id: 422121 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 1C13B1400D2 for ; Wed, 17 Dec 2014 09:41:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751122AbaLPWlz (ORCPT ); Tue, 16 Dec 2014 17:41:55 -0500 Received: from mail-wi0-f177.google.com ([209.85.212.177]:33821 "EHLO mail-wi0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751103AbaLPWlz (ORCPT ); Tue, 16 Dec 2014 17:41:55 -0500 Received: by mail-wi0-f177.google.com with SMTP id l15so14148331wiw.10 for ; Tue, 16 Dec 2014 14:41:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=e1FTVvW8VXvPpJR7ptzWjgO5U+y3tLCeNiFwWik+qCs=; b=nQVgcO8Ft9oCAqBXcYBv0GyEe5dWdnUgCuOj9GweV7Uw4WkH1zfeI/g9Wuvz6/lEWO FLJRcKw+/wi6Bd1Yrw7f36AQyUvqb7RuJ7RwG5kr7IC6Tm8HL6Yd3wLoEgNuCyBTqSPq vxTBnehNzC2VCI9MX4YH9xr9seOz2yUsZ5zAkb14ceiSwTc8CGOhGwfFVUAY4oDB2FJC +IOGmdWFP8qRcaj2hUgtpQocYeJ+UeF4tpJ4/AoRhREiDmiDfruoYkylpOth0klxLZ2j CozF7XCwWawsOi1/EZ5IKeeAty/JnJpl3obEHL5BcEumkgRXXAkTOizujdgVqD2PJaXZ 3WpQ== X-Received: by 10.194.85.137 with SMTP id h9mr50176wjz.70.1418769713661; Tue, 16 Dec 2014 14:41:53 -0800 (PST) Received: from [192.168.1.10] (148.Red-83-46-232.dynamicIP.rima-tde.net. [83.46.232.148]) by mx.google.com with ESMTPSA id iz19sm18598758wic.8.2014.12.16.14.41.52 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 16 Dec 2014 14:41:52 -0800 (PST) Message-ID: <5490B528.2020305@gmail.com> Date: Tue, 16 Dec 2014 23:41:44 +0100 From: =?ISO-8859-1?Q?=C1lvaro_Fern=E1ndez_Rojas?= User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: linux-gpio@vger.kernel.org Subject: basic-mmio-gpio: add DT support Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Add DT support while keeping legacy support. Signed-off-by: Álvaro Fernández Rojas --- -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/gpio/gpio-generic.c b/drivers/gpio/gpio-generic.c index 16f6115..9792783 100644 --- a/drivers/gpio/gpio-generic.c +++ b/drivers/gpio/gpio-generic.c @@ -61,6 +61,9 @@ o ` ~~~~\___/~~~~ ` controller in FPGA is ,.` #include #include #include +#include +#include +#include static void bgpio_write8(void __iomem *reg, unsigned long data) { @@ -488,8 +491,58 @@ static void __iomem *bgpio_map(struct platform_device *pdev, return ret; } +#ifdef CONFIG_OF +static const struct of_device_id bgpio_dt_ids[] = { + { .compatible = "basic-mmio-gpio" }, +}; +MODULE_DEVICE_TABLE(of, bgpio_dt_ids); + +static int bgpio_probe_dt(struct platform_device *pdev) +{ + u32 tmp; + struct bgpio_pdata *pdata; + struct device_node *np; + + np = pdev->dev.of_node; + if (!np) + return 0; + + pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + + pdata->label = dev_name(&pdev->dev); + pdata->base = -1; + if (of_find_property(np, "byte-be", NULL)) { + pdata->flags |= BGPIOF_BIG_ENDIAN_BYTE_ORDER; + } + if (of_find_property(np, "bit-be", NULL)) { + pdata->flags |= BGPIOF_BIG_ENDIAN; + } + if (of_find_property(np, "regset-nr", NULL)) { + pdata->flags |= BGPIOF_UNREADABLE_REG_SET; + } + if (of_find_property(np, "regdir-nr", NULL)) { + pdata->flags |= BGPIOF_UNREADABLE_REG_DIR; + } + if (!of_property_read_u32(np, "num-gpios", &tmp)) { + pdata->ngpio = tmp; + } + + pdev->dev.platform_data = pdata; + + return 1; +} +#else +static inline int bgpio_probe_dt(struct platform_device *pdev) +{ + return 0; +} +#endif + static int bgpio_pdev_probe(struct platform_device *pdev) { + int status; struct device *dev = &pdev->dev; struct resource *r; void __iomem *dat; @@ -498,10 +551,24 @@ 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; int err; struct bgpio_chip *bgc; - struct bgpio_pdata *pdata = dev_get_platdata(dev); + struct bgpio_pdata *pdata; + bool use_of = 0; + + status = bgpio_probe_dt(pdev); + if (status < 0) + return status; + if (status > 0) + use_of = 1; + + pdata = dev_get_platdata(dev); + + if (!use_of) + flags = pdev->id_entry->driver_data; + else if (pdata) + flags = pdata->flags; r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat"); if (!r) @@ -547,6 +614,9 @@ static int bgpio_pdev_probe(struct platform_device *pdev) platform_set_drvdata(pdev, bgc); + if (use_of) + of_gpiochip_add(&bgc->gc); + return gpiochip_add(&bgc->gc); } @@ -572,6 +642,7 @@ MODULE_DEVICE_TABLE(platform, bgpio_id_table); static struct platform_driver bgpio_driver = { .driver = { .name = "basic-mmio-gpio", + .of_match_table = bgpio_dt_ids, }, .id_table = bgpio_id_table, .probe = bgpio_pdev_probe, diff --git a/include/linux/basic_mmio_gpio.h b/include/linux/basic_mmio_gpio.h index 0e97856..a35dffd 100644 --- a/include/linux/basic_mmio_gpio.h +++ b/include/linux/basic_mmio_gpio.h @@ -22,6 +22,7 @@ struct bgpio_pdata { const char *label; int base; int ngpio; + unsigned long flags; }; struct device;