Hi Duson, On Wed, Jun 10, 2015 at 04:25:08PM +0800, DusonLin wrote: > Hi Dmitry, > > When can I fetch the newest linux source code and make sure this patch had be > merged?
You can either check my tree on kernel.org (depending on the patch it will be in either for-linus or next branch) or check linux-next git repository (the patches will also end up there with a delay of about 1 day). Thanks. > > Thank you > Duson > > -----Original Message----- > From: Dmitry Torokhov [mailto:[email protected]] > Sent: Tuesday, June 09, 2015 8:09 AM > To: duson > Cc: [email protected]; [email protected] > Subject: Re: [PATCH] Input - elan_i2c: support multi ic type and iap format > > On Sun, Jun 07, 2015 at 03:34:04AM +0800, duson wrote: > > In order to support multi ic type for i2c/smbus protocol, add get ic > > type command and check fw vaild page count and signature address function. > > > > Signed-off by: Duson Lin <[email protected]> > > Applied, thank you (but please try to convince your mailer to not use quoted > printable format). > > > --- > > drivers/input/mouse/elan_i2c.h | 5 ++-- > > drivers/input/mouse/elan_i2c_core.c | 44 > > ++++++++++++++++++++++++++++++---- > > drivers/input/mouse/elan_i2c_i2c.c | 5 +++- > > drivers/input/mouse/elan_i2c_smbus.c | 6 +++-- > > 4 files changed, 49 insertions(+), 11 deletions(-) > > > > diff --git a/drivers/input/mouse/elan_i2c.h > > b/drivers/input/mouse/elan_i2c.h index 6d5f8a4..ff622a1 100644 > > --- a/drivers/input/mouse/elan_i2c.h > > +++ b/drivers/input/mouse/elan_i2c.h > > @@ -33,9 +33,7 @@ > > #define ETP_FW_IAP_PAGE_ERR (1 << 5) > > #define ETP_FW_IAP_INTF_ERR (1 << 4) > > #define ETP_FW_PAGE_SIZE 64 > > -#define ETP_FW_VAILDPAGE_COUNT 768 > > #define ETP_FW_SIGNATURE_SIZE 6 > > -#define ETP_FW_SIGNATURE_ADDRESS 0xBFFA > > > > struct i2c_client; > > struct completion; > > @@ -58,7 +56,8 @@ struct elan_transport_ops { > > bool max_baseliune, u8 *value); > > > > int (*get_version)(struct i2c_client *client, bool iap, u8 *version); > > - int (*get_sm_version)(struct i2c_client *client, u8 *version); > > + int (*get_sm_version)(struct i2c_client *client, > > + u8* ic_type, u8 *version); > > int (*get_checksum)(struct i2c_client *client, bool iap, u16 *csum); > > int (*get_product_id)(struct i2c_client *client, u8 *id); > > > > diff --git a/drivers/input/mouse/elan_i2c_core.c > > b/drivers/input/mouse/elan_i2c_core.c > > index fd5068b..81e7bc9 100644 > > --- a/drivers/input/mouse/elan_i2c_core.c > > +++ b/drivers/input/mouse/elan_i2c_core.c > > @@ -4,7 +4,7 @@ > > * Copyright (c) 2013 ELAN Microelectronics Corp. > > * > > * Author: 林政維 (Duson Lin) <[email protected]> > > - * Version: 1.5.7 > > + * Version: 1.5.8 > > * > > * Based on cyapa driver: > > * copyright (c) 2011-2012 Cypress Semiconductor, Inc. > > @@ -40,7 +40,7 @@ > > #include "elan_i2c.h" > > > > #define DRIVER_NAME "elan_i2c" > > -#define ELAN_DRIVER_VERSION "1.5.7" > > +#define ELAN_DRIVER_VERSION "1.5.8" > > #define ETP_MAX_PRESSURE 255 > > #define ETP_FWIDTH_REDUCE 90 > > #define ETP_FINGER_WIDTH 15 > > @@ -83,6 +83,9 @@ struct elan_tp_data { > > u16 fw_checksum; > > int pressure_adjustment; > > u8 mode; > > + u8 ic_type; > > + u16 fw_vaildpage_count; > > + u16 fw_signature_address; > > > > bool irq_wake; > > > > @@ -91,6 +94,28 @@ struct elan_tp_data { > > bool baseline_ready; > > }; > > > > +static int elan_get_fwinfo(u8 ic_type, u16 *vaildpage_count, > > + u16 *signature_address) > > +{ > > + > > + switch(ic_type) { > > + case 0x09: > > + *vaildpage_count = 768; > > + break; > > + case 0x0D: > > + *vaildpage_count = 896; > > + break; > > + default: > > + /* unknown ic type clear value */ > > + *vaildpage_count = 0; > > + *signature_address = 0; > > + return -ENXIO; > > + } > > + *signature_address = (*vaildpage_count * ETP_FW_PAGE_SIZE) > > + - ETP_FW_SIGNATURE_SIZE; > > + return 0; > > +} > > + > > static int elan_enable_power(struct elan_tp_data *data) { > > int repeat = ETP_RETRY_COUNT; > > @@ -221,7 +246,8 @@ static int elan_query_device_info(struct elan_tp_data > > *data) > > if (error) > > return error; > > > > - error = data->ops->get_sm_version(data->client, &data->sm_version); > > + error = data->ops->get_sm_version(data->client, &data->ic_type, > > + &data->sm_version); > > if (error) > > return error; > > > > @@ -234,6 +260,14 @@ static int elan_query_device_info(struct elan_tp_data > > *data) > > if (error) > > return error; > > > > + error = elan_get_fwinfo(data->ic_type, &data->fw_vaildpage_count, > > + &data->fw_signature_address); > > + if (error) { > > + dev_err(&data->client->dev, > > + "unknown ic type %d\n", data->ic_type); > > + return error; > > + } > > + > > return 0; > > } > > > > @@ -318,7 +352,7 @@ static int __elan_update_firmware(struct elan_tp_data > > *data, > > iap_start_addr = get_unaligned_le16(&fw->data[ETP_IAP_START_ADDR * > > 2]); > > > > boot_page_count = (iap_start_addr * 2) / ETP_FW_PAGE_SIZE; > > - for (i = boot_page_count; i < ETP_FW_VAILDPAGE_COUNT; i++) { > > + for (i = boot_page_count; i < data->fw_vaildpage_count; i++) { > > u16 checksum = 0; > > const u8 *page = &fw->data[i * ETP_FW_PAGE_SIZE]; > > > > @@ -454,7 +488,7 @@ static ssize_t elan_sysfs_update_fw(struct device *dev, > > } > > > > /* Firmware file must match signature data */ > > - fw_signature = &fw->data[ETP_FW_SIGNATURE_ADDRESS]; > > + fw_signature = &fw->data[data->fw_signature_address]; > > if (memcmp(fw_signature, signature, sizeof(signature)) != 0) { > > dev_err(dev, "signature mismatch (expected %*ph, got %*ph)\n", > > (int)sizeof(signature), signature, diff --git > > a/drivers/input/mouse/elan_i2c_i2c.c > > b/drivers/input/mouse/elan_i2c_i2c.c > > index a0acbbf..549cdfb 100644 > > --- a/drivers/input/mouse/elan_i2c_i2c.c > > +++ b/drivers/input/mouse/elan_i2c_i2c.c > > @@ -259,7 +259,8 @@ static int elan_i2c_get_version(struct i2c_client > > *client, > > return 0; > > } > > > > -static int elan_i2c_get_sm_version(struct i2c_client *client, u8 > > *version) > > +static int elan_i2c_get_sm_version(struct i2c_client *client, u8 *ic_type, > > + u8 *version) > > { > > int error; > > u8 val[3]; > > @@ -271,9 +272,11 @@ static int elan_i2c_get_sm_version(struct i2c_client > > *client, u8 *version) > > } > > > > *version = val[0]; > > + *ic_type = val[1]; > > return 0; > > } > > > > + > > static int elan_i2c_get_product_id(struct i2c_client *client, u8 *id) > > { > > int error; > > diff --git a/drivers/input/mouse/elan_i2c_smbus.c > > b/drivers/input/mouse/elan_i2c_smbus.c > > index 30ab80d..c28caef 100644 > > --- a/drivers/input/mouse/elan_i2c_smbus.c > > +++ b/drivers/input/mouse/elan_i2c_smbus.c > > @@ -165,7 +165,8 @@ static int elan_smbus_get_version(struct i2c_client > > *client, > > return 0; > > } > > > > -static int elan_smbus_get_sm_version(struct i2c_client *client, u8 > > *version) > > +static int elan_smbus_get_sm_version(struct i2c_client *client, u8 > > *ic_type, > > + u8 *version) > > { > > int error; > > u8 val[3]; > > @@ -177,7 +178,8 @@ static int elan_smbus_get_sm_version(struct i2c_client > > *client, u8 *version) > > return error; > > } > > > > - *version = val[0]; /* XXX Why 0 and not 2 as in IAP/FW versions? */ > > + *version = val[0]; > > + *ic_type = val[1]; > > return 0; > > } > > -- > Dmitry > -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

