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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 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




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux