From nobody Sun Dec 14 02:01:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D2E0EB64D9 for ; Thu, 15 Jun 2023 13:51:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344584AbjFONvj (ORCPT ); Thu, 15 Jun 2023 09:51:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344520AbjFONv1 (ORCPT ); Thu, 15 Jun 2023 09:51:27 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D9CC1FCC; Thu, 15 Jun 2023 06:51:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686837086; x=1718373086; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=OHlnlkHPA91wHreN8tHin7Ou/hR9tUoGjail7ciaYAg=; b=NhS0s/bIZhaQWXCZy+jj/xWffXnF8ZTDClYNIfXM0nEZBYbvgPq0qCIc VNpgiXLnoU2zZgqNuRF0fFYJ2wQm9lOVBdQ5/PX7/o+HvK27sg538C6cF 6NdDcQa9lt+GVOlDktBiJkGeDry1dpZNsxf/69kxVetpAzx4D7D3feZY8 J7fghV3JLBIR/XApDWYUD54bovHTvj+GQcaGMSIxVWU+rqC9VqRlsSWU5 cCt216fSls732Fl+f7yprtTgM/CgV50xsPhnWHzNhrUb38eiqwAumoJND OP3zv8tLSnVk2PlXn6Kg9WNBrksEHzRxvXC2syH54g6TA0ATd/Xhv47yc Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="361404921" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="361404921" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 06:20:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="802338785" X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="802338785" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 15 Jun 2023 06:20:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 4E3BA192; Thu, 15 Jun 2023 16:20:28 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven , Linus Walleij , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Bartosz Golaszewski , Andy Shevchenko Subject: [PATCH v3 1/5] gpio: aggregator: Remove CONFIG_OF and of_match_ptr() protections Date: Thu, 15 Jun 2023 16:20:19 +0300 Message-Id: <20230615132023.13801-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> References: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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. Reviewed-by: Geert Uytterhoeven Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Tested-by: Alexander Stein --- 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_devi= ce *pdev) return 0; } =20 -#ifdef CONFIG_OF static const struct of_device_id gpio_aggregator_dt_ids[] =3D { /* * 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 =20 static struct platform_driver gpio_aggregator_driver =3D { .probe =3D gpio_aggregator_probe, .driver =3D { .name =3D DRV_NAME, .groups =3D gpio_aggregator_groups, - .of_match_table =3D of_match_ptr(gpio_aggregator_dt_ids), + .of_match_table =3D gpio_aggregator_dt_ids, }, }; =20 --=20 2.40.0.1.gaa8946217a0b From nobody Sun Dec 14 02:01:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B272BEB64D9 for ; Thu, 15 Jun 2023 13:51:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344517AbjFONv0 (ORCPT ); Thu, 15 Jun 2023 09:51:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57116 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344484AbjFONvX (ORCPT ); Thu, 15 Jun 2023 09:51:23 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1464C1BDB; Thu, 15 Jun 2023 06:51:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686837083; x=1718373083; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=05ajh+nMpM5e9Do3hT1hquzqCJRfHJXHSX3q930HuGo=; b=cdQlKSKpBav0QUR3UdR7Ec8VDICodqQINEhDllUFtDN3EJ0gdjlckZ/9 wnfS0UmRk5x3r7Obhc2CMv4PZ0IO4cd9i6NMWUGbYOTTcpGlxPMa3brT6 VmsEnRCsLTg8EsML/93VTcPsxsxpFYONkct2jbYkkNJI6RJLTkPotjN84 lvv2B16iJirt/Q6KlBaiROzAYhw+TPa6U1JY0dFjY0FkBPFWQ5fEJ9U6N k7CiMFWlmqcRVJvYuhA3vqGDbYbWKjjQCYWy7VA+s8wvTZfXRL0lulb/8 dkvC3xZgNpoRQys9otBX3haV+0uZ0rEL5jjMjjYiuL6zB3r1HcZ5GJ6Yg A==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="361404890" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="361404890" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 06:20:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="802338783" X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="802338783" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 15 Jun 2023 06:20:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 5695866C; Thu, 15 Jun 2023 16:20:28 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven , Linus Walleij , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Bartosz Golaszewski , Andy Shevchenko Subject: [PATCH v3 2/5] gpio: aggregator: Support delay for setting up individual GPIOs Date: Thu, 15 Jun 2023 16:20:20 +0300 Message-Id: <20230615132023.13801-3-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> References: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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. Reviewed-by: Geert Uytterhoeven Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Tested-by: Alexander Stein --- drivers/gpio/gpio-aggregator.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 1aa7455672d3..4a470dd8b75d 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 */ =20 +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 */ }; =20 @@ -331,6 +338,27 @@ static int gpio_fwd_get_multiple_locked(struct gpio_ch= ip *chip, return error; } =20 +static void gpio_fwd_delay(struct gpio_chip *chip, unsigned int offset, in= t value) +{ + struct gpiochip_fwd *fwd =3D gpiochip_get_data(chip); + const struct gpiochip_fwd_timing *delay_timings; + bool is_active_low =3D gpiod_is_active_low(fwd->descs[offset]); + u32 delay_us; + + delay_timings =3D &fwd->delay_timings[offset]; + if ((!is_active_low && value) || (is_active_low && !value)) + delay_us =3D delay_timings->ramp_up_us; + else + delay_us =3D 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 =3D gpiochip_get_data(chip); @@ -339,6 +367,9 @@ static void gpio_fwd_set(struct gpio_chip *chip, unsign= ed 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); } =20 static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long = *mask, --=20 2.40.0.1.gaa8946217a0b From nobody Sun Dec 14 02:01:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B82EEB64DB for ; Thu, 15 Jun 2023 13:51:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344494AbjFONvY (ORCPT ); Thu, 15 Jun 2023 09:51:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343567AbjFONvW (ORCPT ); Thu, 15 Jun 2023 09:51:22 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36DC11BDB; Thu, 15 Jun 2023 06:51:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686837081; x=1718373081; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=m1IxT8Tqx2Xt34NPHZ0FTzyvORZk2opPVHLCk2AQe2Q=; b=h8wkNM8ultuahNJM4vyepIO0733nK4fLVi5NBzHxuc7NUnTs8fdjwbEZ hfYwG98kg60oFjUg6l4iR2pCYPSJP7xNaCHlAn6c7+mmCBpjW/Mr1LKB2 9goeH04/v99qj/zrOnNgoT7B1O+++OfsLhcVOPY1y65h7mqHs1exilRnK NP/ITUmSmP+BNS34oWMhHWqsB8/xGLfOc1/kGwDm9tOQhpchs46ZZOGkO xotKqPPtIkc5PwTfB3YyE13cbzJGSCt5cDOZWOO4ZbnbBZ89a12Sb407b xF2yRNunnJCP4ANkTmlDS5xP246Ai/uBktaRg5Fepvy5QvMKZugf5NMls Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="361404873" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="361404873" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 06:20:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="802338784" X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="802338784" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 15 Jun 2023 06:20:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 5E1A5677; Thu, 15 Jun 2023 16:20:28 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven , Linus Walleij , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Bartosz Golaszewski , Andy Shevchenko Subject: [PATCH v3 3/5] gpio: aggregator: Prevent collisions between DT and user device IDs Date: Thu, 15 Jun 2023 16:20:21 +0300 Message-Id: <20230615132023.13801-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> References: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In case we have a device instantiated via DT or other means than via new_device sysfs node, the collision with the latter is possible. Prevent such collisions by allocating user instantiated devices with higher IDs, currently set to 1024. Signed-off-by: Andy Shevchenko Tested-by: Alexander Stein --- drivers/gpio/gpio-aggregator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 4a470dd8b75d..8892cb37ad79 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -26,6 +26,7 @@ #include #include =20 +#define AGGREGATOR_MIN_DEVID 1024 #define AGGREGATOR_MAX_GPIOS 512 =20 /* @@ -135,7 +136,7 @@ static ssize_t new_device_store(struct device_driver *d= river, const char *buf, } =20 mutex_lock(&gpio_aggregator_lock); - id =3D idr_alloc(&gpio_aggregator_idr, aggr, 0, 0, GFP_KERNEL); + id =3D idr_alloc(&gpio_aggregator_idr, aggr, AGGREGATOR_MIN_DEVID, 0, GFP= _KERNEL); mutex_unlock(&gpio_aggregator_lock); =20 if (id < 0) { --=20 2.40.0.1.gaa8946217a0b From nobody Sun Dec 14 02:01:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3F416EB64D9 for ; Thu, 15 Jun 2023 13:51:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344596AbjFONvl (ORCPT ); Thu, 15 Jun 2023 09:51:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344484AbjFONv1 (ORCPT ); Thu, 15 Jun 2023 09:51:27 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D9EA1FC3; Thu, 15 Jun 2023 06:51:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686837086; x=1718373086; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VnFSx970LoohkoeDP4Iivoj0ONbOU2BclvXilEmqLAo=; b=OUFxHQd1MGs5zkXd4TAp8RLzpd1al3quzUvCpkxRgR27hRp/cMHDIHPP tKRSsLw/y18opTwXv5ibveeLSiEOTHQh5BqsbVVE/9H/bfafSCY9hFjlK VPV4noWwIV/5aDHwJ2OR+O7ue5dXlBZeFwmQPbDz69/XWANUT8Qk9Kty1 JkN+by9ykaF/zFOBLcs8uboZPxf+5kIdgMpA2LPkaPpxbayUum3UiJU2Y DBI/dr+w5gurv+N+p/LDNU/juTcKBFXwZSjn2RCScQXCY5VNbFUcHkR0N a72+or9/cTOHs239lnElidmsbmq/M59B1xpvW5QaGw+MeY5rlEGU7G4O4 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="361404920" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="361404920" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 06:20:24 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="802338788" X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="802338788" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 15 Jun 2023 06:20:19 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 6B57C403; Thu, 15 Jun 2023 16:20:28 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven , Linus Walleij , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Bartosz Golaszewski , Andy Shevchenko Subject: [PATCH v3 4/5] gpio: aggregator: Set up a parser of delay line parameters Date: Thu, 15 Jun 2023 16:20:22 +0300 Message-Id: <20230615132023.13801-5-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> References: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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. Reviewed-by: Geert Uytterhoeven Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Tested-by: Alexander Stein --- drivers/gpio/gpio-aggregator.c | 72 +++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 8892cb37ad79..b944ce9e030e 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,59 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, uns= igned int offset) return gpiod_to_irq(fwd->descs[offset]); } =20 +/* + * The GPIO delay provides a way to configure platform specific delays + * for the GPIO ramp-up or ramp-down delays. This can serve the following + * purposes: + * - Open-drain output using an RC filter + */ +#define FWD_FEATURE_DELAY BIT(0) + +#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 =3D gpiochip_get_data(chip); + struct gpiochip_fwd_timing *timings; + u32 line; + + if (gpiospec->args_count !=3D chip->of_gpio_n_cells) + return -EINVAL; + + line =3D gpiospec->args[0]; + if (line >=3D chip->ngpio) + return -EINVAL; + + timings =3D &fwd->delay_timings[line]; + timings->ramp_up_us =3D gpiospec->args[1]; + timings->ramp_down_us =3D gpiospec->args[2]; + + return line; +} + +static int gpiochip_fwd_setup_delay_line(struct device *dev, struct gpio_c= hip *chip, + struct gpiochip_fwd *fwd) +{ + fwd->delay_timings =3D devm_kcalloc(dev, chip->ngpio, + sizeof(*fwd->delay_timings), + GFP_KERNEL); + if (!fwd->delay_timings) + return -ENOMEM; + + chip->of_xlate =3D gpiochip_fwd_delay_of_xlate; + chip->of_gpio_n_cells =3D 3; + + return 0; +} +#else +static int gpiochip_fwd_setup_delay_line(struct device *dev, struct gpio_c= hip *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 +484,7 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, unsi= gned int offset) * @descs: Array containing the GPIO descriptors to forward to. * This array must contain @ngpios entries, and must not be deallo= cated * before the forwarder has been destroyed again. + * @features: Bitwise ORed features as defined with FWD_FEATURE_*. * * This function creates a new gpiochip, which forwards all GPIO operation= s to * the passed GPIO descriptors. @@ -439,7 +494,8 @@ static int gpio_fwd_to_irq(struct gpio_chip *chip, unsi= gned int offset) */ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev, unsigned int ngpios, - struct gpio_desc *descs[]) + struct gpio_desc *descs[], + unsigned long features) { const char *label =3D dev_name(dev); struct gpiochip_fwd *fwd; @@ -492,6 +548,12 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct= device *dev, else spin_lock_init(&fwd->slock); =20 + if (features & FWD_FEATURE_DELAY) { + error =3D gpiochip_fwd_setup_delay_line(dev, chip, fwd); + if (error) + return ERR_PTR(error); + } + error =3D devm_gpiochip_add_data(dev, chip, fwd); if (error) return ERR_PTR(error); @@ -509,6 +571,7 @@ static int gpio_aggregator_probe(struct platform_device= *pdev) struct device *dev =3D &pdev->dev; struct gpio_desc **descs; struct gpiochip_fwd *fwd; + unsigned long features; int i, n; =20 n =3D gpiod_count(dev, NULL); @@ -525,7 +588,8 @@ static int gpio_aggregator_probe(struct platform_device= *pdev) return PTR_ERR(descs[i]); } =20 - fwd =3D gpiochip_fwd_create(dev, n, descs); + features =3D (uintptr_t)device_get_match_data(dev); + fwd =3D gpiochip_fwd_create(dev, n, descs, features); if (IS_ERR(fwd)) return PTR_ERR(fwd); =20 @@ -534,6 +598,10 @@ static int gpio_aggregator_probe(struct platform_devic= e *pdev) } =20 static const struct of_device_id gpio_aggregator_dt_ids[] =3D { + { + .compatible =3D "gpio-delay", + .data =3D (void *)FWD_FEATURE_DELAY, + }, /* * Add GPIO-operated devices controlled from userspace below, * or use "driver_override" in sysfs. --=20 2.40.0.1.gaa8946217a0b From nobody Sun Dec 14 02:01:02 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF14BEB64D9 for ; Thu, 15 Jun 2023 13:51:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344578AbjFONvo (ORCPT ); Thu, 15 Jun 2023 09:51:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344501AbjFONvb (ORCPT ); Thu, 15 Jun 2023 09:51:31 -0400 Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83BEA1FDD; Thu, 15 Jun 2023 06:51:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1686837090; x=1718373090; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=YsZGaAObpjYqNJMe/OLLryZiMIHAEejOVbI/tTESdOw=; b=VEGcEzQF2RNKEFguWPvisjEpHVzJyBtI9BVLyh0VwdGcJSrpSJ59+2VG rdHrPPBzXHpGIBiAPQI3SPYn24BgRlO/4MSuzPBLQviBR/wiaHCUO1rps A/bdmL1NWveN5Q+q2RmYrB33llvU2burDVStXGoj42FRJj7ZKhjPZCmqt hwhqS2E7B5p21tvZlg9jbLCI6gOG9kP2N6kX2cKCGmZSbpJGElwv0w/X9 lNAE9qG956kMowPd8Uz5HovfkJ8XDwXYq5CtWdvp/KuQzwFj942KWYxy4 GXLGsuxBvUkDZvQuPpbWCQPhlAZQxDgYftS59uYieGw082kFAFMuW1NJW Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="361404962" X-IronPort-AV: E=Sophos;i="6.00,245,1681196400"; d="scan'208";a="361404962" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2023 06:20:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10742"; a="802338858" X-IronPort-AV: E=Sophos;i="6.00,244,1681196400"; d="scan'208";a="802338858" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 15 Jun 2023 06:20:23 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 7E05975A; Thu, 15 Jun 2023 16:20:28 +0300 (EEST) From: Andy Shevchenko To: Bartosz Golaszewski , Andy Shevchenko , Geert Uytterhoeven , Linus Walleij , Alexander Stein , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Bartosz Golaszewski , Andy Shevchenko Subject: [PATCH v3 5/5] gpio: delay: Remove duplicative functionality Date: Thu, 15 Jun 2023 16:20:23 +0300 Message-Id: <20230615132023.13801-6-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> References: <20230615132023.13801-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Now that GPIO aggregator supports a delay line, drop the duplicative functionality, i.e. the entire gpio-delay driver. Reviewed-by: Geert Uytterhoeven Reviewed-by: Linus Walleij Signed-off-by: Andy Shevchenko Tested-by: Alexander Stein --- 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. =20 -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) +=3D gpio-da9052.o obj-$(CONFIG_GPIO_DA9055) +=3D gpio-da9055.o obj-$(CONFIG_GPIO_DAVINCI) +=3D gpio-davinci.o obj-$(CONFIG_GPIO_DLN2) +=3D gpio-dln2.o -obj-$(CONFIG_GPIO_DELAY) +=3D gpio-delay.o obj-$(CONFIG_GPIO_DWAPB) +=3D gpio-dwapb.o obj-$(CONFIG_GPIO_EIC_SPRD) +=3D gpio-eic-sprd.o obj-$(CONFIG_GPIO_ELKHARTLAKE) +=3D 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 off= set) -{ - return GPIO_LINE_DIRECTION_OUT; -} - -static void gpio_delay_set(struct gpio_chip *gc, unsigned int offset, int = val) -{ - struct gpio_delay_priv *priv =3D gpiochip_get_data(gc); - struct gpio_desc *gpio_desc =3D priv->input_gpio->desc[offset]; - const struct gpio_delay_timing *delay_timings; - bool ramp_up; - - gpiod_set_value(gpio_desc, val); - - delay_timings =3D &priv->delay_timings[offset]; - ramp_up =3D (!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 of= fset, int val) -{ - struct gpio_delay_priv *priv =3D gpiochip_get_data(gc); - struct gpio_desc *gpio_desc =3D priv->input_gpio->desc[offset]; - const struct gpio_delay_timing *delay_timings; - bool ramp_up; - - gpiod_set_value_cansleep(gpio_desc, val); - - delay_timings =3D &priv->delay_timings[offset]; - ramp_up =3D (!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 =3D gpiochip_get_data(gc); - struct gpio_delay_timing *timings; - u32 line; - - if (gpiospec->args_count !=3D gc->of_gpio_n_cells) - return -EINVAL; - - line =3D gpiospec->args[0]; - if (line >=3D gc->ngpio) - return -EINVAL; - - timings =3D &priv->delay_timings[line]; - timings->ramp_up_delay_us =3D gpiospec->args[1]; - timings->ramp_down_delay_us =3D gpiospec->args[2]; - - return line; -} - -static bool gpio_delay_can_sleep(const struct gpio_delay_priv *priv) -{ - int i; - - for (i =3D 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 =3D devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); - if (!priv) - return -ENOMEM; - - priv->input_gpio =3D 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 =3D 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 =3D true; - priv->gc.set =3D gpio_delay_set_can_sleep; - } else { - priv->gc.can_sleep =3D false; - priv->gc.set =3D gpio_delay_set; - } - - priv->gc.get_direction =3D gpio_delay_get_direction; - priv->gc.of_xlate =3D gpio_delay_of_xlate; - priv->gc.of_gpio_n_cells =3D 3; - priv->gc.ngpio =3D priv->input_gpio->ndescs; - priv->gc.owner =3D THIS_MODULE; - priv->gc.base =3D -1; - priv->gc.parent =3D &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[] =3D { - { - .compatible =3D "gpio-delay", - }, - { /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, gpio_delay_ids); - -static struct platform_driver gpio_delay_driver =3D { - .driver =3D { - .name =3D "gpio-delay", - .of_match_table =3D gpio_delay_ids, - }, - .probe =3D gpio_delay_probe, -}; -module_platform_driver(gpio_delay_driver); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Alexander Stein "); -MODULE_DESCRIPTION("GPIO delay driver"); --=20 2.40.0.1.gaa8946217a0b