commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=fe51652f26c6fec275c9611e224cceba685332c8 branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk
This driver won't work on VERSION 1 or below. Signed-off-by: Michael Hennerich <[email protected]> --- drivers/input/misc/adux1001-vibra.c | 49 ++++++++++++++++++++++++---------- include/linux/input/adux1001.h | 17 +++++++++--- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/drivers/input/misc/adux1001-vibra.c b/drivers/input/misc/adux1001-vibra.c index 5e234a5..c9072c1 100644 --- a/drivers/input/misc/adux1001-vibra.c +++ b/drivers/input/misc/adux1001-vibra.c @@ -68,10 +68,12 @@ #define ADUX1001_SLRA_CAL3 0x16 /* Smart LRA mode calibration results register 3. Maximum negative back EMF value R/W */ -#define ADUX1001_SLRA_CAL4 0x17 /* Smart LRA mode calibration results - register 4. LRA resonance period R/W */ -#define ADUX1001_SLRA_CAL5 0x18 /* Smart LRA mode calibration results - register 5. LRA resonance period R/W */ +#define ADUX1001_RESERVED0 0x17 /* LRA specific values (RESET: 0x63) */ +#define ADUX1001_RESERVED1 0x18 /* LRA specific values (RESET: 0x10) */ +#define ADUX1001_RESERVED2 0x19 /* LRA specific values (RESET: 0x41) */ +#define ADUX1001_RESERVED3 0x1A /* LRA specific values (RESET: 0x5C) */ +#define ADUX1001_RESERVED4 0x1B /* LRA specific values (RESET: 0x02) */ + #define ADUX1001_STATUS 0x1C /* Status flags R */ #define ADUX1001_VERSION 0x1D /* ADUX1001 silicon revision R */ @@ -107,7 +109,8 @@ #define ADUX1001_I2C_MODE_ACTIVATE (1 << 0) /* CALIBRATE, Register Address 0x12, Reset 0x00 */ -#define ADUX1001_CAL_CYCLES(x) (((x) & 0x1F) << 1) +#define ADUX1001_PERIOD_CAL_CYCLES(x) (((x) & 0x7) << 5) +#define ADUX1001_AMP_CAL_CYCLES(x) (((x) & 0xF) << 1) #define ADUX1001_CALIBRATE_EN (1 << 0) /* STATUS, Register Address 0x1C, Reset 0x20 */ @@ -163,7 +166,8 @@ static int adux1001_calibrate(struct i2c_client *client) unsigned val, delay_ms; int ret; - val = ADUX1001_CAL_CYCLES(pdata->calibration_cycles) | + val = ADUX1001_PERIOD_CAL_CYCLES(pdata->period_calibration_cycles) | + ADUX1001_AMP_CAL_CYCLES(pdata->amp_calibration_cycles) | ADUX1001_CALIBRATE_EN; ret = i2c_smbus_write_byte_data(client, ADUX1001_CALIBRATE, val); @@ -172,7 +176,7 @@ static int adux1001_calibrate(struct i2c_client *client) return ret; } /* assume default resonant period value (6.55ms) */ - delay_ms = pdata->calibration_cycles * 7; + delay_ms = pdata->amp_calibration_cycles * 7; do { msleep(delay_ms); @@ -196,7 +200,7 @@ static int adux1001_read_calibdata(struct i2c_client *client, unsigned char *data = "" char *) calib_data; int reg, ret; - for (reg = ADUX1001_SLRA_CAL0; reg <= ADUX1001_SLRA_CAL5; reg++) { + for (reg = ADUX1001_SLRA_CAL0; reg <= ADUX1001_SLRA_CAL3; reg++) { ret = i2c_smbus_read_byte_data(client, reg); if (ret < 0) return ret; @@ -212,7 +216,7 @@ static int adux1001_write_calibdata(struct i2c_client *client, unsigned char *data = "" char *) calib_data; int reg, ret; - for (reg = ADUX1001_SLRA_CAL0; reg <= ADUX1001_SLRA_CAL5; reg++) { + for (reg = ADUX1001_SLRA_CAL0; reg <= ADUX1001_SLRA_CAL3; reg++) { ret = i2c_smbus_write_byte_data(client, reg, data[reg - ADUX1001_SLRA_CAL0]); if (ret < 0) @@ -222,6 +226,22 @@ static int adux1001_write_calibdata(struct i2c_client *client, return 0; } +static int adux1001_write_reserved_data(struct i2c_client *client, + struct adux1001_reserved_data *reserved_data) +{ + unsigned char *data = "" char *) reserved_data; + int reg, ret; + + for (reg = ADUX1001_RESERVED0; reg <= ADUX1001_RESERVED4; reg++) { + ret = i2c_smbus_write_byte_data(client, reg, + data[reg - ADUX1001_RESERVED0]); + if (ret < 0) + return ret; + } + + return 0; +} + static int adux1001_setup(struct i2c_client *client) { struct adux1001_chip *chip = i2c_get_clientdata(client); @@ -244,12 +264,11 @@ static int adux1001_setup(struct i2c_client *client) } val = i2c_smbus_read_byte_data(client, ADUX1001_VERSION); - if ((val & ADUX1001_VERSION_MASK) <= 1) { - /* Workaround for Silicon Rev.0 */ - i2c_smbus_write_byte_data(client, 0x19, 0x47); - i2c_smbus_write_byte_data(client, 0x1A, 0xC0); - i2c_smbus_write_byte_data(client, 0x1B, 0x68); - } + if ((val & ADUX1001_VERSION_MASK) <= 1) + dev_err(&client->dev, "unsupported VERSION detected\n"); + + if (pdata->reserved_data) + adux1001_write_reserved_data(client, pdata->reserved_data); config = ADUX1001_UVLO_EN(!pdata->uvlo_dis) | ADUX1001_OCLO_EN(!pdata->oclo_dis) | diff --git a/include/linux/input/adux1001.h b/include/linux/input/adux1001.h index f0c3d95..90c2538 100644 --- a/include/linux/input/adux1001.h +++ b/include/linux/input/adux1001.h @@ -21,8 +21,14 @@ struct adux1001_calib_data { unsigned char slra_cal1; unsigned char slra_cal2; unsigned char slra_cal3; - unsigned char slra_cal4; - unsigned char slra_cal5; +} __packed; + +struct adux1001_reserved_data { + unsigned char reserved0; + unsigned char reserved1; + unsigned char reserved2; + unsigned char reserved3; + unsigned char reserved4; } __packed; struct i2c_client; /* forward declaration */ @@ -69,7 +75,7 @@ struct adux1001_vibra_platform_data { unsigned char loop_gain; /* 2..15 */ - /* 0..8, from 50mA - 150mA in 12.5mA steps */ + /* 0..7, from 40mA - 160mA in 10mA steps */ unsigned char max_output_current; bool lra_output_unit_1ms; /* true = 1ms, false = LRA @@ -79,7 +85,10 @@ struct adux1001_vibra_platform_data { unsigned char output_rate; /* Rate = lra_output_unit * * output_rate, 1..127 */ - unsigned char calibration_cycles; /* 1..31 */ + unsigned char period_calibration_cycles; /* 0..7 */ + unsigned char amp_calibration_cycles; /* 0..15 */ + + struct adux1001_reserved_data *reserved_data; /* initial arbitrary waveform buffer */ unsigned char *arb_wform_buffer_array;
_______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
