Commit 1d0b19c9 authored by David Brownell's avatar David Brownell Committed by Jean Delvare

i2c: Guard against oopses from bad init sequences

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: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent 7c15fd12
...@@ -437,6 +437,10 @@ static int i2c_register_adapter(struct i2c_adapter *adap) ...@@ -437,6 +437,10 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
{ {
int res = 0, dummy; int res = 0, dummy;
/* Can't register until after driver model init */
if (unlikely(WARN_ON(!i2c_bus_type.p)))
return -EAGAIN;
mutex_init(&adap->bus_lock); mutex_init(&adap->bus_lock);
mutex_init(&adap->clist_lock); mutex_init(&adap->clist_lock);
INIT_LIST_HEAD(&adap->clients); INIT_LIST_HEAD(&adap->clients);
...@@ -696,6 +700,10 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) ...@@ -696,6 +700,10 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
{ {
int res; int res;
/* Can't register until after driver model init */
if (unlikely(WARN_ON(!i2c_bus_type.p)))
return -EAGAIN;
/* new style driver methods can't mix with legacy ones */ /* new style driver methods can't mix with legacy ones */
if (is_newstyle_driver(driver)) { if (is_newstyle_driver(driver)) {
if (driver->attach_adapter || driver->detach_adapter if (driver->attach_adapter || driver->detach_adapter
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment