return AE_OK;
}
-static struct resource fjes_resource[] = {
- DEFINE_RES_MEM(0, 1),
- DEFINE_RES_IRQ(0)
-};
-
-static int fjes_acpi_add(struct acpi_device *device)
-{
- struct platform_device *plat_dev;
- acpi_status status;
-
- if (!is_extended_socket_device(device))
- return -ENODEV;
-
- if (acpi_check_extended_socket_status(device))
- return -ENODEV;
-
- status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
- fjes_get_acpi_resource, fjes_resource);
- if (ACPI_FAILURE(status))
- return -ENODEV;
-
- /* create platform_device */
- plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource,
- ARRAY_SIZE(fjes_resource));
- if (IS_ERR(plat_dev))
- return PTR_ERR(plat_dev);
-
- device->driver_data = plat_dev;
-
- return 0;
-}
-
-static void fjes_acpi_remove(struct acpi_device *device)
-{
- struct platform_device *plat_dev;
-
- plat_dev = (struct platform_device *)acpi_driver_data(device);
- platform_device_unregister(plat_dev);
-}
-
-static struct acpi_driver fjes_acpi_driver = {
- .name = DRV_NAME,
- .class = DRV_NAME,
- .ids = fjes_acpi_ids,
- .ops = {
- .add = fjes_acpi_add,
- .remove = fjes_acpi_remove,
- },
-};
-
static int fjes_setup_resources(struct fjes_adapter *adapter)
{
struct net_device *netdev = adapter->netdev;
.remove = fjes_remove,
};
+struct fjes_acpi_walk_context {
+ struct acpi_device *adev;
+ struct resource resources[2];
+};
+
static acpi_status
acpi_find_extended_socket_device(acpi_handle obj_handle, u32 level,
void *context, void **return_value)
{
+ struct fjes_acpi_walk_context *fjes_context = context;
struct acpi_device *device;
- bool *found = context;
+ acpi_status status;
- device = acpi_fetch_acpi_dev(obj_handle);
+ device = acpi_get_acpi_dev(obj_handle);
if (!device)
return AE_OK;
if (strcmp(acpi_device_hid(device), ACPI_MOTHERBOARD_RESOURCE_HID))
- return AE_OK;
+ goto skip;
if (!is_extended_socket_device(device))
- return AE_OK;
+ goto skip;
if (acpi_check_extended_socket_status(device))
- return AE_OK;
+ goto skip;
+
+ status = acpi_walk_resources(obj_handle, METHOD_NAME__CRS,
+ fjes_get_acpi_resource, fjes_context->resources);
+ if (ACPI_FAILURE(status))
+ goto skip;
+
+ fjes_context->adev = device;
- *found = true;
return AE_CTRL_TERMINATE;
+
+skip:
+ acpi_dev_put(device);
+ return AE_OK;
}
+static struct platform_device *fjes_plat_dev;
+
/* fjes_init_module - Driver Registration Routine */
static int __init fjes_init_module(void)
{
- bool found = false;
+ struct fjes_acpi_walk_context fjes_context = {
+ .adev = NULL,
+ .resources = {
+ DEFINE_RES_MEM(0, 1),
+ DEFINE_RES_IRQ(0)
+ }
+ };
+ struct platform_device_info pdevinfo;
int result;
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
- acpi_find_extended_socket_device, NULL, &found,
+ acpi_find_extended_socket_device, NULL, &fjes_context,
NULL);
-
- if (!found)
+ if (!fjes_context.adev)
return -ENODEV;
+ memset(&pdevinfo, 0, sizeof(pdevinfo));
+
+ pdevinfo.name = DRV_NAME;
+ pdevinfo.res = fjes_context.resources;
+ pdevinfo.num_res = ARRAY_SIZE(fjes_context.resources);
+ pdevinfo.fwnode = acpi_fwnode_handle(fjes_context.adev);
+
+ fjes_plat_dev = platform_device_register_full(&pdevinfo);
+
+ acpi_dev_put(fjes_context.adev);
+
+ if (IS_ERR(fjes_plat_dev))
+ return PTR_ERR(fjes_plat_dev);
+
pr_info("%s - version %s - %s\n",
fjes_driver_string, fjes_driver_version, fjes_copyright);
result = platform_driver_register(&fjes_driver);
if (result < 0) {
fjes_dbg_exit();
+ platform_device_unregister(fjes_plat_dev);
return result;
}
- result = acpi_bus_register_driver(&fjes_acpi_driver);
- if (result < 0)
- goto fail_acpi_driver;
-
return 0;
-
-fail_acpi_driver:
- platform_driver_unregister(&fjes_driver);
- fjes_dbg_exit();
- return result;
}
module_init(fjes_init_module);
/* fjes_exit_module - Driver Exit Cleanup Routine */
static void __exit fjes_exit_module(void)
{
- acpi_bus_unregister_driver(&fjes_acpi_driver);
platform_driver_unregister(&fjes_driver);
fjes_dbg_exit();
+ platform_device_unregister(fjes_plat_dev);
}
module_exit(fjes_exit_module);