aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-12-02 20:49:10 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-12-02 20:51:32 -0500
commitae9979c31007d5366b73640ee7dcbb271357053e (patch)
tree90e2a51cccf83eccb72bdab6fac1e668ee4defe1
parentb908d3cd812abe3f4a74d7550bbf0a8cbcfbe6ed (diff)
Input: synaptics-rmi4 - store the attn data in the driver
Now that we have a proper API to set the attention data, there is no point in keeping it in the transport driver. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Reviewed-by: Andrew Duggan <aduggan@synaptics.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/rmi4/rmi_driver.c5
-rw-r--r--drivers/input/rmi4/rmi_f03.c13
-rw-r--r--drivers/input/rmi4/rmi_f11.c12
-rw-r--r--drivers/input/rmi4/rmi_f12.c43
-rw-r--r--drivers/input/rmi4/rmi_f30.c11
-rw-r--r--include/linux/rmi.h5
6 files changed, 45 insertions, 44 deletions
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index 85062e414e73..05a3c4bc9778 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -155,7 +155,7 @@ static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
155 if (!data) 155 if (!data)
156 return 0; 156 return 0;
157 157
158 if (!rmi_dev->xport->attn_data) { 158 if (!data->attn_data.data) {
159 error = rmi_read_block(rmi_dev, 159 error = rmi_read_block(rmi_dev,
160 data->f01_container->fd.data_base_addr + 1, 160 data->f01_container->fd.data_base_addr + 1,
161 data->irq_status, data->num_of_irq_regs); 161 data->irq_status, data->num_of_irq_regs);
@@ -223,8 +223,7 @@ static irqreturn_t rmi_irq_fn(int irq, void *dev_id)
223 count = kfifo_get(&drvdata->attn_fifo, &attn_data); 223 count = kfifo_get(&drvdata->attn_fifo, &attn_data);
224 if (count) { 224 if (count) {
225 *(drvdata->irq_status) = attn_data.irq_status; 225 *(drvdata->irq_status) = attn_data.irq_status;
226 rmi_dev->xport->attn_data = attn_data.data; 226 drvdata->attn_data = attn_data;
227 rmi_dev->xport->attn_size = attn_data.size;
228 } 227 }
229 228
230 ret = rmi_process_interrupt_requests(rmi_dev); 229 ret = rmi_process_interrupt_requests(rmi_dev);
diff --git a/drivers/input/rmi4/rmi_f03.c b/drivers/input/rmi4/rmi_f03.c
index 7a3ec0ed0c27..8a7ca3e2f95e 100644
--- a/drivers/input/rmi4/rmi_f03.c
+++ b/drivers/input/rmi4/rmi_f03.c
@@ -164,6 +164,7 @@ static int rmi_f03_config(struct rmi_function *fn)
164static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits) 164static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
165{ 165{
166 struct rmi_device *rmi_dev = fn->rmi_dev; 166 struct rmi_device *rmi_dev = fn->rmi_dev;
167 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
167 struct f03_data *f03 = dev_get_drvdata(&fn->dev); 168 struct f03_data *f03 = dev_get_drvdata(&fn->dev);
168 u16 data_addr = fn->fd.data_base_addr; 169 u16 data_addr = fn->fd.data_base_addr;
169 const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE; 170 const u8 ob_len = f03->rx_queue_length * RMI_F03_OB_SIZE;
@@ -174,20 +175,20 @@ static int rmi_f03_attention(struct rmi_function *fn, unsigned long *irq_bits)
174 int i; 175 int i;
175 int error; 176 int error;
176 177
177 if (!rmi_dev || !rmi_dev->xport) 178 if (!rmi_dev)
178 return -ENODEV; 179 return -ENODEV;
179 180
180 if (rmi_dev->xport->attn_data) { 181 if (drvdata->attn_data.data) {
181 /* First grab the data passed by the transport device */ 182 /* First grab the data passed by the transport device */
182 if (rmi_dev->xport->attn_size < ob_len) { 183 if (drvdata->attn_data.size < ob_len) {
183 dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n"); 184 dev_warn(&fn->dev, "F03 interrupted, but data is missing!\n");
184 return 0; 185 return 0;
185 } 186 }
186 187
187 memcpy(obs, rmi_dev->xport->attn_data, ob_len); 188 memcpy(obs, drvdata->attn_data.data, ob_len);
188 189
189 rmi_dev->xport->attn_data += ob_len; 190 drvdata->attn_data.data += ob_len;
190 rmi_dev->xport->attn_size -= ob_len; 191 drvdata->attn_data.size -= ob_len;
191 } else { 192 } else {
192 /* Grab all of the data registers, and check them for data */ 193 /* Grab all of the data registers, and check them for data */
193 error = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET, 194 error = rmi_read_block(fn->rmi_dev, data_addr + RMI_F03_OB_OFFSET,
diff --git a/drivers/input/rmi4/rmi_f11.c b/drivers/input/rmi4/rmi_f11.c
index ffcbbc1745de..68279f3c5130 100644
--- a/drivers/input/rmi4/rmi_f11.c
+++ b/drivers/input/rmi4/rmi_f11.c
@@ -1285,19 +1285,19 @@ static int rmi_f11_attention(struct rmi_function *fn, unsigned long *irq_bits)
1285 int error; 1285 int error;
1286 int valid_bytes = f11->sensor.pkt_size; 1286 int valid_bytes = f11->sensor.pkt_size;
1287 1287
1288 if (rmi_dev->xport->attn_data) { 1288 if (drvdata->attn_data.data) {
1289 /* 1289 /*
1290 * The valid data in the attention report is less then 1290 * The valid data in the attention report is less then
1291 * expected. Only process the complete fingers. 1291 * expected. Only process the complete fingers.
1292 */ 1292 */
1293 if (f11->sensor.attn_size > rmi_dev->xport->attn_size) 1293 if (f11->sensor.attn_size > drvdata->attn_data.size)
1294 valid_bytes = rmi_dev->xport->attn_size; 1294 valid_bytes = drvdata->attn_data.size;
1295 else 1295 else
1296 valid_bytes = f11->sensor.attn_size; 1296 valid_bytes = f11->sensor.attn_size;
1297 memcpy(f11->sensor.data_pkt, rmi_dev->xport->attn_data, 1297 memcpy(f11->sensor.data_pkt, drvdata->attn_data.data,
1298 valid_bytes); 1298 valid_bytes);
1299 rmi_dev->xport->attn_data += f11->sensor.attn_size; 1299 drvdata->attn_data.data += f11->sensor.attn_size;
1300 rmi_dev->xport->attn_size -= f11->sensor.attn_size; 1300 drvdata->attn_data.size -= f11->sensor.attn_size;
1301 } else { 1301 } else {
1302 error = rmi_read_block(rmi_dev, 1302 error = rmi_read_block(rmi_dev,
1303 data_base_addr, f11->sensor.data_pkt, 1303 data_base_addr, f11->sensor.data_pkt,
diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c
index 82a4964e5eb9..8c5360c25266 100644
--- a/drivers/input/rmi4/rmi_f12.c
+++ b/drivers/input/rmi4/rmi_f12.c
@@ -208,19 +208,20 @@ static int rmi_f12_attention(struct rmi_function *fn,
208{ 208{
209 int retval; 209 int retval;
210 struct rmi_device *rmi_dev = fn->rmi_dev; 210 struct rmi_device *rmi_dev = fn->rmi_dev;
211 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
211 struct f12_data *f12 = dev_get_drvdata(&fn->dev); 212 struct f12_data *f12 = dev_get_drvdata(&fn->dev);
212 struct rmi_2d_sensor *sensor = &f12->sensor; 213 struct rmi_2d_sensor *sensor = &f12->sensor;
213 int valid_bytes = sensor->pkt_size; 214 int valid_bytes = sensor->pkt_size;
214 215
215 if (rmi_dev->xport->attn_data) { 216 if (drvdata->attn_data.data) {
216 if (sensor->attn_size > rmi_dev->xport->attn_size) 217 if (sensor->attn_size > drvdata->attn_data.size)
217 valid_bytes = rmi_dev->xport->attn_size; 218 valid_bytes = drvdata->attn_data.size;
218 else 219 else
219 valid_bytes = sensor->attn_size; 220 valid_bytes = sensor->attn_size;
220 memcpy(sensor->data_pkt, rmi_dev->xport->attn_data, 221 memcpy(sensor->data_pkt, drvdata->attn_data.data,
221 valid_bytes); 222 valid_bytes);
222 rmi_dev->xport->attn_data += sensor->attn_size; 223 drvdata->attn_data.data += sensor->attn_size;
223 rmi_dev->xport->attn_size -= sensor->attn_size; 224 drvdata->attn_data.size -= sensor->attn_size;
224 } else { 225 } else {
225 retval = rmi_read_block(rmi_dev, f12->data_addr, 226 retval = rmi_read_block(rmi_dev, f12->data_addr,
226 sensor->data_pkt, sensor->pkt_size); 227 sensor->data_pkt, sensor->pkt_size);
@@ -323,7 +324,7 @@ static int rmi_f12_probe(struct rmi_function *fn)
323 const struct rmi_register_desc_item *item; 324 const struct rmi_register_desc_item *item;
324 struct rmi_2d_sensor *sensor; 325 struct rmi_2d_sensor *sensor;
325 struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); 326 struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
326 struct rmi_transport_dev *xport = rmi_dev->xport; 327 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
327 u16 data_offset = 0; 328 u16 data_offset = 0;
328 329
329 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); 330 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__);
@@ -422,7 +423,7 @@ static int rmi_f12_probe(struct rmi_function *fn)
422 * HID attention reports. 423 * HID attention reports.
423 */ 424 */
424 item = rmi_get_register_desc_item(&f12->data_reg_desc, 0); 425 item = rmi_get_register_desc_item(&f12->data_reg_desc, 0);
425 if (item && !xport->attn_data) 426 if (item && !drvdata->attn_data.data)
426 data_offset += item->reg_size; 427 data_offset += item->reg_size;
427 428
428 item = rmi_get_register_desc_item(&f12->data_reg_desc, 1); 429 item = rmi_get_register_desc_item(&f12->data_reg_desc, 1);
@@ -436,15 +437,15 @@ static int rmi_f12_probe(struct rmi_function *fn)
436 } 437 }
437 438
438 item = rmi_get_register_desc_item(&f12->data_reg_desc, 2); 439 item = rmi_get_register_desc_item(&f12->data_reg_desc, 2);
439 if (item && !xport->attn_data) 440 if (item && !drvdata->attn_data.data)
440 data_offset += item->reg_size; 441 data_offset += item->reg_size;
441 442
442 item = rmi_get_register_desc_item(&f12->data_reg_desc, 3); 443 item = rmi_get_register_desc_item(&f12->data_reg_desc, 3);
443 if (item && !xport->attn_data) 444 if (item && !drvdata->attn_data.data)
444 data_offset += item->reg_size; 445 data_offset += item->reg_size;
445 446
446 item = rmi_get_register_desc_item(&f12->data_reg_desc, 4); 447 item = rmi_get_register_desc_item(&f12->data_reg_desc, 4);
447 if (item && !xport->attn_data) 448 if (item && !drvdata->attn_data.data)
448 data_offset += item->reg_size; 449 data_offset += item->reg_size;
449 450
450 item = rmi_get_register_desc_item(&f12->data_reg_desc, 5); 451 item = rmi_get_register_desc_item(&f12->data_reg_desc, 5);
@@ -456,22 +457,22 @@ static int rmi_f12_probe(struct rmi_function *fn)
456 } 457 }
457 458
458 item = rmi_get_register_desc_item(&f12->data_reg_desc, 6); 459 item = rmi_get_register_desc_item(&f12->data_reg_desc, 6);
459 if (item && !xport->attn_data) { 460 if (item && !drvdata->attn_data.data) {
460 f12->data6 = item; 461 f12->data6 = item;
461 f12->data6_offset = data_offset; 462 f12->data6_offset = data_offset;
462 data_offset += item->reg_size; 463 data_offset += item->reg_size;
463 } 464 }
464 465
465 item = rmi_get_register_desc_item(&f12->data_reg_desc, 7); 466 item = rmi_get_register_desc_item(&f12->data_reg_desc, 7);
466 if (item && !xport->attn_data) 467 if (item && !drvdata->attn_data.data)
467 data_offset += item->reg_size; 468 data_offset += item->reg_size;
468 469
469 item = rmi_get_register_desc_item(&f12->data_reg_desc, 8); 470 item = rmi_get_register_desc_item(&f12->data_reg_desc, 8);
470 if (item && !xport->attn_data) 471 if (item && !drvdata->attn_data.data)
471 data_offset += item->reg_size; 472 data_offset += item->reg_size;
472 473
473 item = rmi_get_register_desc_item(&f12->data_reg_desc, 9); 474 item = rmi_get_register_desc_item(&f12->data_reg_desc, 9);
474 if (item && !xport->attn_data) { 475 if (item && !drvdata->attn_data.data) {
475 f12->data9 = item; 476 f12->data9 = item;
476 f12->data9_offset = data_offset; 477 f12->data9_offset = data_offset;
477 data_offset += item->reg_size; 478 data_offset += item->reg_size;
@@ -480,27 +481,27 @@ static int rmi_f12_probe(struct rmi_function *fn)
480 } 481 }
481 482
482 item = rmi_get_register_desc_item(&f12->data_reg_desc, 10); 483 item = rmi_get_register_desc_item(&f12->data_reg_desc, 10);
483 if (item && !xport->attn_data) 484 if (item && !drvdata->attn_data.data)
484 data_offset += item->reg_size; 485 data_offset += item->reg_size;
485 486
486 item = rmi_get_register_desc_item(&f12->data_reg_desc, 11); 487 item = rmi_get_register_desc_item(&f12->data_reg_desc, 11);
487 if (item && !xport->attn_data) 488 if (item && !drvdata->attn_data.data)
488 data_offset += item->reg_size; 489 data_offset += item->reg_size;
489 490
490 item = rmi_get_register_desc_item(&f12->data_reg_desc, 12); 491 item = rmi_get_register_desc_item(&f12->data_reg_desc, 12);
491 if (item && !xport->attn_data) 492 if (item && !drvdata->attn_data.data)
492 data_offset += item->reg_size; 493 data_offset += item->reg_size;
493 494
494 item = rmi_get_register_desc_item(&f12->data_reg_desc, 13); 495 item = rmi_get_register_desc_item(&f12->data_reg_desc, 13);
495 if (item && !xport->attn_data) 496 if (item && !drvdata->attn_data.data)
496 data_offset += item->reg_size; 497 data_offset += item->reg_size;
497 498
498 item = rmi_get_register_desc_item(&f12->data_reg_desc, 14); 499 item = rmi_get_register_desc_item(&f12->data_reg_desc, 14);
499 if (item && !xport->attn_data) 500 if (item && !drvdata->attn_data.data)
500 data_offset += item->reg_size; 501 data_offset += item->reg_size;
501 502
502 item = rmi_get_register_desc_item(&f12->data_reg_desc, 15); 503 item = rmi_get_register_desc_item(&f12->data_reg_desc, 15);
503 if (item && !xport->attn_data) { 504 if (item && !drvdata->attn_data.data) {
504 f12->data15 = item; 505 f12->data15 = item;
505 f12->data15_offset = data_offset; 506 f12->data15_offset = data_offset;
506 data_offset += item->reg_size; 507 data_offset += item->reg_size;
diff --git a/drivers/input/rmi4/rmi_f30.c b/drivers/input/rmi4/rmi_f30.c
index f696137a56f5..f4b491e3e0fd 100644
--- a/drivers/input/rmi4/rmi_f30.c
+++ b/drivers/input/rmi4/rmi_f30.c
@@ -99,6 +99,7 @@ static int rmi_f30_attention(struct rmi_function *fn, unsigned long *irq_bits)
99{ 99{
100 struct f30_data *f30 = dev_get_drvdata(&fn->dev); 100 struct f30_data *f30 = dev_get_drvdata(&fn->dev);
101 struct rmi_device *rmi_dev = fn->rmi_dev; 101 struct rmi_device *rmi_dev = fn->rmi_dev;
102 struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
102 int retval; 103 int retval;
103 int gpiled = 0; 104 int gpiled = 0;
104 int value = 0; 105 int value = 0;
@@ -109,15 +110,15 @@ static int rmi_f30_attention(struct rmi_function *fn, unsigned long *irq_bits)
109 return 0; 110 return 0;
110 111
111 /* Read the gpi led data. */ 112 /* Read the gpi led data. */
112 if (rmi_dev->xport->attn_data) { 113 if (drvdata->attn_data.data) {
113 if (rmi_dev->xport->attn_size < f30->register_count) { 114 if (drvdata->attn_data.size < f30->register_count) {
114 dev_warn(&fn->dev, "F30 interrupted, but data is missing\n"); 115 dev_warn(&fn->dev, "F30 interrupted, but data is missing\n");
115 return 0; 116 return 0;
116 } 117 }
117 memcpy(f30->data_regs, rmi_dev->xport->attn_data, 118 memcpy(f30->data_regs, drvdata->attn_data.data,
118 f30->register_count); 119 f30->register_count);
119 rmi_dev->xport->attn_data += f30->register_count; 120 drvdata->attn_data.data += f30->register_count;
120 rmi_dev->xport->attn_size -= f30->register_count; 121 drvdata->attn_data.size -= f30->register_count;
121 } else { 122 } else {
122 retval = rmi_read_block(rmi_dev, fn->fd.data_base_addr, 123 retval = rmi_read_block(rmi_dev, fn->fd.data_base_addr,
123 f30->data_regs, f30->register_count); 124 f30->data_regs, f30->register_count);
diff --git a/include/linux/rmi.h b/include/linux/rmi.h
index 1d4865621493..ac910f730688 100644
--- a/include/linux/rmi.h
+++ b/include/linux/rmi.h
@@ -272,9 +272,6 @@ struct rmi_transport_dev {
272 struct rmi_device_platform_data pdata; 272 struct rmi_device_platform_data pdata;
273 273
274 struct input_dev *input; 274 struct input_dev *input;
275
276 void *attn_data;
277 int attn_size;
278}; 275};
279 276
280/** 277/**
@@ -364,6 +361,8 @@ struct rmi_driver_data {
364 361
365 bool enabled; 362 bool enabled;
366 struct mutex enabled_mutex; 363 struct mutex enabled_mutex;
364
365 struct rmi4_attn_data attn_data;
367 DECLARE_KFIFO(attn_fifo, struct rmi4_attn_data, 16); 366 DECLARE_KFIFO(attn_fifo, struct rmi4_attn_data, 16);
368}; 367};
369 368