lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 18 Apr 2013 14:55:30 -0700
From:	Olof Johansson <olof@...om.net>
To:	Matthew Garrett <matthew.garrett@...ula.com>
Cc:	torvalds@...ux-foundation.org, platform-driver-x86@...r.kernel.org,
	linux-kernel@...r.kernel.org, bleung@...omium.org,
	dirk@...ndel.org, Olof Johansson <olof@...om.net>
Subject: [PATCH] Platform: x86: chromeos_laptop: defer probing if no i2c busses found

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@...ndel.org>
Signed-off-by: Olof Johansson <olof@...om.net>
---
 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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