diff options
| author | Nick Dyer <nick@shmanahar.org> | 2016-07-18 17:10:34 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-08-23 15:32:01 -0400 |
| commit | de601f71e7d1bdfa411e61d43af7b2b6cde5d2a2 (patch) | |
| tree | 92d135a667cf569cf2a6d7bab8590cd3c22f07ed /drivers/input/touchscreen | |
| parent | 2786489f324e8384a814793d88c3a76d1973f422 (diff) | |
[media] Input: atmel_mxt_ts - handle diagnostic data orientation
Invert the diagnostic data to match the orientation of the input device.
Signed-off-by: Nick Dyer <nick@shmanahar.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/touchscreen')
| -rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 29be261a4750..7376c42d2370 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c | |||
| @@ -125,6 +125,8 @@ struct t9_range { | |||
| 125 | 125 | ||
| 126 | /* MXT_TOUCH_MULTI_T9 orient */ | 126 | /* MXT_TOUCH_MULTI_T9 orient */ |
| 127 | #define MXT_T9_ORIENT_SWITCH (1 << 0) | 127 | #define MXT_T9_ORIENT_SWITCH (1 << 0) |
| 128 | #define MXT_T9_ORIENT_INVERTX (1 << 1) | ||
| 129 | #define MXT_T9_ORIENT_INVERTY (1 << 2) | ||
| 128 | 130 | ||
| 129 | /* MXT_SPT_COMMSCONFIG_T18 */ | 131 | /* MXT_SPT_COMMSCONFIG_T18 */ |
| 130 | #define MXT_COMMS_CTRL 0 | 132 | #define MXT_COMMS_CTRL 0 |
| @@ -158,6 +160,8 @@ struct t37_debug { | |||
| 158 | #define MXT_T100_YRANGE 24 | 160 | #define MXT_T100_YRANGE 24 |
| 159 | 161 | ||
| 160 | #define MXT_T100_CFG_SWITCHXY BIT(5) | 162 | #define MXT_T100_CFG_SWITCHXY BIT(5) |
| 163 | #define MXT_T100_CFG_INVERTY BIT(6) | ||
| 164 | #define MXT_T100_CFG_INVERTX BIT(7) | ||
| 161 | 165 | ||
| 162 | #define MXT_T100_TCHAUX_VECT BIT(0) | 166 | #define MXT_T100_TCHAUX_VECT BIT(0) |
| 163 | #define MXT_T100_TCHAUX_AMPL BIT(1) | 167 | #define MXT_T100_TCHAUX_AMPL BIT(1) |
| @@ -262,6 +266,8 @@ struct mxt_data { | |||
| 262 | unsigned int irq; | 266 | unsigned int irq; |
| 263 | unsigned int max_x; | 267 | unsigned int max_x; |
| 264 | unsigned int max_y; | 268 | unsigned int max_y; |
| 269 | bool invertx; | ||
| 270 | bool inverty; | ||
| 265 | bool xy_switch; | 271 | bool xy_switch; |
| 266 | u8 xsize; | 272 | u8 xsize; |
| 267 | u8 ysize; | 273 | u8 ysize; |
| @@ -1747,6 +1753,8 @@ static int mxt_read_t9_resolution(struct mxt_data *data) | |||
| 1747 | return error; | 1753 | return error; |
| 1748 | 1754 | ||
| 1749 | data->xy_switch = orient & MXT_T9_ORIENT_SWITCH; | 1755 | data->xy_switch = orient & MXT_T9_ORIENT_SWITCH; |
| 1756 | data->invertx = orient & MXT_T9_ORIENT_INVERTX; | ||
| 1757 | data->inverty = orient & MXT_T9_ORIENT_INVERTY; | ||
| 1750 | 1758 | ||
| 1751 | return 0; | 1759 | return 0; |
| 1752 | } | 1760 | } |
| @@ -1801,6 +1809,8 @@ static int mxt_read_t100_config(struct mxt_data *data) | |||
| 1801 | return error; | 1809 | return error; |
| 1802 | 1810 | ||
| 1803 | data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY; | 1811 | data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY; |
| 1812 | data->invertx = cfg & MXT_T100_CFG_INVERTX; | ||
| 1813 | data->inverty = cfg & MXT_T100_CFG_INVERTY; | ||
| 1804 | 1814 | ||
| 1805 | /* allocate aux bytes */ | 1815 | /* allocate aux bytes */ |
| 1806 | error = __mxt_read_reg(client, | 1816 | error = __mxt_read_reg(client, |
| @@ -2145,13 +2155,19 @@ static int mxt_convert_debug_pages(struct mxt_data *data, u16 *outbuf) | |||
| 2145 | struct mxt_dbg *dbg = &data->dbg; | 2155 | struct mxt_dbg *dbg = &data->dbg; |
| 2146 | unsigned int x = 0; | 2156 | unsigned int x = 0; |
| 2147 | unsigned int y = 0; | 2157 | unsigned int y = 0; |
| 2148 | unsigned int i; | 2158 | unsigned int i, rx, ry; |
| 2149 | 2159 | ||
| 2150 | for (i = 0; i < dbg->t37_nodes; i++) { | 2160 | for (i = 0; i < dbg->t37_nodes; i++) { |
| 2151 | outbuf[i] = mxt_get_debug_value(data, x, y); | 2161 | /* Handle orientation */ |
| 2162 | rx = data->xy_switch ? y : x; | ||
| 2163 | ry = data->xy_switch ? x : y; | ||
| 2164 | rx = data->invertx ? (data->xsize - 1 - rx) : rx; | ||
| 2165 | ry = data->inverty ? (data->ysize - 1 - ry) : ry; | ||
| 2166 | |||
| 2167 | outbuf[i] = mxt_get_debug_value(data, rx, ry); | ||
| 2152 | 2168 | ||
| 2153 | /* Next value */ | 2169 | /* Next value */ |
| 2154 | if (++x >= data->xsize) { | 2170 | if (++x >= (data->xy_switch ? data->ysize : data->xsize)) { |
| 2155 | x = 0; | 2171 | x = 0; |
| 2156 | y++; | 2172 | y++; |
| 2157 | } | 2173 | } |
| @@ -2306,8 +2322,8 @@ static int mxt_set_input(struct mxt_data *data, unsigned int i) | |||
| 2306 | if (i > 0) | 2322 | if (i > 0) |
| 2307 | return -EINVAL; | 2323 | return -EINVAL; |
| 2308 | 2324 | ||
| 2309 | f->width = data->xsize; | 2325 | f->width = data->xy_switch ? data->ysize : data->xsize; |
| 2310 | f->height = data->ysize; | 2326 | f->height = data->xy_switch ? data->xsize : data->ysize; |
| 2311 | f->pixelformat = V4L2_TCH_FMT_DELTA_TD16; | 2327 | f->pixelformat = V4L2_TCH_FMT_DELTA_TD16; |
| 2312 | f->field = V4L2_FIELD_NONE; | 2328 | f->field = V4L2_FIELD_NONE; |
| 2313 | f->colorspace = V4L2_COLORSPACE_RAW; | 2329 | f->colorspace = V4L2_COLORSPACE_RAW; |
