From patchwork Mon Jun 4 17:05:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jan_Kundr=C3=A1t?= X-Patchwork-Id: 925166 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=cesnet.cz Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=cesnet.cz header.i=@cesnet.cz header.b="QQEe6OSp"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4102VC2LrJz9s0W for ; Tue, 5 Jun 2018 03:48:35 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751213AbeFDRsd (ORCPT ); Mon, 4 Jun 2018 13:48:33 -0400 Received: from office2.cesnet.cz ([195.113.144.244]:48648 "EHLO office2.cesnet.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750987AbeFDRsc (ORCPT ); Mon, 4 Jun 2018 13:48:32 -0400 X-Greylist: delayed 490 seconds by postgrey-1.27 at vger.kernel.org; Mon, 04 Jun 2018 13:48:32 EDT Received: from localhost (unknown [IPv6:2001:718:1:2c:a4a8:fc6b:670f:47e3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by office2.cesnet.cz (Postfix) with ESMTPSA id CC4AF40007B; Mon, 4 Jun 2018 19:40:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cesnet.cz; s=office2; t=1528134038; bh=sYpDTFFcwaAjmYh3pXtaRQagUEpPSfRfH1w1FD2iw54=; h=Resent-Date:Resent-From:Resent-To:Resent-Cc:In-Reply-To: References:From:Date:Subject:To:Cc; b=QQEe6OSpoJcxPoD5JurI1HrSN3oMxYCxMnyVJd+H41FpYEmiNzBRoWYndQw19GDq2 45LRrDTv57+uJIIlWjOrLnMB9Ckv6313G6/bHrjDTjKcHiZPnFQYUHPV0TJ8Sgr2sH r+iZduvNYhf6Xzn5QGfcqLravQ6wYgBljE/aqKII= Message-Id: <2777f8fbccbe8bacbb1003b3206e665eaf8deda0.1528133622.git.jan.kundrat@cesnet.cz> In-Reply-To: References: From: =?utf-8?q?Jan_Kundr=C3=A1t?= Date: Mon, 4 Jun 2018 19:05:10 +0200 Subject: [PATCH 4/4] pinctrl: mcp23s08: work around GPIO line naming MIME-Version: 1.0 To: linux-gpio@vger.kernel.org Cc: Sebastian Reichel , Linus Walleij , Phil Reid Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org This driver is a bit weird because it can hide several gpio_chip instances underneath a single SPI slave. One cannot put the gpio-line-names DT stanza directly to the SPI slave when the spi-present-mask has more than one bit set. I'm making up the `gpio-bank` DT child name as well as its `address` property. We need something to match the DT entries with the SPI address. Signed-off-by: Jan Kundrát Reviewed-by: Phil Reid --- .../bindings/pinctrl/pinctrl-mcp23s08.txt | 35 +++++++++++++++++++ drivers/pinctrl/pinctrl-mcp23s08.c | 12 +++++++ 2 files changed, 47 insertions(+) diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt index a5a8322a31bd..7573df69ccea 100644 --- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt @@ -142,3 +142,38 @@ gpio21: gpio@21 { bias-pull-up; }; }; + +Line naming +=========== + +Because several gpio_chip instances are hidden below a single device tree +node, it is necessary to split the names into several child nodes. Ensure +that the configured addresses match those in the microchip,spi-present-mask: + +gpio@0 { + compatible = "microchip,mcp23s17"; + gpio-controller; + #gpio-cells = <2>; + /* this bitmask has bits #0 (0x01) and #2 (0x04) set */ + spi-present-mask = <0x05>; + reg = <0>; + spi-max-frequency = <1000000>; + + gpio-bank@1 { + address = <0>; + gpio-line-names = + "GPA0", + "GPA1", + ... + "GPA7", + "GPB0", + "GPB1", + ... + "GPB7"; + }; + + gpio-bank@2 { + address = <2>; + gpio-line-names = ... + }; +}; diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index bbef9833edb8..c4fac4e1de71 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -16,6 +16,7 @@ #include #include #include +#include "../gpio/gpiolib.h" /* * MCP types supported by driver @@ -1086,6 +1087,7 @@ static int mcp23s08_probe(struct spi_device *spi) int status, type; unsigned ngpio = 0; const struct of_device_id *match; + struct device_node *np; match = of_match_device(of_match_ptr(mcp23s08_spi_of_match), &spi->dev); if (match) @@ -1148,6 +1150,16 @@ static int mcp23s08_probe(struct spi_device *spi) if (pdata->base != -1) pdata->base += data->mcp[addr]->chip.ngpio; ngpio += data->mcp[addr]->chip.ngpio; + + for_each_available_child_of_node(spi->dev.of_node, np) { + u32 chip_addr; + status = of_property_read_u32(np, "address", &chip_addr); + if (status) + continue; + if (chip_addr != addr) + continue; + devprop_gpiochip_set_names(&data->mcp[addr]->chip, of_fwnode_handle(np)); + } } data->ngpio = ngpio;