From patchwork Fri Oct 5 06:52:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda Delgado X-Patchwork-Id: 979322 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bIT98nUU"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42RL754yjCz9s3C for ; Fri, 5 Oct 2018 16:53:05 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727540AbeJENuW (ORCPT ); Fri, 5 Oct 2018 09:50:22 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:41728 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727025AbeJENuV (ORCPT ); Fri, 5 Oct 2018 09:50:21 -0400 Received: by mail-lf1-f65.google.com with SMTP id q39-v6so8571567lfi.8; Thu, 04 Oct 2018 23:53:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xBWJIuKG25fJ3c03nNo4vLlqJ9Gh+jksa5pKMeO33sQ=; b=bIT98nUUew3kkIXuTPrzGSYrqTcwl3zEqkgvrfvMc0yStMYxZc2KBtR/8PYhD8/IvF MA5tharguvnUUPBaHO8xm2MHKKCBXhbrpC7/fNAhwkF//n5gCWxmuVcHtI0zpdoQY0N0 d3VG2QAeXaDOcu0lP6f59W88xJ/iaClZX7+CGnm5KWykNX6z++fREgVHvUCoElLJaQQJ 2zOSIaHUKvG1UBTx3uzqc2CdhSF8NrX1fFyllMCe9zJc0jv+JfKPgRsUVENAaJgOb2RZ mu/RMqlr763eJZmaurwRlH4pxcftTrQ4QTalcuVTTgdWauVDg4ViihJ5hEx704Iimwxj zbWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xBWJIuKG25fJ3c03nNo4vLlqJ9Gh+jksa5pKMeO33sQ=; b=K8sKzlplVW9Z7Pp3aG4va/fHC0CGIVSlDBEOaRfDGRYcjF/uWqCMSA/MPZajxzA6bY SItTNFVAUecCZXXA+jSxhpMw+rCWj8nNx6VXAxZnhpJG8P42JUELjYfVxs0gkrxX9UhI S6EzMyZ9N1sIxy0wHHN3T1L+LHxP5FDW2iT1msaO5SA2NKTkzsS8mD0XjJIGTZPckJPQ IezPlvxXPzEhy28Z6RTGa0MaWLzY8qOPse9C4ChCeGc0Xpt3E7vo91PzdnicFnznfEXj gjHsDsw4jMWQfhddYqi73ZOzIPHaiQocPyVfRoDeRCnkC90j2zKDf6dfj6p+G6I7wBey aG7w== X-Gm-Message-State: ABuFfogdns15U420ea/BNLTRFQ7b5VvTbKnYEa+Tt3WLoaWN5LsxJeL3 Dbz50TIOGnTQHvI+Mbhlgdo= X-Google-Smtp-Source: ACcGV61PGIBVgyyaIQ17rwnptX1GG2m2eb1Y3tg1wa1Cg9tuScS9VNuTYSbqi0rpsCiSVrvvsLYUFQ== X-Received: by 2002:a19:169d:: with SMTP id 29-v6mr5622722lfw.151.1538722382592; Thu, 04 Oct 2018 23:53:02 -0700 (PDT) Received: from neopili.qtec.com (cpe.xe-3-0-1-778.vbrnqe10.dk.customer.tdc.net. [80.197.57.18]) by smtp.gmail.com with ESMTPSA id t21-v6sm1608871ljg.32.2018.10.04.23.53.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Oct 2018 23:53:01 -0700 (PDT) From: Ricardo Ribalda Delgado To: Jeffrey Hugo , Linus Walleij , Timur Tabi , Stephen Boyd , linux-gpio , LKML Cc: Ricardo Ribalda Delgado Subject: [PATCH v5 1/3] gpiolib: Add init_valid_mask exported function Date: Fri, 5 Oct 2018 08:52:58 +0200 Message-Id: <20181005065300.22882-1-ricardo.ribalda@gmail.com> X-Mailer: git-send-email 2.19.0 MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Add a function that allows initializing the valid_mask from gpiochip_add_data. This prevents race conditions during gpiochip initialization. If the function is not exported, then the old behaviour is respected, this is, set all gpios as valid. Signed-off-by: Ricardo Ribalda Delgado --- drivers/gpio/gpiolib.c | 16 ++++++++++++++-- include/linux/gpio/driver.h | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index e8f8a1999393..907019b67a58 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -359,7 +359,7 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *chip) return p; } -static int gpiochip_init_valid_mask(struct gpio_chip *gpiochip) +static int gpiochip_alloc_valid_mask(struct gpio_chip *gpiochip) { #ifdef CONFIG_OF_GPIO int size; @@ -380,6 +380,14 @@ static int gpiochip_init_valid_mask(struct gpio_chip *gpiochip) return 0; } +static int gpiochip_init_valid_mask(struct gpio_chip *gpiochip) +{ + if (gpiochip->init_valid_mask) + return gpiochip->init_valid_mask(gpiochip); + + return 0; +} + static void gpiochip_free_valid_mask(struct gpio_chip *gpiochip) { kfree(gpiochip->valid_mask); @@ -1367,7 +1375,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, if (status) goto err_remove_from_list; - status = gpiochip_init_valid_mask(chip); + status = gpiochip_alloc_valid_mask(chip); if (status) goto err_remove_irqchip_mask; @@ -1379,6 +1387,10 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, if (status) goto err_remove_chip; + status = gpiochip_init_valid_mask(chip); + if (status) + goto err_remove_chip; + acpi_gpiochip_add(chip); machine_gpiochip_add(chip); diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 0ea328e71ec9..df09749269ff 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -256,6 +256,9 @@ struct gpio_chip { void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip); + + int (*init_valid_mask)(struct gpio_chip *chip); + int base; u16 ngpio; const char *const *names; @@ -294,7 +297,9 @@ struct gpio_chip { /** * @need_valid_mask: * - * If set core allocates @valid_mask with all bits set to one. + * If set core allocates @valid_mask with all its values initialized + * with init_valid_mask() or set to one if init_valid_mask() is not + * defined */ bool need_valid_mask; From patchwork Fri Oct 5 06:52:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda Delgado X-Patchwork-Id: 979324 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qYVQqPMK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42RL7M0z3qz9s3C for ; Fri, 5 Oct 2018 16:53:19 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727976AbeJENuY (ORCPT ); Fri, 5 Oct 2018 09:50:24 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:44794 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727025AbeJENuX (ORCPT ); Fri, 5 Oct 2018 09:50:23 -0400 Received: by mail-lj1-f195.google.com with SMTP id v6-v6so10593064ljc.11; Thu, 04 Oct 2018 23:53:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Vur/nZx57X35xCVeK+GvGWS7rgTTqrCBUYltbYz91FM=; b=qYVQqPMKGTGHtunHtFiNbFIuSsdgfFB3V9FeDzdfgUwSZltEXYGZHIodlzQRg+cWEG JxfgMjN28n6SkTbtU8FXdkYiyFZ8DRM8Jn6m9qkLFblITUg2Cms6fqh5rky+BKzQz4aw g4OBFMKces3u+Ks1RkNhgN9tCs+orOUlHbdWFHTBEessJhgV1ezoj4CvokaRagZUp4v3 xD/lygdcnD6CqRIVbUeXfUDC0FF0Y113J3UjbyqNVKheRp41gWTetJau7S4IlOOkrJ5a 0hGBXw5TMraXwJ2OhB3aujX8ROy4K5A/05XHcREMZVM0Jy7jB77P8UEOFhyL/zANVsQb vSmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Vur/nZx57X35xCVeK+GvGWS7rgTTqrCBUYltbYz91FM=; b=C+qelVJLr4XQT6ibOKhY/sVUzg8XHpJJ81oC4yUAX9sH0rQImI6GRpoR4j77lXYIZP RVrxBBF/UgrfNxdMe2D3cXZUZe0D15dQAbdz2/0KVQFv04tljlGg4pJleRXL4oIpUZ4B 5AU6jEB2tsQGgGKcG/BTZVJioknAYDjYYcIaAlNBpJWtWAjmgKIGWRU4YhlATSyGyA/J NoBrFYPx6hAKKD/089nkNeYyazJRmu8dWGkcsDYxCtEn2dfgURvJ43GNwMKSjksttHb2 wBahWwoMQl43P0EE/CdkZIv50p93op5ACh3YVd4BXETG95DT7R6IXMdJGUMooiccE5An Yfhw== X-Gm-Message-State: ABuFfojpm3QkgrN8OBrIL8HHwTYblEjBhLDZdFvFH2AuEZ0tCHjyPCxt 41zstY67jhpM/zLt/sHqfDU= X-Google-Smtp-Source: ACcGV62BleszJBHQ4ziXtPFnoQP8eyBBW3tE2zuv37bQERXQnNXDZru3onPunOHXbtJsAj0u1BAqgw== X-Received: by 2002:a2e:48d:: with SMTP id a13-v6mr6214857ljf.27.1538722384567; Thu, 04 Oct 2018 23:53:04 -0700 (PDT) Received: from neopili.qtec.com (cpe.xe-3-0-1-778.vbrnqe10.dk.customer.tdc.net. [80.197.57.18]) by smtp.gmail.com with ESMTPSA id t21-v6sm1608871ljg.32.2018.10.04.23.53.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Oct 2018 23:53:02 -0700 (PDT) From: Ricardo Ribalda Delgado To: Jeffrey Hugo , Linus Walleij , Timur Tabi , Stephen Boyd , linux-gpio , LKML Cc: Ricardo Ribalda Delgado Subject: [PATCH v5 2/3] pinctrl: msm: Use init_valid_mask exported function Date: Fri, 5 Oct 2018 08:52:59 +0200 Message-Id: <20181005065300.22882-2-ricardo.ribalda@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181005065300.22882-1-ricardo.ribalda@gmail.com> References: <20181005065300.22882-1-ricardo.ribalda@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org The current code produces XPU violation if get_direction is called just after the initialization. Signed-off-by: Ricardo Ribalda Delgado Acked-by: Timur Tabi --- drivers/pinctrl/qcom/pinctrl-msm.c | 79 ++++++++++++++---------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index 5d72ffad32c2..ce1ade47ea37 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c @@ -566,6 +566,42 @@ static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) #define msm_gpio_dbg_show NULL #endif +static int msm_gpio_init_valid_mask(struct gpio_chip *chip) +{ + struct msm_pinctrl *pctrl = gpiochip_get_data(chip); + int ret; + unsigned int len, i; + unsigned int max_gpios = pctrl->soc->ngpios; + u16 *tmp; + + /* The number of GPIOs in the ACPI tables */ + len = ret = device_property_read_u16_array(pctrl->dev, "gpios", NULL, + 0); + if (ret < 0) + return 0; + + if (ret > max_gpios) + return -EINVAL; + + tmp = kmalloc_array(len, sizeof(*tmp), GFP_KERNEL); + if (!tmp) + return -ENOMEM; + + ret = device_property_read_u16_array(pctrl->dev, "gpios", tmp, len); + if (ret < 0) { + dev_err(pctrl->dev, "could not read list of GPIOs\n"); + goto out; + } + + bitmap_zero(chip->valid_mask, max_gpios); + for (i = 0; i < len; i++) + set_bit(tmp[i], chip->valid_mask); + +out: + kfree(tmp); + return ret; +} + static const struct gpio_chip msm_gpio_template = { .direction_input = msm_gpio_direction_input, .direction_output = msm_gpio_direction_output, @@ -575,6 +611,7 @@ static const struct gpio_chip msm_gpio_template = { .request = gpiochip_generic_request, .free = gpiochip_generic_free, .dbg_show = msm_gpio_dbg_show, + .init_valid_mask = msm_gpio_init_valid_mask, }; /* For dual-edge interrupts in software, since some hardware has no @@ -855,41 +892,6 @@ static void msm_gpio_irq_handler(struct irq_desc *desc) chained_irq_exit(chip, desc); } -static int msm_gpio_init_valid_mask(struct gpio_chip *chip, - struct msm_pinctrl *pctrl) -{ - int ret; - unsigned int len, i; - unsigned int max_gpios = pctrl->soc->ngpios; - u16 *tmp; - - /* The number of GPIOs in the ACPI tables */ - len = ret = device_property_read_u16_array(pctrl->dev, "gpios", NULL, 0); - if (ret < 0) - return 0; - - if (ret > max_gpios) - return -EINVAL; - - tmp = kmalloc_array(len, sizeof(*tmp), GFP_KERNEL); - if (!tmp) - return -ENOMEM; - - ret = device_property_read_u16_array(pctrl->dev, "gpios", tmp, len); - if (ret < 0) { - dev_err(pctrl->dev, "could not read list of GPIOs\n"); - goto out; - } - - bitmap_zero(chip->valid_mask, max_gpios); - for (i = 0; i < len; i++) - set_bit(tmp[i], chip->valid_mask); - -out: - kfree(tmp); - return ret; -} - static bool msm_gpio_needs_valid_mask(struct msm_pinctrl *pctrl) { return device_property_read_u16_array(pctrl->dev, "gpios", NULL, 0) > 0; @@ -926,13 +928,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) return ret; } - ret = msm_gpio_init_valid_mask(chip, pctrl); - if (ret) { - dev_err(pctrl->dev, "Failed to setup irq valid bits\n"); - gpiochip_remove(&pctrl->chip); - return ret; - } - /* * For DeviceTree-supported systems, the gpio core checks the * pinctrl's device node for the "gpio-ranges" property. From patchwork Fri Oct 5 06:53:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ricardo Ribalda Delgado X-Patchwork-Id: 979323 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=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="U3dF5Hd/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42RL7D0styz9s4Z for ; Fri, 5 Oct 2018 16:53:12 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728042AbeJENu1 (ORCPT ); Fri, 5 Oct 2018 09:50:27 -0400 Received: from mail-lf1-f67.google.com ([209.85.167.67]:33116 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727025AbeJENu0 (ORCPT ); Fri, 5 Oct 2018 09:50:26 -0400 Received: by mail-lf1-f67.google.com with SMTP id o21-v6so8602605lfe.0; Thu, 04 Oct 2018 23:53:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JDv7+lrfVHx6crNgWoKYdtCEXUNPEwDIMvB3Aq/NiOY=; b=U3dF5Hd/6yXGlzsw+OcTsxfReqrXFy2yFJ4m7PNFNgqz8tkeIIinx6jtyS/YSYmWhI Z58awvvaAm41fqxDObeJCrZ3yyOYK7MumxMJ63HD/juPrXX+nYcS8xd46+KNp8K6oQdF SLPAbv+Q5UGX93RU6grtxZBn5pHR787GemwqZkgA4z0jNXpS09gWoyeqzxQTwYZ/zEVH NUP1pC5HR/4R0ut1XaiKx2LosCF/OHMauiG/y/IwYlZz0NBiqiONXh29Sx0roZxFgQeU J7xfzcmoetuIztvZhXowmnnhJ6a1qfQhZxZO6U0Y04Jav05Do2MqhlfmB5/gwVOfea8t UJgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=JDv7+lrfVHx6crNgWoKYdtCEXUNPEwDIMvB3Aq/NiOY=; b=XdpcML8vGKau12Ukl9ozl5SwGcJR+mpiFsub8xbl+iCo1tyZ2GrQUBAV5HU2oVv4AE kN13BCzxgHboxWIHZQQ8cxQR3+uiXsvtf8LXqrCXvQ+hVdy87Y1K7S8al4QS+9ojuwGf +ca0wvCj1otV30yt64Rkj5/+uP2+wtwI5slWIGJak0tcWze95H1WXW8i302uHKkJN1kD j9ZpvMR808lF2amleRisiEez7lomD+uhxCQq5QFlnx7UrP3bK3blyA54yCw0gt0Mz8tE NuO0KS5X640tqoxB/NszY+Y7r/ugwjom1kRhCBbFCVoYpNR8tHJyBJtYGcw56rii3KG2 NpXw== X-Gm-Message-State: ABuFfoiYXYb+cBoozPOGC2Y4qu62m08HeMNC+BbmgrC5jA4YKb/YwCGd 3a6iKPFMQBMSD+KpQnonWKA= X-Google-Smtp-Source: ACcGV61KRnBQS0qflgMGeYEwS3+PckOqyS5OfVGo/+rttSWA6v0S2DGKO04UChvRE78kC1pGH/DxiA== X-Received: by 2002:a19:ea57:: with SMTP id i84-v6mr5582566lfh.91.1538722387064; Thu, 04 Oct 2018 23:53:07 -0700 (PDT) Received: from neopili.qtec.com (cpe.xe-3-0-1-778.vbrnqe10.dk.customer.tdc.net. [80.197.57.18]) by smtp.gmail.com with ESMTPSA id t21-v6sm1608871ljg.32.2018.10.04.23.53.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Oct 2018 23:53:04 -0700 (PDT) From: Ricardo Ribalda Delgado To: Jeffrey Hugo , Linus Walleij , Timur Tabi , Stephen Boyd , linux-gpio , LKML Cc: Ricardo Ribalda Delgado Subject: [PATCH v5 3/3] gpiolib: Show correct direction from the beginning Date: Fri, 5 Oct 2018 08:53:00 +0200 Message-Id: <20181005065300.22882-3-ricardo.ribalda@gmail.com> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181005065300.22882-1-ricardo.ribalda@gmail.com> References: <20181005065300.22882-1-ricardo.ribalda@gmail.com> MIME-Version: 1.0 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Current code assumes that the direction is input if direction_input function is set. This might not be the case on GPIOs with programmable direction. Signed-off-by: Ricardo Ribalda Delgado Tested-by: Jeffrey Hugo --- drivers/gpio/gpiolib.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 907019b67a58..e016b22658ff 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1349,20 +1349,6 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, spin_unlock_irqrestore(&gpio_lock, flags); - for (i = 0; i < chip->ngpio; i++) { - struct gpio_desc *desc = &gdev->descs[i]; - - desc->gdev = gdev; - - /* REVISIT: most hardware initializes GPIOs as inputs (often - * with pullups enabled) so power usage is minimized. Linux - * code should set the gpio direction first thing; but until - * it does, and in case chip->get_direction is not set, we may - * expose the wrong direction in sysfs. - */ - desc->flags = !chip->direction_input ? (1 << FLAG_IS_OUT) : 0; - } - #ifdef CONFIG_PINCTRL INIT_LIST_HEAD(&gdev->pin_ranges); #endif @@ -1391,6 +1377,19 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, if (status) goto err_remove_chip; + for (i = 0; i < chip->ngpio; i++) { + struct gpio_desc *desc = &gdev->descs[i]; + + desc->gdev = gdev; + + if (chip->get_direction && gpiochip_line_is_valid(chip, i)) + desc->flags = !chip->get_direction(chip, i) ? + (1 << FLAG_IS_OUT) : 0; + else + desc->flags = !chip->direction_input ? + (1 << FLAG_IS_OUT) : 0; + } + acpi_gpiochip_add(chip); machine_gpiochip_add(chip);