From nobody Wed Dec 31 00:35:52 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 60F1EC4332F for ; Mon, 13 Nov 2023 12:40:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229941AbjKMMkD (ORCPT ); Mon, 13 Nov 2023 07:40:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229470AbjKMMkB (ORCPT ); Mon, 13 Nov 2023 07:40:01 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A869CD79; Mon, 13 Nov 2023 04:39:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699879198; x=1731415198; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=E7fDxJK51e9bco+AhBHJ0FtTr2XjHsY+0b0sdYUYno8=; b=fQs0wgSImwTyMkW8CuprQWa40kURnpXdlaKkXaNJAeoP2geR1ZFLkLvo AmJNYIsWs89s9AnNINjTJWTQOAMTjnh6bBWcSZZWwMjEMB9P0RVr0+cgA jTjffWPviUNYt8rI61jbQ0UHhTIp5e/TroIJZ9x8WCGCoaaviAJa8gr2D RCiemDP6okPz4EeWOmwomXV5OKYe5T2m3Ldya0I0148xlsLpdPGnq54nB LR9zjcrRe/0hLvdn4B4BSNI0ZWYSP21Jw+w8Ms0wJs7ryxAX2i+7vzMWt hBSCRYpBd0qw9fBhHcu+73wZnnobe3FhV3K1pcnSInRW+RoMdMrKjO/iE A==; X-IronPort-AV: E=McAfee;i="6600,9927,10892"; a="476646574" X-IronPort-AV: E=Sophos;i="6.03,299,1694761200"; d="scan'208";a="476646574" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Nov 2023 04:39:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10892"; a="1095740696" X-IronPort-AV: E=Sophos;i="6.03,299,1694761200"; d="scan'208";a="1095740696" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga005.fm.intel.com with ESMTP; 13 Nov 2023 04:39:56 -0800 Received: by black.fi.intel.com (Postfix, from userid 1003) id 402395C2; Mon, 13 Nov 2023 14:31:49 +0200 (EET) From: Andy Shevchenko To: Andy Shevchenko , Raag Jadav , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Andy Shevchenko , Linus Walleij Subject: [PATCH v2 1/2] pinctrl: intel: Revert "Unexport intel_pinctrl_probe()" Date: Mon, 13 Nov 2023 14:28:47 +0200 Message-ID: <20231113123147.4075203-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.43.0.rc1.1.gbec44491f096 In-Reply-To: <20231113123147.4075203-1-andriy.shevchenko@linux.intel.com> References: <20231113123147.4075203-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 order to prepare for a new coming driver export the original intel_pinctrl_probe() again. This reverts commit 0dd519e3784b13befa1cdfeff847a0885b06650f. Signed-off-by: Andy Shevchenko --- drivers/pinctrl/intel/pinctrl-intel.c | 5 +++-- drivers/pinctrl/intel/pinctrl-intel.h | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/= pinctrl-intel.c index 62daf189d3f4..2367c2747a83 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.c +++ b/drivers/pinctrl/intel/pinctrl-intel.c @@ -1504,8 +1504,8 @@ static int intel_pinctrl_probe_pwm(struct intel_pinct= rl *pctrl, return PTR_ERR_OR_ZERO(pwm); } =20 -static int intel_pinctrl_probe(struct platform_device *pdev, - const struct intel_pinctrl_soc_data *soc_data) +int intel_pinctrl_probe(struct platform_device *pdev, + const struct intel_pinctrl_soc_data *soc_data) { struct device *dev =3D &pdev->dev; struct intel_pinctrl *pctrl; @@ -1623,6 +1623,7 @@ static int intel_pinctrl_probe(struct platform_device= *pdev, =20 return 0; } +EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe, PINCTRL_INTEL); =20 int intel_pinctrl_probe_by_hid(struct platform_device *pdev) { diff --git a/drivers/pinctrl/intel/pinctrl-intel.h b/drivers/pinctrl/intel/= pinctrl-intel.h index e7d911a65584..fde65e18cd14 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.h +++ b/drivers/pinctrl/intel/pinctrl-intel.h @@ -252,6 +252,9 @@ struct intel_pinctrl { int irq; }; =20 +int intel_pinctrl_probe(struct platform_device *pdev, + const struct intel_pinctrl_soc_data *soc_data); + int intel_pinctrl_probe_by_hid(struct platform_device *pdev); int intel_pinctrl_probe_by_uid(struct platform_device *pdev); =20 --=20 2.43.0.rc1.1.gbec44491f096 From nobody Wed Dec 31 00:35:52 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 765F5C4167B for ; Mon, 13 Nov 2023 12:40:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229970AbjKMMkV (ORCPT ); Mon, 13 Nov 2023 07:40:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229470AbjKMMkU (ORCPT ); Mon, 13 Nov 2023 07:40:20 -0500 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73943171F; Mon, 13 Nov 2023 04:40:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699879216; x=1731415216; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UjuuT7vwu5HyOEeJ+9HscGkad4vAsx/2d+SgD8lgWTY=; b=IHfX4N36qtQ92iiKgJWgpbj7N6d1tyqNrrxiEVqDCPVYo8hOVDSoV0r8 2eS4+RphgumBp6h3JTCmmCZ85TIMT8/1WS047mn8fZxOMiW4XkpS94qsG 0htaa2cr0iKk7ZlTYUzRe0HlcVUeL1lXrwvAzlOCXDoxyWssHoK1WgLJj UIwfpNb7/TySbLGc/jbuwP4l3iZBv+NR0zzmN2La2MSR4fJryrto6gvif tztpJmDGiyCFO1/GZLn3L7NjTDTcTmyMaNUy0ObGFb0M6bLbLMLMvzJdw 7Fa6fDQmNtu94M6S+5Jd5I2MQo+UwzRKlcJ/FTUCo6k+Gi9n1sgpGVD14 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10892"; a="375454571" X-IronPort-AV: E=Sophos;i="6.03,299,1694761200"; d="scan'208";a="375454571" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Nov 2023 04:39:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10892"; a="767903399" X-IronPort-AV: E=Sophos;i="6.03,299,1694761200"; d="scan'208";a="767903399" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga007.fm.intel.com with ESMTP; 13 Nov 2023 04:39:56 -0800 Received: by black.fi.intel.com (Postfix, from userid 1003) id 4EB607F1; Mon, 13 Nov 2023 14:31:49 +0200 (EET) From: Andy Shevchenko To: Andy Shevchenko , Raag Jadav , Mika Westerberg , linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org Cc: Andy Shevchenko , Linus Walleij Subject: [PATCH v2 2/2] pinctrl: intel: Add a generic Intel pin control platform driver Date: Mon, 13 Nov 2023 14:28:48 +0200 Message-ID: <20231113123147.4075203-3-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.43.0.rc1.1.gbec44491f096 In-Reply-To: <20231113123147.4075203-1-andriy.shevchenko@linux.intel.com> References: <20231113123147.4075203-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" New generations of Intel platforms will provide better description of the pin control devices in the ACPI tables. Hence, we may provide a generic pin control platform driver to cover all of them. Currently the following Intel SoCs / platforms require this to be functional: - Lunar Lake Signed-off-by: Andy Shevchenko Acked-by: Mika Westerberg --- drivers/pinctrl/intel/Kconfig | 10 + drivers/pinctrl/intel/Makefile | 1 + .../pinctrl/intel/pinctrl-intel-platform.c | 225 ++++++++++++++++++ 3 files changed, 236 insertions(+) create mode 100644 drivers/pinctrl/intel/pinctrl-intel-platform.c diff --git a/drivers/pinctrl/intel/Kconfig b/drivers/pinctrl/intel/Kconfig index d66f4f6932d8..8c50bae85bca 100644 --- a/drivers/pinctrl/intel/Kconfig +++ b/drivers/pinctrl/intel/Kconfig @@ -37,6 +37,16 @@ config PINCTRL_INTEL select GPIOLIB select GPIOLIB_IRQCHIP =20 +config PINCTRL_INTEL_PLATFORM + tristate "Intel pinctrl and GPIO platform driver" + depends on ACPI + select PINCTRL_INTEL + help + This pinctrl driver provides an interface that allows configuring + of Intel PCH pins and using them as GPIOs. Currently the following + Intel SoCs / platforms require this to be functional: + - Lunar Lake + config PINCTRL_ALDERLAKE tristate "Intel Alder Lake pinctrl and GPIO driver" select PINCTRL_INTEL diff --git a/drivers/pinctrl/intel/Makefile b/drivers/pinctrl/intel/Makefile index f6d30f2d973a..96c93ed4bd58 100644 --- a/drivers/pinctrl/intel/Makefile +++ b/drivers/pinctrl/intel/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_PINCTRL_TANGIER) +=3D pinctrl-tangier.o obj-$(CONFIG_PINCTRL_MERRIFIELD) +=3D pinctrl-merrifield.o obj-$(CONFIG_PINCTRL_MOOREFIELD) +=3D pinctrl-moorefield.o obj-$(CONFIG_PINCTRL_INTEL) +=3D pinctrl-intel.o +obj-$(CONFIG_PINCTRL_INTEL_PLATFORM) +=3D pinctrl-intel-platform.o obj-$(CONFIG_PINCTRL_ALDERLAKE) +=3D pinctrl-alderlake.o obj-$(CONFIG_PINCTRL_BROXTON) +=3D pinctrl-broxton.o obj-$(CONFIG_PINCTRL_CANNONLAKE) +=3D pinctrl-cannonlake.o diff --git a/drivers/pinctrl/intel/pinctrl-intel-platform.c b/drivers/pinct= rl/intel/pinctrl-intel-platform.c new file mode 100644 index 000000000000..4a19ab3b4ba7 --- /dev/null +++ b/drivers/pinctrl/intel/pinctrl-intel-platform.c @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Intel PCH pinctrl/GPIO driver + * + * Copyright (C) 2021-2023, Intel Corporation + * Author: Andy Shevchenko + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include "pinctrl-intel.h" + +struct intel_platform_pins { + struct pinctrl_pin_desc *pins; + size_t npins; +}; + +static int intel_platform_pinctrl_prepare_pins(struct device *dev, size_t = base, + const char *name, u32 size, + struct intel_platform_pins *pins) +{ + struct pinctrl_pin_desc *descs; + char **pin_names; + unsigned int i; + + pin_names =3D devm_kasprintf_strarray(dev, name, size); + if (IS_ERR(pin_names)) + return PTR_ERR(pin_names); + + descs =3D devm_krealloc_array(dev, pins->pins, base + size, sizeof(*descs= ), GFP_KERNEL); + if (!descs) + return -ENOMEM; + + for (i =3D 0; i < size; i++) { + unsigned int pin_number =3D base + i; + char *pin_name =3D pin_names[i]; + struct pinctrl_pin_desc *desc; + + /* Unify delimiter for pin name */ + strreplace(pin_name, '-', '_'); + + desc =3D &descs[pin_number]; + desc->number =3D pin_number; + desc->name =3D pin_name; + } + + pins->pins =3D descs; + pins->npins =3D base + size; + + return 0; +} + +static int intel_platform_pinctrl_prepare_group(struct device *dev, + struct fwnode_handle *child, + struct intel_padgroup *gpp, + struct intel_platform_pins *pins) +{ + size_t base =3D pins->npins; + const char *name; + u32 size; + int ret; + + ret =3D fwnode_property_read_string(child, "intc-gpio-group-name", &name); + if (ret) + return ret; + + ret =3D fwnode_property_read_u32(child, "intc-gpio-pad-count", &size); + if (ret) + return ret; + + ret =3D intel_platform_pinctrl_prepare_pins(dev, base, name, size, pins); + if (ret) + return ret; + + gpp->base =3D base; + gpp->size =3D size; + gpp->gpio_base =3D INTEL_GPIO_BASE_MATCH; + + return 0; +} + +static int intel_platform_pinctrl_prepare_community(struct device *dev, + struct intel_community *community, + struct intel_platform_pins *pins) +{ + struct fwnode_handle *child; + struct intel_padgroup *gpps; + unsigned int group; + size_t ngpps; + u32 offset; + int ret; + + ret =3D device_property_read_u32(dev, "intc-gpio-pad-ownership-offset", &= offset); + if (ret) + return ret; + community->padown_offset =3D offset; + + ret =3D device_property_read_u32(dev, "intc-gpio-pad-configuration-lock-o= ffset", &offset); + if (ret) + return ret; + community->padcfglock_offset =3D offset; + + ret =3D device_property_read_u32(dev, "intc-gpio-host-software-pad-owners= hip-offset", &offset); + if (ret) + return ret; + community->hostown_offset =3D offset; + + ret =3D device_property_read_u32(dev, "intc-gpio-gpi-interrupt-status-off= set", &offset); + if (ret) + return ret; + community->is_offset =3D offset; + + ret =3D device_property_read_u32(dev, "intc-gpio-gpi-interrupt-enable-off= set", &offset); + if (ret) + return ret; + community->ie_offset =3D offset; + + ngpps =3D device_get_child_node_count(dev); + if (!ngpps) + return -ENODEV; + + gpps =3D devm_kcalloc(dev, ngpps, sizeof(*gpps), GFP_KERNEL); + if (!gpps) + return -ENOMEM; + + group =3D 0; + device_for_each_child_node(dev, child) { + struct intel_padgroup *gpp =3D &gpps[group]; + + gpp->reg_num =3D group; + + ret =3D intel_platform_pinctrl_prepare_group(dev, child, gpp, pins); + if (ret) + return ret; + + group++; + } + + community->ngpps =3D ngpps; + community->gpps =3D gpps; + + return 0; +} + +static int intel_platform_pinctrl_prepare_soc_data(struct device *dev, + struct intel_pinctrl_soc_data *data) +{ + struct intel_platform_pins pins =3D {}; + struct intel_community *communities; + size_t ncommunities; + unsigned int i; + int ret; + + /* Version 1.0 of the specification assumes only a single community per d= evice node */ + ncommunities =3D 1, + communities =3D devm_kcalloc(dev, ncommunities, sizeof(*communities), GFP= _KERNEL); + if (!communities) + return -ENOMEM; + + for (i =3D 0; i < ncommunities; i++) { + struct intel_community *community =3D &communities[i]; + + community->barno =3D i; + community->pin_base =3D pins.npins; + + ret =3D intel_platform_pinctrl_prepare_community(dev, community, &pins); + if (ret) + return ret; + + community->npins =3D pins.npins - community->pin_base; + } + + data->ncommunities =3D ncommunities; + data->communities =3D communities; + + data->npins =3D pins.npins; + data->pins =3D pins.pins; + + return 0; +} + +static int intel_platform_pinctrl_probe(struct platform_device *pdev) +{ + struct intel_pinctrl_soc_data *data; + struct device *dev =3D &pdev->dev; + int ret; + + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + ret =3D intel_platform_pinctrl_prepare_soc_data(dev, data); + if (ret) + return ret; + + return intel_pinctrl_probe(pdev, data); +} + +static const struct acpi_device_id intel_platform_pinctrl_acpi_match[] =3D= { + { "INTC105F" }, + { } +}; +MODULE_DEVICE_TABLE(acpi, intel_platform_pinctrl_acpi_match); + +static struct platform_driver intel_platform_pinctrl_driver =3D { + .probe =3D intel_platform_pinctrl_probe, + .driver =3D { + .name =3D "intel-pinctrl", + .acpi_match_table =3D intel_platform_pinctrl_acpi_match, + .pm =3D pm_sleep_ptr(&intel_pinctrl_pm_ops), + }, +}; +module_platform_driver(intel_platform_pinctrl_driver); + +MODULE_AUTHOR("Andy Shevchenko "); +MODULE_DESCRIPTION("Intel PCH pinctrl/GPIO driver"); +MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(PINCTRL_INTEL); --=20 2.43.0.rc1.1.gbec44491f096