[PATCH 3/7] fjes: Implement platform_driver functionality

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds implementation of platform_device driver
to FUJITSU Extended Socket Network Device driver.

When "PNP0C02" is found and ACPI resource can be retrieved
successfuly, this driver creates platform_device.
platform_driver.probe and .remove routine are mock code.

Signed-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx>
---
 drivers/platform/x86/fjes/fjes_main.c | 47 +++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/drivers/platform/x86/fjes/fjes_main.c b/drivers/platform/x86/fjes/fjes_main.c
index 3454098..87057b8 100644
--- a/drivers/platform/x86/fjes/fjes_main.c
+++ b/drivers/platform/x86/fjes/fjes_main.c
@@ -22,6 +22,7 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/nls.h>
+#include <linux/platform_device.h>
 
 #include "fjes.h"
 
@@ -47,6 +48,9 @@ static int fjes_acpi_add(struct acpi_device *);
 static int fjes_acpi_remove(struct acpi_device *);
 static acpi_status fjes_get_acpi_resource(struct acpi_resource *, void*);
 
+static int fjes_probe(struct platform_device *);
+static int fjes_remove(struct platform_device *);
+
 
 static const struct acpi_device_id fjes_acpi_ids[] = {
 	{"PNP0C02", 0},
@@ -65,6 +69,15 @@ static struct acpi_driver fjes_acpi_driver = {
 	},
 };
 
+static struct platform_driver fjes_driver = {
+	.driver = {
+		.name = DRV_NAME,
+		.owner = THIS_MODULE,
+	},
+	.probe = fjes_probe,
+	.remove = fjes_remove,
+};
+
 static struct resource fjes_resource[] = {
 	{
 		.flags = IORESOURCE_MEM,
@@ -93,6 +106,10 @@ static int __init fjes_init_module(void)
 			fjes_driver_string, fjes_driver_version);
 	pr_info("%s\n", fjes_copyright);
 
+	result = platform_driver_register(&fjes_driver);
+	if (result < 0)
+		return result;
+
 	result = acpi_bus_register_driver(&fjes_acpi_driver);
 	if (result < 0)
 		goto fail_acpi_driver;
@@ -100,6 +117,7 @@ static int __init fjes_init_module(void)
 	return 0;
 
 fail_acpi_driver:
+	platform_driver_unregister(&fjes_driver);
 	return result;
 }
 
@@ -114,6 +132,7 @@ module_init(fjes_init_module);
 static void __exit fjes_exit_module(void)
 {
 	acpi_bus_unregister_driver(&fjes_acpi_driver);
+	platform_driver_unregister(&fjes_driver);
 }
 
 module_exit(fjes_exit_module);
@@ -126,6 +145,7 @@ static int fjes_acpi_add(struct acpi_device *device)
 	union acpi_object *str;
 	char str_buf[sizeof(FJES_ACPI_SYMBOL) + 1];
 	int result;
+	struct platform_device *plat_dev;
 
 	status = acpi_evaluate_object(device->handle, "_STR", NULL, &buffer);
 	if (ACPI_FAILURE(status))
@@ -148,11 +168,21 @@ static int fjes_acpi_add(struct acpi_device *device)
 	if (ACPI_FAILURE(status))
 		return -ENODEV;
 
+	/* create platform_device */
+	plat_dev = platform_device_register_simple(DRV_NAME, 0,
+				fjes_resource, ARRAY_SIZE(fjes_resource));
+	device->driver_data = plat_dev;
+
 	return 0;
 }
 
 static int 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);
+
 	return 0;
 }
 
@@ -186,5 +216,22 @@ static acpi_status fjes_get_acpi_resource(struct acpi_resource *acpi_res,
 	return AE_OK;
 }
 
+/*
+ *  fjes_probe - Device Initialization Routine
+ *
+ *  Returns 0 on success, negative on failure
+ */
+static int fjes_probe(struct platform_device *plat_dev)
+{
+	return 0;
+}
+
+/*
+ *  fjes_remove - Device Removal Routine
+ */
+static int fjes_remove(struct platform_device *plat_dev)
+{
+	return 0;
+}
 
 
-- 
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux