diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2018-03-20 18:31:31 -0400 |
---|---|---|
committer | Benson Leung <bleung@chromium.org> | 2018-04-10 01:38:04 -0400 |
commit | ab6c5600d8caf5ee9a8a5081344f055bc80bc271 (patch) | |
tree | a802e3bc6e7fbc0865b24f18cec287509419580c | |
parent | 4f27f677c9541c02b7a62761f93bccbc404be8bb (diff) |
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.c | 35 |
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 = { | |||
120 | .flags = I2C_CLIENT_WAKE, | 120 | .flags = I2C_CLIENT_WAKE, |
121 | }; | 121 | }; |
122 | 122 | ||
123 | static int chromeos_laptop_get_irq_from_dmi(const char *dmi_name) | ||
124 | { | ||
125 | const struct dmi_device *dmi_dev; | ||
126 | const struct dmi_dev_onboard *dev_data; | ||
127 | |||
128 | dmi_dev = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, dmi_name, NULL); | ||
129 | if (!dmi_dev) { | ||
130 | pr_err("failed to find DMI device '%s'\n", dmi_name); | ||
131 | return -ENOENT; | ||
132 | } | ||
133 | |||
134 | dev_data = dmi_dev->device_data; | ||
135 | if (!dev_data) { | ||
136 | pr_err("failed to get data from DMI for '%s'\n", dmi_name); | ||
137 | return -EINVAL; | ||
138 | } | ||
139 | |||
140 | return dev_data->instance; | ||
141 | } | ||
142 | |||
123 | static struct i2c_client *__add_probed_i2c_device( | 143 | static struct i2c_client *__add_probed_i2c_device( |
124 | const char *name, | 144 | const char *name, |
125 | int bus, | 145 | int bus, |
126 | struct i2c_board_info *info, | 146 | struct i2c_board_info *info, |
127 | const unsigned short *alt_addr_list) | 147 | const unsigned short *alt_addr_list) |
128 | { | 148 | { |
129 | const struct dmi_device *dmi_dev; | ||
130 | const struct dmi_dev_onboard *dev_data; | ||
131 | struct i2c_adapter *adapter; | 149 | struct i2c_adapter *adapter; |
132 | struct i2c_client *client = NULL; | 150 | struct i2c_client *client = NULL; |
133 | const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END }; | 151 | const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END }; |
134 | 152 | ||
135 | if (bus < 0) | 153 | if (bus < 0) |
136 | return NULL; | 154 | return NULL; |
155 | |||
137 | /* | 156 | /* |
138 | * If a name is specified, look for irq platform information stashed | 157 | * If a name is specified, look for irq platform information stashed |
139 | * in DMI_DEV_TYPE_DEV_ONBOARD by the Chrome OS custom system firmware. | 158 | * in DMI_DEV_TYPE_DEV_ONBOARD by the Chrome OS custom system firmware. |
140 | */ | 159 | */ |
141 | if (name) { | 160 | if (name) { |
142 | dmi_dev = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, name, NULL); | 161 | info->irq = chromeos_laptop_get_irq_from_dmi(name); |
143 | if (!dmi_dev) { | 162 | if (info->irq < 0) |
144 | pr_err("failed to dmi find device %s\n", name); | ||
145 | return NULL; | ||
146 | } | ||
147 | dev_data = (struct dmi_dev_onboard *)dmi_dev->device_data; | ||
148 | if (!dev_data) { | ||
149 | pr_err("failed to get data from dmi for %s\n", name); | ||
150 | return NULL; | 163 | return NULL; |
151 | } | ||
152 | info->irq = dev_data->instance; | ||
153 | } | 164 | } |
154 | 165 | ||
155 | adapter = i2c_get_adapter(bus); | 166 | adapter = i2c_get_adapter(bus); |