aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/chrome/chromeos_laptop.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-26 16:36:02 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-26 16:36:02 -0400
commit36a8032d77649430f5ef11fbf0df2bb026be0b04 (patch)
tree18e386a957bde5f71e9efd2cddf1d8aadafe48e4 /drivers/platform/chrome/chromeos_laptop.c
parent7f9f44308c8993c9ab8078d174dad34bea3e82d7 (diff)
parent96cba9b00e297303774bec59e192064d20adeb3d (diff)
Merge tag 'chrome-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/chrome-platform
Pull chrome platform updates from Olof Johansson: "Here's a set of updates to the Chrome OS platform drivers for this merge window. Main new things this cycle is: - Driver changes to expose the lightbar to users. With this, you can make your own blinkenlights on Chromebook Pixels. - Changes in the way that the atmel_mxt trackpads are probed. The laptop driver is trying to be smart and not instantiate the devices that don't answer to probe. For the trackpad that can come up in two modes (bootloader or regular), this gets complicated since the driver already knows how to handle the two modes including the actual addresses used. So now the laptop driver needs to know more too, instantiating the regular address even if the bootloader one is the probe that passed. - mfd driver improvements by Javier Martines Canillas, and a few bugfixes from him, kbuild and myself" * tag 'chrome-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/chrome-platform: platform/chrome: chromeos_laptop - instantiate Atmel at primary address platform/chrome: cros_ec_lpc - Depend on X86 || COMPILE_TEST platform/chrome: cros_ec_lpc - Include linux/io.h header file platform/chrome: fix platform_no_drv_owner.cocci warnings platform/chrome: cros_ec_lightbar - fix duplicate const warning platform/chrome: cros_ec_dev - fix Unknown escape '%' warning platform/chrome: Expose Chrome OS Lightbar to users platform/chrome: Create sysfs attributes for the ChromeOS EC mfd: cros_ec: Instantiate ChromeOS EC character device platform/chrome: Add Chrome OS EC userspace device interface platform/chrome: Add cros_ec_lpc driver for x86 devices mfd: cros_ec: Add char dev and virtual dev pointers mfd: cros_ec: Use fixed size arrays to transfer data with the EC
Diffstat (limited to 'drivers/platform/chrome/chromeos_laptop.c')
-rw-r--r--drivers/platform/chrome/chromeos_laptop.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c
index b84fdd6b629b..a04019ab9feb 100644
--- a/drivers/platform/chrome/chromeos_laptop.c
+++ b/drivers/platform/chrome/chromeos_laptop.c
@@ -133,12 +133,13 @@ static struct i2c_client *__add_probed_i2c_device(
133 const char *name, 133 const char *name,
134 int bus, 134 int bus,
135 struct i2c_board_info *info, 135 struct i2c_board_info *info,
136 const unsigned short *addrs) 136 const unsigned short *alt_addr_list)
137{ 137{
138 const struct dmi_device *dmi_dev; 138 const struct dmi_device *dmi_dev;
139 const struct dmi_dev_onboard *dev_data; 139 const struct dmi_dev_onboard *dev_data;
140 struct i2c_adapter *adapter; 140 struct i2c_adapter *adapter;
141 struct i2c_client *client; 141 struct i2c_client *client = NULL;
142 const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
142 143
143 if (bus < 0) 144 if (bus < 0)
144 return NULL; 145 return NULL;
@@ -169,8 +170,28 @@ static struct i2c_client *__add_probed_i2c_device(
169 return NULL; 170 return NULL;
170 } 171 }
171 172
172 /* add the i2c device */ 173 /*
173 client = i2c_new_probed_device(adapter, info, addrs, NULL); 174 * Add the i2c device. If we can't detect it at the primary
175 * address we scan secondary addresses. In any case the client
176 * structure gets assigned primary address.
177 */
178 client = i2c_new_probed_device(adapter, info, addr_list, NULL);
179 if (!client && alt_addr_list) {
180 struct i2c_board_info dummy_info = {
181 I2C_BOARD_INFO("dummy", info->addr),
182 };
183 struct i2c_client *dummy;
184
185 dummy = i2c_new_probed_device(adapter, &dummy_info,
186 alt_addr_list, NULL);
187 if (dummy) {
188 pr_debug("%s %d-%02x is probed at %02x\n",
189 __func__, bus, info->addr, dummy->addr);
190 i2c_unregister_device(dummy);
191 client = i2c_new_device(adapter, info);
192 }
193 }
194
174 if (!client) 195 if (!client)
175 pr_notice("%s failed to register device %d-%02x\n", 196 pr_notice("%s failed to register device %d-%02x\n",
176 __func__, bus, info->addr); 197 __func__, bus, info->addr);
@@ -254,12 +275,10 @@ static struct i2c_client *add_i2c_device(const char *name,
254 enum i2c_adapter_type type, 275 enum i2c_adapter_type type,
255 struct i2c_board_info *info) 276 struct i2c_board_info *info)
256{ 277{
257 const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
258
259 return __add_probed_i2c_device(name, 278 return __add_probed_i2c_device(name,
260 find_i2c_adapter_num(type), 279 find_i2c_adapter_num(type),
261 info, 280 info,
262 addr_list); 281 NULL);
263} 282}
264 283
265static int setup_cyapa_tp(enum i2c_adapter_type type) 284static int setup_cyapa_tp(enum i2c_adapter_type type)
@@ -275,7 +294,6 @@ static int setup_cyapa_tp(enum i2c_adapter_type type)
275static int setup_atmel_224s_tp(enum i2c_adapter_type type) 294static int setup_atmel_224s_tp(enum i2c_adapter_type type)
276{ 295{
277 const unsigned short addr_list[] = { ATMEL_TP_I2C_BL_ADDR, 296 const unsigned short addr_list[] = { ATMEL_TP_I2C_BL_ADDR,
278 ATMEL_TP_I2C_ADDR,
279 I2C_CLIENT_END }; 297 I2C_CLIENT_END };
280 if (tp) 298 if (tp)
281 return 0; 299 return 0;
@@ -289,7 +307,6 @@ static int setup_atmel_224s_tp(enum i2c_adapter_type type)
289static int setup_atmel_1664s_ts(enum i2c_adapter_type type) 307static int setup_atmel_1664s_ts(enum i2c_adapter_type type)
290{ 308{
291 const unsigned short addr_list[] = { ATMEL_TS_I2C_BL_ADDR, 309 const unsigned short addr_list[] = { ATMEL_TS_I2C_BL_ADDR,
292 ATMEL_TS_I2C_ADDR,
293 I2C_CLIENT_END }; 310 I2C_CLIENT_END };
294 if (ts) 311 if (ts)
295 return 0; 312 return 0;