From 33ad2a0517e94847740a30aed0aa56de38655e3c Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Tue, 17 Jun 2008 12:49:06 +0000
Subject: [PATCH] Create class device with device_number information in sysfs.

---
 master/master.c | 14 +++++++++++++-
 master/master.h |  3 ++-
 master/module.c |  2 +-
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/master/master.c b/master/master.c
index f9a4ddea..56915124 100644
--- a/master/master.c
+++ b/master/master.c
@@ -76,7 +76,8 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
         unsigned int index, /**< master index */
         const uint8_t *main_mac, /**< MAC address of main device */
         const uint8_t *backup_mac, /**< MAC address of backup device */
-        dev_t device_number /**< Character device number. */
+        dev_t device_number, /**< Character device number. */
+        struct class *class /**< Device class. */
         )
 {
     unsigned int i;
@@ -170,9 +171,19 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
     // init character device
     if (ec_cdev_init(&master->cdev, master, device_number))
         goto out_clear_fsm;
+    
+    master->class_device = class_device_create(class,
+            MKDEV(MAJOR(device_number), master->index),
+            NULL, "EtherCAT%u", master->index);
+    if (IS_ERR(master->class_device)) {
+        EC_ERR("Failed to create class device!\n");
+        goto out_clear_cdev;
+    }
 
     return 0;
 
+out_clear_cdev:
+    ec_cdev_clear(&master->cdev);
 out_clear_fsm:
     ec_fsm_master_clear(&master->fsm);
     ec_datagram_clear(&master->fsm_datagram);
@@ -192,6 +203,7 @@ void ec_master_clear(
         ec_master_t *master /**< EtherCAT master */
         )
 {
+    class_device_unregister(master->class_device);
     ec_cdev_clear(&master->cdev);
 #ifdef EC_EOE
     ec_master_clear_eoe_handlers(master);
diff --git a/master/master.h b/master/master.h
index 429911dc..f68bb264 100644
--- a/master/master.h
+++ b/master/master.h
@@ -84,6 +84,7 @@ struct ec_master {
     unsigned int reserved; /**< non-zero, if the master is reserved for RT */
 
     ec_cdev_t cdev; /**< Master character device. */
+    struct class_device *class_device; /**< Master class device. */
 
     ec_device_t main_device; /**< EtherCAT device */
     const uint8_t *main_mac; /**< MAC address of main device */
@@ -167,7 +168,7 @@ struct ec_master {
 
 // master creation/deletion
 int ec_master_init(ec_master_t *, unsigned int, const uint8_t *,
-        const uint8_t *, dev_t);
+        const uint8_t *, dev_t, struct class *);
 void ec_master_clear(ec_master_t *);
 
 // mode transitions
diff --git a/master/module.c b/master/module.c
index 7fd99de2..a923d7cf 100644
--- a/master/module.c
+++ b/master/module.c
@@ -144,7 +144,7 @@ int __init ec_init_module(void)
     
     for (i = 0; i < master_count; i++) {
         if (ec_master_init(&masters[i], i, macs[i][0], macs[i][1],
-                    device_number)) {
+                    device_number, class)) {
             ret = -ENOMEM;
             goto out_free_masters;
         }
-- 
GitLab