Skip to content

Commit 96cba9b

Browse files
dtorolofj
authored andcommitted
platform/chrome: chromeos_laptop - instantiate Atmel at primary address
The new Atmel MXT driver expects i2c client's address contain the primary (main address) of the chip, and calculates the expected bootloader address form the primary address. Unfortunately chrome_laptop does probe the devices and if touchpad (or touchscreen, or both) comes up in bootloader mode the i2c device gets instantiated with the bootloader address which confuses the driver. To work around this issue let's probe the primary address first. If the device is not detected at the primary address we'll probe alternative addresses as "dummy" devices. If any of them are found, destroy the dummy client and instantiate client with proper name at primary address still. Signed-off-by: Dmitry Torokhov <[email protected]> Signed-off-by: Olof Johansson <[email protected]>
1 parent 8ce5809 commit 96cba9b

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

drivers/platform/chrome/chromeos_laptop.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,13 @@ static struct i2c_client *__add_probed_i2c_device(
133133
const char *name,
134134
int bus,
135135
struct i2c_board_info *info,
136-
const unsigned short *addrs)
136+
const unsigned short *alt_addr_list)
137137
{
138138
const struct dmi_device *dmi_dev;
139139
const struct dmi_dev_onboard *dev_data;
140140
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 };
142143

143144
if (bus < 0)
144145
return NULL;
@@ -169,8 +170,28 @@ static struct i2c_client *__add_probed_i2c_device(
169170
return NULL;
170171
}
171172

172-
/* add the i2c device */
173-
client = i2c_new_probed_device(adapter, info, addrs, NULL);
173+
/*
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+
174195
if (!client)
175196
pr_notice("%s failed to register device %d-%02x\n",
176197
__func__, bus, info->addr);
@@ -254,12 +275,10 @@ static struct i2c_client *add_i2c_device(const char *name,
254275
enum i2c_adapter_type type,
255276
struct i2c_board_info *info)
256277
{
257-
const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
258-
259278
return __add_probed_i2c_device(name,
260279
find_i2c_adapter_num(type),
261280
info,
262-
addr_list);
281+
NULL);
263282
}
264283

265284
static int setup_cyapa_tp(enum i2c_adapter_type type)
@@ -275,7 +294,6 @@ static int setup_cyapa_tp(enum i2c_adapter_type type)
275294
static int setup_atmel_224s_tp(enum i2c_adapter_type type)
276295
{
277296
const unsigned short addr_list[] = { ATMEL_TP_I2C_BL_ADDR,
278-
ATMEL_TP_I2C_ADDR,
279297
I2C_CLIENT_END };
280298
if (tp)
281299
return 0;
@@ -289,7 +307,6 @@ static int setup_atmel_224s_tp(enum i2c_adapter_type type)
289307
static int setup_atmel_1664s_ts(enum i2c_adapter_type type)
290308
{
291309
const unsigned short addr_list[] = { ATMEL_TS_I2C_BL_ADDR,
292-
ATMEL_TS_I2C_ADDR,
293310
I2C_CLIENT_END };
294311
if (ts)
295312
return 0;

0 commit comments

Comments
 (0)