Re: [PATCH] Platform: x86: chromeos_laptop: defer probing if no i2cbusses found

From: Benson Leung
Date: Thu Apr 18 2013 - 18:00:10 EST


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 linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/