Commit 7085e4e2 authored by Linus Walleij's avatar Linus Walleij

Merge tag 'intel-pinctrl-v6.8-1' of...

Merge tag 'intel-pinctrl-v6.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/intel into devel

intel-pinctrl for v6.8-1

* New agnostic driver to support Lunar Lake and newer platforms
* New driver for Intel Meteor Point-S (PCH for Meteor Lake-S)
* Update drivers to use new PM helpers
* Use RAII for locking in a few drivers (Raag, Andy)
* Reduce locking scope in some functions (Raag)
* Miscellaneous cleanups (Raag)

The following is an automated git shortlog grouped by driver:

alderlake:
 -  Switch to use Intel pin control PM ops

baytrail:
 -  Simplify code with cleanup helpers
 -  Move default strength assignment to a switch-case
 -  Factor out byt_gpio_force_input_mode()
 -  Fix types of config value in byt_pin_config_set()

broxton:
 -  Switch to use Intel pin control PM ops

cannonlake:
 -  Switch to use Intel pin control PM ops

cedarfork:
 -  Switch to use Intel pin control PM ops

denverton:
 -  Switch to use Intel pin control PM ops

elkhartlake:
 -  Switch to use Intel pin control PM ops

emmitsburg:
 -  Switch to use Intel pin control PM ops

geminilake:
 -  Switch to use Intel pin control PM ops

icelake:
 -  Switch to use Intel pin control PM ops

intel:
 -  Add Intel Meteor Point pin controller and GPIO support
 -  use the correct _PM_OPS() export macro
 -  Add a generic Intel pin control platform driver
 -  Revert "Unexport intel_pinctrl_probe()"
 -  allow independent COMPILE_TEST
 -  Refactor intel_pinctrl_get_soc_data()
 -  Move default strength assignment to a switch-case
 -  Make PM ops functions static
 -  Provide Intel pin control wide PM ops structure

jasperlake:
 -  Switch to use Intel pin control PM ops

lakefield:
 -  Switch to use Intel pin control PM ops

lewisburg:
 -  Switch to use Intel pin control PM ops

lynxpoint:
 -  Simplify code with cleanup helpers

meteorlake:
 -  Switch to use Intel pin control PM ops

sunrisepoint:
 -  Switch to use Intel pin control PM ops

tangier:
 -  simplify locking using cleanup helpers
 -  Move default strength assignment to a switch-case
 -  Enable 910 Ohm bias

