From nobody Fri Oct 3 19:11:43 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 548193469E3; Tue, 26 Aug 2025 13:46:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216002; cv=none; b=q9x3ZGVKI+/+1Rq3JbWNl1dJsY+pRwnRYBgWgGSpiGjWXFQof0NUQlth2/A1APG9G9RbAVMB5Y+Qf4eAFzuveZ3B9B3IcfnxLAcjt3QNlmDZfzDyaGyMpGGlQ4bxLUrUTEGxPX2ULY++ymRIqn/NlNGc4o2g7/F6/Zuil+NiyGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216002; c=relaxed/simple; bh=e8tqXpBe33EP37rpAKaiTY6qWMS6bARYy+kyi3t+lnU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qD3gNmlSWZ2Jr/p7f2seHCYEppteN/5y5krNDzktLsS/AR4dsP28cYs3sxahSXgt31yIvUR6JWoC3v1ogTHLcXN61TJPevDW9sat6MaoieonqTOFPt1O6BAECbdBBFzXYFvxkmHpisjjFYqknHRv5fBcEtE3i59HqLzfXxTcZDA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YEhvkCKa; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YEhvkCKa" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A6865C4CEF1; Tue, 26 Aug 2025 13:46:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756216002; bh=e8tqXpBe33EP37rpAKaiTY6qWMS6bARYy+kyi3t+lnU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YEhvkCKaKTv/Vl3Yqacw8rRUCtGD3W9ueOe2xsKjJUInh5VtZfAoEbIEHYEX/mVRu Bru2JfpnaMAw/Pgzi1GuMrz9QbJcC4fwuTy/yH1LAsLlbsnLNoB3Loiy4h7rxGcfqf tM8HXJ+xmEpXYFWwphcJ/T+GKTT9kSCNVycHmDTGcmdedjZLFj9HbpIykvpkmxZHkL 8ogKp8Hs7eCKhhLiVrY1xYZ9dhQ/vvM7+kIYyj7olqO+2plJFa+i1gxy4Vj4QA8BU0 hxJ+IPDV1+kBXuE+L5dcwVM7pNwobSdrkZVE3kk1r1QNHqM/lGKdNLzrUYBCN1r9wC B0tlAnJ+r302A== From: Michael Walle To: Dmitry Torokhov , Lee Jones Cc: jcormier@criticallink.com, Job Sava , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, Michael Walle Subject: [PATCH v2 1/3] input: tps6594-pwrbutton: Add power button functionality Date: Tue, 26 Aug 2025 15:46:29 +0200 Message-Id: <20250826134631.1499936-2-mwalle@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250826134631.1499936-1-mwalle@kernel.org> References: <20250826134631.1499936-1-mwalle@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Job Sava TPS6594 defines two interrupts for the power button one for push and one for release. This driver is very simple in that it maps the push interrupt to a key input and the release interrupt to a key release. Signed-off-by: Job Sava Acked-by: Dmitry Torokhov Signed-off-by: Michael Walle --- v2: - moved the mfd part into a seperate patch --- drivers/input/misc/Kconfig | 10 ++ drivers/input/misc/Makefile | 1 + drivers/input/misc/tps6594-pwrbutton.c | 126 +++++++++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 drivers/input/misc/tps6594-pwrbutton.c diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 0fb21c99a5e3..cce51358242f 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -506,6 +506,16 @@ config INPUT_TPS65219_PWRBUTTON To compile this driver as a module, choose M here. The module will be called tps65219-pwrbutton. =20 +config INPUT_TPS6594_PWRBUTTON + tristate "TPS6594 Power button driver" + depends on MFD_TPS6594 + help + Say Y here if you want to enable power button reporting for + TPS6594 Power Management IC devices. + + To compile this driver as a module, choose M here. The module will + be called tps6594-pwrbutton. + config INPUT_AXP20X_PEK tristate "X-Powers AXP20X power button driver" depends on MFD_AXP20X diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index d468c8140b93..bb12f883851c 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -83,6 +83,7 @@ obj-$(CONFIG_INPUT_SPARCSPKR) +=3D sparcspkr.o obj-$(CONFIG_INPUT_STPMIC1_ONKEY) +=3D stpmic1_onkey.o obj-$(CONFIG_INPUT_TPS65218_PWRBUTTON) +=3D tps65218-pwrbutton.o obj-$(CONFIG_INPUT_TPS65219_PWRBUTTON) +=3D tps65219-pwrbutton.o +obj-$(CONFIG_INPUT_TPS6594_PWRBUTTON) +=3D tps6594-pwrbutton.o obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) +=3D twl4030-pwrbutton.o obj-$(CONFIG_INPUT_TWL4030_VIBRA) +=3D twl4030-vibra.o obj-$(CONFIG_INPUT_TWL6040_VIBRA) +=3D twl6040-vibra.o diff --git a/drivers/input/misc/tps6594-pwrbutton.c b/drivers/input/misc/tp= s6594-pwrbutton.c new file mode 100644 index 000000000000..cd039b3866dc --- /dev/null +++ b/drivers/input/misc/tps6594-pwrbutton.c @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * power button driver for TI TPS6594 PMICs + * + * Copyright (C) 2025 Critical Link LLC - https://www.criticallink.com/ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct tps6594_pwrbutton { + struct device *dev; + struct input_dev *idev; + char phys[32]; +}; + +static irqreturn_t tps6594_pb_push_irq(int irq, void *_pwr) +{ + struct tps6594_pwrbutton *pwr =3D _pwr; + + input_report_key(pwr->idev, KEY_POWER, 1); + pm_wakeup_event(pwr->dev, 0); + input_sync(pwr->idev); + + return IRQ_HANDLED; +} + +static irqreturn_t tps6594_pb_release_irq(int irq, void *_pwr) +{ + struct tps6594_pwrbutton *pwr =3D _pwr; + + input_report_key(pwr->idev, KEY_POWER, 0); + input_sync(pwr->idev); + + return IRQ_HANDLED; +} + +static int tps6594_pb_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct tps6594_pwrbutton *pwr; + struct input_dev *idev; + int error; + int push_irq; + int release_irq; + + pwr =3D devm_kzalloc(dev, sizeof(*pwr), GFP_KERNEL); + if (!pwr) + return -ENOMEM; + + idev =3D devm_input_allocate_device(dev); + if (!idev) + return -ENOMEM; + + idev->name =3D pdev->name; + snprintf(pwr->phys, sizeof(pwr->phys), "%s/input0", + pdev->name); + idev->phys =3D pwr->phys; + idev->id.bustype =3D BUS_I2C; + + input_set_capability(idev, EV_KEY, KEY_POWER); + + pwr->dev =3D dev; + pwr->idev =3D idev; + device_init_wakeup(dev, true); + + push_irq =3D platform_get_irq(pdev, 0); + if (push_irq < 0) + return -EINVAL; + + release_irq =3D platform_get_irq(pdev, 1); + if (release_irq < 0) + return -EINVAL; + + error =3D devm_request_threaded_irq(dev, push_irq, NULL, + tps6594_pb_push_irq, + IRQF_ONESHOT, + pdev->resource[0].name, pwr); + if (error) { + dev_err(dev, "failed to request push IRQ #%d: %d\n", push_irq, + error); + return error; + } + + error =3D devm_request_threaded_irq(dev, release_irq, NULL, + tps6594_pb_release_irq, + IRQF_ONESHOT, + pdev->resource[1].name, pwr); + if (error) { + dev_err(dev, "failed to request release IRQ #%d: %d\n", + release_irq, error); + return error; + } + + error =3D input_register_device(idev); + if (error) { + dev_err(dev, "Can't register power button: %d\n", error); + return error; + } + + return 0; +} + +static const struct platform_device_id tps6594_pwrbtn_id_table[] =3D { + { "tps6594-pwrbutton", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(platform, tps6594_pwrbtn_id_table); + +static struct platform_driver tps6594_pb_driver =3D { + .probe =3D tps6594_pb_probe, + .driver =3D { + .name =3D "tps6594_pwrbutton", + }, + .id_table =3D tps6594_pwrbtn_id_table, +}; +module_platform_driver(tps6594_pb_driver); + +MODULE_DESCRIPTION("TPS6594 Power Button"); +MODULE_LICENSE("GPL"); --=20 2.39.5 From nobody Fri Oct 3 19:11:43 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4371534DCE0; Tue, 26 Aug 2025 13:46:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216004; cv=none; b=IVJgknmBG5t+M+ng6omGMeGofiqKiAW5Jb53n9JtWy9BdKYoIyQkJXLyrF/P6r3p60aJ96oJ5LvMaisZgWo/XSZFird3K+EPzgjc4746A6i8DRe9vgdK0jnBE28GnYnye/wNMOg6ee5sjZNdxs0UZn4ySH0xdo/r4kmsTGyBG20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216004; c=relaxed/simple; bh=m9GeSia0h/hVXBSTHS2s4MKOCJv9PQTagZv5avUTLh8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mt0DdBdHkjAERyKa8/ujA5P7yJOVkQSGnETa1pA76wDFaIcWvTxhW91DhbQIsYYSyNGxytX2z7ST8uhM3GA8EDeJRpEP+TdP0skkPxV4QMbV4sSZJh/8Dw40Qnigc6T4sIDgJzorBPW9gYMsZ0dTXGQdMrB9OQhX7J4eeAMUKR8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=BOfzz6z4; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="BOfzz6z4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 88CF4C116D0; Tue, 26 Aug 2025 13:46:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756216004; bh=m9GeSia0h/hVXBSTHS2s4MKOCJv9PQTagZv5avUTLh8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BOfzz6z4H4S4mGd1d4e6/27Ch7z0x17SxSWTwJhMo7jSNl8P6HzKy/h/0xb+2bjFw qoVBf5jN418J6ALU4CWgovU+fp2Q/LIAMous646rMN+1KQNQu9EFi93BKUSI98vFjK yjUD5I96LZOchRTncdX7FBJV7TC+mvYknuqIRg6+5mYwyYpiFCAg/9udY6mp1o+kLk gc7v4P8J30A4b/K1A+6Muxx7cPg2teon1KOrjpWo21R2s078i+lQfY4om3iBOH7VeU VRVrpVjoDcxlQbSHOEVjqJW5U0oACarOHrK2l0f3f7Yxe/uZHMulRrE1hpjYKAWhfa frDwSSHgcsyrw== From: Michael Walle To: Dmitry Torokhov , Lee Jones Cc: jcormier@criticallink.com, Job Sava , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, Michael Walle Subject: [PATCH v2 2/3] mfd: tps6594: add power button functionality Date: Tue, 26 Aug 2025 15:46:30 +0200 Message-Id: <20250826134631.1499936-3-mwalle@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250826134631.1499936-1-mwalle@kernel.org> References: <20250826134631.1499936-1-mwalle@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The PMIC has a multi-function pin PB/EN/VSENSE. If it is configured as push-button (PB), add the corresponding device for it. Co-developed-by: Job Sava Signed-off-by: Job Sava Signed-off-by: Michael Walle --- v2: - new patch, these bits were previously part of another patch - don't use "ti,power-button" to decide whether to add the power-button device, but read the configuration register of the pin, whose default value is stored in the OTP memory of the chip --- drivers/mfd/tps6594-core.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/tps6594-core.c b/drivers/mfd/tps6594-core.c index c16c37e36617..9195c9059489 100644 --- a/drivers/mfd/tps6594-core.c +++ b/drivers/mfd/tps6594-core.c @@ -20,6 +20,8 @@ #include =20 #define TPS6594_CRC_SYNC_TIMEOUT_MS 150 +#define TPS65224_EN_SEL_PB 1 +#define TPS65224_GPIO3_SEL_PB 3 =20 /* Completion to synchronize CRC feature enabling on all PMICs */ static DECLARE_COMPLETION(tps6594_crc_comp); @@ -128,6 +130,12 @@ static const struct resource tps6594_rtc_resources[] = =3D { DEFINE_RES_IRQ_NAMED(TPS6594_IRQ_POWER_UP, TPS6594_IRQ_NAME_POWERUP), }; =20 +static const struct resource tps6594_pwrbutton_resources[] =3D { + DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_FALL, TPS65224_IRQ_NAME_PB_FALL), + DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_RISE, TPS65224_IRQ_NAME_PB_RISE), + DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_SHORT, TPS65224_IRQ_NAME_PB_SHORT), +}; + static const struct mfd_cell tps6594_common_cells[] =3D { MFD_CELL_RES("tps6594-regulator", tps6594_regulator_resources), MFD_CELL_RES("tps6594-pinctrl", tps6594_pinctrl_resources), @@ -318,8 +326,6 @@ static const struct resource tps65224_pfsm_resources[] = =3D { DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_REG_UNLOCK, TPS65224_IRQ_NAME_REG_UNLOC= K), DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_TWARN, TPS65224_IRQ_NAME_TWARN), DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_LONG, TPS65224_IRQ_NAME_PB_LONG), - DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_FALL, TPS65224_IRQ_NAME_PB_FALL), - DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_PB_RISE, TPS65224_IRQ_NAME_PB_RISE), DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_TSD_ORD, TPS65224_IRQ_NAME_TSD_ORD), DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_BIST_FAIL, TPS65224_IRQ_NAME_BIST_FAIL), DEFINE_RES_IRQ_NAMED(TPS65224_IRQ_REG_CRC_ERR, TPS65224_IRQ_NAME_REG_CRC_= ERR), @@ -347,6 +353,12 @@ static const struct mfd_cell tps65224_common_cells[] = =3D { MFD_CELL_RES("tps6594-regulator", tps65224_regulator_resources), }; =20 +static const struct mfd_cell tps6594_pwrbutton_cell =3D { + .name =3D "tps6594-pwrbutton", + .resources =3D tps6594_pwrbutton_resources, + .num_resources =3D ARRAY_SIZE(tps6594_pwrbutton_resources), +}; + static const struct regmap_irq tps65224_irqs[] =3D { /* INT_BUCK register */ REGMAP_IRQ_REG(TPS65224_IRQ_BUCK1_UVOV, 0, TPS65224_BIT_BUCK1_UVOV_INT), @@ -681,6 +693,7 @@ int tps6594_device_init(struct tps6594 *tps, bool enabl= e_crc) struct device *dev =3D tps->dev; int ret; struct regmap_irq_chip *irq_chip; + unsigned int pwr_on, gpio3_cfg; const struct mfd_cell *cells; int n_cells; =20 @@ -727,6 +740,27 @@ int tps6594_device_init(struct tps6594 *tps, bool enab= le_crc) if (ret) return dev_err_probe(dev, ret, "Failed to add common child devices\n"); =20 + /* If either the PB/EN/VSENSE or GPIO3 is configured as PB, register a dr= iver for it */ + if (tps->chip_id =3D=3D TPS65224 || tps->chip_id =3D=3D TPS652G1) { + ret =3D regmap_read(tps->regmap, TPS6594_REG_NPWRON_CONF, &pwr_on); + if (ret) + return dev_err_probe(dev, ret, "Failed to read PB/EN/VSENSE config\n"); + + ret =3D regmap_read(tps->regmap, TPS6594_REG_GPIOX_CONF(2), &gpio3_cfg); + if (ret) + return dev_err_probe(dev, ret, "Failed to read GPIO3 config\n"); + + if (FIELD_GET(TPS65224_MASK_EN_PB_VSENSE_CONFIG, pwr_on) =3D=3D TPS65224= _EN_SEL_PB || + FIELD_GET(TPS65224_MASK_GPIO_SEL, gpio3_cfg) =3D=3D TPS65224_GPIO3_S= EL_PB) { + ret =3D devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, + &tps6594_pwrbutton_cell, 1, NULL, 0, + regmap_irq_get_domain(tps->irq_data)); + if (ret) + return dev_err_probe(dev, ret, + "Failed to add power button device.\n"); + } + } + /* No RTC for LP8764, TPS65224 and TPS652G1 */ if (tps->chip_id !=3D LP8764 && tps->chip_id !=3D TPS65224 && tps->chip_i= d !=3D TPS652G1) { ret =3D devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, tps6594_rtc_cells, --=20 2.39.5 From nobody Fri Oct 3 19:11:43 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A09234F460; Tue, 26 Aug 2025 13:46:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216006; cv=none; b=cFczMkwNY9RrKgGaYbPT9ZYpYPD3k06nHZHkGcMYKQEPDfRrfp2C/rC0JtyRCxhoedr6BXqQBtwv5p6PkT6aZvXSj+jpp733bb4xoqJTFROOUe6zqYgsIcxAG+SqHwQrGy5WrJ5bBUz5X0X+uqQGh3G1hNudMyXubRjxCcfhSfo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756216006; c=relaxed/simple; bh=AAH1An4dME/NHFSM/pFOMD8DZ8SYdIRvJf7aDrJZdFs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Iekk7Rwh7Ncds9cAK+wWgDuIQs7ACYJo9t9XZ2kNxVaa5nrVTtrfLdu1CUC4a6cSe7xRAMikws3MyazXHgnjtYfkbSOwGpqS/vtZMbSLK6e1zkISRefCCgMkfAo1pdzSUVKh1weyc+R95o374DFfeYCSaPcCByEdT1Bmncarj2A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B2811dIm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B2811dIm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6CD57C4CEF1; Tue, 26 Aug 2025 13:46:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1756216005; bh=AAH1An4dME/NHFSM/pFOMD8DZ8SYdIRvJf7aDrJZdFs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B2811dImBTJdaljtQDbuVrXRMHjWETRARaTNmSFdBVZnXrswCYH8HDM/PqIitRhh2 w2TsJrNPctccrFK82j7bUFmzfxhVnFb+INrhy3c9xEdJOD0QJrhc6ozyMzsx9tzeGK pDJtx01Puj2AbvMDkHchlfQonJeReZrnQLZbj3mElqz4Z0/ihQMJJTnhDmlvB4mwru 4i2D6rr4spFcYh6nSMvmTqyQpkibLFwERIGY1NtvMYeF8TBadp4c+XCczdT4a6XoVf k2zZrKDbDfc/tN42LEGfIo2LEAf1DBAai8C37NXvp5pMdEhqxEYgZf213iabz3iHv8 Iwqw1S5h4CiGg== From: Michael Walle To: Dmitry Torokhov , Lee Jones Cc: jcormier@criticallink.com, Job Sava , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, Michael Walle Subject: [PATCH v2 3/3] mfd: tps6594: Add board power-off support Date: Tue, 26 Aug 2025 15:46:31 +0200 Message-Id: <20250826134631.1499936-4-mwalle@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250826134631.1499936-1-mwalle@kernel.org> References: <20250826134631.1499936-1-mwalle@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a system level power-off handler if the "system-power-controller" flag is set for this device in the device tree. A power-off request is triggered by writing the TRIGGER_I2C_0 bit (which is actually just a convention and really depends on the freely programmable FSM). Co-developed-by: Job Sava Signed-off-by: Job Sava Signed-off-by: Michael Walle --- v2: - incoroprate feedback from Lee Jones. - use of_device_is_system_power_controller() instead of open coding it - handle errors in power_off handler --- drivers/mfd/tps6594-core.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/mfd/tps6594-core.c b/drivers/mfd/tps6594-core.c index 9195c9059489..7127af7142f5 100644 --- a/drivers/mfd/tps6594-core.c +++ b/drivers/mfd/tps6594-core.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 #include #include @@ -688,6 +689,19 @@ static int tps6594_enable_crc(struct tps6594 *tps) return ret; } =20 +static int tps6594_power_off_handler(struct sys_off_data *data) +{ + struct tps6594 *tps =3D data->cb_data; + int ret; + + ret =3D regmap_update_bits(tps->regmap, TPS6594_REG_FSM_I2C_TRIGGERS, + TPS6594_BIT_TRIGGER_I2C(0), TPS6594_BIT_TRIGGER_I2C(0)); + if (ret) + return notifier_from_errno(ret); + + return NOTIFY_DONE; +} + int tps6594_device_init(struct tps6594 *tps, bool enable_crc) { struct device *dev =3D tps->dev; @@ -770,6 +784,12 @@ int tps6594_device_init(struct tps6594 *tps, bool enab= le_crc) return dev_err_probe(dev, ret, "Failed to add RTC child device\n"); } =20 + if (of_device_is_system_power_controller(dev->of_node)) { + ret =3D devm_register_power_off_handler(tps->dev, tps6594_power_off_hand= ler, tps); + if (ret) + return dev_err_probe(dev, ret, "Failed to register power-off handler\n"= ); + } + return 0; } EXPORT_SYMBOL_GPL(tps6594_device_init); --=20 2.39.5