aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorNick Dyer <nick@shmanahar.org>2016-07-18 17:10:36 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-08-23 15:33:13 -0400
commit06b3d3f38c19601564cdd10443edbcac5c8293e2 (patch)
tree4bae0a5d4bee39891390f0af9cd6aac52b2cd015 /drivers/input
parent566d533a4bd2ed9a7ce26a08df31a6e634051562 (diff)
[media] Input: atmel_mxt_ts - add support for reference data
There are different datatypes available from a maXTouch chip. Add support to retrieve reference data as well. 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')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c57
1 files changed, 51 insertions, 6 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 584198e64661..beede8fe511c 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -135,6 +135,7 @@ struct t9_range {
135/* MXT_DEBUG_DIAGNOSTIC_T37 */ 135/* MXT_DEBUG_DIAGNOSTIC_T37 */
136#define MXT_DIAGNOSTIC_PAGEUP 0x01 136#define MXT_DIAGNOSTIC_PAGEUP 0x01
137#define MXT_DIAGNOSTIC_DELTAS 0x10 137#define MXT_DIAGNOSTIC_DELTAS 0x10
138#define MXT_DIAGNOSTIC_REFS 0x11
138#define MXT_DIAGNOSTIC_SIZE 128 139#define MXT_DIAGNOSTIC_SIZE 128
139 140
140#define MXT_FAMILY_1386 160 141#define MXT_FAMILY_1386 160
@@ -249,6 +250,12 @@ struct mxt_dbg {
249 int input; 250 int input;
250}; 251};
251 252
253enum v4l_dbg_inputs {
254 MXT_V4L_INPUT_DELTAS,
255 MXT_V4L_INPUT_REFS,
256 MXT_V4L_INPUT_MAX,
257};
258
252static const struct v4l2_file_operations mxt_video_fops = { 259static const struct v4l2_file_operations mxt_video_fops = {
253 .owner = THIS_MODULE, 260 .owner = THIS_MODULE,
254 .open = v4l2_fh_open, 261 .open = v4l2_fh_open,
@@ -2273,6 +2280,7 @@ static void mxt_buffer_queue(struct vb2_buffer *vb)
2273 struct mxt_data *data = vb2_get_drv_priv(vb->vb2_queue); 2280 struct mxt_data *data = vb2_get_drv_priv(vb->vb2_queue);
2274 u16 *ptr; 2281 u16 *ptr;
2275 int ret; 2282 int ret;
2283 u8 mode;
2276 2284
2277 ptr = vb2_plane_vaddr(vb, 0); 2285 ptr = vb2_plane_vaddr(vb, 0);
2278 if (!ptr) { 2286 if (!ptr) {
@@ -2280,7 +2288,18 @@ static void mxt_buffer_queue(struct vb2_buffer *vb)
2280 goto fault; 2288 goto fault;
2281 } 2289 }
2282 2290
2283 ret = mxt_read_diagnostic_debug(data, MXT_DIAGNOSTIC_DELTAS, ptr); 2291 switch (data->dbg.input) {
2292 case MXT_V4L_INPUT_DELTAS:
2293 default:
2294 mode = MXT_DIAGNOSTIC_DELTAS;
2295 break;
2296
2297 case MXT_V4L_INPUT_REFS:
2298 mode = MXT_DIAGNOSTIC_REFS;
2299 break;
2300 }
2301
2302 ret = mxt_read_diagnostic_debug(data, mode, ptr);
2284 if (ret) 2303 if (ret)
2285 goto fault; 2304 goto fault;
2286 2305
@@ -2325,11 +2344,21 @@ static int mxt_vidioc_querycap(struct file *file, void *priv,
2325static int mxt_vidioc_enum_input(struct file *file, void *priv, 2344static int mxt_vidioc_enum_input(struct file *file, void *priv,
2326 struct v4l2_input *i) 2345 struct v4l2_input *i)
2327{ 2346{
2328 if (i->index > 0) 2347 if (i->index >= MXT_V4L_INPUT_MAX)
2329 return -EINVAL; 2348 return -EINVAL;
2330 2349
2331 i->type = V4L2_INPUT_TYPE_TOUCH; 2350 i->type = V4L2_INPUT_TYPE_TOUCH;
2332 strlcpy(i->name, "Mutual Capacitance Deltas", sizeof(i->name)); 2351
2352 switch (i->index) {
2353 case MXT_V4L_INPUT_REFS:
2354 strlcpy(i->name, "Mutual Capacitance References",
2355 sizeof(i->name));
2356 break;
2357 case MXT_V4L_INPUT_DELTAS:
2358 strlcpy(i->name, "Mutual Capacitance Deltas", sizeof(i->name));
2359 break;
2360 }
2361
2333 return 0; 2362 return 0;
2334} 2363}
2335 2364
@@ -2337,12 +2366,16 @@ static int mxt_set_input(struct mxt_data *data, unsigned int i)
2337{ 2366{
2338 struct v4l2_pix_format *f = &data->dbg.format; 2367 struct v4l2_pix_format *f = &data->dbg.format;
2339 2368
2340 if (i > 0) 2369 if (i >= MXT_V4L_INPUT_MAX)
2341 return -EINVAL; 2370 return -EINVAL;
2342 2371
2372 if (i == MXT_V4L_INPUT_DELTAS)
2373 f->pixelformat = V4L2_TCH_FMT_DELTA_TD16;
2374 else
2375 f->pixelformat = V4L2_TCH_FMT_TU16;
2376
2343 f->width = data->xy_switch ? data->ysize : data->xsize; 2377 f->width = data->xy_switch ? data->ysize : data->xsize;
2344 f->height = data->xy_switch ? data->xsize : data->ysize; 2378 f->height = data->xy_switch ? data->xsize : data->ysize;
2345 f->pixelformat = V4L2_TCH_FMT_DELTA_TD16;
2346 f->field = V4L2_FIELD_NONE; 2379 f->field = V4L2_FIELD_NONE;
2347 f->colorspace = V4L2_COLORSPACE_RAW; 2380 f->colorspace = V4L2_COLORSPACE_RAW;
2348 f->bytesperline = f->width * sizeof(u16); 2381 f->bytesperline = f->width * sizeof(u16);
@@ -2383,7 +2416,19 @@ static int mxt_vidioc_enum_fmt(struct file *file, void *priv,
2383 if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 2416 if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2384 return -EINVAL; 2417 return -EINVAL;
2385 2418
2386 fmt->pixelformat = V4L2_TCH_FMT_DELTA_TD16; 2419 switch (fmt->index) {
2420 case 0:
2421 fmt->pixelformat = V4L2_TCH_FMT_TU16;
2422 break;
2423
2424 case 1:
2425 fmt->pixelformat = V4L2_TCH_FMT_DELTA_TD16;
2426 break;
2427
2428 default:
2429 return -EINVAL;
2430 }
2431
2387 return 0; 2432 return 0;
2388} 2433}
2389 2434