Commit ab6c5600 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Benson Leung
Browse files

platform/chrome: chromeos_laptop - factor out getting IRQ from DMI



This will make code instantiating I2C device a bit clearer.

Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarBenson Leung <bleung@chromium.org>
parent 4f27f677
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -120,37 +120,48 @@ 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);
		info->irq = chromeos_laptop_get_irq_from_dmi(name);
		if (info->irq < 0)
			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);
			return NULL;
		}
		info->irq = dev_data->instance;
	}

	adapter = i2c_get_adapter(bus);
	if (!adapter) {