This source file includes following definitions.
- cec_pin_update
- cec_pin_read
- cec_pin_low
- cec_pin_high
- rx_error_inj
- rx_nack
- rx_low_drive
- rx_add_byte
- rx_remove_byte
- rx_arb_lost
- tx_error_inj
- tx_no_eom
- tx_early_eom
- tx_short_bit
- tx_long_bit
- tx_custom_bit
- tx_short_start
- tx_long_start
- tx_custom_start
- tx_last_bit
- tx_add_bytes
- tx_remove_byte
- tx_low_drive
- cec_pin_to_idle
- cec_pin_tx_states
- cec_pin_rx_states
- cec_pin_timer
- cec_pin_thread_func
- cec_pin_adap_enable
- cec_pin_adap_log_addr
- cec_pin_start_timer
- cec_pin_adap_transmit
- cec_pin_adap_status
- cec_pin_adap_monitor_all_enable
- cec_pin_adap_free
- cec_pin_changed
- cec_pin_allocate_adapter
1
2
3
4
5
6 #include <linux/delay.h>
7 #include <linux/slab.h>
8 #include <linux/sched/types.h>
9
10 #include <media/cec-pin.h>
11 #include "cec-pin-priv.h"
12
13
14
15
16 #define CEC_TIM_START_BIT_LOW 3700
17 #define CEC_TIM_START_BIT_LOW_MIN 3500
18 #define CEC_TIM_START_BIT_LOW_MAX 3900
19 #define CEC_TIM_START_BIT_TOTAL 4500
20 #define CEC_TIM_START_BIT_TOTAL_MIN 4300
21 #define CEC_TIM_START_BIT_TOTAL_MAX 4700
22
23
24 #define CEC_TIM_DATA_BIT_0_LOW 1500
25 #define CEC_TIM_DATA_BIT_0_LOW_MIN 1300
26 #define CEC_TIM_DATA_BIT_0_LOW_MAX 1700
27 #define CEC_TIM_DATA_BIT_1_LOW 600
28 #define CEC_TIM_DATA_BIT_1_LOW_MIN 400
29 #define CEC_TIM_DATA_BIT_1_LOW_MAX 800
30 #define CEC_TIM_DATA_BIT_TOTAL 2400
31 #define CEC_TIM_DATA_BIT_TOTAL_MIN 2050
32 #define CEC_TIM_DATA_BIT_TOTAL_MAX 2750
33
34 #define CEC_TIM_DATA_BIT_SAMPLE 850
35
36 #define CEC_TIM_DATA_BIT_HIGH 1750
37
38
39 #define CEC_TIM_IDLE_SAMPLE 1000
40
41 #define CEC_TIM_START_BIT_SAMPLE 500
42
43 #define CEC_TIM_SAMPLE 50
44
45 #define CEC_TIM_LOW_DRIVE_ERROR (1.5 * CEC_TIM_DATA_BIT_TOTAL)
46
47
48
49
50
51 #define CEC_TIM_DATA_BIT_TOTAL_SHORT 1800
52 #define CEC_TIM_DATA_BIT_TOTAL_LONG 2900
53
54
55
56
57
58 #define CEC_TIM_START_BIT_TOTAL_SHORT 4100
59 #define CEC_TIM_START_BIT_TOTAL_LONG 5000
60
61
62 #define EOM_BIT 8
63 #define ACK_BIT 9
64
65 struct cec_state {
66 const char * const name;
67 unsigned int usecs;
68 };
69
70 static const struct cec_state states[CEC_PIN_STATES] = {
71 { "Off", 0 },
72 { "Idle", CEC_TIM_IDLE_SAMPLE },
73 { "Tx Wait", CEC_TIM_SAMPLE },
74 { "Tx Wait for High", CEC_TIM_IDLE_SAMPLE },
75 { "Tx Start Bit Low", CEC_TIM_START_BIT_LOW },
76 { "Tx Start Bit High", CEC_TIM_START_BIT_TOTAL - CEC_TIM_START_BIT_LOW },
77 { "Tx Start Bit High Short", CEC_TIM_START_BIT_TOTAL_SHORT - CEC_TIM_START_BIT_LOW },
78 { "Tx Start Bit High Long", CEC_TIM_START_BIT_TOTAL_LONG - CEC_TIM_START_BIT_LOW },
79 { "Tx Start Bit Low Custom", 0 },
80 { "Tx Start Bit High Custom", 0 },
81 { "Tx Data 0 Low", CEC_TIM_DATA_BIT_0_LOW },
82 { "Tx Data 0 High", CEC_TIM_DATA_BIT_TOTAL - CEC_TIM_DATA_BIT_0_LOW },
83 { "Tx Data 0 High Short", CEC_TIM_DATA_BIT_TOTAL_SHORT - CEC_TIM_DATA_BIT_0_LOW },
84 { "Tx Data 0 High Long", CEC_TIM_DATA_BIT_TOTAL_LONG - CEC_TIM_DATA_BIT_0_LOW },
85 { "Tx Data 1 Low", CEC_TIM_DATA_BIT_1_LOW },
86 { "Tx Data 1 High", CEC_TIM_DATA_BIT_TOTAL - CEC_TIM_DATA_BIT_1_LOW },
87 { "Tx Data 1 High Short", CEC_TIM_DATA_BIT_TOTAL_SHORT - CEC_TIM_DATA_BIT_1_LOW },
88 { "Tx Data 1 High Long", CEC_TIM_DATA_BIT_TOTAL_LONG - CEC_TIM_DATA_BIT_1_LOW },
89 { "Tx Data 1 High Pre Sample", CEC_TIM_DATA_BIT_SAMPLE - CEC_TIM_DATA_BIT_1_LOW },
90 { "Tx Data 1 High Post Sample", CEC_TIM_DATA_BIT_TOTAL - CEC_TIM_DATA_BIT_SAMPLE },
91 { "Tx Data 1 High Post Sample Short", CEC_TIM_DATA_BIT_TOTAL_SHORT - CEC_TIM_DATA_BIT_SAMPLE },
92 { "Tx Data 1 High Post Sample Long", CEC_TIM_DATA_BIT_TOTAL_LONG - CEC_TIM_DATA_BIT_SAMPLE },
93 { "Tx Data Bit Low Custom", 0 },
94 { "Tx Data Bit High Custom", 0 },
95 { "Tx Pulse Low Custom", 0 },
96 { "Tx Pulse High Custom", 0 },
97 { "Tx Low Drive", CEC_TIM_LOW_DRIVE_ERROR },
98 { "Rx Start Bit Low", CEC_TIM_SAMPLE },
99 { "Rx Start Bit High", CEC_TIM_SAMPLE },
100 { "Rx Data Sample", CEC_TIM_DATA_BIT_SAMPLE },
101 { "Rx Data Post Sample", CEC_TIM_DATA_BIT_HIGH - CEC_TIM_DATA_BIT_SAMPLE },
102 { "Rx Data Wait for Low", CEC_TIM_SAMPLE },
103 { "Rx Ack Low", CEC_TIM_DATA_BIT_0_LOW },
104 { "Rx Ack Low Post", CEC_TIM_DATA_BIT_HIGH - CEC_TIM_DATA_BIT_0_LOW },
105 { "Rx Ack High Post", CEC_TIM_DATA_BIT_HIGH },
106 { "Rx Ack Finish", CEC_TIM_DATA_BIT_TOTAL_MIN - CEC_TIM_DATA_BIT_HIGH },
107 { "Rx Low Drive", CEC_TIM_LOW_DRIVE_ERROR },
108 { "Rx Irq", 0 },
109 };
110
111 static void cec_pin_update(struct cec_pin *pin, bool v, bool force)
112 {
113 if (!force && v == pin->adap->cec_pin_is_high)
114 return;
115
116 pin->adap->cec_pin_is_high = v;
117 if (atomic_read(&pin->work_pin_num_events) < CEC_NUM_PIN_EVENTS) {
118 u8 ev = v;
119
120 if (pin->work_pin_events_dropped) {
121 pin->work_pin_events_dropped = false;
122 ev |= CEC_PIN_EVENT_FL_DROPPED;
123 }
124 pin->work_pin_events[pin->work_pin_events_wr] = ev;
125 pin->work_pin_ts[pin->work_pin_events_wr] = ktime_get();
126 pin->work_pin_events_wr =
127 (pin->work_pin_events_wr + 1) % CEC_NUM_PIN_EVENTS;
128 atomic_inc(&pin->work_pin_num_events);
129 } else {
130 pin->work_pin_events_dropped = true;
131 pin->work_pin_events_dropped_cnt++;
132 }
133 wake_up_interruptible(&pin->kthread_waitq);
134 }
135
136 static bool cec_pin_read(struct cec_pin *pin)
137 {
138 bool v = pin->ops->read(pin->adap);
139
140 cec_pin_update(pin, v, false);
141 return v;
142 }
143
144 static void cec_pin_low(struct cec_pin *pin)
145 {
146 pin->ops->low(pin->adap);
147 cec_pin_update(pin, false, false);
148 }
149
150 static bool cec_pin_high(struct cec_pin *pin)
151 {
152 pin->ops->high(pin->adap);
153 return cec_pin_read(pin);
154 }
155
156 static bool rx_error_inj(struct cec_pin *pin, unsigned int mode_offset,
157 int arg_idx, u8 *arg)
158 {
159 #ifdef CONFIG_CEC_PIN_ERROR_INJ
160 u16 cmd = cec_pin_rx_error_inj(pin);
161 u64 e = pin->error_inj[cmd];
162 unsigned int mode = (e >> mode_offset) & CEC_ERROR_INJ_MODE_MASK;
163
164 if (arg_idx >= 0) {
165 u8 pos = pin->error_inj_args[cmd][arg_idx];
166
167 if (arg)
168 *arg = pos;
169 else if (pos != pin->rx_bit)
170 return false;
171 }
172
173 switch (mode) {
174 case CEC_ERROR_INJ_MODE_ONCE:
175 pin->error_inj[cmd] &=
176 ~(CEC_ERROR_INJ_MODE_MASK << mode_offset);
177 return true;
178 case CEC_ERROR_INJ_MODE_ALWAYS:
179 return true;
180 case CEC_ERROR_INJ_MODE_TOGGLE:
181 return pin->rx_toggle;
182 default:
183 return false;
184 }
185 #else
186 return false;
187 #endif
188 }
189
190 static bool rx_nack(struct cec_pin *pin)
191 {
192 return rx_error_inj(pin, CEC_ERROR_INJ_RX_NACK_OFFSET, -1, NULL);
193 }
194
195 static bool rx_low_drive(struct cec_pin *pin)
196 {
197 return rx_error_inj(pin, CEC_ERROR_INJ_RX_LOW_DRIVE_OFFSET,
198 CEC_ERROR_INJ_RX_LOW_DRIVE_ARG_IDX, NULL);
199 }
200
201 static bool rx_add_byte(struct cec_pin *pin)
202 {
203 return rx_error_inj(pin, CEC_ERROR_INJ_RX_ADD_BYTE_OFFSET, -1, NULL);
204 }
205
206 static bool rx_remove_byte(struct cec_pin *pin)
207 {
208 return rx_error_inj(pin, CEC_ERROR_INJ_RX_REMOVE_BYTE_OFFSET, -1, NULL);
209 }
210
211 static bool rx_arb_lost(struct cec_pin *pin, u8 *poll)
212 {
213 return pin->tx_msg.len == 0 &&
214 rx_error_inj(pin, CEC_ERROR_INJ_RX_ARB_LOST_OFFSET,
215 CEC_ERROR_INJ_RX_ARB_LOST_ARG_IDX, poll);
216 }
217
218 static bool tx_error_inj(struct cec_pin *pin, unsigned int mode_offset,
219 int arg_idx, u8 *arg)
220 {
221 #ifdef CONFIG_CEC_PIN_ERROR_INJ
222 u16 cmd = cec_pin_tx_error_inj(pin);
223 u64 e = pin->error_inj[cmd];
224 unsigned int mode = (e >> mode_offset) & CEC_ERROR_INJ_MODE_MASK;
225
226 if (arg_idx >= 0) {
227 u8 pos = pin->error_inj_args[cmd][arg_idx];
228
229 if (arg)
230 *arg = pos;
231 else if (pos != pin->tx_bit)
232 return false;
233 }
234
235 switch (mode) {
236 case CEC_ERROR_INJ_MODE_ONCE:
237 pin->error_inj[cmd] &=
238 ~(CEC_ERROR_INJ_MODE_MASK << mode_offset);
239 return true;
240 case CEC_ERROR_INJ_MODE_ALWAYS:
241 return true;
242 case CEC_ERROR_INJ_MODE_TOGGLE:
243 return pin->tx_toggle;
244 default:
245 return false;
246 }
247 #else
248 return false;
249 #endif
250 }
251
252 static bool tx_no_eom(struct cec_pin *pin)
253 {
254 return tx_error_inj(pin, CEC_ERROR_INJ_TX_NO_EOM_OFFSET, -1, NULL);
255 }
256
257 static bool tx_early_eom(struct cec_pin *pin)
258 {
259 return tx_error_inj(pin, CEC_ERROR_INJ_TX_EARLY_EOM_OFFSET, -1, NULL);
260 }
261
262 static bool tx_short_bit(struct cec_pin *pin)
263 {
264 return tx_error_inj(pin, CEC_ERROR_INJ_TX_SHORT_BIT_OFFSET,
265 CEC_ERROR_INJ_TX_SHORT_BIT_ARG_IDX, NULL);
266 }
267
268 static bool tx_long_bit(struct cec_pin *pin)
269 {
270 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LONG_BIT_OFFSET,
271 CEC_ERROR_INJ_TX_LONG_BIT_ARG_IDX, NULL);
272 }
273
274 static bool tx_custom_bit(struct cec_pin *pin)
275 {
276 return tx_error_inj(pin, CEC_ERROR_INJ_TX_CUSTOM_BIT_OFFSET,
277 CEC_ERROR_INJ_TX_CUSTOM_BIT_ARG_IDX, NULL);
278 }
279
280 static bool tx_short_start(struct cec_pin *pin)
281 {
282 return tx_error_inj(pin, CEC_ERROR_INJ_TX_SHORT_START_OFFSET, -1, NULL);
283 }
284
285 static bool tx_long_start(struct cec_pin *pin)
286 {
287 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LONG_START_OFFSET, -1, NULL);
288 }
289
290 static bool tx_custom_start(struct cec_pin *pin)
291 {
292 return tx_error_inj(pin, CEC_ERROR_INJ_TX_CUSTOM_START_OFFSET,
293 -1, NULL);
294 }
295
296 static bool tx_last_bit(struct cec_pin *pin)
297 {
298 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LAST_BIT_OFFSET,
299 CEC_ERROR_INJ_TX_LAST_BIT_ARG_IDX, NULL);
300 }
301
302 static u8 tx_add_bytes(struct cec_pin *pin)
303 {
304 u8 bytes;
305
306 if (tx_error_inj(pin, CEC_ERROR_INJ_TX_ADD_BYTES_OFFSET,
307 CEC_ERROR_INJ_TX_ADD_BYTES_ARG_IDX, &bytes))
308 return bytes;
309 return 0;
310 }
311
312 static bool tx_remove_byte(struct cec_pin *pin)
313 {
314 return tx_error_inj(pin, CEC_ERROR_INJ_TX_REMOVE_BYTE_OFFSET, -1, NULL);
315 }
316
317 static bool tx_low_drive(struct cec_pin *pin)
318 {
319 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LOW_DRIVE_OFFSET,
320 CEC_ERROR_INJ_TX_LOW_DRIVE_ARG_IDX, NULL);
321 }
322
323 static void cec_pin_to_idle(struct cec_pin *pin)
324 {
325
326
327
328
329 pin->rx_bit = pin->tx_bit = 0;
330 pin->rx_msg.len = 0;
331 memset(pin->rx_msg.msg, 0, sizeof(pin->rx_msg.msg));
332 pin->ts = ns_to_ktime(0);
333 pin->tx_generated_poll = false;
334 pin->tx_post_eom = false;
335 if (pin->state >= CEC_ST_TX_WAIT &&
336 pin->state <= CEC_ST_TX_LOW_DRIVE)
337 pin->tx_toggle ^= 1;
338 if (pin->state >= CEC_ST_RX_START_BIT_LOW &&
339 pin->state <= CEC_ST_RX_LOW_DRIVE)
340 pin->rx_toggle ^= 1;
341 pin->state = CEC_ST_IDLE;
342 }
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370 static void cec_pin_tx_states(struct cec_pin *pin, ktime_t ts)
371 {
372 bool v;
373 bool is_ack_bit, ack;
374
375 switch (pin->state) {
376 case CEC_ST_TX_WAIT_FOR_HIGH:
377 if (cec_pin_read(pin))
378 cec_pin_to_idle(pin);
379 break;
380
381 case CEC_ST_TX_START_BIT_LOW:
382 if (tx_short_start(pin)) {
383
384
385
386
387 pin->state = CEC_ST_TX_START_BIT_HIGH_SHORT;
388 } else if (tx_long_start(pin)) {
389
390
391
392
393 pin->state = CEC_ST_TX_START_BIT_HIGH_LONG;
394 } else {
395 pin->state = CEC_ST_TX_START_BIT_HIGH;
396 }
397
398 cec_pin_high(pin);
399 break;
400
401 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
402 pin->state = CEC_ST_TX_START_BIT_HIGH_CUSTOM;
403
404 cec_pin_high(pin);
405 break;
406
407 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE:
408 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT:
409 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG:
410 if (pin->tx_nacked) {
411 cec_pin_to_idle(pin);
412 pin->tx_msg.len = 0;
413 if (pin->tx_generated_poll)
414 break;
415 pin->work_tx_ts = ts;
416 pin->work_tx_status = CEC_TX_STATUS_NACK;
417 wake_up_interruptible(&pin->kthread_waitq);
418 break;
419 }
420
421 case CEC_ST_TX_DATA_BIT_0_HIGH:
422 case CEC_ST_TX_DATA_BIT_0_HIGH_SHORT:
423 case CEC_ST_TX_DATA_BIT_0_HIGH_LONG:
424 case CEC_ST_TX_DATA_BIT_1_HIGH:
425 case CEC_ST_TX_DATA_BIT_1_HIGH_SHORT:
426 case CEC_ST_TX_DATA_BIT_1_HIGH_LONG:
427
428
429
430
431
432
433
434
435 if (!cec_pin_read(pin) && !pin->tx_generated_poll) {
436
437
438
439
440 pin->tx_msg.len = 0;
441 pin->state = CEC_ST_TX_WAIT_FOR_HIGH;
442 pin->work_tx_ts = ts;
443 pin->work_tx_status = CEC_TX_STATUS_LOW_DRIVE;
444 pin->tx_low_drive_cnt++;
445 wake_up_interruptible(&pin->kthread_waitq);
446 break;
447 }
448
449 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
450 if (tx_last_bit(pin)) {
451
452 cec_pin_to_idle(pin);
453 pin->tx_msg.len = 0;
454 if (pin->tx_generated_poll)
455 break;
456 pin->work_tx_ts = ts;
457 pin->work_tx_status = CEC_TX_STATUS_OK;
458 wake_up_interruptible(&pin->kthread_waitq);
459 break;
460 }
461 pin->tx_bit++;
462
463 case CEC_ST_TX_START_BIT_HIGH:
464 case CEC_ST_TX_START_BIT_HIGH_SHORT:
465 case CEC_ST_TX_START_BIT_HIGH_LONG:
466 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
467 if (tx_low_drive(pin)) {
468
469 cec_pin_low(pin);
470 pin->state = CEC_ST_TX_LOW_DRIVE;
471 pin->tx_msg.len = 0;
472 if (pin->tx_generated_poll)
473 break;
474 pin->work_tx_ts = ts;
475 pin->work_tx_status = CEC_TX_STATUS_LOW_DRIVE;
476 pin->tx_low_drive_cnt++;
477 wake_up_interruptible(&pin->kthread_waitq);
478 break;
479 }
480 if (pin->tx_bit / 10 >= pin->tx_msg.len + pin->tx_extra_bytes) {
481 cec_pin_to_idle(pin);
482 pin->tx_msg.len = 0;
483 if (pin->tx_generated_poll)
484 break;
485 pin->work_tx_ts = ts;
486 pin->work_tx_status = CEC_TX_STATUS_OK;
487 wake_up_interruptible(&pin->kthread_waitq);
488 break;
489 }
490
491 switch (pin->tx_bit % 10) {
492 default: {
493
494
495
496
497
498
499 unsigned int idx = (pin->tx_bit / 10);
500 u8 val = idx;
501
502 if (idx < pin->tx_msg.len)
503 val = pin->tx_msg.msg[idx];
504 v = val & (1 << (7 - (pin->tx_bit % 10)));
505
506 pin->state = v ? CEC_ST_TX_DATA_BIT_1_LOW :
507 CEC_ST_TX_DATA_BIT_0_LOW;
508 break;
509 }
510 case EOM_BIT: {
511 unsigned int tot_len = pin->tx_msg.len +
512 pin->tx_extra_bytes;
513 unsigned int tx_byte_idx = pin->tx_bit / 10;
514
515 v = !pin->tx_post_eom && tx_byte_idx == tot_len - 1;
516 if (tot_len > 1 && tx_byte_idx == tot_len - 2 &&
517 tx_early_eom(pin)) {
518
519 v = true;
520 pin->tx_post_eom = true;
521 } else if (v && tx_no_eom(pin)) {
522
523 v = false;
524 }
525 pin->state = v ? CEC_ST_TX_DATA_BIT_1_LOW :
526 CEC_ST_TX_DATA_BIT_0_LOW;
527 break;
528 }
529 case ACK_BIT:
530 pin->state = CEC_ST_TX_DATA_BIT_1_LOW;
531 break;
532 }
533 if (tx_custom_bit(pin))
534 pin->state = CEC_ST_TX_DATA_BIT_LOW_CUSTOM;
535 cec_pin_low(pin);
536 break;
537
538 case CEC_ST_TX_DATA_BIT_0_LOW:
539 case CEC_ST_TX_DATA_BIT_1_LOW:
540 v = pin->state == CEC_ST_TX_DATA_BIT_1_LOW;
541 is_ack_bit = pin->tx_bit % 10 == ACK_BIT;
542 if (v && (pin->tx_bit < 4 || is_ack_bit)) {
543 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE;
544 } else if (!is_ack_bit && tx_short_bit(pin)) {
545
546 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH_SHORT :
547 CEC_ST_TX_DATA_BIT_0_HIGH_SHORT;
548 } else if (!is_ack_bit && tx_long_bit(pin)) {
549
550 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH_LONG :
551 CEC_ST_TX_DATA_BIT_0_HIGH_LONG;
552 } else {
553 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH :
554 CEC_ST_TX_DATA_BIT_0_HIGH;
555 }
556 cec_pin_high(pin);
557 break;
558
559 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
560 pin->state = CEC_ST_TX_DATA_BIT_HIGH_CUSTOM;
561 cec_pin_high(pin);
562 break;
563
564 case CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE:
565
566 v = cec_pin_read(pin);
567 is_ack_bit = pin->tx_bit % 10 == ACK_BIT;
568
569
570
571
572
573
574
575
576 if (!v && !is_ack_bit && !pin->tx_generated_poll) {
577 pin->tx_msg.len = 0;
578 pin->work_tx_ts = ts;
579 pin->work_tx_status = CEC_TX_STATUS_ARB_LOST;
580 wake_up_interruptible(&pin->kthread_waitq);
581 pin->rx_bit = pin->tx_bit;
582 pin->tx_bit = 0;
583 memset(pin->rx_msg.msg, 0, sizeof(pin->rx_msg.msg));
584 pin->rx_msg.msg[0] = pin->tx_msg.msg[0];
585 pin->rx_msg.msg[0] &= (0xff << (8 - pin->rx_bit));
586 pin->rx_msg.len = 0;
587 pin->ts = ktime_sub_us(ts, CEC_TIM_DATA_BIT_SAMPLE);
588 pin->state = CEC_ST_RX_DATA_POST_SAMPLE;
589 pin->rx_bit++;
590 break;
591 }
592 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE;
593 if (!is_ack_bit && tx_short_bit(pin)) {
594
595 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT;
596 } else if (!is_ack_bit && tx_long_bit(pin)) {
597
598 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG;
599 }
600 if (!is_ack_bit)
601 break;
602
603 ack = cec_msg_is_broadcast(&pin->tx_msg) ? v : !v;
604 if (!ack && (!pin->tx_ignore_nack_until_eom ||
605 pin->tx_bit / 10 == pin->tx_msg.len - 1) &&
606 !pin->tx_post_eom) {
607
608
609
610
611
612
613
614
615
616
617
618
619 pin->tx_nacked = true;
620 }
621 break;
622
623 case CEC_ST_TX_PULSE_LOW_CUSTOM:
624 cec_pin_high(pin);
625 pin->state = CEC_ST_TX_PULSE_HIGH_CUSTOM;
626 break;
627
628 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
629 cec_pin_to_idle(pin);
630 break;
631
632 default:
633 break;
634 }
635 }
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652 static void cec_pin_rx_states(struct cec_pin *pin, ktime_t ts)
653 {
654 s32 delta;
655 bool v;
656 bool ack;
657 bool bcast, for_us;
658 u8 dest;
659 u8 poll;
660
661 switch (pin->state) {
662
663 case CEC_ST_RX_START_BIT_LOW:
664 v = cec_pin_read(pin);
665 if (!v)
666 break;
667 pin->state = CEC_ST_RX_START_BIT_HIGH;
668 delta = ktime_us_delta(ts, pin->ts);
669
670 if (delta < CEC_TIM_START_BIT_LOW_MIN - CEC_TIM_IDLE_SAMPLE) {
671 if (!pin->rx_start_bit_low_too_short_cnt++) {
672 pin->rx_start_bit_low_too_short_ts = ktime_to_ns(pin->ts);
673 pin->rx_start_bit_low_too_short_delta = delta;
674 }
675 cec_pin_to_idle(pin);
676 break;
677 }
678 if (rx_arb_lost(pin, &poll)) {
679 cec_msg_init(&pin->tx_msg, poll >> 4, poll & 0xf);
680 pin->tx_generated_poll = true;
681 pin->tx_extra_bytes = 0;
682 pin->state = CEC_ST_TX_START_BIT_HIGH;
683 pin->ts = ts;
684 }
685 break;
686
687 case CEC_ST_RX_START_BIT_HIGH:
688 v = cec_pin_read(pin);
689 delta = ktime_us_delta(ts, pin->ts);
690
691
692
693
694 if (v && delta > CEC_TIM_START_BIT_TOTAL_LONG) {
695 pin->rx_start_bit_too_long_cnt++;
696 cec_pin_to_idle(pin);
697 break;
698 }
699 if (v)
700 break;
701
702 if (delta < CEC_TIM_START_BIT_TOTAL_MIN - CEC_TIM_IDLE_SAMPLE) {
703 if (!pin->rx_start_bit_too_short_cnt++) {
704 pin->rx_start_bit_too_short_ts = ktime_to_ns(pin->ts);
705 pin->rx_start_bit_too_short_delta = delta;
706 }
707 cec_pin_to_idle(pin);
708 break;
709 }
710 if (rx_low_drive(pin)) {
711
712 cec_pin_low(pin);
713 pin->state = CEC_ST_RX_LOW_DRIVE;
714 pin->rx_low_drive_cnt++;
715 break;
716 }
717 pin->state = CEC_ST_RX_DATA_SAMPLE;
718 pin->ts = ts;
719 pin->rx_eom = false;
720 break;
721
722 case CEC_ST_RX_DATA_SAMPLE:
723 v = cec_pin_read(pin);
724 pin->state = CEC_ST_RX_DATA_POST_SAMPLE;
725 switch (pin->rx_bit % 10) {
726 default:
727 if (pin->rx_bit / 10 < CEC_MAX_MSG_SIZE)
728 pin->rx_msg.msg[pin->rx_bit / 10] |=
729 v << (7 - (pin->rx_bit % 10));
730 break;
731 case EOM_BIT:
732 pin->rx_eom = v;
733 pin->rx_msg.len = pin->rx_bit / 10 + 1;
734 break;
735 case ACK_BIT:
736 break;
737 }
738 pin->rx_bit++;
739 break;
740
741 case CEC_ST_RX_DATA_POST_SAMPLE:
742 pin->state = CEC_ST_RX_DATA_WAIT_FOR_LOW;
743 break;
744
745 case CEC_ST_RX_DATA_WAIT_FOR_LOW:
746 v = cec_pin_read(pin);
747 delta = ktime_us_delta(ts, pin->ts);
748
749
750
751
752 if (v && delta > CEC_TIM_DATA_BIT_TOTAL_LONG) {
753 pin->rx_data_bit_too_long_cnt++;
754 cec_pin_to_idle(pin);
755 break;
756 }
757 if (v)
758 break;
759
760 if (rx_low_drive(pin)) {
761
762 cec_pin_low(pin);
763 pin->state = CEC_ST_RX_LOW_DRIVE;
764 pin->rx_low_drive_cnt++;
765 break;
766 }
767
768
769
770
771
772 if (delta < CEC_TIM_DATA_BIT_TOTAL_MIN) {
773 if (!pin->rx_data_bit_too_short_cnt++) {
774 pin->rx_data_bit_too_short_ts = ktime_to_ns(pin->ts);
775 pin->rx_data_bit_too_short_delta = delta;
776 }
777 cec_pin_low(pin);
778 pin->state = CEC_ST_RX_LOW_DRIVE;
779 pin->rx_low_drive_cnt++;
780 break;
781 }
782 pin->ts = ts;
783 if (pin->rx_bit % 10 != 9) {
784 pin->state = CEC_ST_RX_DATA_SAMPLE;
785 break;
786 }
787
788 dest = cec_msg_destination(&pin->rx_msg);
789 bcast = dest == CEC_LOG_ADDR_BROADCAST;
790
791 for_us = bcast || (pin->la_mask & (1 << dest));
792
793 ack = bcast ? 1 : !for_us;
794
795 if (for_us && rx_nack(pin)) {
796
797 ack = !ack;
798 }
799
800 if (ack) {
801
802 pin->state = CEC_ST_RX_ACK_HIGH_POST;
803 break;
804 }
805 cec_pin_low(pin);
806 pin->state = CEC_ST_RX_ACK_LOW;
807 break;
808
809 case CEC_ST_RX_ACK_LOW:
810 cec_pin_high(pin);
811 pin->state = CEC_ST_RX_ACK_LOW_POST;
812 break;
813
814 case CEC_ST_RX_ACK_LOW_POST:
815 case CEC_ST_RX_ACK_HIGH_POST:
816 v = cec_pin_read(pin);
817 if (v && pin->rx_eom) {
818 pin->work_rx_msg = pin->rx_msg;
819 pin->work_rx_msg.rx_ts = ktime_to_ns(ts);
820 wake_up_interruptible(&pin->kthread_waitq);
821 pin->ts = ts;
822 pin->state = CEC_ST_RX_ACK_FINISH;
823 break;
824 }
825 pin->rx_bit++;
826 pin->state = CEC_ST_RX_DATA_WAIT_FOR_LOW;
827 break;
828
829 case CEC_ST_RX_ACK_FINISH:
830 cec_pin_to_idle(pin);
831 break;
832
833 default:
834 break;
835 }
836 }
837
838
839
840
841
842 static enum hrtimer_restart cec_pin_timer(struct hrtimer *timer)
843 {
844 struct cec_pin *pin = container_of(timer, struct cec_pin, timer);
845 struct cec_adapter *adap = pin->adap;
846 ktime_t ts;
847 s32 delta;
848 u32 usecs;
849
850 ts = ktime_get();
851 if (ktime_to_ns(pin->timer_ts)) {
852 delta = ktime_us_delta(ts, pin->timer_ts);
853 pin->timer_cnt++;
854 if (delta > 100 && pin->state != CEC_ST_IDLE) {
855
856 pin->timer_sum_overrun += delta;
857 pin->timer_100ms_overruns++;
858 if (delta > 300)
859 pin->timer_300ms_overruns++;
860 if (delta > pin->timer_max_overrun)
861 pin->timer_max_overrun = delta;
862 }
863 }
864 if (adap->monitor_pin_cnt)
865 cec_pin_read(pin);
866
867 if (pin->wait_usecs) {
868
869
870
871
872 if (pin->wait_usecs > 150) {
873 pin->wait_usecs -= 100;
874 pin->timer_ts = ktime_add_us(ts, 100);
875 hrtimer_forward_now(timer, ns_to_ktime(100000));
876 return HRTIMER_RESTART;
877 }
878 if (pin->wait_usecs > 100) {
879 pin->wait_usecs /= 2;
880 pin->timer_ts = ktime_add_us(ts, pin->wait_usecs);
881 hrtimer_forward_now(timer,
882 ns_to_ktime(pin->wait_usecs * 1000));
883 return HRTIMER_RESTART;
884 }
885 pin->timer_ts = ktime_add_us(ts, pin->wait_usecs);
886 hrtimer_forward_now(timer,
887 ns_to_ktime(pin->wait_usecs * 1000));
888 pin->wait_usecs = 0;
889 return HRTIMER_RESTART;
890 }
891
892 switch (pin->state) {
893
894 case CEC_ST_TX_WAIT_FOR_HIGH:
895 case CEC_ST_TX_START_BIT_LOW:
896 case CEC_ST_TX_START_BIT_HIGH:
897 case CEC_ST_TX_START_BIT_HIGH_SHORT:
898 case CEC_ST_TX_START_BIT_HIGH_LONG:
899 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
900 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
901 case CEC_ST_TX_DATA_BIT_0_LOW:
902 case CEC_ST_TX_DATA_BIT_0_HIGH:
903 case CEC_ST_TX_DATA_BIT_0_HIGH_SHORT:
904 case CEC_ST_TX_DATA_BIT_0_HIGH_LONG:
905 case CEC_ST_TX_DATA_BIT_1_LOW:
906 case CEC_ST_TX_DATA_BIT_1_HIGH:
907 case CEC_ST_TX_DATA_BIT_1_HIGH_SHORT:
908 case CEC_ST_TX_DATA_BIT_1_HIGH_LONG:
909 case CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE:
910 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE:
911 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT:
912 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG:
913 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
914 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
915 case CEC_ST_TX_PULSE_LOW_CUSTOM:
916 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
917 cec_pin_tx_states(pin, ts);
918 break;
919
920
921 case CEC_ST_RX_START_BIT_LOW:
922 case CEC_ST_RX_START_BIT_HIGH:
923 case CEC_ST_RX_DATA_SAMPLE:
924 case CEC_ST_RX_DATA_POST_SAMPLE:
925 case CEC_ST_RX_DATA_WAIT_FOR_LOW:
926 case CEC_ST_RX_ACK_LOW:
927 case CEC_ST_RX_ACK_LOW_POST:
928 case CEC_ST_RX_ACK_HIGH_POST:
929 case CEC_ST_RX_ACK_FINISH:
930 cec_pin_rx_states(pin, ts);
931 break;
932
933 case CEC_ST_IDLE:
934 case CEC_ST_TX_WAIT:
935 if (!cec_pin_high(pin)) {
936
937 pin->ts = ts;
938 pin->state = CEC_ST_RX_START_BIT_LOW;
939
940
941
942
943
944
945
946 if (pin->tx_msg.len && pin->tx_signal_free_time >
947 CEC_SIGNAL_FREE_TIME_NEW_INITIATOR)
948 pin->tx_signal_free_time =
949 CEC_SIGNAL_FREE_TIME_NEW_INITIATOR;
950 break;
951 }
952 if (ktime_to_ns(pin->ts) == 0)
953 pin->ts = ts;
954 if (pin->tx_msg.len) {
955
956
957
958
959 delta = ktime_us_delta(ts, pin->ts);
960 if (delta / CEC_TIM_DATA_BIT_TOTAL >
961 pin->tx_signal_free_time) {
962 pin->tx_nacked = false;
963 if (tx_custom_start(pin))
964 pin->state = CEC_ST_TX_START_BIT_LOW_CUSTOM;
965 else
966 pin->state = CEC_ST_TX_START_BIT_LOW;
967
968 cec_pin_low(pin);
969 break;
970 }
971 if (delta / CEC_TIM_DATA_BIT_TOTAL >
972 pin->tx_signal_free_time - 1)
973 pin->state = CEC_ST_TX_WAIT;
974 break;
975 }
976 if (pin->tx_custom_pulse && pin->state == CEC_ST_IDLE) {
977 pin->tx_custom_pulse = false;
978
979 cec_pin_low(pin);
980 pin->state = CEC_ST_TX_PULSE_LOW_CUSTOM;
981 break;
982 }
983 if (pin->state != CEC_ST_IDLE || pin->ops->enable_irq == NULL ||
984 pin->enable_irq_failed || adap->is_configuring ||
985 adap->is_configured || adap->monitor_all_cnt)
986 break;
987
988 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_ENABLE);
989 pin->state = CEC_ST_RX_IRQ;
990 wake_up_interruptible(&pin->kthread_waitq);
991 return HRTIMER_NORESTART;
992
993 case CEC_ST_TX_LOW_DRIVE:
994 case CEC_ST_RX_LOW_DRIVE:
995 cec_pin_high(pin);
996 cec_pin_to_idle(pin);
997 break;
998
999 default:
1000 break;
1001 }
1002
1003 switch (pin->state) {
1004 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
1005 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
1006 case CEC_ST_TX_PULSE_LOW_CUSTOM:
1007 usecs = pin->tx_custom_low_usecs;
1008 break;
1009 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
1010 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
1011 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
1012 usecs = pin->tx_custom_high_usecs;
1013 break;
1014 default:
1015 usecs = states[pin->state].usecs;
1016 break;
1017 }
1018
1019 if (!adap->monitor_pin_cnt || usecs <= 150) {
1020 pin->wait_usecs = 0;
1021 pin->timer_ts = ktime_add_us(ts, usecs);
1022 hrtimer_forward_now(timer,
1023 ns_to_ktime(usecs * 1000));
1024 return HRTIMER_RESTART;
1025 }
1026 pin->wait_usecs = usecs - 100;
1027 pin->timer_ts = ktime_add_us(ts, 100);
1028 hrtimer_forward_now(timer, ns_to_ktime(100000));
1029 return HRTIMER_RESTART;
1030 }
1031
1032 static int cec_pin_thread_func(void *_adap)
1033 {
1034 struct cec_adapter *adap = _adap;
1035 struct cec_pin *pin = adap->pin;
1036
1037 for (;;) {
1038 wait_event_interruptible(pin->kthread_waitq,
1039 kthread_should_stop() ||
1040 pin->work_rx_msg.len ||
1041 pin->work_tx_status ||
1042 atomic_read(&pin->work_irq_change) ||
1043 atomic_read(&pin->work_pin_num_events));
1044
1045 if (pin->work_rx_msg.len) {
1046 struct cec_msg *msg = &pin->work_rx_msg;
1047
1048 if (msg->len > 1 && msg->len < CEC_MAX_MSG_SIZE &&
1049 rx_add_byte(pin)) {
1050
1051 msg->msg[msg->len++] = 0x55;
1052 }
1053 if (msg->len > 2 && rx_remove_byte(pin)) {
1054
1055 msg->len--;
1056 }
1057 if (msg->len > CEC_MAX_MSG_SIZE)
1058 msg->len = CEC_MAX_MSG_SIZE;
1059 cec_received_msg_ts(adap, msg,
1060 ns_to_ktime(pin->work_rx_msg.rx_ts));
1061 msg->len = 0;
1062 }
1063 if (pin->work_tx_status) {
1064 unsigned int tx_status = pin->work_tx_status;
1065
1066 pin->work_tx_status = 0;
1067 cec_transmit_attempt_done_ts(adap, tx_status,
1068 pin->work_tx_ts);
1069 }
1070
1071 while (atomic_read(&pin->work_pin_num_events)) {
1072 unsigned int idx = pin->work_pin_events_rd;
1073 u8 v = pin->work_pin_events[idx];
1074
1075 cec_queue_pin_cec_event(adap,
1076 v & CEC_PIN_EVENT_FL_IS_HIGH,
1077 v & CEC_PIN_EVENT_FL_DROPPED,
1078 pin->work_pin_ts[idx]);
1079 pin->work_pin_events_rd = (idx + 1) % CEC_NUM_PIN_EVENTS;
1080 atomic_dec(&pin->work_pin_num_events);
1081 }
1082
1083 switch (atomic_xchg(&pin->work_irq_change,
1084 CEC_PIN_IRQ_UNCHANGED)) {
1085 case CEC_PIN_IRQ_DISABLE:
1086 pin->ops->disable_irq(adap);
1087 cec_pin_high(pin);
1088 cec_pin_to_idle(pin);
1089 hrtimer_start(&pin->timer, ns_to_ktime(0),
1090 HRTIMER_MODE_REL);
1091 break;
1092 case CEC_PIN_IRQ_ENABLE:
1093 pin->enable_irq_failed = !pin->ops->enable_irq(adap);
1094 if (pin->enable_irq_failed) {
1095 cec_pin_to_idle(pin);
1096 hrtimer_start(&pin->timer, ns_to_ktime(0),
1097 HRTIMER_MODE_REL);
1098 }
1099 break;
1100 default:
1101 break;
1102 }
1103
1104 if (kthread_should_stop())
1105 break;
1106 }
1107 return 0;
1108 }
1109
1110 static int cec_pin_adap_enable(struct cec_adapter *adap, bool enable)
1111 {
1112 struct cec_pin *pin = adap->pin;
1113
1114 pin->enabled = enable;
1115 if (enable) {
1116 atomic_set(&pin->work_pin_num_events, 0);
1117 pin->work_pin_events_rd = pin->work_pin_events_wr = 0;
1118 pin->work_pin_events_dropped = false;
1119 cec_pin_read(pin);
1120 cec_pin_to_idle(pin);
1121 pin->tx_msg.len = 0;
1122 pin->timer_ts = ns_to_ktime(0);
1123 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_UNCHANGED);
1124 pin->kthread = kthread_run(cec_pin_thread_func, adap,
1125 "cec-pin");
1126 if (IS_ERR(pin->kthread)) {
1127 pr_err("cec-pin: kernel_thread() failed\n");
1128 return PTR_ERR(pin->kthread);
1129 }
1130 hrtimer_start(&pin->timer, ns_to_ktime(0),
1131 HRTIMER_MODE_REL);
1132 } else {
1133 if (pin->ops->disable_irq)
1134 pin->ops->disable_irq(adap);
1135 hrtimer_cancel(&pin->timer);
1136 kthread_stop(pin->kthread);
1137 cec_pin_read(pin);
1138 cec_pin_to_idle(pin);
1139 pin->state = CEC_ST_OFF;
1140 }
1141 return 0;
1142 }
1143
1144 static int cec_pin_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
1145 {
1146 struct cec_pin *pin = adap->pin;
1147
1148 if (log_addr == CEC_LOG_ADDR_INVALID)
1149 pin->la_mask = 0;
1150 else
1151 pin->la_mask |= (1 << log_addr);
1152 return 0;
1153 }
1154
1155 void cec_pin_start_timer(struct cec_pin *pin)
1156 {
1157 if (pin->state != CEC_ST_RX_IRQ)
1158 return;
1159
1160 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_UNCHANGED);
1161 pin->ops->disable_irq(pin->adap);
1162 cec_pin_high(pin);
1163 cec_pin_to_idle(pin);
1164 hrtimer_start(&pin->timer, ns_to_ktime(0), HRTIMER_MODE_REL);
1165 }
1166
1167 static int cec_pin_adap_transmit(struct cec_adapter *adap, u8 attempts,
1168 u32 signal_free_time, struct cec_msg *msg)
1169 {
1170 struct cec_pin *pin = adap->pin;
1171
1172
1173
1174
1175
1176
1177 if (pin->state != CEC_ST_IDLE &&
1178 signal_free_time > CEC_SIGNAL_FREE_TIME_NEW_INITIATOR)
1179 signal_free_time = CEC_SIGNAL_FREE_TIME_NEW_INITIATOR;
1180
1181 pin->tx_signal_free_time = signal_free_time;
1182 pin->tx_extra_bytes = 0;
1183 pin->tx_msg = *msg;
1184 if (msg->len > 1) {
1185
1186 pin->tx_extra_bytes = tx_add_bytes(pin);
1187 }
1188 if (msg->len > 2 && tx_remove_byte(pin)) {
1189
1190 pin->tx_msg.len--;
1191 }
1192 pin->work_tx_status = 0;
1193 pin->tx_bit = 0;
1194 cec_pin_start_timer(pin);
1195 return 0;
1196 }
1197
1198 static void cec_pin_adap_status(struct cec_adapter *adap,
1199 struct seq_file *file)
1200 {
1201 struct cec_pin *pin = adap->pin;
1202
1203 seq_printf(file, "state: %s\n", states[pin->state].name);
1204 seq_printf(file, "tx_bit: %d\n", pin->tx_bit);
1205 seq_printf(file, "rx_bit: %d\n", pin->rx_bit);
1206 seq_printf(file, "cec pin: %d\n", pin->ops->read(adap));
1207 seq_printf(file, "cec pin events dropped: %u\n",
1208 pin->work_pin_events_dropped_cnt);
1209 seq_printf(file, "irq failed: %d\n", pin->enable_irq_failed);
1210 if (pin->timer_100ms_overruns) {
1211 seq_printf(file, "timer overruns > 100ms: %u of %u\n",
1212 pin->timer_100ms_overruns, pin->timer_cnt);
1213 seq_printf(file, "timer overruns > 300ms: %u of %u\n",
1214 pin->timer_300ms_overruns, pin->timer_cnt);
1215 seq_printf(file, "max timer overrun: %u usecs\n",
1216 pin->timer_max_overrun);
1217 seq_printf(file, "avg timer overrun: %u usecs\n",
1218 pin->timer_sum_overrun / pin->timer_100ms_overruns);
1219 }
1220 if (pin->rx_start_bit_low_too_short_cnt)
1221 seq_printf(file,
1222 "rx start bit low too short: %u (delta %u, ts %llu)\n",
1223 pin->rx_start_bit_low_too_short_cnt,
1224 pin->rx_start_bit_low_too_short_delta,
1225 pin->rx_start_bit_low_too_short_ts);
1226 if (pin->rx_start_bit_too_short_cnt)
1227 seq_printf(file,
1228 "rx start bit too short: %u (delta %u, ts %llu)\n",
1229 pin->rx_start_bit_too_short_cnt,
1230 pin->rx_start_bit_too_short_delta,
1231 pin->rx_start_bit_too_short_ts);
1232 if (pin->rx_start_bit_too_long_cnt)
1233 seq_printf(file, "rx start bit too long: %u\n",
1234 pin->rx_start_bit_too_long_cnt);
1235 if (pin->rx_data_bit_too_short_cnt)
1236 seq_printf(file,
1237 "rx data bit too short: %u (delta %u, ts %llu)\n",
1238 pin->rx_data_bit_too_short_cnt,
1239 pin->rx_data_bit_too_short_delta,
1240 pin->rx_data_bit_too_short_ts);
1241 if (pin->rx_data_bit_too_long_cnt)
1242 seq_printf(file, "rx data bit too long: %u\n",
1243 pin->rx_data_bit_too_long_cnt);
1244 seq_printf(file, "rx initiated low drive: %u\n", pin->rx_low_drive_cnt);
1245 seq_printf(file, "tx detected low drive: %u\n", pin->tx_low_drive_cnt);
1246 pin->work_pin_events_dropped_cnt = 0;
1247 pin->timer_cnt = 0;
1248 pin->timer_100ms_overruns = 0;
1249 pin->timer_300ms_overruns = 0;
1250 pin->timer_max_overrun = 0;
1251 pin->timer_sum_overrun = 0;
1252 pin->rx_start_bit_low_too_short_cnt = 0;
1253 pin->rx_start_bit_too_short_cnt = 0;
1254 pin->rx_start_bit_too_long_cnt = 0;
1255 pin->rx_data_bit_too_short_cnt = 0;
1256 pin->rx_data_bit_too_long_cnt = 0;
1257 pin->rx_low_drive_cnt = 0;
1258 pin->tx_low_drive_cnt = 0;
1259 if (pin->ops->status)
1260 pin->ops->status(adap, file);
1261 }
1262
1263 static int cec_pin_adap_monitor_all_enable(struct cec_adapter *adap,
1264 bool enable)
1265 {
1266 struct cec_pin *pin = adap->pin;
1267
1268 pin->monitor_all = enable;
1269 return 0;
1270 }
1271
1272 static void cec_pin_adap_free(struct cec_adapter *adap)
1273 {
1274 struct cec_pin *pin = adap->pin;
1275
1276 if (pin->ops->free)
1277 pin->ops->free(adap);
1278 adap->pin = NULL;
1279 kfree(pin);
1280 }
1281
1282 void cec_pin_changed(struct cec_adapter *adap, bool value)
1283 {
1284 struct cec_pin *pin = adap->pin;
1285
1286 cec_pin_update(pin, value, false);
1287 if (!value && (adap->is_configuring || adap->is_configured ||
1288 adap->monitor_all_cnt))
1289 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_DISABLE);
1290 }
1291 EXPORT_SYMBOL_GPL(cec_pin_changed);
1292
1293 static const struct cec_adap_ops cec_pin_adap_ops = {
1294 .adap_enable = cec_pin_adap_enable,
1295 .adap_monitor_all_enable = cec_pin_adap_monitor_all_enable,
1296 .adap_log_addr = cec_pin_adap_log_addr,
1297 .adap_transmit = cec_pin_adap_transmit,
1298 .adap_status = cec_pin_adap_status,
1299 .adap_free = cec_pin_adap_free,
1300 #ifdef CONFIG_CEC_PIN_ERROR_INJ
1301 .error_inj_parse_line = cec_pin_error_inj_parse_line,
1302 .error_inj_show = cec_pin_error_inj_show,
1303 #endif
1304 };
1305
1306 struct cec_adapter *cec_pin_allocate_adapter(const struct cec_pin_ops *pin_ops,
1307 void *priv, const char *name, u32 caps)
1308 {
1309 struct cec_adapter *adap;
1310 struct cec_pin *pin = kzalloc(sizeof(*pin), GFP_KERNEL);
1311
1312 if (pin == NULL)
1313 return ERR_PTR(-ENOMEM);
1314 pin->ops = pin_ops;
1315 hrtimer_init(&pin->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1316 pin->timer.function = cec_pin_timer;
1317 init_waitqueue_head(&pin->kthread_waitq);
1318 pin->tx_custom_low_usecs = CEC_TIM_CUSTOM_DEFAULT;
1319 pin->tx_custom_high_usecs = CEC_TIM_CUSTOM_DEFAULT;
1320
1321 adap = cec_allocate_adapter(&cec_pin_adap_ops, priv, name,
1322 caps | CEC_CAP_MONITOR_ALL | CEC_CAP_MONITOR_PIN,
1323 CEC_MAX_LOG_ADDRS);
1324
1325 if (IS_ERR(adap)) {
1326 kfree(pin);
1327 return adap;
1328 }
1329
1330 adap->pin = pin;
1331 pin->adap = adap;
1332 cec_pin_update(pin, cec_pin_high(pin), true);
1333 return adap;
1334 }
1335 EXPORT_SYMBOL_GPL(cec_pin_allocate_adapter);