From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754878AbbDNUu4 (ORCPT ); Tue, 14 Apr 2015 16:50:56 -0400 Received: from mail-ig0-f170.google.com ([209.85.213.170]:38450 "EHLO mail-ig0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754198AbbDNUuv (ORCPT ); Tue, 14 Apr 2015 16:50:51 -0400 Date: Tue, 14 Apr 2015 13:50:46 -0700 From: Dmitry Torokhov To: Olof Johansson Cc: Benson Leung , Nick Dyer , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] platform/chrome: chromeos_laptop - do not probe devices on Pixel 1 Message-ID: <20150414205046.GB35263@dtor-ws> References: <20150409235759.GA21174@dtor-glaptop> <20150410174154.GA28305@dtor-glaptop> <20150414205009.GA35263@dtor-ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150414205009.GA35263@dtor-ws> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Apr 14, 2015 at 01:50:09PM -0700, Dmitry Torokhov wrote: > On Fri, Apr 10, 2015 at 10:41:54AM -0700, Dmitry Torokhov wrote: > > On Thu, Apr 09, 2015 at 04:57:59PM -0700, Dmitry Torokhov wrote: > > > Atmel MXT devices use different i2c addresses, depending on the current > > > mode of operation (bootloader or application). The new Atmel MXT driver > > > expects i2c client's address contain the application address of the > > > chip, and calculates the expected bootloader address form the > > > application address. Unfortunately chromeos_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 > > > instead of application address, which confuses the driver. > > > > > > Given that hardware on Pixel is set and is not going to change let's not > > > try to probe devices to see if they are present or not, but rather > > > instantiate them always at expected addresses. > > > > > > Since all devices are now probed and/or instantiated at given address, > > > we no longer need to support probing multiple addresses for the same > > > > Hmm, that strategy won't work on C720 since there are devices with touchscreen > > and without one, so we do want to probe but always instantiate at primary > > address. V3 will be upcoming... > > OK, new version. Not sending to the wide world for now in case we decide ... and I failed... > it is too ugly... > > > From 480ea02024a0b9a2ad2f91e2e0ca02f34577972c Mon Sep 17 00:00:00 2001 > From: Dmitry Torokhov > Date: Mon, 12 Jan 2015 13:59:32 -0800 > Subject: [PATCH] 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 > --- > drivers/platform/chrome/chromeos_laptop.c | 35 +++++++++++++++++++++++-------- > 1 file changed, 26 insertions(+), 9 deletions(-) > > diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c > index b84fdd6..a04019a 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( > const char *name, > int bus, > struct i2c_board_info *info, > - const unsigned short *addrs) > + 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; > + struct i2c_client *client = NULL; > + const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END }; > > if (bus < 0) > return NULL; > @@ -169,8 +170,28 @@ static struct i2c_client *__add_probed_i2c_device( > return NULL; > } > > - /* add the i2c device */ > - client = i2c_new_probed_device(adapter, info, addrs, NULL); > + /* > + * Add the i2c device. If we can't detect it at the primary > + * address we scan secondary addresses. In any case the client > + * structure gets assigned primary address. > + */ > + client = i2c_new_probed_device(adapter, info, addr_list, NULL); > + if (!client && alt_addr_list) { > + struct i2c_board_info dummy_info = { > + I2C_BOARD_INFO("dummy", info->addr), > + }; > + struct i2c_client *dummy; > + > + dummy = i2c_new_probed_device(adapter, &dummy_info, > + alt_addr_list, NULL); > + if (dummy) { > + pr_debug("%s %d-%02x is probed at %02x\n", > + __func__, bus, info->addr, dummy->addr); > + i2c_unregister_device(dummy); > + client = i2c_new_device(adapter, info); > + } > + } > + > if (!client) > pr_notice("%s failed to register device %d-%02x\n", > __func__, bus, info->addr); > @@ -254,12 +275,10 @@ static struct i2c_client *add_i2c_device(const char *name, > enum i2c_adapter_type type, > struct i2c_board_info *info) > { > - const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END }; > - > return __add_probed_i2c_device(name, > find_i2c_adapter_num(type), > info, > - addr_list); > + NULL); > } > > static int setup_cyapa_tp(enum i2c_adapter_type type) > @@ -275,7 +294,6 @@ static int setup_cyapa_tp(enum i2c_adapter_type type) > static int setup_atmel_224s_tp(enum i2c_adapter_type type) > { > const unsigned short addr_list[] = { ATMEL_TP_I2C_BL_ADDR, > - ATMEL_TP_I2C_ADDR, > I2C_CLIENT_END }; > if (tp) > return 0; > @@ -289,7 +307,6 @@ static int setup_atmel_224s_tp(enum i2c_adapter_type type) > static int setup_atmel_1664s_ts(enum i2c_adapter_type type) > { > const unsigned short addr_list[] = { ATMEL_TS_I2C_BL_ADDR, > - ATMEL_TS_I2C_ADDR, > I2C_CLIENT_END }; > if (ts) > return 0; > -- > 2.2.0.rc0.207.ga3a616c > > > -- > Dmitry -- Dmitry