Acked-by: Benson Leung <bleung@xxxxxxxxxxxx> On Thu, Apr 18, 2013 at 2:55 PM, Olof Johansson <olof@xxxxxxxxx> wrote: > If chromeos_laptop is loaded before the DRM driver, the i2c busses will > not yet be available. Defer probe for that case and try again later. > > Trickling the error up to the module init function is unfortuantely a > little awkward, since the i2c bus lookup and device registration happens > as a dmi callback. > > Reported-by: Dirk Hohndel <dirk@xxxxxxxxxxx> > Signed-off-by: Olof Johansson <olof@xxxxxxxxx> > --- > drivers/platform/x86/chromeos_laptop.c | 33 ++++++++++++++++++++++++-------- > 1 file changed, 25 insertions(+), 8 deletions(-) > > diff --git a/drivers/platform/x86/chromeos_laptop.c b/drivers/platform/x86/chromeos_laptop.c > index 3e5b4497..7ff12fa 100644 > --- a/drivers/platform/x86/chromeos_laptop.c > +++ b/drivers/platform/x86/chromeos_laptop.c > @@ -39,6 +39,7 @@ > static struct i2c_client *als; > static struct i2c_client *tp; > static struct i2c_client *ts; > +static int setup_error; > > const char *i2c_adapter_names[] = { > "SMBus I801 adapter", > @@ -191,7 +192,8 @@ static int __init find_i2c_adapter_num(enum i2c_adapter_type type) > if (!dev) { > pr_err("%s: i2c adapter %s not found on system.\n", __func__, > name); > + setup_error = -EPROBE_DEFER; > return -ENODEV; > } > adapter = to_i2c_adapter(dev); > return adapter->nr; > @@ -381,23 +383,38 @@ static struct dmi_system_id __initdata chromeos_laptop_dmi_table[] = { > }; > MODULE_DEVICE_TABLE(dmi, chromeos_laptop_dmi_table); > > +static void chromeos_laptop_unregister(void) > +{ > + if (als) > + i2c_unregister_device(als); > + if (tp) > + i2c_unregister_device(tp); > + if (ts) > + i2c_unregister_device(ts); > + > + als = NULL; > + tp = NULL; > + ts = NULL; > +} > + > static int __init chromeos_laptop_init(void) > { > + setup_error = 0; > + > if (!dmi_check_system(chromeos_laptop_dmi_table)) { > pr_debug("%s unsupported system.\n", __func__); > return -ENODEV; > } > - return 0; > + > + if (setup_error) > + chromeos_laptop_unregister(); > + > + return setup_error; > } > > static void __exit chromeos_laptop_exit(void) > { > - if (als) > - i2c_unregister_device(als); > - if (tp) > - i2c_unregister_device(tp); > - if (ts) > - i2c_unregister_device(ts); > + chromeos_laptop_unregister(); > } > > module_init(chromeos_laptop_init); > -- > 1.7.10.4 > -- Benson Leung Software Engineer, Chrom* OS bleung@xxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html