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