tigerlake:
 -  Switch to use Intel pin control PM ops
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parents 915fdc94 ebe7f339
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Intel pin control drivers # Intel pin control drivers
menu "Intel pinctrl drivers" menu "Intel pinctrl drivers"
depends on ACPI && (X86 || COMPILE_TEST) depends on (ACPI && X86) || COMPILE_TEST
config PINCTRL_BAYTRAIL config PINCTRL_BAYTRAIL
bool "Intel Baytrail GPIO pin control" bool "Intel Baytrail GPIO pin control"
...@@ -37,6 +37,16 @@ config PINCTRL_INTEL ...@@ -37,6 +37,16 @@ config PINCTRL_INTEL
select GPIOLIB select GPIOLIB
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
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 config PINCTRL_ALDERLAKE
tristate "Intel Alder Lake pinctrl and GPIO driver" tristate "Intel Alder Lake pinctrl and GPIO driver"
select PINCTRL_INTEL select PINCTRL_INTEL
...@@ -128,6 +138,15 @@ config PINCTRL_METEORLAKE ...@@ -128,6 +138,15 @@ config PINCTRL_METEORLAKE
This pinctrl driver provides an interface that allows configuring This pinctrl driver provides an interface that allows configuring
of Intel Meteor Lake pins and using them as GPIOs. of Intel Meteor Lake pins and using them as GPIOs.
config PINCTRL_METEORPOINT
tristate "Intel Meteor Point pinctrl and GPIO driver"
depends on ACPI
select PINCTRL_INTEL
help
Meteor Point is the PCH of Intel Meteor Lake. This pinctrl driver
provides an interface that allows configuring of PCH pins and
using them as GPIOs.
config PINCTRL_SUNRISEPOINT config PINCTRL_SUNRISEPOINT
tristate "Intel Sunrisepoint pinctrl and GPIO driver" tristate "Intel Sunrisepoint pinctrl and GPIO driver"
select PINCTRL_INTEL select PINCTRL_INTEL
......
...@@ -8,6 +8,7 @@ obj-$(CONFIG_PINCTRL_TANGIER) += pinctrl-tangier.o ...@@ -8,6 +8,7 @@ obj-$(CONFIG_PINCTRL_TANGIER) += pinctrl-tangier.o
obj-$(CONFIG_PINCTRL_MERRIFIELD) += pinctrl-merrifield.o obj-$(CONFIG_PINCTRL_MERRIFIELD) += pinctrl-merrifield.o
obj-$(CONFIG_PINCTRL_MOOREFIELD) += pinctrl-moorefield.o obj-$(CONFIG_PINCTRL_MOOREFIELD) += pinctrl-moorefield.o
obj-$(CONFIG_PINCTRL_INTEL) += pinctrl-intel.o obj-$(CONFIG_PINCTRL_INTEL) += pinctrl-intel.o
obj-$(CONFIG_PINCTRL_INTEL_PLATFORM) += pinctrl-intel-platform.o
obj-$(CONFIG_PINCTRL_ALDERLAKE) += pinctrl-alderlake.o obj-$(CONFIG_PINCTRL_ALDERLAKE) += pinctrl-alderlake.o
obj-$(CONFIG_PINCTRL_BROXTON) += pinctrl-broxton.o obj-$(CONFIG_PINCTRL_BROXTON) += pinctrl-broxton.o
obj-$(CONFIG_PINCTRL_CANNONLAKE) += pinctrl-cannonlake.o obj-$(CONFIG_PINCTRL_CANNONLAKE) += pinctrl-cannonlake.o
...@@ -21,5 +22,6 @@ obj-$(CONFIG_PINCTRL_JASPERLAKE) += pinctrl-jasperlake.o ...@@ -21,5 +22,6 @@ obj-$(CONFIG_PINCTRL_JASPERLAKE) += pinctrl-jasperlake.o
obj-$(CONFIG_PINCTRL_LAKEFIELD) += pinctrl-lakefield.o obj-$(CONFIG_PINCTRL_LAKEFIELD) += pinctrl-lakefield.o
obj-$(CONFIG_PINCTRL_LEWISBURG) += pinctrl-lewisburg.o obj-$(CONFIG_PINCTRL_LEWISBURG) += pinctrl-lewisburg.o
obj-$(CONFIG_PINCTRL_METEORLAKE) += pinctrl-meteorlake.o obj-$(CONFIG_PINCTRL_METEORLAKE) += pinctrl-meteorlake.o
obj-$(CONFIG_PINCTRL_METEORPOINT) += pinctrl-meteorpoint.o
obj-$(CONFIG_PINCTRL_SUNRISEPOINT) += pinctrl-sunrisepoint.o obj-$(CONFIG_PINCTRL_SUNRISEPOINT) += pinctrl-sunrisepoint.o
obj-$(CONFIG_PINCTRL_TIGERLAKE) += pinctrl-tigerlake.o obj-$(CONFIG_PINCTRL_TIGERLAKE) += pinctrl-tigerlake.o
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -733,14 +734,12 @@ static const struct acpi_device_id adl_pinctrl_acpi_match[] = { ...@@ -733,14 +734,12 @@ static const struct acpi_device_id adl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, adl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, adl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(adl_pinctrl_pm_ops);
static struct platform_driver adl_pinctrl_driver = { static struct platform_driver adl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "alderlake-pinctrl", .name = "alderlake-pinctrl",
.acpi_match_table = adl_pinctrl_acpi_match, .acpi_match_table = adl_pinctrl_acpi_match,
.pm = &adl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(adl_pinctrl_driver); module_platform_driver(adl_pinctrl_driver);
......
This diff is collapsed.
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -1000,14 +1001,12 @@ static const struct platform_device_id bxt_pinctrl_platform_ids[] = { ...@@ -1000,14 +1001,12 @@ static const struct platform_device_id bxt_pinctrl_platform_ids[] = {
}; };
MODULE_DEVICE_TABLE(platform, bxt_pinctrl_platform_ids); MODULE_DEVICE_TABLE(platform, bxt_pinctrl_platform_ids);
static INTEL_PINCTRL_PM_OPS(bxt_pinctrl_pm_ops);
static struct platform_driver bxt_pinctrl_driver = { static struct platform_driver bxt_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_uid, .probe = intel_pinctrl_probe_by_uid,
.driver = { .driver = {
.name = "broxton-pinctrl", .name = "broxton-pinctrl",
.acpi_match_table = bxt_pinctrl_acpi_match, .acpi_match_table = bxt_pinctrl_acpi_match,
.pm = &bxt_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
.id_table = bxt_pinctrl_platform_ids, .id_table = bxt_pinctrl_platform_ids,
}; };
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -824,14 +825,12 @@ static const struct acpi_device_id cnl_pinctrl_acpi_match[] = { ...@@ -824,14 +825,12 @@ static const struct acpi_device_id cnl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, cnl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, cnl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(cnl_pinctrl_pm_ops);
static struct platform_driver cnl_pinctrl_driver = { static struct platform_driver cnl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "cannonlake-pinctrl", .name = "cannonlake-pinctrl",
.acpi_match_table = cnl_pinctrl_acpi_match, .acpi_match_table = cnl_pinctrl_acpi_match,
.pm = &cnl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(cnl_pinctrl_driver); module_platform_driver(cnl_pinctrl_driver);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -319,8 +320,6 @@ static const struct intel_pinctrl_soc_data cdf_soc_data = { ...@@ -319,8 +320,6 @@ static const struct intel_pinctrl_soc_data cdf_soc_data = {
.ncommunities = ARRAY_SIZE(cdf_communities), .ncommunities = ARRAY_SIZE(cdf_communities),
}; };
static INTEL_PINCTRL_PM_OPS(cdf_pinctrl_pm_ops);
static const struct acpi_device_id cdf_pinctrl_acpi_match[] = { static const struct acpi_device_id cdf_pinctrl_acpi_match[] = {
{ "INTC3001", (kernel_ulong_t)&cdf_soc_data }, { "INTC3001", (kernel_ulong_t)&cdf_soc_data },
{ } { }
...@@ -332,7 +331,7 @@ static struct platform_driver cdf_pinctrl_driver = { ...@@ -332,7 +331,7 @@ static struct platform_driver cdf_pinctrl_driver = {
.driver = { .driver = {
.name = "cedarfork-pinctrl", .name = "cedarfork-pinctrl",
.acpi_match_table = cdf_pinctrl_acpi_match, .acpi_match_table = cdf_pinctrl_acpi_match,
.pm = &cdf_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -249,8 +250,6 @@ static const struct intel_pinctrl_soc_data dnv_soc_data = { ...@@ -249,8 +250,6 @@ static const struct intel_pinctrl_soc_data dnv_soc_data = {
.ncommunities = ARRAY_SIZE(dnv_communities), .ncommunities = ARRAY_SIZE(dnv_communities),
}; };
static INTEL_PINCTRL_PM_OPS(dnv_pinctrl_pm_ops);
static const struct acpi_device_id dnv_pinctrl_acpi_match[] = { static const struct acpi_device_id dnv_pinctrl_acpi_match[] = {
{ "INTC3000", (kernel_ulong_t)&dnv_soc_data }, { "INTC3000", (kernel_ulong_t)&dnv_soc_data },
{ } { }
...@@ -268,7 +267,7 @@ static struct platform_driver dnv_pinctrl_driver = { ...@@ -268,7 +267,7 @@ static struct platform_driver dnv_pinctrl_driver = {
.driver = { .driver = {
.name = "denverton-pinctrl", .name = "denverton-pinctrl",
.acpi_match_table = dnv_pinctrl_acpi_match, .acpi_match_table = dnv_pinctrl_acpi_match,
.pm = &dnv_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
.id_table = dnv_pinctrl_platform_ids, .id_table = dnv_pinctrl_platform_ids,
}; };
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -485,14 +486,12 @@ static const struct acpi_device_id ehl_pinctrl_acpi_match[] = { ...@@ -485,14 +486,12 @@ static const struct acpi_device_id ehl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, ehl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, ehl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(ehl_pinctrl_pm_ops);
static struct platform_driver ehl_pinctrl_driver = { static struct platform_driver ehl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_uid, .probe = intel_pinctrl_probe_by_uid,
.driver = { .driver = {
.name = "elkhartlake-pinctrl", .name = "elkhartlake-pinctrl",
.acpi_match_table = ehl_pinctrl_acpi_match, .acpi_match_table = ehl_pinctrl_acpi_match,
.pm = &ehl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(ehl_pinctrl_driver); module_platform_driver(ehl_pinctrl_driver);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -358,14 +359,12 @@ static const struct acpi_device_id ebg_pinctrl_acpi_match[] = { ...@@ -358,14 +359,12 @@ static const struct acpi_device_id ebg_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, ebg_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, ebg_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(ebg_pinctrl_pm_ops);
static struct platform_driver ebg_pinctrl_driver = { static struct platform_driver ebg_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "emmitsburg-pinctrl", .name = "emmitsburg-pinctrl",
.acpi_match_table = ebg_pinctrl_acpi_match, .acpi_match_table = ebg_pinctrl_acpi_match,
.pm = &ebg_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(ebg_pinctrl_driver); module_platform_driver(ebg_pinctrl_driver);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -447,14 +448,12 @@ static const struct acpi_device_id glk_pinctrl_acpi_match[] = { ...@@ -447,14 +448,12 @@ static const struct acpi_device_id glk_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, glk_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, glk_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(glk_pinctrl_pm_ops);
static struct platform_driver glk_pinctrl_driver = { static struct platform_driver glk_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_uid, .probe = intel_pinctrl_probe_by_uid,
.driver = { .driver = {
.name = "geminilake-pinctrl", .name = "geminilake-pinctrl",
.acpi_match_table = glk_pinctrl_acpi_match, .acpi_match_table = glk_pinctrl_acpi_match,
.pm = &glk_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -668,8 +669,6 @@ static const struct intel_pinctrl_soc_data icln_soc_data = { ...@@ -668,8 +669,6 @@ static const struct intel_pinctrl_soc_data icln_soc_data = {
.ncommunities = ARRAY_SIZE(icln_communities), .ncommunities = ARRAY_SIZE(icln_communities),
}; };
static INTEL_PINCTRL_PM_OPS(icl_pinctrl_pm_ops);
static const struct acpi_device_id icl_pinctrl_acpi_match[] = { static const struct acpi_device_id icl_pinctrl_acpi_match[] = {
{ "INT3455", (kernel_ulong_t)&icllp_soc_data }, { "INT3455", (kernel_ulong_t)&icllp_soc_data },
{ "INT34C3", (kernel_ulong_t)&icln_soc_data }, { "INT34C3", (kernel_ulong_t)&icln_soc_data },
...@@ -682,7 +681,7 @@ static struct platform_driver icl_pinctrl_driver = { ...@@ -682,7 +681,7 @@ static struct platform_driver icl_pinctrl_driver = {
.driver = { .driver = {
.name = "icelake-pinctrl", .name = "icelake-pinctrl",
.acpi_match_table = icl_pinctrl_acpi_match, .acpi_match_table = icl_pinctrl_acpi_match,
.pm = &icl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(icl_pinctrl_driver); module_platform_driver(icl_pinctrl_driver);
......
// SPDX-License-Identifier: GPL-2.0
/*
* Intel PCH pinctrl/GPIO driver
*
* Copyright (C) 2021-2023, Intel Corporation
* Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
*/
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/property.h>
#include <linux/string_helpers.h>
#include <linux/pinctrl/pinctrl.h>
#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 = devm_kasprintf_strarray(dev, name, size);
if (IS_ERR(pin_names))
return PTR_ERR(pin_names);
descs = devm_krealloc_array(dev, pins->pins, base + size, sizeof(*descs), GFP_KERNEL);
if (!descs)
return -ENOMEM;
for (i = 0; i < size; i++) {
unsigned int pin_number = base + i;
char *pin_name = pin_names[i];
struct pinctrl_pin_desc *desc;
/* Unify delimiter for pin name */
strreplace(pin_name, '-', '_');
desc = &descs[pin_number];
desc->number = pin_number;
desc->name = pin_name;
}
pins->pins = descs;
pins->npins = 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 = pins->npins;
const char *name;
u32 size;
int ret;
ret = fwnode_property_read_string(child, "intc-gpio-group-name", &name);
if (ret)
return ret;
ret = fwnode_property_read_u32(child, "intc-gpio-pad-count", &size);
if (ret)
return ret;
ret = intel_platform_pinctrl_prepare_pins(dev, base, name, size, pins);
if (ret)
return ret;
gpp->base = base;
gpp->size = size;
gpp->gpio_base = 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 = device_property_read_u32(dev, "intc-gpio-pad-ownership-offset", &offset);
if (ret)
return ret;
community->padown_offset = offset;
ret = device_property_read_u32(dev, "intc-gpio-pad-configuration-lock-offset", &offset);
if (ret)
return ret;
community->padcfglock_offset = offset;
ret = device_property_read_u32(dev, "intc-gpio-host-software-pad-ownership-offset", &offset);
if (ret)
return ret;
community->hostown_offset = offset;
ret = device_property_read_u32(dev, "intc-gpio-gpi-interrupt-status-offset", &offset);
if (ret)
return ret;
community->is_offset = offset;
ret = device_property_read_u32(dev, "intc-gpio-gpi-interrupt-enable-offset", &offset);
if (ret)
return ret;
community->ie_offset = offset;
ngpps = device_get_child_node_count(dev);
if (!ngpps)
return -ENODEV;
gpps = devm_kcalloc(dev, ngpps, sizeof(*gpps), GFP_KERNEL);
if (!gpps)
return -ENOMEM;
group = 0;
device_for_each_child_node(dev, child) {
struct intel_padgroup *gpp = &gpps[group];
gpp->reg_num = group;
ret = intel_platform_pinctrl_prepare_group(dev, child, gpp, pins);
if (ret)
return ret;
group++;
}
community->ngpps = ngpps;
community->gpps = 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 = {};
struct intel_community *communities;
size_t ncommunities;
unsigned int i;
int ret;
/* Version 1.0 of the specification assumes only a single community per device node */
ncommunities = 1,
communities = devm_kcalloc(dev, ncommunities, sizeof(*communities), GFP_KERNEL);
if (!communities)
return -ENOMEM;
for (i = 0; i < ncommunities; i++) {
struct intel_community *community = &communities[i];
community->barno = i;
community->pin_base = pins.npins;
ret = intel_platform_pinctrl_prepare_community(dev, community, &pins);
if (ret)
return ret;
community->npins = pins.npins - community->pin_base;
}
data->ncommunities = ncommunities;
data->communities = communities;
data->npins = pins.npins;
data->pins = pins.pins;
return 0;
}
static int intel_platform_pinctrl_probe(struct platform_device *pdev)
{
struct intel_pinctrl_soc_data *data;
struct device *dev = &pdev->dev;
int ret;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
ret = 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[] = {
{ "INTC105F" },
{ }
};
MODULE_DEVICE_TABLE(acpi, intel_platform_pinctrl_acpi_match);
static struct platform_driver intel_platform_pinctrl_driver = {
.probe = intel_platform_pinctrl_probe,
.driver = {
.name = "intel-pinctrl",
.acpi_match_table = intel_platform_pinctrl_acpi_match,
.pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
},
};
module_platform_driver(intel_platform_pinctrl_driver);
MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
MODULE_DESCRIPTION("Intel PCH pinctrl/GPIO driver");
MODULE_LICENSE("GPL v2");
MODULE_IMPORT_NS(PINCTRL_INTEL);
...@@ -677,10 +677,6 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin, ...@@ -677,10 +677,6 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
u32 term = 0, up = 0, value; u32 term = 0, up = 0, value;
void __iomem *padcfg1; void __iomem *padcfg1;
/* Set default strength value in case none is given */
if (arg == 1)
arg = 5000;
switch (param) { switch (param) {
case PIN_CONFIG_BIAS_DISABLE: case PIN_CONFIG_BIAS_DISABLE:
break; break;
...@@ -690,6 +686,7 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin, ...@@ -690,6 +686,7 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
case 20000: case 20000:
term = PADCFG1_TERM_20K; term = PADCFG1_TERM_20K;
break; break;
case 1: /* Set default strength value in case none is given */
case 5000: case 5000:
term = PADCFG1_TERM_5K; term = PADCFG1_TERM_5K;
break; break;
...@@ -716,6 +713,7 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin, ...@@ -716,6 +713,7 @@ static int intel_config_set_pull(struct intel_pinctrl *pctrl, unsigned int pin,
case 20000: case 20000:
term = PADCFG1_TERM_20K; term = PADCFG1_TERM_20K;
break; break;
case 1: /* Set default strength value in case none is given */
case 5000: case 5000:
term = PADCFG1_TERM_5K; term = PADCFG1_TERM_5K;
break; break;
...@@ -899,7 +897,7 @@ static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned int offset, ...@@ -899,7 +897,7 @@ static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned int offset,
* *
* Return: a GPIO offset, or negative error code if translation can't be done. * Return: a GPIO offset, or negative error code if translation can't be done.
*/ */
static __maybe_unused int intel_pin_to_gpio(struct intel_pinctrl *pctrl, int pin) static int intel_pin_to_gpio(struct intel_pinctrl *pctrl, int pin)
{ {
const struct intel_community *community; const struct intel_community *community;
const struct intel_padgroup *padgrp; const struct intel_padgroup *padgrp;
...@@ -1506,8 +1504,8 @@ static int intel_pinctrl_probe_pwm(struct intel_pinctrl *pctrl, ...@@ -1506,8 +1504,8 @@ static int intel_pinctrl_probe_pwm(struct intel_pinctrl *pctrl,
return PTR_ERR_OR_ZERO(pwm); return PTR_ERR_OR_ZERO(pwm);
} }
static int intel_pinctrl_probe(struct platform_device *pdev, int intel_pinctrl_probe(struct platform_device *pdev,
const struct intel_pinctrl_soc_data *soc_data) const struct intel_pinctrl_soc_data *soc_data)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct intel_pinctrl *pctrl; struct intel_pinctrl *pctrl;
...@@ -1625,6 +1623,7 @@ static int intel_pinctrl_probe(struct platform_device *pdev, ...@@ -1625,6 +1623,7 @@ static int intel_pinctrl_probe(struct platform_device *pdev,
return 0; return 0;
} }
EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe, PINCTRL_INTEL);
int intel_pinctrl_probe_by_hid(struct platform_device *pdev) int intel_pinctrl_probe_by_hid(struct platform_device *pdev)
{ {
...@@ -1653,7 +1652,7 @@ EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_uid, PINCTRL_INTEL); ...@@ -1653,7 +1652,7 @@ EXPORT_SYMBOL_NS_GPL(intel_pinctrl_probe_by_uid, PINCTRL_INTEL);
const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_device *pdev) const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_device *pdev)
{ {
const struct intel_pinctrl_soc_data * const *table; const struct intel_pinctrl_soc_data * const *table;
const struct intel_pinctrl_soc_data *data = NULL; const struct intel_pinctrl_soc_data *data;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
table = device_get_match_data(dev); table = device_get_match_data(dev);
...@@ -1662,11 +1661,10 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_ ...@@ -1662,11 +1661,10 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_
unsigned int i; unsigned int i;
for (i = 0; table[i]; i++) { for (i = 0; table[i]; i++) {
if (acpi_dev_uid_match(adev, table[i]->uid)) { if (acpi_dev_uid_match(adev, table[i]->uid))
data = table[i];
break; break;
}
} }
data = table[i];
} else { } else {
const struct platform_device_id *id; const struct platform_device_id *id;
...@@ -1682,7 +1680,6 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_ ...@@ -1682,7 +1680,6 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_
} }
EXPORT_SYMBOL_NS_GPL(intel_pinctrl_get_soc_data, PINCTRL_INTEL); EXPORT_SYMBOL_NS_GPL(intel_pinctrl_get_soc_data, PINCTRL_INTEL);
#ifdef CONFIG_PM_SLEEP
static bool __intel_gpio_is_direct_irq(u32 value) static bool __intel_gpio_is_direct_irq(u32 value)
{ {
return (value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) && return (value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) &&
...@@ -1728,7 +1725,7 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int ...@@ -1728,7 +1725,7 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int
return false; return false;
} }
int intel_pinctrl_suspend_noirq(struct device *dev) static int intel_pinctrl_suspend_noirq(struct device *dev)
{ {
struct intel_pinctrl *pctrl = dev_get_drvdata(dev); struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
struct intel_community_context *communities; struct intel_community_context *communities;
...@@ -1771,7 +1768,6 @@ int intel_pinctrl_suspend_noirq(struct device *dev) ...@@ -1771,7 +1768,6 @@ int intel_pinctrl_suspend_noirq(struct device *dev)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(intel_pinctrl_suspend_noirq);
static bool intel_gpio_update_reg(void __iomem *reg, u32 mask, u32 value) static bool intel_gpio_update_reg(void __iomem *reg, u32 mask, u32 value)
{ {
...@@ -1838,7 +1834,7 @@ static void intel_restore_padcfg(struct intel_pinctrl *pctrl, unsigned int pin, ...@@ -1838,7 +1834,7 @@ static void intel_restore_padcfg(struct intel_pinctrl *pctrl, unsigned int pin,
dev_dbg(dev, "restored pin %u padcfg%u %#08x\n", pin, n, readl(padcfg)); dev_dbg(dev, "restored pin %u padcfg%u %#08x\n", pin, n, readl(padcfg));
} }
int intel_pinctrl_resume_noirq(struct device *dev) static int intel_pinctrl_resume_noirq(struct device *dev)
{ {
struct intel_pinctrl *pctrl = dev_get_drvdata(dev); struct intel_pinctrl *pctrl = dev_get_drvdata(dev);
const struct intel_community_context *communities; const struct intel_community_context *communities;
...@@ -1882,8 +1878,10 @@ int intel_pinctrl_resume_noirq(struct device *dev) ...@@ -1882,8 +1878,10 @@ int intel_pinctrl_resume_noirq(struct device *dev)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(intel_pinctrl_resume_noirq);
#endif EXPORT_NS_GPL_DEV_SLEEP_PM_OPS(intel_pinctrl_pm_ops, PINCTRL_INTEL) = {
NOIRQ_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend_noirq, intel_pinctrl_resume_noirq)
};
MODULE_AUTHOR("Mathias Nyman <mathias.nyman@linux.intel.com>"); MODULE_AUTHOR("Mathias Nyman <mathias.nyman@linux.intel.com>");
MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>"); MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
......
...@@ -252,19 +252,13 @@ struct intel_pinctrl { ...@@ -252,19 +252,13 @@ struct intel_pinctrl {
int irq; int irq;
}; };
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_hid(struct platform_device *pdev);
int intel_pinctrl_probe_by_uid(struct platform_device *pdev); int intel_pinctrl_probe_by_uid(struct platform_device *pdev);
#ifdef CONFIG_PM_SLEEP extern const struct dev_pm_ops intel_pinctrl_pm_ops;
int intel_pinctrl_suspend_noirq(struct device *dev);
int intel_pinctrl_resume_noirq(struct device *dev);
#endif
#define INTEL_PINCTRL_PM_OPS(_name) \
const struct dev_pm_ops _name = { \
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(intel_pinctrl_suspend_noirq, \
intel_pinctrl_resume_noirq) \
}
struct intel_community *intel_get_community(struct intel_pinctrl *pctrl, unsigned int pin); struct intel_community *intel_get_community(struct intel_pinctrl *pctrl, unsigned int pin);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -326,14 +327,12 @@ static const struct acpi_device_id jsl_pinctrl_acpi_match[] = { ...@@ -326,14 +327,12 @@ static const struct acpi_device_id jsl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, jsl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, jsl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(jsl_pinctrl_pm_ops);
static struct platform_driver jsl_pinctrl_driver = { static struct platform_driver jsl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "jasperlake-pinctrl", .name = "jasperlake-pinctrl",
.acpi_match_table = jsl_pinctrl_acpi_match, .acpi_match_table = jsl_pinctrl_acpi_match,
.pm = &jsl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(jsl_pinctrl_driver); module_platform_driver(jsl_pinctrl_driver);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -347,14 +348,12 @@ static const struct acpi_device_id lkf_pinctrl_acpi_match[] = { ...@@ -347,14 +348,12 @@ static const struct acpi_device_id lkf_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, lkf_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, lkf_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(lkf_pinctrl_pm_ops);
static struct platform_driver lkf_pinctrl_driver = { static struct platform_driver lkf_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "lakefield-pinctrl", .name = "lakefield-pinctrl",
.acpi_match_table = lkf_pinctrl_acpi_match, .acpi_match_table = lkf_pinctrl_acpi_match,
.pm = &lkf_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(lkf_pinctrl_driver); module_platform_driver(lkf_pinctrl_driver);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -301,8 +302,6 @@ static const struct intel_pinctrl_soc_data lbg_soc_data = { ...@@ -301,8 +302,6 @@ static const struct intel_pinctrl_soc_data lbg_soc_data = {
.ncommunities = ARRAY_SIZE(lbg_communities), .ncommunities = ARRAY_SIZE(lbg_communities),
}; };
static INTEL_PINCTRL_PM_OPS(lbg_pinctrl_pm_ops);
static const struct acpi_device_id lbg_pinctrl_acpi_match[] = { static const struct acpi_device_id lbg_pinctrl_acpi_match[] = {
{ "INT3536", (kernel_ulong_t)&lbg_soc_data }, { "INT3536", (kernel_ulong_t)&lbg_soc_data },
{ } { }
...@@ -314,7 +313,7 @@ static struct platform_driver lbg_pinctrl_driver = { ...@@ -314,7 +313,7 @@ static struct platform_driver lbg_pinctrl_driver = {
.driver = { .driver = {
.name = "lewisburg-pinctrl", .name = "lewisburg-pinctrl",
.acpi_match_table = lbg_pinctrl_acpi_match, .acpi_match_table = lbg_pinctrl_acpi_match,
.pm = &lbg_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(lbg_pinctrl_driver); module_platform_driver(lbg_pinctrl_driver);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/array_size.h> #include <linux/array_size.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/cleanup.h>
#include <linux/gpio/driver.h> #include <linux/gpio/driver.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -291,10 +292,9 @@ static int lp_pinmux_set_mux(struct pinctrl_dev *pctldev, ...@@ -291,10 +292,9 @@ static int lp_pinmux_set_mux(struct pinctrl_dev *pctldev,
{ {
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
const struct intel_pingroup *grp = &lg->soc->groups[group]; const struct intel_pingroup *grp = &lg->soc->groups[group];
unsigned long flags;
int i; int i;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
/* Now enable the mux setting for each pin in the group */ /* Now enable the mux setting for each pin in the group */
for (i = 0; i < grp->grp.npins; i++) { for (i = 0; i < grp->grp.npins; i++) {
...@@ -312,8 +312,6 @@ static int lp_pinmux_set_mux(struct pinctrl_dev *pctldev, ...@@ -312,8 +312,6 @@ static int lp_pinmux_set_mux(struct pinctrl_dev *pctldev,
iowrite32(value, reg); iowrite32(value, reg);
} }
raw_spin_unlock_irqrestore(&lg->lock, flags);
return 0; return 0;
} }
...@@ -334,10 +332,9 @@ static int lp_gpio_request_enable(struct pinctrl_dev *pctldev, ...@@ -334,10 +332,9 @@ static int lp_gpio_request_enable(struct pinctrl_dev *pctldev,
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
void __iomem *reg = lp_gpio_reg(&lg->chip, pin, LP_CONFIG1); void __iomem *reg = lp_gpio_reg(&lg->chip, pin, LP_CONFIG1);
void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2); void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2);
unsigned long flags;
u32 value; u32 value;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
/* /*
* Reconfigure pin to GPIO mode if needed and issue a warning, * Reconfigure pin to GPIO mode if needed and issue a warning,
...@@ -352,8 +349,6 @@ static int lp_gpio_request_enable(struct pinctrl_dev *pctldev, ...@@ -352,8 +349,6 @@ static int lp_gpio_request_enable(struct pinctrl_dev *pctldev,
/* Enable input sensing */ /* Enable input sensing */
lp_gpio_enable_input(conf2); lp_gpio_enable_input(conf2);
raw_spin_unlock_irqrestore(&lg->lock, flags);
return 0; return 0;
} }
...@@ -363,14 +358,11 @@ static void lp_gpio_disable_free(struct pinctrl_dev *pctldev, ...@@ -363,14 +358,11 @@ static void lp_gpio_disable_free(struct pinctrl_dev *pctldev,
{ {
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2); void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2);
unsigned long flags;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
/* Disable input sensing */ /* Disable input sensing */
lp_gpio_disable_input(conf2); lp_gpio_disable_input(conf2);
raw_spin_unlock_irqrestore(&lg->lock, flags);
} }
static int lp_gpio_set_direction(struct pinctrl_dev *pctldev, static int lp_gpio_set_direction(struct pinctrl_dev *pctldev,
...@@ -379,10 +371,9 @@ static int lp_gpio_set_direction(struct pinctrl_dev *pctldev, ...@@ -379,10 +371,9 @@ static int lp_gpio_set_direction(struct pinctrl_dev *pctldev,
{ {
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
void __iomem *reg = lp_gpio_reg(&lg->chip, pin, LP_CONFIG1); void __iomem *reg = lp_gpio_reg(&lg->chip, pin, LP_CONFIG1);
unsigned long flags;
u32 value; u32 value;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
value = ioread32(reg); value = ioread32(reg);
value &= ~DIR_BIT; value &= ~DIR_BIT;
...@@ -400,8 +391,6 @@ static int lp_gpio_set_direction(struct pinctrl_dev *pctldev, ...@@ -400,8 +391,6 @@ static int lp_gpio_set_direction(struct pinctrl_dev *pctldev,
} }
iowrite32(value, reg); iowrite32(value, reg);
raw_spin_unlock_irqrestore(&lg->lock, flags);
return 0; return 0;
} }
...@@ -421,13 +410,11 @@ static int lp_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin, ...@@ -421,13 +410,11 @@ static int lp_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2); void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2);
enum pin_config_param param = pinconf_to_config_param(*config); enum pin_config_param param = pinconf_to_config_param(*config);
unsigned long flags;
u32 value, pull; u32 value, pull;
u16 arg; u16 arg;
raw_spin_lock_irqsave(&lg->lock, flags); scoped_guard(raw_spinlock_irqsave, &lg->lock)
value = ioread32(conf2); value = ioread32(conf2);
raw_spin_unlock_irqrestore(&lg->lock, flags);
pull = value & GPIWP_MASK; pull = value & GPIWP_MASK;
...@@ -464,11 +451,10 @@ static int lp_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin, ...@@ -464,11 +451,10 @@ static int lp_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev); struct intel_pinctrl *lg = pinctrl_dev_get_drvdata(pctldev);
void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2); void __iomem *conf2 = lp_gpio_reg(&lg->chip, pin, LP_CONFIG2);
enum pin_config_param param; enum pin_config_param param;
unsigned long flags; unsigned int i;
int i, ret = 0;
u32 value; u32 value;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
value = ioread32(conf2); value = ioread32(conf2);
...@@ -489,19 +475,13 @@ static int lp_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin, ...@@ -489,19 +475,13 @@ static int lp_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
value |= GPIWP_UP; value |= GPIWP_UP;
break; break;
default: default:
ret = -ENOTSUPP; return -ENOTSUPP;
} }
if (ret)
break;
} }
if (!ret) iowrite32(value, conf2);
iowrite32(value, conf2);
raw_spin_unlock_irqrestore(&lg->lock, flags); return 0;
return ret;
} }
static const struct pinconf_ops lptlp_pinconf_ops = { static const struct pinconf_ops lptlp_pinconf_ops = {
...@@ -527,16 +507,13 @@ static void lp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) ...@@ -527,16 +507,13 @@ static void lp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{ {
struct intel_pinctrl *lg = gpiochip_get_data(chip); struct intel_pinctrl *lg = gpiochip_get_data(chip);
void __iomem *reg = lp_gpio_reg(chip, offset, LP_CONFIG1); void __iomem *reg = lp_gpio_reg(chip, offset, LP_CONFIG1);
unsigned long flags;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
if (value) if (value)
iowrite32(ioread32(reg) | OUT_LVL_BIT, reg); iowrite32(ioread32(reg) | OUT_LVL_BIT, reg);
else else
iowrite32(ioread32(reg) & ~OUT_LVL_BIT, reg); iowrite32(ioread32(reg) & ~OUT_LVL_BIT, reg);
raw_spin_unlock_irqrestore(&lg->lock, flags);
} }
static int lp_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) static int lp_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
...@@ -592,11 +569,10 @@ static void lp_irq_ack(struct irq_data *d) ...@@ -592,11 +569,10 @@ static void lp_irq_ack(struct irq_data *d)
struct intel_pinctrl *lg = gpiochip_get_data(gc); struct intel_pinctrl *lg = gpiochip_get_data(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_STAT); void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_STAT);
unsigned long flags;
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
iowrite32(BIT(hwirq % 32), reg); iowrite32(BIT(hwirq % 32), reg);
raw_spin_unlock_irqrestore(&lg->lock, flags);
} }
static void lp_irq_unmask(struct irq_data *d) static void lp_irq_unmask(struct irq_data *d)
...@@ -613,13 +589,11 @@ static void lp_irq_enable(struct irq_data *d) ...@@ -613,13 +589,11 @@ static void lp_irq_enable(struct irq_data *d)
struct intel_pinctrl *lg = gpiochip_get_data(gc); struct intel_pinctrl *lg = gpiochip_get_data(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_ENABLE); void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_ENABLE);
unsigned long flags;
gpiochip_enable_irq(gc, hwirq); gpiochip_enable_irq(gc, hwirq);
raw_spin_lock_irqsave(&lg->lock, flags); scoped_guard(raw_spinlock_irqsave, &lg->lock)
iowrite32(ioread32(reg) | BIT(hwirq % 32), reg); iowrite32(ioread32(reg) | BIT(hwirq % 32), reg);
raw_spin_unlock_irqrestore(&lg->lock, flags);
} }
static void lp_irq_disable(struct irq_data *d) static void lp_irq_disable(struct irq_data *d)
...@@ -628,11 +602,9 @@ static void lp_irq_disable(struct irq_data *d) ...@@ -628,11 +602,9 @@ static void lp_irq_disable(struct irq_data *d)
struct intel_pinctrl *lg = gpiochip_get_data(gc); struct intel_pinctrl *lg = gpiochip_get_data(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_ENABLE); void __iomem *reg = lp_gpio_reg(&lg->chip, hwirq, LP_INT_ENABLE);
unsigned long flags;
raw_spin_lock_irqsave(&lg->lock, flags); scoped_guard(raw_spinlock_irqsave, &lg->lock)
iowrite32(ioread32(reg) & ~BIT(hwirq % 32), reg); iowrite32(ioread32(reg) & ~BIT(hwirq % 32), reg);
raw_spin_unlock_irqrestore(&lg->lock, flags);
gpiochip_disable_irq(gc, hwirq); gpiochip_disable_irq(gc, hwirq);
} }
...@@ -642,7 +614,6 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -642,7 +614,6 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type)
struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
struct intel_pinctrl *lg = gpiochip_get_data(gc); struct intel_pinctrl *lg = gpiochip_get_data(gc);
irq_hw_number_t hwirq = irqd_to_hwirq(d); irq_hw_number_t hwirq = irqd_to_hwirq(d);
unsigned long flags;
void __iomem *reg; void __iomem *reg;
u32 value; u32 value;
...@@ -656,7 +627,8 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -656,7 +627,8 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type)
return -EBUSY; return -EBUSY;
} }
raw_spin_lock_irqsave(&lg->lock, flags); guard(raw_spinlock_irqsave)(&lg->lock);
value = ioread32(reg); value = ioread32(reg);
/* set both TRIG_SEL and INV bits to 0 for rising edge */ /* set both TRIG_SEL and INV bits to 0 for rising edge */
...@@ -682,8 +654,6 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type) ...@@ -682,8 +654,6 @@ static int lp_irq_set_type(struct irq_data *d, unsigned int type)
else if (type & IRQ_TYPE_LEVEL_MASK) else if (type & IRQ_TYPE_LEVEL_MASK)
irq_set_handler_locked(d, handle_level_irq); irq_set_handler_locked(d, handle_level_irq);
raw_spin_unlock_irqrestore(&lg->lock, flags);
return 0; return 0;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -589,14 +590,12 @@ static const struct acpi_device_id mtl_pinctrl_acpi_match[] = { ...@@ -589,14 +590,12 @@ static const struct acpi_device_id mtl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, mtl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, mtl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(mtl_pinctrl_pm_ops);
static struct platform_driver mtl_pinctrl_driver = { static struct platform_driver mtl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "meteorlake-pinctrl", .name = "meteorlake-pinctrl",
.acpi_match_table = mtl_pinctrl_acpi_match, .acpi_match_table = mtl_pinctrl_acpi_match,
.pm = &mtl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(mtl_pinctrl_driver); module_platform_driver(mtl_pinctrl_driver);
......
This diff is collapsed.
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -579,14 +580,12 @@ static const struct acpi_device_id spt_pinctrl_acpi_match[] = { ...@@ -579,14 +580,12 @@ static const struct acpi_device_id spt_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, spt_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, spt_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(spt_pinctrl_pm_ops);
static struct platform_driver spt_pinctrl_driver = { static struct platform_driver spt_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "sunrisepoint-pinctrl", .name = "sunrisepoint-pinctrl",
.acpi_match_table = spt_pinctrl_acpi_match, .acpi_match_table = spt_pinctrl_acpi_match,
.pm = &spt_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
*/ */
#include <linux/bits.h> #include <linux/bits.h>
#include <linux/cleanup.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -220,7 +221,6 @@ static int tng_pinmux_set_mux(struct pinctrl_dev *pctldev, ...@@ -220,7 +221,6 @@ static int tng_pinmux_set_mux(struct pinctrl_dev *pctldev,
const struct intel_pingroup *grp = &tp->groups[group]; const struct intel_pingroup *grp = &tp->groups[group];
u32 bits = grp->mode << BUFCFG_PINMODE_SHIFT; u32 bits = grp->mode << BUFCFG_PINMODE_SHIFT;
u32 mask = BUFCFG_PINMODE_MASK; u32 mask = BUFCFG_PINMODE_MASK;
unsigned long flags;
unsigned int i; unsigned int i;
/* /*
...@@ -232,11 +232,11 @@ static int tng_pinmux_set_mux(struct pinctrl_dev *pctldev, ...@@ -232,11 +232,11 @@ static int tng_pinmux_set_mux(struct pinctrl_dev *pctldev,
return -EBUSY; return -EBUSY;
} }
guard(raw_spinlock_irqsave)(&tp->lock);
/* Now enable the mux setting for each pin in the group */ /* Now enable the mux setting for each pin in the group */
raw_spin_lock_irqsave(&tp->lock, flags);
for (i = 0; i < grp->grp.npins; i++) for (i = 0; i < grp->grp.npins; i++)
tng_update_bufcfg(tp, grp->grp.pins[i], bits, mask); tng_update_bufcfg(tp, grp->grp.pins[i], bits, mask);
raw_spin_unlock_irqrestore(&tp->lock, flags);
return 0; return 0;
} }
...@@ -248,14 +248,13 @@ static int tng_gpio_request_enable(struct pinctrl_dev *pctldev, ...@@ -248,14 +248,13 @@ static int tng_gpio_request_enable(struct pinctrl_dev *pctldev,
struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev); struct tng_pinctrl *tp = pinctrl_dev_get_drvdata(pctldev);
u32 bits = BUFCFG_PINMODE_GPIO << BUFCFG_PINMODE_SHIFT; u32 bits = BUFCFG_PINMODE_GPIO << BUFCFG_PINMODE_SHIFT;
u32 mask = BUFCFG_PINMODE_MASK; u32 mask = BUFCFG_PINMODE_MASK;
unsigned long flags;
if (!tng_buf_available(tp, pin)) if (!tng_buf_available(tp, pin))
return -EBUSY; return -EBUSY;
raw_spin_lock_irqsave(&tp->lock, flags); guard(raw_spinlock_irqsave)(&tp->lock);
tng_update_bufcfg(tp, pin, bits, mask); tng_update_bufcfg(tp, pin, bits, mask);
raw_spin_unlock_irqrestore(&tp->lock, flags);
return 0; return 0;
} }
...@@ -360,7 +359,6 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin, ...@@ -360,7 +359,6 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin,
unsigned int param = pinconf_to_config_param(config); unsigned int param = pinconf_to_config_param(config);
unsigned int arg = pinconf_to_config_argument(config); unsigned int arg = pinconf_to_config_argument(config);
u32 mask, term, value = 0; u32 mask, term, value = 0;
unsigned long flags;
switch (param) { switch (param) {
case PIN_CONFIG_BIAS_DISABLE: case PIN_CONFIG_BIAS_DISABLE:
...@@ -368,20 +366,20 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin, ...@@ -368,20 +366,20 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin,
break; break;
case PIN_CONFIG_BIAS_PULL_UP: case PIN_CONFIG_BIAS_PULL_UP:
/* Set default strength value in case none is given */
if (arg == 1)
arg = 20000;
switch (arg) { switch (arg) {
case 50000: case 50000:
term = BUFCFG_PUPD_VAL_50K; term = BUFCFG_PUPD_VAL_50K;
break; break;
case 1: /* Set default strength value in case none is given */
case 20000: case 20000:
term = BUFCFG_PUPD_VAL_20K; term = BUFCFG_PUPD_VAL_20K;
break; break;
case 2000: case 2000:
term = BUFCFG_PUPD_VAL_2K; term = BUFCFG_PUPD_VAL_2K;
break; break;
case 910:
term = BUFCFG_PUPD_VAL_910;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -391,20 +389,20 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin, ...@@ -391,20 +389,20 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin,
break; break;
case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_DOWN:
/* Set default strength value in case none is given */
if (arg == 1)
arg = 20000;
switch (arg) { switch (arg) {
case 50000: case 50000:
term = BUFCFG_PUPD_VAL_50K; term = BUFCFG_PUPD_VAL_50K;
break; break;
case 1: /* Set default strength value in case none is given */
case 20000: case 20000:
term = BUFCFG_PUPD_VAL_20K; term = BUFCFG_PUPD_VAL_20K;
break; break;
case 2000: case 2000:
term = BUFCFG_PUPD_VAL_2K; term = BUFCFG_PUPD_VAL_2K;
break; break;
case 910:
term = BUFCFG_PUPD_VAL_910;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -432,9 +430,9 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin, ...@@ -432,9 +430,9 @@ static int tng_config_set_pin(struct tng_pinctrl *tp, unsigned int pin,
return -EINVAL; return -EINVAL;
} }
raw_spin_lock_irqsave(&tp->lock, flags); guard(raw_spinlock_irqsave)(&tp->lock);
tng_update_bufcfg(tp, pin, value, mask); tng_update_bufcfg(tp, pin, value, mask);
raw_spin_unlock_irqrestore(&tp->lock, flags);
return 0; return 0;
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h>
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
...@@ -743,14 +744,12 @@ static const struct acpi_device_id tgl_pinctrl_acpi_match[] = { ...@@ -743,14 +744,12 @@ static const struct acpi_device_id tgl_pinctrl_acpi_match[] = {
}; };
MODULE_DEVICE_TABLE(acpi, tgl_pinctrl_acpi_match); MODULE_DEVICE_TABLE(acpi, tgl_pinctrl_acpi_match);
static INTEL_PINCTRL_PM_OPS(tgl_pinctrl_pm_ops);
static struct platform_driver tgl_pinctrl_driver = { static struct platform_driver tgl_pinctrl_driver = {
.probe = intel_pinctrl_probe_by_hid, .probe = intel_pinctrl_probe_by_hid,
.driver = { .driver = {
.name = "tigerlake-pinctrl", .name = "tigerlake-pinctrl",
.acpi_match_table = tgl_pinctrl_acpi_match, .acpi_match_table = tgl_pinctrl_acpi_match,
.pm = &tgl_pinctrl_pm_ops, .pm = pm_sleep_ptr(&intel_pinctrl_pm_ops),
}, },
}; };
module_platform_driver(tgl_pinctrl_driver); module_platform_driver(tgl_pinctrl_driver);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment