aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2018-03-20 18:31:31 -0400
committerBenson Leung <bleung@chromium.org>2018-04-10 01:38:04 -0400
commitab6c5600d8caf5ee9a8a5081344f055bc80bc271 (patch)
treea802e3bc6e7fbc0865b24f18cec287509419580c
parent4f27f677c9541c02b7a62761f93bccbc404be8bb (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.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 = {
120 .flags = I2C_CLIENT_WAKE, 120 .flags = I2C_CLIENT_WAKE,
121}; 121};
122 122
123static 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
123static struct i2c_client *__add_probed_i2c_device( 143static 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);