From patchwork Wed Sep 5 08:40:54 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 1406781 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id 1896B3FC71 for ; Wed, 5 Sep 2012 08:45:11 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1T9BBO-0000Tg-58; Wed, 05 Sep 2012 08:41:58 +0000 Received: from mail.free-electrons.com ([88.190.12.23]) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1T9BAq-0000J8-95 for linux-arm-kernel@lists.infradead.org; Wed, 05 Sep 2012 08:41:25 +0000 Received: by mail.free-electrons.com (Postfix, from userid 106) id 8283D192; Wed, 5 Sep 2012 10:41:24 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.free-electrons.com X-Spam-Level: X-Spam-Status: No, score=-3.2 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham version=3.3.1 Received: from localhost (col31-4-88-188-83-94.fbx.proxad.net [88.188.83.94]) by mail.free-electrons.com (Postfix) with ESMTPSA id A3BC91A6; Wed, 5 Sep 2012 10:41:06 +0200 (CEST) From: Maxime Ripard To: linux-arm-kernel@lists.infradead.org, shawn.guo@linaro.org, grant.likely@secretlab.ca, linus.walleij@linaro.org Subject: [PATCH 5/8] gpio: 74x164: Add output pin support Date: Wed, 5 Sep 2012 10:40:54 +0200 Message-Id: <1346834457-6257-5-git-send-email-maxime.ripard@free-electrons.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1346834457-6257-1-git-send-email-maxime.ripard@free-electrons.com> References: <1346834457-6257-1-git-send-email-maxime.ripard@free-electrons.com> X-Spam-Note: CRM114 invocation failed X-Spam-Score: -2.1 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.1 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.2 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: brian@crystalfontz.com X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org The shift registers have an output that, when enabled, propagates the values of its internal register to the pins. Make use of this pin through the output-latch-gpio dt property. Signed-off-by: Maxime Ripard --- drivers/gpio/gpio-74x164.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c index 613067c..ff8d3d8 100644 --- a/drivers/gpio/gpio-74x164.c +++ b/drivers/gpio/gpio-74x164.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -21,6 +22,7 @@ struct gen_74x164_chip { struct gpio_chip gpio_chip; struct mutex lock; u8 port_config; + int chip_select; }; static struct gen_74x164_chip *gpio_to_74x164_chip(struct gpio_chip *gc) @@ -30,8 +32,14 @@ static struct gen_74x164_chip *gpio_to_74x164_chip(struct gpio_chip *gc) static int __gen_74x164_write_config(struct gen_74x164_chip *chip) { - return spi_write(chip->spi, + int ret; + + gpio_set_value(chip->chip_select, 0); + ret = spi_write(chip->spi, &chip->port_config, sizeof(chip->port_config)); + gpio_set_value(chip->chip_select, 1); + + return ret; } static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset) @@ -73,6 +81,11 @@ static int __devinit gen_74x164_probe(struct spi_device *spi) struct gen_74x164_chip *chip; int ret; + if (!spi->dev.of_node) { + dev_err(&spi->dev, "No device tree data available.\n"); + return -EINVAL; + } + /* * bits_per_word cannot be configured in platform data */ @@ -102,6 +115,23 @@ static int __devinit gen_74x164_probe(struct spi_device *spi) chip->gpio_chip.dev = &spi->dev; chip->gpio_chip.owner = THIS_MODULE; + chip->chip_select = of_get_named_gpio(spi->dev.of_node, "output-latch-gpio", 0); + if (gpio_is_valid(chip->chip_select)) { + int flags = GPIOF_OUT_INIT_HIGH; + if (of_get_property(spi->dev.of_node, "latch-active-low", NULL)) + flags = GPIOF_OUT_INIT_LOW; + ret = devm_gpio_request_one(&spi->dev, chip->chip_select, + flags, "output-latch"); + if (ret) { + dev_err(&spi->dev, + "failed to request gpio %d: %d\n", + chip->chip_select, ret); + goto exit_destroy; + } + } + + gpio_set_value(chip->chip_select, 1); + ret = __gen_74x164_write_config(chip); if (ret) { dev_err(&spi->dev, "Failed writing: %d\n", ret);