summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2018-03-20 23:31:31 +0100
committerBenson Leung <bleung@chromium.org>2018-04-10 07:38:04 +0200
commitab6c5600d8caf5ee9a8a5081344f055bc80bc271 (patch)
treea802e3bc6e7fbc0865b24f18cec287509419580c
parentplatform/chrome: chromeos_laptop - introduce pr_fmt() (diff)
downloadlinux-ab6c5600d8caf5ee9a8a5081344f055bc80bc271.tar.xz
linux-ab6c5600d8caf5ee9a8a5081344f055bc80bc271.zip
platform/chrome: chromeos_laptop - factor out getting IRQ from DMI
This will make code instantiating I2C device a bit clearer. Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Benson Leung <bleung@chromium.org>
-rw-r--r--drivers/platform/chrome/chromeos_laptop.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c
index 08ce7a105e76..96e962ff38e8 100644
--- a/drivers/platform/chrome/chromeos_laptop.c
+++ b/drivers/platform/chrome/chromeos_laptop.c
@@ -120,36 +120,47 @@ static struct i2c_board_info atmel_1664s_device = {
.flags = I2C_CLIENT_WAKE,
};
+static int chromeos_laptop_get_irq_from_dmi(const char *dmi_name)
+{
+ const struct dmi_device *dmi_dev;
+ const struct dmi_dev_onboard *dev_data;
+
+ dmi_dev = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, dmi_name, NULL);
+ if (!dmi_dev) {
+ pr_err("failed to find DMI device '%s'\n", dmi_name);
+ return -ENOENT;
+ }
+
+ dev_data = dmi_dev->device_data;
+ if (!dev_data) {
+ pr_err("failed to get data from DMI for '%s'\n", dmi_name);
+ return -EINVAL;
+ }
+
+ return dev_data->instance;
+}
+
static struct i2c_client *__add_probed_i2c_device(
const char *name,
int bus,
struct i2c_board_info *info,
const unsigned short *alt_addr_list)
{
- const struct dmi_device *dmi_dev;
- const struct dmi_dev_onboard *dev_data;
struct i2c_adapter *adapter;
struct i2c_client *client = NULL;
const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
if (bus < 0)
return NULL;
+
/*
* If a name is specified, look for irq platform information stashed
* in DMI_DEV_TYPE_DEV_ONBOARD by the Chrome OS custom system firmware.
*/
if (name) {
- dmi_dev = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, name, NULL);
- if (!dmi_dev) {
- pr_err("failed to dmi find device %s\n", name);
- return NULL;
- }
- dev_data = (struct dmi_dev_onboard *)dmi_dev->device_data;
- if (!dev_data) {
- pr_err("failed to get data from dmi for %s\n", name);
+ info->irq = chromeos_laptop_get_irq_from_dmi(name);
+ if (info->irq < 0)
return NULL;
- }
- info->irq = dev_data->instance;
}
adapter = i2c_get_adapter(bus);