Input: atmel_mxt_ts - improve touchscreen size/orientation handling
Both T100 and T9 handle range and orientation in a similar fashion. Reduce duplication between the two implementations. Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
committed by
Dmitry Torokhov
parent
6544a1df11
commit
1c0276d567
@@ -113,8 +113,8 @@ struct t7_config {
|
|||||||
#define MXT_T9_DETECT (1 << 7)
|
#define MXT_T9_DETECT (1 << 7)
|
||||||
|
|
||||||
struct t9_range {
|
struct t9_range {
|
||||||
u16 x;
|
__le16 x;
|
||||||
u16 y;
|
__le16 y;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* MXT_TOUCH_MULTI_T9 orient */
|
/* MXT_TOUCH_MULTI_T9 orient */
|
||||||
@@ -216,6 +216,7 @@ struct mxt_data {
|
|||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
unsigned int max_x;
|
unsigned int max_x;
|
||||||
unsigned int max_y;
|
unsigned int max_y;
|
||||||
|
bool xy_switch;
|
||||||
bool in_bootloader;
|
bool in_bootloader;
|
||||||
u16 mem_size;
|
u16 mem_size;
|
||||||
u8 t100_aux_ampl;
|
u8 t100_aux_ampl;
|
||||||
@@ -1665,8 +1666,8 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
le16_to_cpus(&range.x);
|
data->max_x = get_unaligned_le16(&range.x);
|
||||||
le16_to_cpus(&range.y);
|
data->max_y = get_unaligned_le16(&range.y);
|
||||||
|
|
||||||
error = __mxt_read_reg(client,
|
error = __mxt_read_reg(client,
|
||||||
object->start_address + MXT_T9_ORIENT,
|
object->start_address + MXT_T9_ORIENT,
|
||||||
@@ -1674,23 +1675,7 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
/* Handle default values */
|
data->xy_switch = orient & MXT_T9_ORIENT_SWITCH;
|
||||||
if (range.x == 0)
|
|
||||||
range.x = 1023;
|
|
||||||
|
|
||||||
if (range.y == 0)
|
|
||||||
range.y = 1023;
|
|
||||||
|
|
||||||
if (orient & MXT_T9_ORIENT_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;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1708,13 +1693,14 @@ static int mxt_read_t100_config(struct mxt_data *data)
|
|||||||
if (!object)
|
if (!object)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* read touchscreen dimensions */
|
||||||
error = __mxt_read_reg(client,
|
error = __mxt_read_reg(client,
|
||||||
object->start_address + MXT_T100_XRANGE,
|
object->start_address + MXT_T100_XRANGE,
|
||||||
sizeof(range_x), &range_x);
|
sizeof(range_x), &range_x);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
le16_to_cpus(&range_x);
|
data->max_x = get_unaligned_le16(&range_x);
|
||||||
|
|
||||||
error = __mxt_read_reg(client,
|
error = __mxt_read_reg(client,
|
||||||
object->start_address + MXT_T100_YRANGE,
|
object->start_address + MXT_T100_YRANGE,
|
||||||
@@ -1722,36 +1708,24 @@ static int mxt_read_t100_config(struct mxt_data *data)
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
le16_to_cpus(&range_y);
|
data->max_y = get_unaligned_le16(&range_y);
|
||||||
|
|
||||||
|
/* read orientation config */
|
||||||
error = __mxt_read_reg(client,
|
error = __mxt_read_reg(client,
|
||||||
object->start_address + MXT_T100_CFG1,
|
object->start_address + MXT_T100_CFG1,
|
||||||
1, &cfg);
|
1, &cfg);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY;
|
||||||
|
|
||||||
|
/* allocate aux bytes */
|
||||||
error = __mxt_read_reg(client,
|
error = __mxt_read_reg(client,
|
||||||
object->start_address + MXT_T100_TCHAUX,
|
object->start_address + MXT_T100_TCHAUX,
|
||||||
1, &tchaux);
|
1, &tchaux);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
/* Handle default values */
|
|
||||||
if (range_x == 0)
|
|
||||||
range_x = 1023;
|
|
||||||
|
|
||||||
if (range_y == 0)
|
|
||||||
range_y = 1023;
|
|
||||||
|
|
||||||
if (cfg & MXT_T100_CFG_SWITCHXY) {
|
|
||||||
data->max_x = range_y;
|
|
||||||
data->max_y = range_x;
|
|
||||||
} else {
|
|
||||||
data->max_x = range_x;
|
|
||||||
data->max_y = range_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate aux bytes */
|
|
||||||
aux = 6;
|
aux = 6;
|
||||||
|
|
||||||
if (tchaux & MXT_T100_TCHAUX_VECT)
|
if (tchaux & MXT_T100_TCHAUX_VECT)
|
||||||
@@ -1767,9 +1741,6 @@ static int mxt_read_t100_config(struct mxt_data *data)
|
|||||||
"T100 aux mappings vect:%u ampl:%u area:%u\n",
|
"T100 aux mappings vect:%u ampl:%u area:%u\n",
|
||||||
data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area);
|
data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area);
|
||||||
|
|
||||||
dev_info(&client->dev,
|
|
||||||
"T100 Touchscreen size X%uY%u\n", data->max_x, data->max_y);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1828,6 +1799,19 @@ static int mxt_initialize_input_device(struct mxt_data *data)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle default values and orientation switch */
|
||||||
|
if (data->max_x == 0)
|
||||||
|
data->max_x = 1023;
|
||||||
|
|
||||||
|
if (data->max_y == 0)
|
||||||
|
data->max_y = 1023;
|
||||||
|
|
||||||
|
if (data->xy_switch)
|
||||||
|
swap(data->max_x, data->max_y);
|
||||||
|
|
||||||
|
dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y);
|
||||||
|
|
||||||
|
/* Register input device */
|
||||||
input_dev = input_allocate_device();
|
input_dev = input_allocate_device();
|
||||||
if (!input_dev) {
|
if (!input_dev) {
|
||||||
dev_err(dev, "Failed to allocate memory\n");
|
dev_err(dev, "Failed to allocate memory\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user