Skip to content

Commit

Permalink
Input: atmel_mxt_ts - read screen config from chip
Browse files Browse the repository at this point in the history
By reading the touchscreen configuration from the settings that the
maXTouch chip is actually using, we can remove some platform data.

The matrix size is not used for anything, and results in some rather
confusing code to re-read it because it may change when configuration
is downloaded, so don't print it out.

Signed-off-by: Nick Dyer <[email protected]>
Acked-by: Benson Leung <[email protected]>
Acked-by: Yufeng Shen <[email protected]>
Signed-off-by: Dmitry Torokhov <[email protected]>
  • Loading branch information
ndyer authored and dtor committed May 27, 2014
1 parent f2ac6cb commit 61dc1ab
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 95 deletions.
3 changes: 0 additions & 3 deletions arch/arm/mach-s5pv210/mach-goni.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,6 @@ static void __init goni_radio_init(void)

/* TSP */
static struct mxt_platform_data qt602240_platform_data = {
.x_size = 800,
.y_size = 480,
.orient = MXT_DIAGONAL,
.irqflags = IRQF_TRIGGER_FALLING,
};

Expand Down
136 changes: 65 additions & 71 deletions drivers/input/touchscreen/atmel_mxt_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,33 +100,16 @@

/* MXT_TOUCH_MULTI_T9 field */
#define MXT_TOUCH_CTRL 0
#define MXT_TOUCH_XORIGIN 1
#define MXT_TOUCH_YORIGIN 2
#define MXT_TOUCH_XSIZE 3
#define MXT_TOUCH_YSIZE 4
#define MXT_TOUCH_BLEN 6
#define MXT_TOUCH_TCHTHR 7
#define MXT_TOUCH_TCHDI 8
#define MXT_TOUCH_ORIENT 9
#define MXT_TOUCH_MOVHYSTI 11
#define MXT_TOUCH_MOVHYSTN 12
#define MXT_TOUCH_NUMTOUCH 14
#define MXT_TOUCH_MRGHYST 15
#define MXT_TOUCH_MRGTHR 16
#define MXT_TOUCH_AMPHYST 17
#define MXT_TOUCH_XRANGE_LSB 18
#define MXT_TOUCH_XRANGE_MSB 19
#define MXT_TOUCH_YRANGE_LSB 20
#define MXT_TOUCH_YRANGE_MSB 21
#define MXT_TOUCH_XLOCLIP 22
#define MXT_TOUCH_XHICLIP 23
#define MXT_TOUCH_YLOCLIP 24
#define MXT_TOUCH_YHICLIP 25
#define MXT_TOUCH_XEDGECTRL 26
#define MXT_TOUCH_XEDGEDIST 27
#define MXT_TOUCH_YEDGECTRL 28
#define MXT_TOUCH_YEDGEDIST 29
#define MXT_TOUCH_JUMPLIMIT 30
#define MXT_T9_ORIENT 9
#define MXT_T9_RANGE 18

struct t9_range {
u16 x;
u16 y;
} __packed;

/* Touch orient bits */
#define MXT_XY_SWITCH (1 << 0)

/* MXT_PROCI_GRIPFACE_T20 field */
#define MXT_GRIPFACE_CTRL 0
Expand Down Expand Up @@ -211,11 +194,6 @@
#define MXT_PRESS (1 << 6)
#define MXT_DETECT (1 << 7)

/* Touch orient bits */
#define MXT_XY_SWITCH (1 << 0)
#define MXT_X_INVERT (1 << 1)
#define MXT_Y_INVERT (1 << 2)

/* Touchscreen absolute values */
#define MXT_MAX_AREA 0xff

Expand Down Expand Up @@ -580,11 +558,6 @@ static int __mxt_read_reg(struct i2c_client *client,
return ret;
}

static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val)
{
return __mxt_read_reg(client, reg, 1, val);
}

static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
const void *val)
{
Expand Down Expand Up @@ -1029,12 +1002,59 @@ static void mxt_free_object_table(struct mxt_data *data)
data->T19_reportid = 0;
}

static int mxt_read_t9_resolution(struct mxt_data *data)
{
struct i2c_client *client = data->client;
int error;
struct t9_range range;
unsigned char orient;
struct mxt_object *object;

object = mxt_get_object(data, MXT_TOUCH_MULTI_T9);
if (!object)
return -EINVAL;

error = __mxt_read_reg(client,
object->start_address + MXT_T9_RANGE,
sizeof(range), &range);
if (error)
return error;

le16_to_cpus(&range.x);
le16_to_cpus(&range.y);

error = __mxt_read_reg(client,
object->start_address + MXT_T9_ORIENT,
1, &orient);
if (error)
return error;

/* Handle default values */
if (range.x == 0)
range.x = 1023;

if (range.y == 0)
range.y = 1023;

if (orient & MXT_XY_SWITCH) {
data->max_x = range.y;
data->max_y = range.x;
} else {
data->max_x = range.x;
data->max_y = range.y;
}

dev_dbg(&client->dev,
"Touchscreen size X%uY%u\n", data->max_x, data->max_y);

return 0;
}

