|
@@ -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);
|