Skip to content

Commit

Permalink
i2c: scmi: Convert to be a platform driver
Browse files Browse the repository at this point in the history
ACPI core in conjunction with platform driver core provides
an infrastructure to enumerate ACPI devices. Use it in order
to remove a lot of boilerplate code.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: Josef Johansson <josef@oderland.se>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
  • Loading branch information
Andy Shevchenko authored and Wolfram Sang committed Sep 16, 2022
1 parent d819524 commit 03d4287
Showing 1 changed file with 19 additions and 29 deletions.
48 changes: 19 additions & 29 deletions drivers/i2c/busses/i2c-scmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@
*/

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/i2c.h>
#include <linux/acpi.h>

#define ACPI_SMBUS_HC_CLASS "smbus"
#define ACPI_SMBUS_HC_DEVICE_NAME "cmi"

/* SMBUS HID definition as supported by Microsoft Windows */
#define ACPI_SMBUS_MS_HID "SMB0001"

Expand All @@ -30,7 +28,7 @@ struct acpi_smbus_cmi {
u8 cap_info:1;
u8 cap_read:1;
u8 cap_write:1;
struct smbus_methods_t *methods;
const struct smbus_methods_t *methods;
};

static const struct smbus_methods_t smbus_methods = {
Expand Down Expand Up @@ -358,29 +356,25 @@ static acpi_status acpi_smbus_cmi_query_methods(acpi_handle handle, u32 level,
return AE_OK;
}

static int acpi_smbus_cmi_add(struct acpi_device *device)
static int smbus_cmi_probe(struct platform_device *device)
{
struct device *dev = &device->dev;
struct acpi_smbus_cmi *smbus_cmi;
const struct acpi_device_id *id;
int ret;

smbus_cmi = kzalloc(sizeof(struct acpi_smbus_cmi), GFP_KERNEL);
if (!smbus_cmi)
return -ENOMEM;

smbus_cmi->handle = device->handle;
strcpy(acpi_device_name(device), ACPI_SMBUS_HC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_SMBUS_HC_CLASS);
device->driver_data = smbus_cmi;
smbus_cmi->handle = ACPI_HANDLE(dev);
smbus_cmi->methods = device_get_match_data(dev);

platform_set_drvdata(device, smbus_cmi);

smbus_cmi->cap_info = 0;
smbus_cmi->cap_read = 0;
smbus_cmi->cap_write = 0;

for (id = acpi_smbus_cmi_ids; id->id[0]; id++)
if (!strcmp(id->id, acpi_device_hid(device)))
smbus_cmi->methods =
(struct smbus_methods_t *) id->driver_data;

acpi_walk_namespace(ACPI_TYPE_METHOD, smbus_cmi->handle, 1,
acpi_smbus_cmi_query_methods, NULL, smbus_cmi, NULL);

Expand All @@ -390,8 +384,7 @@ static int acpi_smbus_cmi_add(struct acpi_device *device)
}

snprintf(smbus_cmi->adapter.name, sizeof(smbus_cmi->adapter.name),
"SMBus CMI adapter %s",
acpi_device_name(device));
"SMBus CMI adapter %s", dev_name(dev));
smbus_cmi->adapter.owner = THIS_MODULE;
smbus_cmi->adapter.algo = &acpi_smbus_cmi_algorithm;
smbus_cmi->adapter.algo_data = smbus_cmi;
Expand All @@ -408,31 +401,28 @@ static int acpi_smbus_cmi_add(struct acpi_device *device)

err:
kfree(smbus_cmi);
device->driver_data = NULL;
return ret;
}

static int acpi_smbus_cmi_remove(struct acpi_device *device)
static int smbus_cmi_remove(struct platform_device *device)
{
struct acpi_smbus_cmi *smbus_cmi = acpi_driver_data(device);
struct acpi_smbus_cmi *smbus_cmi = platform_get_drvdata(device);

i2c_del_adapter(&smbus_cmi->adapter);
kfree(smbus_cmi);
device->driver_data = NULL;

return 0;
}

static struct acpi_driver acpi_smbus_cmi_driver = {
.name = ACPI_SMBUS_HC_DEVICE_NAME,
.class = ACPI_SMBUS_HC_CLASS,
.ids = acpi_smbus_cmi_ids,
.ops = {
.add = acpi_smbus_cmi_add,
.remove = acpi_smbus_cmi_remove,
static struct platform_driver smbus_cmi_driver = {
.probe = smbus_cmi_probe,
.remove = smbus_cmi_remove,
.driver = {
.name = "smbus_cmi",
.acpi_match_table = acpi_smbus_cmi_ids,
},
};
module_acpi_driver(acpi_smbus_cmi_driver);
module_platform_driver(smbus_cmi_driver);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Crane Cai <crane.cai@amd.com>");
Expand Down

0 comments on commit 03d4287

Please sign in to comment.