From nobody Mon Feb 9 06:09:02 2026 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8B3E320CA9 for ; Fri, 14 Nov 2025 14:11:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129468; cv=none; b=FU+xgdP8z6VxGHlIK38fEsq3XCLqdsXCjl1de2UDic93KlrFJ0G8LQYhn+AX2pTnGKl/vLHZqlXG/CvfvdRtF9Q3U42q0lAAhhxD4gu9x1sBXdzWvhEoWg9t1bnmNKbhakZ45BKun/utxuDoEr5gcmESnIS0phaY20MBRSAi2WE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763129468; c=relaxed/simple; bh=wqc8bNzHacyAqxgyv6B/haW5mpIwAi4OJICexTaUa7k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=LcGQ7Q9n7QYLLp8aYk6Dho0z+J45YYui7dizNMN8SKBAc+XonNz+NQZNkKbna/1OmpUsLvwMigWGYp6xrjxC2xpUZjiUZDBSWtQUj607kC2/chUIUiHjOjgK2VkO4ErFbedwzeVCPrmcZsJ25t2sZMS5RRcNZudreAA9zRMEMJg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Kaqcgb3R; arc=none smtp.client-ip=209.85.218.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Kaqcgb3R" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-b713c7096f9so256158866b.3 for ; Fri, 14 Nov 2025 06:11:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1763129461; x=1763734261; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=P5i1aNz8H3encFDexaz8c63loY0QBYJOvJuXhfdmWlE=; b=Kaqcgb3RplgUZhMClnysxWVN9cBmFCh1Hp6EiHt6dWPbhQJIjugNURagWMIeTFSEMn 3niBW2+HT5JOXmF7XiZqseOPx1htX6tiesR497ks1nhK+ihMD4Pv2xlyD+443Vs1ICpX mJOQZRSmGJFxpK17Wq9+JUgqeHhsKD4Ud/0TG9wFQ569lo6Qx/YBfYBxUGP3IqOhDwyA VY/r+eBxBdTceOJvyBL11l6gLXhSWyxLF7jP6WaF4Ve9prBjvdQjD5rJ5B8B5oDa1K8p yeWuUBFWSxOLeeeC3Bjv8b2+K6M71bl7Hz+YppoUx1OV0YBU/z98YL+ViP03aILktIrL bahw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763129461; x=1763734261; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=P5i1aNz8H3encFDexaz8c63loY0QBYJOvJuXhfdmWlE=; b=PY7VrOGYYjvbNZFoeaO8Hq2GMVBA53vU3mX1jM2hQOxDezKR9BnheIaGtZDBcIGguO 3Gqr0w7N4HylrpNSOYO89TT4gegzm99ku2E38V3bYph6eBKTaS6YNU9oSKYzKJ1ZJNWG 3iorUfhHvfdmFNJwGcwvLX68T0CaQ+myOHIEveLoKtsg9Snf21T83Fa3gWQg7O7Bv5Zf bd4aQVglSlmmtKyYw+qRQRW1FjFP75kOsZyF1F8JLyXjqCcLX+mIad9o5NjiPRUayV/A QVRjteoFAI1cgEFOHduP8uteSn9RHI/HN3flwugujuqEv7UywX1kX1sErVnKb7sJ9BWf GKtQ== X-Forwarded-Encrypted: i=1; AJvYcCWRZApZEzh+0hc5bLIS+tFgomop5rftXnopS2N3L6Z4qH9zKuadIOXTTNe5p/5dFSuAT3Mesn9xFvJ4rkc=@vger.kernel.org X-Gm-Message-State: AOJu0YwzyyD4RqRONSsm2F2AJrtQj3veLR0RIqqul3zyhBVDNt0n1OSZ YVvj9tKEE82X7ekTgf69V4AzSoK9/QdbRK/Q4SejCUse5nf8YEs4W1wygejkA+t5HQc= X-Gm-Gg: ASbGncuvxeeWt+Vk9u3BeeI+Sh/UjgtLTpxPUFBunqRhWBNveQTJ2ux8ZP5tJZDQVXM L0yRnudVsqPNUPpbOgbBnpLshX+4yNR3Nba/nnCTpWvePJ8Uhi/FQERZd9RQpnNNcHjCbg4Xwue +xNlCpHWaW2vjX5CHVNySjRs3uXxDP9L3eOhW5KpvZJ6i2pLsocYE7e9JypoBoRBHUm6qsiR8dy 6HLzmdTl561h9khIrwFt9GZfkJpMvG4brDNSw5uT9o7bHxA/KjVWR3Gbirc/FM3t/2/FVGpVGzv un9jBIMZdeQ0rjZOskwTDPXCKH4pMaQeeVM0bw6wF4gMd+4/qjawLahyhCdYB5rICw6o6sfQ58a Iw8GZHJwjQLIm3XbBySICc5refXMWU5vs46xabxqhYJ8VCqR1Gh6d+CIlfx5aj97t/tvbNkMbLh 5VrSHvp6h6n38KRp67xYJQG+3fZXWP/CizsAecnv5ztr/SbVWUZ7YcKxUzvmrqnqTxttWD7/JGD J2vqQ== X-Google-Smtp-Source: AGHT+IF5NwlyBHtD12anUC4nI/Qmh/iP+mZgjMVwytdNsIYtuE0AXxcOg3RzCBmlLIyp3nwl3EYZlQ== X-Received: by 2002:a17:906:7307:b0:b73:5146:8b7b with SMTP id a640c23a62f3a-b73678e9981mr249590366b.36.1763129460930; Fri, 14 Nov 2025 06:11:00 -0800 (PST) Received: from puffmais2.c.googlers.com (180.192.141.34.bc.googleusercontent.com. [34.141.192.180]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b734fed90c0sm395728766b.65.2025.11.14.06.11.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Nov 2025 06:11:00 -0800 (PST) From: =?utf-8?q?Andr=C3=A9_Draszik?= Date: Fri, 14 Nov 2025 14:10:59 +0000 Subject: [PATCH] mfd: sec: Use chained IRQs for s2mpg10 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251114-s2mpg10-chained-irq-v1-1-34ddfa49c4cd@linaro.org> X-B4-Tracking: v=1; b=H4sIAHI4F2kC/x2MQQqAIBAAvyJ7bsGVDOor0UFstT1kpRCB9Pek4 zDMVCichQtMqkLmW4ocqQF1CvzmUmSUtTEYbSwR9VjMfkbS2KwkXlHyhdbr0Q4ctDMErTwzB3n +67y87werP1bZZQAAAA== X-Change-ID: 20251114-s2mpg10-chained-irq-5c0956ef0a21 To: Krzysztof Kozlowski , Lee Jones Cc: Peter Griffin , Tudor Ambarus , Will McVicker , Juan Yescas , Douglas Anderson , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org, =?utf-8?q?Andr=C3=A9_Draszik?= X-Mailer: b4 0.14.2 On S2MPG10 (and similar like S2MPG11), top-level interrupt status and mask registers exist which need to be unmasked to get the PMIC interrupts. This additional status doesn't seem to exist on other PMICs in the S2MP* family, and the S2MPG10 driver is manually dealing with masking and unmasking currently. The correct approach here is to register this hierarchy as chained interrupts, though, without any additional manual steps. Doing so will also simplify addition of other, similar, PMICs (like S2MPG11) in the future. Update the driver to do just that. Signed-off-by: Andr=C3=A9 Draszik --- This patch and https://lore.kernel.org/all/20251114-s5m-alarm-v1-0-c9b3bebae65f@linaro.org/ that I sent earlier will conflict due to patch context. I propose to have this one here merged first (as it should be more straight forward and I think it's simpler and hopefully less controversial), and then I can send a rebased version of the other series if you agree. --- drivers/mfd/sec-acpm.c | 23 +------------ drivers/mfd/sec-irq.c | 73 +++++++++++++++++++++++++++++++++++++= ++-- include/linux/mfd/samsung/irq.h | 6 ++++ 3 files changed, 77 insertions(+), 25 deletions(-) diff --git a/drivers/mfd/sec-acpm.c b/drivers/mfd/sec-acpm.c index 8b31c816d65b86c54a108fa994384abfac0e7da4..36622069a7885c9b5fc74329efe= c34e1e4bcc106 100644 --- a/drivers/mfd/sec-acpm.c +++ b/drivers/mfd/sec-acpm.c @@ -325,11 +325,6 @@ static struct regmap *sec_pmic_acpm_regmap_init(struct= device *dev, return regmap; } =20 -static void sec_pmic_acpm_mask_common_irqs(void *regmap_common) -{ - regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMMON_INT_S= RC); -} - static int sec_pmic_acpm_probe(struct platform_device *pdev) { struct regmap *regmap_common, *regmap_pmic, *regmap; @@ -360,15 +355,10 @@ static int sec_pmic_acpm_probe(struct platform_device= *pdev) shared_ctx->speedy_channel =3D pdata->speedy_channel; =20 regmap_common =3D sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACP= M_ACCESSTYPE_COMMON, - pdata->regmap_cfg_common, false); + pdata->regmap_cfg_common, true); if (IS_ERR(regmap_common)) return PTR_ERR(regmap_common); =20 - /* Mask all interrupts from 'common' block, until successful init */ - ret =3D regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMM= ON_INT_SRC); - if (ret) - return dev_err_probe(dev, ret, "failed to mask common block interrupts\n= "); - regmap_pmic =3D sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_= ACCESSTYPE_PMIC, pdata->regmap_cfg_pmic, false); if (IS_ERR(regmap_pmic)) @@ -391,17 +381,6 @@ static int sec_pmic_acpm_probe(struct platform_device = *pdev) if (device_property_read_bool(dev, "wakeup-source")) devm_device_init_wakeup(dev); =20 - /* Unmask PMIC interrupt from 'common' block, now that everything is in p= lace. */ - ret =3D regmap_clear_bits(regmap_common, S2MPG10_COMMON_INT_MASK, - S2MPG10_COMMON_INT_SRC_PMIC); - if (ret) - return dev_err_probe(dev, ret, "failed to unmask PMIC interrupt\n"); - - /* Mask all interrupts from 'common' block on shutdown */ - ret =3D devm_add_action_or_reset(dev, sec_pmic_acpm_mask_common_irqs, reg= map_common); - if (ret) - return ret; - return 0; } =20 diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c index c5c80b1ba104e6c5a55b442d2f10a8554201a961..d992e41e716dcdc060421e1db84= 75523842a12be 100644 --- a/drivers/mfd/sec-irq.c +++ b/drivers/mfd/sec-irq.c @@ -20,6 +20,12 @@ #include "sec-core.h" =20 static const struct regmap_irq s2mpg10_irqs[] =3D { + REGMAP_IRQ_REG(S2MPG10_COMMON_IRQ_PMIC, 0, S2MPG10_COMMON_INT_SRC_PMIC), + /* No documentation or other reference for remaining bits */ + REGMAP_IRQ_REG(S2MPG10_COMMON_IRQ_UNUSED, 0, GENMASK(7, 1)), +}; + +static const struct regmap_irq s2mpg10_pmic_irqs[] =3D { REGMAP_IRQ_REG(S2MPG10_IRQ_PWRONF, 0, S2MPG10_IRQ_PWRONF_MASK), REGMAP_IRQ_REG(S2MPG10_IRQ_PWRONR, 0, S2MPG10_IRQ_PWRONR_MASK), REGMAP_IRQ_REG(S2MPG10_IRQ_JIGONBF, 0, S2MPG10_IRQ_JIGONBF_MASK), @@ -183,11 +189,20 @@ static const struct regmap_irq s5m8767_irqs[] =3D { /* All S2MPG10 interrupt sources are read-only and don't require clearing = */ static const struct regmap_irq_chip s2mpg10_irq_chip =3D { .name =3D "s2mpg10", + .status_base =3D S2MPG10_COMMON_INT, + .mask_base =3D S2MPG10_COMMON_INT_MASK, + .num_regs =3D 1, .irqs =3D s2mpg10_irqs, .num_irqs =3D ARRAY_SIZE(s2mpg10_irqs), - .num_regs =3D 6, +}; + +static const struct regmap_irq_chip s2mpg10_irq_chip_pmic =3D { + .name =3D "s2mpg10-pmic", .status_base =3D S2MPG10_PMIC_INT1, .mask_base =3D S2MPG10_PMIC_INT1M, + .num_regs =3D 6, + .irqs =3D s2mpg10_pmic_irqs, + .num_irqs =3D ARRAY_SIZE(s2mpg10_pmic_irqs), }; =20 static const struct regmap_irq_chip s2mps11_irq_chip =3D { @@ -253,6 +268,59 @@ static const struct regmap_irq_chip s5m8767_irq_chip = =3D { .ack_base =3D S5M8767_REG_INT1, }; =20 +static int s2mpg1x_add_chained_irq_chip(struct device *dev, struct regmap = *regmap, int pirq, + struct regmap_irq_chip_data *parent, + const struct regmap_irq_chip *chip, + struct regmap_irq_chip_data **data) +{ + int irq, ret; + + irq =3D regmap_irq_get_virq(parent, pirq); + if (irq < 0) + return dev_err_probe(dev, irq, "Failed to get parent vIRQ(%d) for chip %= s\n", pirq, + chip->name); + + ret =3D devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT | IRQF_SH= ARED, 0, chip, data); + if (ret) + return dev_err_probe(dev, ret, "Failed to add %s IRQ chip\n", chip->name= ); + + return 0; +} + +static int sec_irq_init_s2mpg1x(struct sec_pmic_dev *sec_pmic) +{ + const struct regmap_irq_chip *irq_chip, *chained_irq_chip; + struct regmap_irq_chip_data *irq_data; + struct regmap *regmap_common; + int chained_pirq; + int ret; + + switch (sec_pmic->device_type) { + case S2MPG10: + irq_chip =3D &s2mpg10_irq_chip; + chained_irq_chip =3D &s2mpg10_irq_chip_pmic; + chained_pirq =3D S2MPG10_COMMON_IRQ_PMIC; + break; + default: + return dev_err_probe(sec_pmic->dev, -EINVAL, "Unsupported device type %d= \n", + sec_pmic->device_type); + }; + + regmap_common =3D dev_get_regmap(sec_pmic->dev, "common"); + if (!regmap_common) + return dev_err_probe(sec_pmic->dev, -EINVAL, "No 'common' regmap %d\n", + sec_pmic->device_type); + + ret =3D devm_regmap_add_irq_chip(sec_pmic->dev, regmap_common, sec_pmic->= irq, IRQF_ONESHOT, 0, + irq_chip, &irq_data); + if (ret) + return dev_err_probe(sec_pmic->dev, ret, "Failed to add %s IRQ chip\n", + irq_chip->name); + + return s2mpg1x_add_chained_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic,= chained_pirq, + irq_data, chained_irq_chip, &sec_pmic->irq_data); +} + int sec_irq_init(struct sec_pmic_dev *sec_pmic) { const struct regmap_irq_chip *sec_irq_chip; @@ -268,8 +336,7 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic) sec_irq_chip =3D &s2mps14_irq_chip; break; case S2MPG10: - sec_irq_chip =3D &s2mpg10_irq_chip; - break; + return sec_irq_init_s2mpg1x(sec_pmic); case S2MPS11X: sec_irq_chip =3D &s2mps11_irq_chip; break; diff --git a/include/linux/mfd/samsung/irq.h b/include/linux/mfd/samsung/ir= q.h index b4805cbd949bd605004bd88cf361109d1cbbc3bf..8402a5f8e18ab62b4bec89541d7= 85442674adee0 100644 --- a/include/linux/mfd/samsung/irq.h +++ b/include/linux/mfd/samsung/irq.h @@ -57,6 +57,12 @@ enum s2mpa01_irq { #define S2MPA01_IRQ_B24_TSD_MASK (1 << 4) #define S2MPA01_IRQ_B35_TSD_MASK (1 << 5) =20 +enum s2mpg10_common_irq { + /* Top-level (common) block */ + S2MPG10_COMMON_IRQ_PMIC, + S2MPG10_COMMON_IRQ_UNUSED, +}; + enum s2mpg10_irq { /* PMIC */ S2MPG10_IRQ_PWRONF, --- base-commit: b179ce312bafcb8c68dc718e015aee79b7939ff0 change-id: 20251114-s2mpg10-chained-irq-5c0956ef0a21 Best regards, --=20 Andr=C3=A9 Draszik