From: David Brownell <[EMAIL PROTECTED]>

Guard I2C against oopsing because of init sequence problems, by
verifying that i2c_init() has been called before calling any
routines that rely on that initialization.  This specific test
just requires that bus_register(&i2c_bus_type) was called.

Examples of this kind of oopsing come from subystems and drivers
which register I2C drivers in their subsys_initcall code but
which are statically linked before I2C by drivers/Makefile.

Signed-off-by: David Brownell <[EMAIL PROTECTED]>
---
Alternatively have postcore_initcall(i2c_init), which may
be better ... the initcall levels are pretty limited, and
in these cases the "subsystem" of interest builds on I2C
and needs to work before device_initcall.  Having I2C use
subsys_initcall kind of forces things into fs_initcall.

I'd encourage the anti-oopsing paranoia in any case, even
if i2c switches to postcore_initcall (or earlier).

 drivers/i2c/i2c-core.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -443,6 +443,12 @@ static int i2c_register_adapter(struct i
 
        mutex_lock(&core_lock);
 
+       /* can't register until after driver model init */
+       if (WARN_ON(!i2c_bus_type.p)) {
+               res = -ENOENT;
+               goto out_list;
+       }
+
        /* Add the adapter to the driver core.
         * If the parent pointer is not set up,
         * we add this adapter to the host bus.
@@ -696,6 +702,10 @@ int i2c_register_driver(struct module *o
 {
        int res;
 
+       /* can't register until after driver model init */
+       if (WARN_ON(!i2c_bus_type.p))
+               return -ENOENT;
+
        /* new style driver methods can't mix with legacy ones */
        if (is_newstyle_driver(driver)) {
                if (driver->attach_adapter || driver->detach_adapter

_______________________________________________
i2c mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/i2c

Reply via email to