static int mxt_initialize(struct mxt_data *data)
{
struct i2c_client *client = data->client;
struct mxt_info *info = &data->info;
int error;
u8 val;

error = mxt_get_info(data);
if (error)
Expand Down Expand Up @@ -1063,26 +1083,16 @@ static int mxt_initialize(struct mxt_data *data)
goto err_free_object_table;
}

/* Update matrix size at info struct */
error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val);
if (error)
goto err_free_object_table;
info->matrix_xsize = val;

error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, &val);
if (error)
error = mxt_read_t9_resolution(data);
if (error) {
dev_err(&client->dev, "Failed to initialize T9 resolution\n");
goto err_free_object_table;
info->matrix_ysize = val;

dev_info(&client->dev,
"Family: %u Variant: %u Firmware V%u.%u.%02X\n",
info->family_id, info->variant_id, info->version >> 4,
info->version & 0xf, info->build);
}

dev_info(&client->dev,
"Matrix X Size: %u Matrix Y Size: %u Objects: %u\n",
info->matrix_xsize, info->matrix_ysize,
info->object_num);
"Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n",
info->family_id, info->variant_id, info->version >> 4,
info->version & 0xf, info->build, info->object_num);

return 0;

Expand All @@ -1091,20 +1101,6 @@ static int mxt_initialize(struct mxt_data *data)
return error;
}

static void mxt_calc_resolution(struct mxt_data *data)
{
unsigned int max_x = data->pdata->x_size - 1;
unsigned int max_y = data->pdata->y_size - 1;

if (data->pdata->orient & MXT_XY_SWITCH) {
data->max_x = max_y;
data->max_y = max_x;
} else {
data->max_x = max_x;
data->max_y = max_y;
}
}

/* Firmware Version is returned as Major.Minor.Build */
static ssize_t mxt_fw_version_show(struct device *dev,
struct device_attribute *attr, char *buf)
Expand Down Expand Up @@ -1430,8 +1426,6 @@ static int mxt_probe(struct i2c_client *client,
init_completion(&data->reset_completion);
init_completion(&data->crc_completion);

mxt_calc_resolution(data);

error = mxt_initialize(data);
if (error)
goto err_free_mem;
Expand Down
6 changes: 0 additions & 6 deletions drivers/platform/chrome/chromeos_laptop.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,6 @@ static int mxt_t19_keys[] = {
};

static struct mxt_platform_data atmel_224s_tp_platform_data = {
.x_size = 102*20,
.y_size = 68*20,
.orient = MXT_VERTICAL_FLIP,
.irqflags = IRQF_TRIGGER_FALLING,
.t19_num_keys = ARRAY_SIZE(mxt_t19_keys),
.t19_keymap = mxt_t19_keys,
Expand All @@ -111,9 +108,6 @@ static struct i2c_board_info atmel_224s_tp_device = {
};

static struct mxt_platform_data atmel_1664s_platform_data = {
.x_size = 1700,
.y_size = 2560,
.orient = MXT_ROTATED_90_COUNTER,
.irqflags = IRQF_TRIGGER_FALLING,
.config = NULL,
.config_length = 0,
Expand Down
15 changes: 0 additions & 15 deletions include/linux/i2c/atmel_mxt_ts.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,11 @@

#include <linux/types.h>

/* Orient */
#define MXT_NORMAL 0x0
#define MXT_DIAGONAL 0x1
#define MXT_HORIZONTAL_FLIP 0x2
#define MXT_ROTATED_90_COUNTER 0x3
#define MXT_VERTICAL_FLIP 0x4
#define MXT_ROTATED_90 0x5
#define MXT_ROTATED_180 0x6
#define MXT_DIAGONAL_COUNTER 0x7

/* The platform data for the Atmel maXTouch touchscreen driver */
struct mxt_platform_data {
const u8 *config;
size_t config_length;
u32 config_crc;

unsigned int x_size;
unsigned int y_size;
unsigned char orient;

unsigned long irqflags;
u8 t19_num_keys;
const unsigned int *t19_keymap;
Expand Down

0 comments on commit 61dc1ab

Please sign in to comment.