[PATCH] libi2c allowed to probe on device init libi2c registration of a device fails if the device initialization fails Benefits: allows for device probing on multiple addreses

Alexandru-Sever Horin alex.sever.h at gmail.com
Wed Apr 1 15:18:18 UTC 2015


From: Alexandru-Sever Horin <alex.sever.h at gmail.com>

---
 cpukit/libi2c/libi2c.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/cpukit/libi2c/libi2c.c b/cpukit/libi2c/libi2c.c
index 233cb68..43daa86 100644
--- a/cpukit/libi2c/libi2c.c
+++ b/cpukit/libi2c/libi2c.c
@@ -736,6 +736,17 @@ rtems_libi2c_register_drv (const char *name, rtems_libi2c_drv_t * drvtbl,
       /* found a free slot; encode slot + 1 ! */
       minor = ((i + 1) << 13) | RTEMS_LIBI2C_MAKE_MINOR (busno, i2caddr);
 
+      /* before registering, try to initialize the device to check it's there */
+      if (drvtbl->ops->initialization_entry) {
+        err = drvtbl->ops->initialization_entry (rtems_libi2c_major,
+                                                 minor, 0);
+        if (err) {
+          LIBUNLOCK ();
+          /* make sure the returned value is negative, not to mistake it for minor number */
+          return err < 0 ? err : -err;
+        }
+      }
+
       if (name) {
         size_t length = strlen (busses[busno].name) + strlen (name) + 2;
         str = malloc (length);
@@ -761,17 +772,11 @@ rtems_libi2c_register_drv (const char *name, rtems_libi2c_drv_t * drvtbl,
 
       drvs[i].drv = drvtbl;
 
-      if (drvtbl->ops->initialization_entry)
-        err =
-          drvs[i].drv->ops->initialization_entry (rtems_libi2c_major, minor,
-                                                  0);
-      else
-        err = RTEMS_SUCCESSFUL;
-
       LIBUNLOCK ();
-      return err ? -err : minor;
+      return minor;
     }
   }
+
   LIBUNLOCK ();
   return -RTEMS_TOO_MANY;
 }
-- 
2.3.5



More information about the devel mailing list