From: "Rafael J. Wysocki" <rafael@kernel.org>
To: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Peter Huewe <peterhuewe@gmx.de>, Jason Gunthorpe <jgg@ziepe.ca>,
linux-integrity@vger.kernel.org,
LKML <linux-kernel@vger.kernel.org>,
Linux ACPI <linux-acpi@vger.kernel.org>
Subject: [PATCH v1] tpm_crb: Convert ACPI driver to a platform one
Date: Mon, 23 Feb 2026 16:55:21 +0100 [thread overview]
Message-ID: <2706178.Lt9SDvczpP@rafael.j.wysocki> (raw)
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
In all cases in which a struct acpi_driver is used for binding a driver
to an ACPI device object, a corresponding platform device is created by
the ACPI core and that device is regarded as a proper representation of
underlying hardware. Accordingly, a struct platform_driver should be
used by driver code to bind to that device. There are multiple reasons
why drivers should not bind directly to ACPI device objects [1].
Overall, it is better to bind drivers to platform devices than to their
ACPI companions, so convert the tpm_crb ACPI driver to a platform one.
While this is not expected to alter functionality, it changes sysfs
layout and so it will be visible to user space.
Link: https://lore.kernel.org/all/2396510.ElGaqSPkdT@rafael.j.wysocki/ [1]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/char/tpm/tpm_crb.c | 35 ++++++++++++++++-------------------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c
index 6c25305c256e..7d1377e8e616 100644
--- a/drivers/char/tpm/tpm_crb.c
+++ b/drivers/char/tpm/tpm_crb.c
@@ -15,6 +15,7 @@
#include <linux/highmem.h>
#include <linux/rculist.h>
#include <linux/module.h>
+#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#ifdef CONFIG_ARM64
#include <linux/arm-smccc.h>
@@ -602,13 +603,13 @@ static u64 crb_fixup_cmd_size(struct device *dev, struct resource *io_res,
return io_res->end - start + 1;
}
-static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
+static int crb_map_io(struct device *dev, struct crb_priv *priv,
struct acpi_table_tpm2 *buf)
{
+ struct acpi_device *device = ACPI_COMPANION(dev);
struct list_head acpi_resource_list;
struct resource iores_array[TPM_CRB_MAX_RESOURCES + 1] = { {0} };
void __iomem *iobase_array[TPM_CRB_MAX_RESOURCES] = {NULL};
- struct device *dev = &device->dev;
struct resource *iores;
void __iomem **iobase_ptr;
int i;
@@ -782,12 +783,13 @@ static int crb_map_pluton(struct device *dev, struct crb_priv *priv,
return 0;
}
-static int crb_acpi_add(struct acpi_device *device)
+static int crb_acpi_probe(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
+ struct acpi_device *device = ACPI_COMPANION(dev);
struct acpi_table_tpm2 *buf;
struct crb_priv *priv;
struct tpm_chip *chip;
- struct device *dev = &device->dev;
struct tpm2_crb_smc *crb_smc;
struct tpm2_crb_ffa *crb_ffa;
struct tpm2_crb_pluton *crb_pluton;
@@ -867,7 +869,7 @@ static int crb_acpi_add(struct acpi_device *device)
priv->sm = sm;
priv->hid = acpi_device_hid(device);
- rc = crb_map_io(device, priv, buf);
+ rc = crb_map_io(dev, priv, buf);
if (rc)
goto out;
@@ -901,12 +903,9 @@ static int crb_acpi_add(struct acpi_device *device)
return rc;
}
-static void crb_acpi_remove(struct acpi_device *device)
+static void crb_acpi_remove(struct platform_device *pdev)
{
- struct device *dev = &device->dev;
- struct tpm_chip *chip = dev_get_drvdata(dev);
-
- tpm_chip_unregister(chip);
+ tpm_chip_unregister(platform_get_drvdata(pdev));
}
static const struct dev_pm_ops crb_pm = {
@@ -919,19 +918,17 @@ static const struct acpi_device_id crb_device_ids[] = {
};
MODULE_DEVICE_TABLE(acpi, crb_device_ids);
-static struct acpi_driver crb_acpi_driver = {
- .name = "tpm_crb",
- .ids = crb_device_ids,
- .ops = {
- .add = crb_acpi_add,
- .remove = crb_acpi_remove,
- },
- .drv = {
+static struct platform_driver crb_acpi_driver = {
+ .probe = crb_acpi_probe,
+ .remove = crb_acpi_remove,
+ .driver = {
+ .name = "tpm_crb_acpi",
+ .acpi_match_table = crb_device_ids,
.pm = &crb_pm,
},
};
-module_acpi_driver(crb_acpi_driver);
+module_platform_driver(crb_acpi_driver);
MODULE_AUTHOR("Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>");
MODULE_DESCRIPTION("TPM2 Driver");
MODULE_VERSION("0.1");
--
2.51.0
next reply other threads:[~2026-02-23 15:55 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-23 15:55 Rafael J. Wysocki [this message]
2026-03-03 21:47 ` [PATCH v1] tpm_crb: Convert ACPI driver to a platform one Jarkko Sakkinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2706178.Lt9SDvczpP@rafael.j.wysocki \
--to=rafael@kernel.org \
--cc=jarkko@kernel.org \
--cc=jgg@ziepe.ca \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peterhuewe@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.