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

Reply via email to