From patchwork Wed Jun 14 23:14:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 108199 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp289586vqr; Wed, 14 Jun 2023 16:35:42 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4zswBGkGtBqv0F1ohx5cWT+6YiHJFT4xum4HT1Z2be89Vdu9i9bJ/AxkWlqSmmU6pV0R+S X-Received: by 2002:a05:6402:6d9:b0:516:9f47:5390 with SMTP id n25-20020a05640206d900b005169f475390mr10846702edy.27.1686785742705; Wed, 14 Jun 2023 16:35:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686785742; cv=none; d=google.com; s=arc-20160816; b=uWKf+3L6T/kkDm7FklLBWRkbjZMOUqM9A8F/pPjb/ohXFdJ+StxTUhV0rQYY9ZeZz4 WFaPEhLXLLpmdco9HY9Hh7aNICEvzc3eLIXMywowPTVevHwGFXmyfiq2OSuj6WZj0Z/p +M5wg5JJ3P8BgW/xSgFna5cP1jPpMgSemq0vHGjH1F0C8IJbeDsGgGt8X/8kpae3NjBj ncXTj3ED7xChQDq7pEgKHfGfHMb1YBq+S/3UbPsmwlhVqz7wZlvBUtn0wl/hOTIglIrN mTe28H1SWbRCQ43Yr/0mOWICUxvP0aspHdMzfMlp1kkkQHxwa1+TDnCrBbRLC5VRHXWO ywzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zaDH14MfUTybYDXp0m0mPR2FAC0BT0s7zXD9zr5v/Mg=; b=Q7BcCmE9cptF7qJMfvDBUQqSF+EILygnN8kgiwp9qsz+kueQ1ZXM9nptXs59a0gDSA gzlKdfYt8RrXbfuaMF00zjZZj0nGrYFbe3aGCHshC1cDoRWXwR/yS9cMZSUuwaG3WR8y t3HYaaqqLsyU3N5zv0sEnIygbBCbCRJu/j3D6jOx4dM0/8RWzHcZ5sCFgyZ0D/zUp0FP PzEp2hQ1T1ZOnVk2qoY1TLXIQTMC0H/exvWFJcBJctySZ4UpJwqiLnduqNMT1lRo6NSZ Ugn42sDH30vI+m/tw3BBYoCKEkN26KeBX+vCrlD+8kXGfn97LyuVCN9GVYI8vIZ7GJ7h JsEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BC48ERjp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r16-20020aa7cb90000000b005183ce42dafsi5374003edt.597.2023.06.14.16.35.18; Wed, 14 Jun 2023 16:35:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BC48ERjp; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234716AbjFNXTC (ORCPT + 99 others); Wed, 14 Jun 2023 19:19:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234594AbjFNXSZ (ORCPT ); Wed, 14 Jun 2023 19:18:25 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F307271C; Wed, 14 Jun 2023 16:18:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686784693; x=1718320693; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=HZHl2n4pQk9SJY0+lqSTvrEjOmrphzRUODe48oQg0/w=; b=BC48ERjpXXAUNTTLtd6W2kFGmDFTukZ4hrdw2BLBCmjlueqJauZFvJUp asSHF3ZYiVw4BrQrZ0cJPtKe1O8XtdAiUYCNHvvrZmRvx5aAaPyyepnU3 0OUk3Fjm4RNGUDRAfHSn6bz8eo/mVqf0tYOjNOL33QeRu0wldNd89UyMc k+/uo1xXRahJZeF7zEnrn+kZ/FRhcuCTalbusDeJmsvSZ9n5nM5ZScXlA OaolWnLxwnKmOU9uWH3i5dNYwc1R3OliETYDQJgx4GYj5FRRlZagbQkkt w7HBKkUo7OzG5DxUpvlaolkynwYF0Wawo7WYas7UlgPS2gdQyIC5rpwf+ Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="424648059" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="424648059" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2023 16:14:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="715387936" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="715387936" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga007.fm.intel.com with ESMTP; 14 Jun 2023 16:14:43 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id DB4E9133; Thu, 15 Jun 2023 02:14:51 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Linus Walleij , Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven Subject: [PATCH v2 1/4] gpio: aggregator: Remove CONFIG_OF and of_match_ptr() protections Date: Thu, 15 Jun 2023 02:14:43 +0300 Message-Id: <20230614231446.3687-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> References: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768723046815074798?= X-GMAIL-MSGID: =?utf-8?q?1768723046815074798?= They stop the driver being used with ACPI PRP0001 and are something I want to avoid being cut and paste into new drivers. Also include mod_devicetable.h as we struct of_device_id is defined in there. Signed-off-by: Andy Shevchenko Reviewed-by: Linus Walleij Reviewed-by: Geert Uytterhoeven --- drivers/gpio/gpio-aggregator.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 20a686f12df7..1aa7455672d3 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -500,23 +501,21 @@ static int gpio_aggregator_probe(struct platform_device *pdev) return 0; } -#ifdef CONFIG_OF static const struct of_device_id gpio_aggregator_dt_ids[] = { /* * Add GPIO-operated devices controlled from userspace below, - * or use "driver_override" in sysfs + * or use "driver_override" in sysfs. */ {} }; MODULE_DEVICE_TABLE(of, gpio_aggregator_dt_ids); -#endif static struct platform_driver gpio_aggregator_driver = { .probe = gpio_aggregator_probe, .driver = { .name = DRV_NAME, .groups = gpio_aggregator_groups, - .of_match_table = of_match_ptr(gpio_aggregator_dt_ids), + .of_match_table = gpio_aggregator_dt_ids, }, }; From patchwork Wed Jun 14 23:14:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 108196 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp286151vqr; Wed, 14 Jun 2023 16:26:38 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ592O2ozMGVmebV0LuY/ceQG60CF1uVdrr5fxTaq9H8r1dopxnfDouWRMmTIpzwEBbbCR9j X-Received: by 2002:a9d:6a09:0:b0:6ab:2fb1:92d8 with SMTP id g9-20020a9d6a09000000b006ab2fb192d8mr14739704otn.12.1686785197942; Wed, 14 Jun 2023 16:26:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686785197; cv=none; d=google.com; s=arc-20160816; b=JVtbMc5iltKNh5ScrWbdLPY9p3NboC39119YlNJV6Hgyqfi65fFXAp8dxgsykJV8Ms EFY9PcrzHK1bTdx80nNsWoCCdL6DFhPBMRQwtxURPUmIHHJOrz9oOhVCDdanWMvfB+LQ LVBo4ejxeVzKnybmXr8dG192aUrj8801q50okKweuh+aACpjN2SSbNwC4038bfhAJT9S f06dnnfVmCQIx1gLRewpMZ3dv2ky/Jtj9w+75gyHeolX1E7wKP/0wcKzQeCLic8QJv1a YIGGFjoNX1yuNCxgNtHr0OUV52pZxbHPkFc5bZyI91zmo+GRwJIyCLNX05fHspNf1u3e VDrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=m0cm77nCiauHD2MW8QiuBXc2KMgHai0FnVt2Zs7jjZg=; b=bEjBa9re/pUyfD5vUbjPGdHfyPQJBUJEnXPWjH+LbzTOWBaSRCv46GRxsYf5xbL4Gj rYeizrUnG6hl/PWfepFxxaxvanj/UOQFm1J9I9htX8447GbC7ljF7sd5NHZ4z31YtU0e 0ruGxt5k/u+Oi79yHB4IRdSCNTtRbQokh3wqeY1Fbaao1H9KPPbxseWkKfdJicnZ2msw /s2XvWPeJRXpMl8L3hdX1m/Z3XDD8aHz5Tj1IP7sDiC0rBNHYzCdrVpv40PggqYBSuZ/ k22jRk8ZPMhexJiW5s/uz9eaZoaWaix/T0mzlKq7z/BSBrns6tWPm8tj91Ib/xlbXMLm SSFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=IrdoCveJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n7-20020a638f07000000b00546bab11218si11595714pgd.439.2023.06.14.16.26.23; Wed, 14 Jun 2023 16:26:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=IrdoCveJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238983AbjFNXSW (ORCPT + 99 others); Wed, 14 Jun 2023 19:18:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54062 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233697AbjFNXSQ (ORCPT ); Wed, 14 Jun 2023 19:18:16 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 78F0EAC; Wed, 14 Jun 2023 16:17:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686784678; x=1718320678; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Vuq1lOeFuGO/J19m1cI+coKiG4lvz42SypGElO940fk=; b=IrdoCveJAy1iLer1jbF9uTZd9NS6/Ac8X+dMFilMy79k0brm/ngZI5mi fXpUBJ70jRZRgF86ycqMhrH+S2EukTo1W2tnYIF/dbgCQ9xMfuLaquxeN eCfZrqZzi1EtecLUXc8bnJRQNZPN4n6iveFRBylqOpuy4Q9MoJVrinA8V ZAzABqijX62omuYa2qXnMV8VuxSVdseJZ3FZRZSvBba/95XWAxgxE4ZK6 wNGWOZ6+8QteYDsrYhS4ISPmueXeL9bxVD1hhtGe6h83oj6svT7hWsbz5 tzDKUW39PUbYNuOl3+Iw/DfAwnUo1YjgHbN/tLBBPqVqd9md2LBCtQbal w==; X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="424648032" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="424648032" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2023 16:14:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="715387935" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="715387935" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga007.fm.intel.com with ESMTP; 14 Jun 2023 16:14:43 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id E558F35F; Thu, 15 Jun 2023 02:14:51 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Linus Walleij , Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven Subject: [PATCH v2 2/4] gpio: aggregator: Support delay for setting up individual GPIOs Date: Thu, 15 Jun 2023 02:14:44 +0300 Message-Id: <20230614231446.3687-3-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> References: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768722475435939168?= X-GMAIL-MSGID: =?utf-8?q?1768722475435939168?= In some cases the GPIO may require an additional delay after setting its value. Add support for that into the GPIO forwarder code. This will be fully enabled for use in the following changes. Signed-off-by: Andy Shevchenko Reviewed-by: Linus Walleij Reviewed-by: Geert Uytterhoeven --- drivers/gpio/gpio-aggregator.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 1aa7455672d3..a74a8d86caf3 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -240,6 +241,11 @@ static void __exit gpio_aggregator_remove_all(void) * GPIO Forwarder */ +struct gpiochip_fwd_timing { + u32 ramp_up_us; + u32 ramp_down_us; +}; + struct gpiochip_fwd { struct gpio_chip chip; struct gpio_desc **descs; @@ -247,6 +253,7 @@ struct gpiochip_fwd { struct mutex mlock; /* protects tmp[] if can_sleep */ spinlock_t slock; /* protects tmp[] if !can_sleep */ }; + struct gpiochip_fwd_timing *delay_timings; unsigned long tmp[]; /* values and descs for multiple ops */ }; @@ -331,6 +338,28 @@ static int gpio_fwd_get_multiple_locked(struct gpio_chip *chip, return error; } +static void gpio_fwd_delay(struct gpio_chip *chip, unsigned int offset, int value) +{ + struct gpiochip_fwd *fwd = gpiochip_get_data(chip); + const struct gpiochip_fwd_timing *delay_timings; + struct gpio_desc *desc = fwd->descs[offset]; + bool is_active_low = gpiod_is_active_low(desc); + u32 delay_us; + + delay_timings = &fwd->delay_timings[offset]; + if ((!is_active_low && value) || (is_active_low && !value)) + delay_us = delay_timings->ramp_up_us; + else + delay_us = delay_timings->ramp_down_us; + if (!delay_us) + return; + + if (chip->can_sleep) + fsleep(delay_us); + else + udelay(delay_us); +} + static void gpio_fwd_set(struct gpio_chip *chip, unsigned int offset, int value) { struct gpiochip_fwd *fwd = gpiochip_get_data(chip); @@ -339,6 +368,9 @@ static void gpio_fwd_set(struct gpio_chip *chip, unsigned int offset, int value) gpiod_set_value_cansleep(fwd->descs[offset], value); else gpiod_set_value(fwd->descs[offset], value); + + if (fwd->delay_timings) + gpio_fwd_delay(chip, offset, value); } static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask, From patchwork Wed Jun 14 23:14:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 108197 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp288527vqr; Wed, 14 Jun 2023 16:33:03 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6m8S0mmOW2vCNL9Tq/QVUWADzqR4wX2hZSe4LhQwYxLlt7EoqPAbgppR2OxuCMVZXbAkUP X-Received: by 2002:a5d:4106:0:b0:30f:bb5e:8173 with SMTP id l6-20020a5d4106000000b0030fbb5e8173mr8643378wrp.57.1686785583608; Wed, 14 Jun 2023 16:33:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686785583; cv=none; d=google.com; s=arc-20160816; b=JOQeySd8XB3fAEFnf36VhvT70qQ6zjpM7AkFytPWqkdxUxgJ5J+NbkrC8IXoJgnNGc 1mMmGx4izpoGA+Hynw0aejeEwjmxZQzkVr6i0kLnpGVI2jBGEYmxZzLUniPIcQfa24d9 XIoh//4k9kDyV7UINgURUG1LviyTPjH6Evt7L86I8i8c23cBFf3DkBPOBI0IS2rDV1S8 Boe8tFkN9HHCXMQhF0NWdAN+W6NdOn7sH97nGhAnJDkezgrNtvATyLXN2hX7ZpN8j+j0 NGM+OyDFfLgOQHS1gnwe92ZpXBfKEem/TYwYBeyDUwLcDL+pl7rTBCsY3EICziqxh7I3 TCxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=nMlHl4Upms1/CCGBrIW0Tw/uxjSzryZIZOHJ4ys5s1w=; b=Qqe7mdA7kTI2Ga2EOBr2sGraBU6wVnnJ8c4WmL120LBtDU+d5xvyMXH9XkZkrCaixe /05avqv1QN/eTyPhk848i3K7gT3cfbQ+X+kZoE6ark4P63QrnMCKwDX5Rs+3K3Vxz8+V qVbEc8BUcooxiEWIMqAt+O9pjUQXNW+FwrR08Mp+Ja6MS0LAL8fRv2ZsUdNATL2Pfjw0 WWq/nx3I0NMuDe7RKkJTmwBLwIeWay7CEtvd2TR7wrmDFm31/5sXkle1KNhGL7waJdj2 6gEC+fIY4kD2Aa9sYgfAeN4ri5ylWJl6kcKM1g6kbfTM0bpoF1SWz5akDS2OYy6t34yB sSZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Uj3hTEYL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n21-20020a05640204d500b0051836749133si5478402edw.494.2023.06.14.16.32.37; Wed, 14 Jun 2023 16:33:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Uj3hTEYL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236439AbjFNXS0 (ORCPT + 99 others); Wed, 14 Jun 2023 19:18:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236285AbjFNXSQ (ORCPT ); Wed, 14 Jun 2023 19:18:16 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 940AE11C; Wed, 14 Jun 2023 16:18:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686784682; x=1718320682; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=oFD2RmHp6VjqlL6UdN87B/4X3j8u5LDczmhuyuUCg2c=; b=Uj3hTEYLHLDZdM7FsOo/XfRF1mYhstRcf8MAX3w1P/EC6n8z2znDPCPl BzRAj9HDoxSzmk/m2AS+7GUTu7vPPrNAdV/qhvOhyKqkcJRVTXvx/aoeM XRtuGvWdZjl7ACy1FC/NYvp/E2nz1pwl0x4KijfOt1qqJ6UtLG60QcJ3y kvHVLJITBkT6UfXBucHkC8lwK22TvBsLMRQvRWTmZfKyL6UyieXMtaAHu MKMNNcxR+tCE7AeOQhZYOqKBhIL7MkLtGVRgAQvOQgVJbe/Glm6ydTA+d G5XzV+VI0g1e2dOwfSyysTUIf9bfgeGb8b8QoF/OmA9pB+HagPExGg4be Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="424648039" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="424648039" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2023 16:14:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="715387933" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="715387933" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga007.fm.intel.com with ESMTP; 14 Jun 2023 16:14:43 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id EB42630C; Thu, 15 Jun 2023 02:14:51 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Linus Walleij , Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven Subject: [PATCH v2 3/4] gpio: aggregator: Set up a parser of delay line parameters Date: Thu, 15 Jun 2023 02:14:45 +0300 Message-Id: <20230614231446.3687-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> References: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768722879660109490?= X-GMAIL-MSGID: =?utf-8?q?1768722879660109490?= The aggregator mode can also handle properties of the platform, that do not belong to the GPIO controller itself. One of such a property is a signal delay line. Set up a parser to support it. Signed-off-by: Andy Shevchenko Reviewed-by: Linus Walleij Reviewed-by: Geert Uytterhoeven --- drivers/gpio/gpio-aggregator.c | 70 +++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index a74a8d86caf3..ed11aa56bc51 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -423,6 +424,51 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, unsigned int offset) return gpiod_to_irq(fwd->descs[offset]); } +#ifdef CONFIG_OF_GPIO +static int gpiochip_fwd_delay_of_xlate(struct gpio_chip *chip, + const struct of_phandle_args *gpiospec, + u32 *flags) +{ + struct gpiochip_fwd *fwd = gpiochip_get_data(chip); + struct gpiochip_fwd_timing *timings; + u32 line; + + if (gpiospec->args_count != chip->of_gpio_n_cells) + return -EINVAL; + + line = gpiospec->args[0]; + if (line >= chip->ngpio) + return -EINVAL; + + timings = &fwd->delay_timings[line]; + timings->ramp_up_us = gpiospec->args[1]; + timings->ramp_down_us = gpiospec->args[2]; + + return line; +} + +static int gpiochip_fwd_setup_delay_line(struct device *dev, struct gpio_chip *chip, + struct gpiochip_fwd *fwd) +{ + fwd->delay_timings = devm_kcalloc(dev, chip->ngpio, + sizeof(*fwd->delay_timings), + GFP_KERNEL); + if (!fwd->delay_timings) + return -ENOMEM; + + chip->of_xlate = gpiochip_fwd_delay_of_xlate; + chip->of_gpio_n_cells = 3; + + return 0; +} +#else +static int gpiochip_fwd_setup_delay_line(struct device *dev, struct gpio_chip *chip, + struct gpiochip_fwd *fwd) +{ + return 0; +} +#endif /* !CONFIG_OF_GPIO */ + /** * gpiochip_fwd_create() - Create a new GPIO forwarder * @dev: Parent device pointer @@ -430,6 +476,7 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, unsigned int offset) * @descs: Array containing the GPIO descriptors to forward to. * This array must contain @ngpios entries, and must not be deallocated * before the forwarder has been destroyed again. + * @delay_line: True if the pins have an external delay line. * * This function creates a new gpiochip, which forwards all GPIO operations to * the passed GPIO descriptors. @@ -439,7 +486,8 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, unsigned int offset) */ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, unsigned int ngpios, - struct gpio_desc *descs[]) + struct gpio_desc *descs[], + bool delay_line) { const char *label = dev_name(dev); struct gpiochip_fwd *fwd; @@ -492,6 +540,12 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, else spin_lock_init(&fwd->slock); + if (delay_line) { + error = gpiochip_fwd_setup_delay_line(dev, chip, fwd); + if (error) + return ERR_PTR(error); + } + error = devm_gpiochip_add_data(dev, chip, fwd); if (error) return ERR_PTR(error); @@ -509,6 +563,7 @@ static int gpio_aggregator_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct gpio_desc **descs; struct gpiochip_fwd *fwd; + bool delay_line; int i, n; n = gpiod_count(dev, NULL); @@ -525,7 +580,9 @@ static int gpio_aggregator_probe(struct platform_device *pdev) return PTR_ERR(descs[i]); } - fwd = gpiochip_fwd_create(dev, n, descs); + delay_line = fwnode_device_is_compatible(dev_fwnode(dev), "gpio-delay"); + + fwd = gpiochip_fwd_create(dev, n, descs, delay_line); if (IS_ERR(fwd)) return PTR_ERR(fwd); @@ -534,6 +591,15 @@ static int gpio_aggregator_probe(struct platform_device *pdev) } static const struct of_device_id gpio_aggregator_dt_ids[] = { + /* + * The GPIO delay provides a way to configure platform specific delays + * for GPIO ramp-up or ramp-down delays. This can serve the following + * purposes: + * - Open-drain output using an RC filter + */ + { + .compatible = "gpio-delay", + }, /* * Add GPIO-operated devices controlled from userspace below, * or use "driver_override" in sysfs. From patchwork Wed Jun 14 23:14:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 108201 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp289628vqr; Wed, 14 Jun 2023 16:35:51 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7W8ZeunRnlhGnsnPxbtyX8F0v1+022aNvNnWoLo65n9f7zTQIic9ASbNdNsF+O2sP41RGh X-Received: by 2002:a17:906:7945:b0:982:9219:85cf with SMTP id l5-20020a170906794500b00982921985cfmr985487ejo.67.1686785750729; Wed, 14 Jun 2023 16:35:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686785750; cv=none; d=google.com; s=arc-20160816; b=oYqtLUWO4MLf5VIMmTjohMrUN366J39UYdzENjzg133TWUkYUnJUv8z1uUmlIOXF51 tYJl3fQWtfMCdxxzpIosrF3jCh78JUuugSeSEo9Q6wj3DzXdMvfTWAP07D5lUsx4pq6R Qn/Z2Ihl3jSQf6gSpvmmaMWqZXkXMPfFzDwWWr5FtUsWD3Vn+rDxpXKDuP3AaGznQb+N MNgPqOvlCN7gDvrJF2xJToY4qIggD6YBRIU8qszNUbaBq9ZCxV64Ngm8XokS646fBAzT nwTwW0GPGLvW9VmYANIVnqMIFHtphsB01ZJ/iC3Wd8o8lJYTr19B6Zw6bLocYg9xlX/j Nt2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=UvQVrWNPJA8wmIS0zOikRdWy1MpZgKmtENpn1iCbmsk=; b=wX4JSrpQFkWhQ683VSzoVeOreN1SPyI3qYDrg344pnfV4dl59ZeS1nScPlH/KqtOOp IsTYohAg5wWuusQDjOpSVx8eZJ8wLtMARUPnsmmTEqkW2sSQiKUaLcUr7RLLz5UpaLru n1tUABNIWHfQ51fZsBWg1+lhxD/biHKOML11bvPWaqo9gUKkSOBAPgIvJbytycvkjWvY FRq5h5/Mkwdxntx/SDS8Zx8IlB9u7RXFRPdhTyrFU3ZHbAk1luk1dho+Tu1MTB5YLOxK 93YCDvVDqRirXTML/1vL64QbHycqZeL6Wu6XFu8k0LFB7fZ9eZJcqXKDp/iWhO4t8TGG 1vrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=DVr0oNj1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s18-20020a170906355200b0097489089852si9056906eja.45.2023.06.14.16.35.22; Wed, 14 Jun 2023 16:35:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=DVr0oNj1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236289AbjFNXSs (ORCPT + 99 others); Wed, 14 Jun 2023 19:18:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238478AbjFNXSV (ORCPT ); Wed, 14 Jun 2023 19:18:21 -0400 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 415DE26BF; Wed, 14 Jun 2023 16:18:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686784690; x=1718320690; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9F6zH3UDg7TGi4FkoyI+l7N5RQc/2fFZU7O2gZQCqaY=; b=DVr0oNj1csSpIp5vE8S1g3fPsegZAUw7wZazosX7XtJujf1seCYTR0Md 89P6cP9w3WiM7d1zYfRAidTeG8N4RVDkuWpxoHB64zWvo1oj9W+FFa3LP PO+beS7nPc3NDkL1rb0ZTnWwoGJSHpmdFNQVnc1xKhxeBrZ3gl8g2EtpN O37VOnVZ6jv48EAAwjR43XaEgP+y4Vw8LLNDFyEgOXVfIuzgHbk+UjZuL nTHOqZEAs2ChcVd2AXbFO6ESp0vXz6ciH1VmDRpP1rj6q2G+VCZX1b7KS LitdLGPv2vQQsLhlwVH5THAFQge2CMJsB0PQQWr3TztSBfnwDlmDdmpC9 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="424648055" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="424648055" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2023 16:14:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10741"; a="715387937" X-IronPort-AV: E=Sophos;i="6.00,243,1681196400"; d="scan'208";a="715387937" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga007.fm.intel.com with ESMTP; 14 Jun 2023 16:14:43 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 018B840D; Thu, 15 Jun 2023 02:14:52 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Linus Walleij , Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven Subject: [PATCH v2 4/4] gpio: delay: Remove duplicative functionality Date: Thu, 15 Jun 2023 02:14:46 +0300 Message-Id: <20230614231446.3687-5-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> References: <20230614231446.3687-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768723055239413013?= X-GMAIL-MSGID: =?utf-8?q?1768723055239413013?= Now that GPIO aggregator supports a delay line, drop the duplicative functionality, i.e. the entire gpio-delay driver. Signed-off-by: Andy Shevchenko Reviewed-by: Linus Walleij Reviewed-by: Geert Uytterhoeven --- drivers/gpio/Kconfig | 9 --- drivers/gpio/Makefile | 1 - drivers/gpio/gpio-delay.c | 164 -------------------------------------- 3 files changed, 174 deletions(-) delete mode 100644 drivers/gpio/gpio-delay.c diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 209738ef1446..abaae68c88a4 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -1748,15 +1748,6 @@ config GPIO_AGGREGATOR industrial control context, to be operated from userspace using the GPIO chardev interface. -config GPIO_DELAY - tristate "GPIO delay" - depends on OF_GPIO - help - Say yes here to enable the GPIO delay, which provides a way to - configure platform specific delays for GPIO ramp-up or ramp-down - delays. This can serve the following purposes: - - Open-drain output using an RC filter - config GPIO_LATCH tristate "GPIO latch driver" help diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 947c9cf9aba8..7843b16f5d59 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -52,7 +52,6 @@ obj-$(CONFIG_GPIO_DA9052) += gpio-da9052.o obj-$(CONFIG_GPIO_DA9055) += gpio-da9055.o obj-$(CONFIG_GPIO_DAVINCI) += gpio-davinci.o obj-$(CONFIG_GPIO_DLN2) += gpio-dln2.o -obj-$(CONFIG_GPIO_DELAY) += gpio-delay.o obj-$(CONFIG_GPIO_DWAPB) += gpio-dwapb.o obj-$(CONFIG_GPIO_EIC_SPRD) += gpio-eic-sprd.o obj-$(CONFIG_GPIO_ELKHARTLAKE) += gpio-elkhartlake.o diff --git a/drivers/gpio/gpio-delay.c b/drivers/gpio/gpio-delay.c deleted file mode 100644 index b489b561b225..000000000000 --- a/drivers/gpio/gpio-delay.c +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Copyright 2022 TQ-Systems GmbH - * Author: Alexander Stein - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "gpiolib.h" - -struct gpio_delay_timing { - unsigned long ramp_up_delay_us; - unsigned long ramp_down_delay_us; -}; - -struct gpio_delay_priv { - struct gpio_chip gc; - struct gpio_descs *input_gpio; - struct gpio_delay_timing *delay_timings; -}; - -static int gpio_delay_get_direction(struct gpio_chip *gc, unsigned int offset) -{ - return GPIO_LINE_DIRECTION_OUT; -} - -static void gpio_delay_set(struct gpio_chip *gc, unsigned int offset, int val) -{ - struct gpio_delay_priv *priv = gpiochip_get_data(gc); - struct gpio_desc *gpio_desc = priv->input_gpio->desc[offset]; - const struct gpio_delay_timing *delay_timings; - bool ramp_up; - - gpiod_set_value(gpio_desc, val); - - delay_timings = &priv->delay_timings[offset]; - ramp_up = (!gpiod_is_active_low(gpio_desc) && val) || - (gpiod_is_active_low(gpio_desc) && !val); - - if (ramp_up && delay_timings->ramp_up_delay_us) - udelay(delay_timings->ramp_up_delay_us); - if (!ramp_up && delay_timings->ramp_down_delay_us) - udelay(delay_timings->ramp_down_delay_us); -} - -static void gpio_delay_set_can_sleep(struct gpio_chip *gc, unsigned int offset, int val) -{ - struct gpio_delay_priv *priv = gpiochip_get_data(gc); - struct gpio_desc *gpio_desc = priv->input_gpio->desc[offset]; - const struct gpio_delay_timing *delay_timings; - bool ramp_up; - - gpiod_set_value_cansleep(gpio_desc, val); - - delay_timings = &priv->delay_timings[offset]; - ramp_up = (!gpiod_is_active_low(gpio_desc) && val) || - (gpiod_is_active_low(gpio_desc) && !val); - - if (ramp_up && delay_timings->ramp_up_delay_us) - fsleep(delay_timings->ramp_up_delay_us); - if (!ramp_up && delay_timings->ramp_down_delay_us) - fsleep(delay_timings->ramp_down_delay_us); -} - -static int gpio_delay_of_xlate(struct gpio_chip *gc, - const struct of_phandle_args *gpiospec, - u32 *flags) -{ - struct gpio_delay_priv *priv = gpiochip_get_data(gc); - struct gpio_delay_timing *timings; - u32 line; - - if (gpiospec->args_count != gc->of_gpio_n_cells) - return -EINVAL; - - line = gpiospec->args[0]; - if (line >= gc->ngpio) - return -EINVAL; - - timings = &priv->delay_timings[line]; - timings->ramp_up_delay_us = gpiospec->args[1]; - timings->ramp_down_delay_us = gpiospec->args[2]; - - return line; -} - -static bool gpio_delay_can_sleep(const struct gpio_delay_priv *priv) -{ - int i; - - for (i = 0; i < priv->input_gpio->ndescs; i++) - if (gpiod_cansleep(priv->input_gpio->desc[i])) - return true; - - return false; -} - -static int gpio_delay_probe(struct platform_device *pdev) -{ - struct gpio_delay_priv *priv; - - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - priv->input_gpio = devm_gpiod_get_array(&pdev->dev, NULL, GPIOD_OUT_LOW); - if (IS_ERR(priv->input_gpio)) - return dev_err_probe(&pdev->dev, PTR_ERR(priv->input_gpio), - "Failed to get input-gpios"); - - priv->delay_timings = devm_kcalloc(&pdev->dev, - priv->input_gpio->ndescs, - sizeof(*priv->delay_timings), - GFP_KERNEL); - if (!priv->delay_timings) - return -ENOMEM; - - if (gpio_delay_can_sleep(priv)) { - priv->gc.can_sleep = true; - priv->gc.set = gpio_delay_set_can_sleep; - } else { - priv->gc.can_sleep = false; - priv->gc.set = gpio_delay_set; - } - - priv->gc.get_direction = gpio_delay_get_direction; - priv->gc.of_xlate = gpio_delay_of_xlate; - priv->gc.of_gpio_n_cells = 3; - priv->gc.ngpio = priv->input_gpio->ndescs; - priv->gc.owner = THIS_MODULE; - priv->gc.base = -1; - priv->gc.parent = &pdev->dev; - - platform_set_drvdata(pdev, priv); - - return devm_gpiochip_add_data(&pdev->dev, &priv->gc, priv); -} - -static const struct of_device_id gpio_delay_ids[] = { - { - .compatible = "gpio-delay", - }, - { /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, gpio_delay_ids); - -static struct platform_driver gpio_delay_driver = { - .driver = { - .name = "gpio-delay", - .of_match_table = gpio_delay_ids, - }, - .probe = gpio_delay_probe, -}; -module_platform_driver(gpio_delay_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Alexander Stein "); -MODULE_DESCRIPTION("GPIO delay driver");