blob: da8c514c657d46f8462246e533f30753b30eee21 [file] [log] [blame]
Hans Verkuilb4e30a92018-02-07 09:34:03 -05001// SPDX-License-Identifier: GPL-2.0-only
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03002/*
3 * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03004 */
5
6#include <linux/delay.h>
7#include <linux/slab.h>
8#include <linux/sched/types.h>
9
10#include <media/cec-pin.h>
Hans Verkuil5bf24e02017-10-13 18:01:32 +020011#include "cec-pin-priv.h"
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030012
13/* All timings are in microseconds */
14
15/* start bit timings */
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/* data bit timings */
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/* earliest safe time to sample the bit state */
34#define CEC_TIM_DATA_BIT_SAMPLE 850
35/* earliest time the bit is back to 1 (T7 + 50) */
36#define CEC_TIM_DATA_BIT_HIGH 1750
37
38/* when idle, sample once per millisecond */
39#define CEC_TIM_IDLE_SAMPLE 1000
40/* when processing the start bit, sample twice per millisecond */
41#define CEC_TIM_START_BIT_SAMPLE 500
Hans Verkuil865463f2017-10-31 09:55:09 -040042/* when polling for a state change, sample once every 50 microseconds */
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030043#define CEC_TIM_SAMPLE 50
44
45#define CEC_TIM_LOW_DRIVE_ERROR (1.5 * CEC_TIM_DATA_BIT_TOTAL)
46
Hans Verkuil865463f2017-10-31 09:55:09 -040047/*
48 * Total data bit time that is too short/long for a valid bit,
49 * used for error injection.
50 */
51#define CEC_TIM_DATA_BIT_TOTAL_SHORT 1800
52#define CEC_TIM_DATA_BIT_TOTAL_LONG 2900
53
54/*
55 * Total start bit time that is too short/long for a valid bit,
56 * used for error injection.
57 */
58#define CEC_TIM_START_BIT_TOTAL_SHORT 4100
59#define CEC_TIM_START_BIT_TOTAL_LONG 5000
60
61/* Data bits are 0-7, EOM is bit 8 and ACK is bit 9 */
62#define EOM_BIT 8
63#define ACK_BIT 9
64
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030065struct cec_state {
66 const char * const name;
67 unsigned int usecs;
68};
69
70static 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 },
Hans Verkuil865463f2017-10-31 09:55:09 -040077 { "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 },
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030081 { "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 },
Hans Verkuil865463f2017-10-31 09:55:09 -040083 { "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 },
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030085 { "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 },
Hans Verkuil865463f2017-10-31 09:55:09 -040087 { "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 },
Hans Verkuilea5c8ef2017-07-11 03:30:42 -030098 { "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 },
Hans Verkuil865463f2017-10-31 09:55:09 -0400102 { "Rx Data Wait for Low", CEC_TIM_SAMPLE },
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300103 { "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
111static void cec_pin_update(struct cec_pin *pin, bool v, bool force)
112{
Hans Verkuil28e11b12017-08-20 06:53:10 -0400113 if (!force && v == pin->adap->cec_pin_is_high)
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300114 return;
115
Hans Verkuil28e11b12017-08-20 06:53:10 -0400116 pin->adap->cec_pin_is_high = v;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300117 if (atomic_read(&pin->work_pin_events) < CEC_NUM_PIN_EVENTS) {
118 pin->work_pin_is_high[pin->work_pin_events_wr] = v;
119 pin->work_pin_ts[pin->work_pin_events_wr] = ktime_get();
120 pin->work_pin_events_wr =
121 (pin->work_pin_events_wr + 1) % CEC_NUM_PIN_EVENTS;
122 atomic_inc(&pin->work_pin_events);
123 }
124 wake_up_interruptible(&pin->kthread_waitq);
125}
126
127static bool cec_pin_read(struct cec_pin *pin)
128{
129 bool v = pin->ops->read(pin->adap);
130
131 cec_pin_update(pin, v, false);
132 return v;
133}
134
135static void cec_pin_low(struct cec_pin *pin)
136{
137 pin->ops->low(pin->adap);
138 cec_pin_update(pin, false, false);
139}
140
141static bool cec_pin_high(struct cec_pin *pin)
142{
143 pin->ops->high(pin->adap);
144 return cec_pin_read(pin);
145}
146
Hans Verkuil865463f2017-10-31 09:55:09 -0400147static bool rx_error_inj(struct cec_pin *pin, unsigned int mode_offset,
148 int arg_idx, u8 *arg)
149{
150#ifdef CONFIG_CEC_PIN_ERROR_INJ
151 u16 cmd = cec_pin_rx_error_inj(pin);
152 u64 e = pin->error_inj[cmd];
153 unsigned int mode = (e >> mode_offset) & CEC_ERROR_INJ_MODE_MASK;
154
155 if (arg_idx >= 0) {
156 u8 pos = pin->error_inj_args[cmd][arg_idx];
157
158 if (arg)
159 *arg = pos;
160 else if (pos != pin->rx_bit)
161 return false;
162 }
163
164 switch (mode) {
165 case CEC_ERROR_INJ_MODE_ONCE:
166 pin->error_inj[cmd] &=
167 ~(CEC_ERROR_INJ_MODE_MASK << mode_offset);
168 return true;
169 case CEC_ERROR_INJ_MODE_ALWAYS:
170 return true;
171 case CEC_ERROR_INJ_MODE_TOGGLE:
172 return pin->rx_toggle;
173 default:
174 return false;
175 }
176#else
177 return false;
178#endif
179}
180
181static bool rx_nack(struct cec_pin *pin)
182{
183 return rx_error_inj(pin, CEC_ERROR_INJ_RX_NACK_OFFSET, -1, NULL);
184}
185
186static bool rx_low_drive(struct cec_pin *pin)
187{
188 return rx_error_inj(pin, CEC_ERROR_INJ_RX_LOW_DRIVE_OFFSET,
189 CEC_ERROR_INJ_RX_LOW_DRIVE_ARG_IDX, NULL);
190}
191
192static bool rx_add_byte(struct cec_pin *pin)
193{
194 return rx_error_inj(pin, CEC_ERROR_INJ_RX_ADD_BYTE_OFFSET, -1, NULL);
195}
196
197static bool rx_remove_byte(struct cec_pin *pin)
198{
199 return rx_error_inj(pin, CEC_ERROR_INJ_RX_REMOVE_BYTE_OFFSET, -1, NULL);
200}
201
202static bool rx_arb_lost(struct cec_pin *pin, u8 *poll)
203{
204 return pin->tx_msg.len == 0 &&
205 rx_error_inj(pin, CEC_ERROR_INJ_RX_ARB_LOST_OFFSET,
206 CEC_ERROR_INJ_RX_ARB_LOST_ARG_IDX, poll);
207}
208
209static bool tx_error_inj(struct cec_pin *pin, unsigned int mode_offset,
210 int arg_idx, u8 *arg)
211{
212#ifdef CONFIG_CEC_PIN_ERROR_INJ
213 u16 cmd = cec_pin_tx_error_inj(pin);
214 u64 e = pin->error_inj[cmd];
215 unsigned int mode = (e >> mode_offset) & CEC_ERROR_INJ_MODE_MASK;
216
217 if (arg_idx >= 0) {
218 u8 pos = pin->error_inj_args[cmd][arg_idx];
219
220 if (arg)
221 *arg = pos;
222 else if (pos != pin->tx_bit)
223 return false;
224 }
225
226 switch (mode) {
227 case CEC_ERROR_INJ_MODE_ONCE:
228 pin->error_inj[cmd] &=
229 ~(CEC_ERROR_INJ_MODE_MASK << mode_offset);
230 return true;
231 case CEC_ERROR_INJ_MODE_ALWAYS:
232 return true;
233 case CEC_ERROR_INJ_MODE_TOGGLE:
234 return pin->tx_toggle;
235 default:
236 return false;
237 }
238#else
239 return false;
240#endif
241}
242
243static bool tx_no_eom(struct cec_pin *pin)
244{
245 return tx_error_inj(pin, CEC_ERROR_INJ_TX_NO_EOM_OFFSET, -1, NULL);
246}
247
248static bool tx_early_eom(struct cec_pin *pin)
249{
250 return tx_error_inj(pin, CEC_ERROR_INJ_TX_EARLY_EOM_OFFSET, -1, NULL);
251}
252
253static bool tx_short_bit(struct cec_pin *pin)
254{
255 return tx_error_inj(pin, CEC_ERROR_INJ_TX_SHORT_BIT_OFFSET,
256 CEC_ERROR_INJ_TX_SHORT_BIT_ARG_IDX, NULL);
257}
258
259static bool tx_long_bit(struct cec_pin *pin)
260{
261 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LONG_BIT_OFFSET,
262 CEC_ERROR_INJ_TX_LONG_BIT_ARG_IDX, NULL);
263}
264
265static bool tx_custom_bit(struct cec_pin *pin)
266{
267 return tx_error_inj(pin, CEC_ERROR_INJ_TX_CUSTOM_BIT_OFFSET,
268 CEC_ERROR_INJ_TX_CUSTOM_BIT_ARG_IDX, NULL);
269}
270
271static bool tx_short_start(struct cec_pin *pin)
272{
273 return tx_error_inj(pin, CEC_ERROR_INJ_TX_SHORT_START_OFFSET, -1, NULL);
274}
275
276static bool tx_long_start(struct cec_pin *pin)
277{
278 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LONG_START_OFFSET, -1, NULL);
279}
280
281static bool tx_custom_start(struct cec_pin *pin)
282{
283 return tx_error_inj(pin, CEC_ERROR_INJ_TX_CUSTOM_START_OFFSET,
284 -1, NULL);
285}
286
287static bool tx_last_bit(struct cec_pin *pin)
288{
289 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LAST_BIT_OFFSET,
290 CEC_ERROR_INJ_TX_LAST_BIT_ARG_IDX, NULL);
291}
292
293static u8 tx_add_bytes(struct cec_pin *pin)
294{
295 u8 bytes;
296
297 if (tx_error_inj(pin, CEC_ERROR_INJ_TX_ADD_BYTES_OFFSET,
298 CEC_ERROR_INJ_TX_ADD_BYTES_ARG_IDX, &bytes))
299 return bytes;
300 return 0;
301}
302
303static bool tx_remove_byte(struct cec_pin *pin)
304{
305 return tx_error_inj(pin, CEC_ERROR_INJ_TX_REMOVE_BYTE_OFFSET, -1, NULL);
306}
307
308static bool tx_low_drive(struct cec_pin *pin)
309{
310 return tx_error_inj(pin, CEC_ERROR_INJ_TX_LOW_DRIVE_OFFSET,
311 CEC_ERROR_INJ_TX_LOW_DRIVE_ARG_IDX, NULL);
312}
313
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300314static void cec_pin_to_idle(struct cec_pin *pin)
315{
316 /*
317 * Reset all status fields, release the bus and
318 * go to idle state.
319 */
320 pin->rx_bit = pin->tx_bit = 0;
321 pin->rx_msg.len = 0;
322 memset(pin->rx_msg.msg, 0, sizeof(pin->rx_msg.msg));
Hans Verkuil805f23a2017-09-01 04:37:54 -0400323 pin->ts = ns_to_ktime(0);
Hans Verkuil865463f2017-10-31 09:55:09 -0400324 pin->tx_generated_poll = false;
325 pin->tx_post_eom = false;
326 if (pin->state >= CEC_ST_TX_WAIT &&
327 pin->state <= CEC_ST_TX_LOW_DRIVE)
328 pin->tx_toggle ^= 1;
329 if (pin->state >= CEC_ST_RX_START_BIT_LOW &&
330 pin->state <= CEC_ST_RX_LOW_DRIVE)
331 pin->rx_toggle ^= 1;
332 pin->state = CEC_ST_IDLE;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300333}
334
335/*
336 * Handle Transmit-related states
337 *
338 * Basic state changes when transmitting:
339 *
340 * Idle -> Tx Wait (waiting for the end of signal free time) ->
341 * Tx Start Bit Low -> Tx Start Bit High ->
342 *
343 * Regular data bits + EOM:
344 * Tx Data 0 Low -> Tx Data 0 High ->
345 * or:
346 * Tx Data 1 Low -> Tx Data 1 High ->
347 *
348 * First 4 data bits or Ack bit:
349 * Tx Data 0 Low -> Tx Data 0 High ->
350 * or:
351 * Tx Data 1 Low -> Tx Data 1 High -> Tx Data 1 Pre Sample ->
352 * Tx Data 1 Post Sample ->
353 *
354 * After the last Ack go to Idle.
355 *
356 * If it detects a Low Drive condition then:
357 * Tx Wait For High -> Idle
358 *
359 * If it loses arbitration, then it switches to state Rx Data Post Sample.
360 */
361static void cec_pin_tx_states(struct cec_pin *pin, ktime_t ts)
362{
363 bool v;
364 bool is_ack_bit, ack;
365
366 switch (pin->state) {
367 case CEC_ST_TX_WAIT_FOR_HIGH:
368 if (cec_pin_read(pin))
369 cec_pin_to_idle(pin);
370 break;
371
372 case CEC_ST_TX_START_BIT_LOW:
Hans Verkuil865463f2017-10-31 09:55:09 -0400373 if (tx_short_start(pin)) {
374 /*
375 * Error Injection: send an invalid (too short)
376 * start pulse.
377 */
378 pin->state = CEC_ST_TX_START_BIT_HIGH_SHORT;
379 } else if (tx_long_start(pin)) {
380 /*
381 * Error Injection: send an invalid (too long)
382 * start pulse.
383 */
384 pin->state = CEC_ST_TX_START_BIT_HIGH_LONG;
385 } else {
386 pin->state = CEC_ST_TX_START_BIT_HIGH;
387 }
388 /* Generate start bit */
389 cec_pin_high(pin);
390 break;
391
392 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
393 pin->state = CEC_ST_TX_START_BIT_HIGH_CUSTOM;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300394 /* Generate start bit */
395 cec_pin_high(pin);
396 break;
397
398 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE:
Hans Verkuil865463f2017-10-31 09:55:09 -0400399 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT:
400 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300401 if (pin->tx_nacked) {
402 cec_pin_to_idle(pin);
403 pin->tx_msg.len = 0;
Hans Verkuil865463f2017-10-31 09:55:09 -0400404 if (pin->tx_generated_poll)
405 break;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300406 pin->work_tx_ts = ts;
407 pin->work_tx_status = CEC_TX_STATUS_NACK;
408 wake_up_interruptible(&pin->kthread_waitq);
409 break;
410 }
411 /* fall through */
412 case CEC_ST_TX_DATA_BIT_0_HIGH:
Hans Verkuil865463f2017-10-31 09:55:09 -0400413 case CEC_ST_TX_DATA_BIT_0_HIGH_SHORT:
414 case CEC_ST_TX_DATA_BIT_0_HIGH_LONG:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300415 case CEC_ST_TX_DATA_BIT_1_HIGH:
Hans Verkuil865463f2017-10-31 09:55:09 -0400416 case CEC_ST_TX_DATA_BIT_1_HIGH_SHORT:
417 case CEC_ST_TX_DATA_BIT_1_HIGH_LONG:
418 /*
419 * If the read value is 1, then all is OK, otherwise we have a
420 * low drive condition.
421 *
422 * Special case: when we generate a poll message due to an
423 * Arbitration Lost error injection, then ignore this since
424 * the pin can actually be low in that case.
425 */
426 if (!cec_pin_read(pin) && !pin->tx_generated_poll) {
427 /*
428 * It's 0, so someone detected an error and pulled the
429 * line low for 1.5 times the nominal bit period.
430 */
431 pin->tx_msg.len = 0;
432 pin->state = CEC_ST_TX_WAIT_FOR_HIGH;
433 pin->work_tx_ts = ts;
434 pin->work_tx_status = CEC_TX_STATUS_LOW_DRIVE;
Hans Verkuil2b76e532018-03-01 02:02:24 -0500435 pin->tx_low_drive_cnt++;
Hans Verkuil865463f2017-10-31 09:55:09 -0400436 wake_up_interruptible(&pin->kthread_waitq);
437 break;
438 }
439 /* fall through */
440 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
441 if (tx_last_bit(pin)) {
442 /* Error Injection: just stop sending after this bit */
443 cec_pin_to_idle(pin);
444 pin->tx_msg.len = 0;
445 if (pin->tx_generated_poll)
446 break;
447 pin->work_tx_ts = ts;
448 pin->work_tx_status = CEC_TX_STATUS_OK;
449 wake_up_interruptible(&pin->kthread_waitq);
450 break;
451 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300452 pin->tx_bit++;
453 /* fall through */
454 case CEC_ST_TX_START_BIT_HIGH:
Hans Verkuil865463f2017-10-31 09:55:09 -0400455 case CEC_ST_TX_START_BIT_HIGH_SHORT:
456 case CEC_ST_TX_START_BIT_HIGH_LONG:
457 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
458 if (tx_low_drive(pin)) {
459 /* Error injection: go to low drive */
460 cec_pin_low(pin);
461 pin->state = CEC_ST_TX_LOW_DRIVE;
462 pin->tx_msg.len = 0;
463 if (pin->tx_generated_poll)
464 break;
465 pin->work_tx_ts = ts;
466 pin->work_tx_status = CEC_TX_STATUS_LOW_DRIVE;
Hans Verkuil2b76e532018-03-01 02:02:24 -0500467 pin->tx_low_drive_cnt++;
Hans Verkuil865463f2017-10-31 09:55:09 -0400468 wake_up_interruptible(&pin->kthread_waitq);
469 break;
470 }
471 if (pin->tx_bit / 10 >= pin->tx_msg.len + pin->tx_extra_bytes) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300472 cec_pin_to_idle(pin);
473 pin->tx_msg.len = 0;
Hans Verkuil865463f2017-10-31 09:55:09 -0400474 if (pin->tx_generated_poll)
475 break;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300476 pin->work_tx_ts = ts;
477 pin->work_tx_status = CEC_TX_STATUS_OK;
478 wake_up_interruptible(&pin->kthread_waitq);
479 break;
480 }
481
482 switch (pin->tx_bit % 10) {
Hans Verkuil865463f2017-10-31 09:55:09 -0400483 default: {
484 /*
485 * In the CEC_ERROR_INJ_TX_ADD_BYTES case we transmit
486 * extra bytes, so pin->tx_bit / 10 can become >= 16.
487 * Generate bit values for those extra bytes instead
488 * of reading them from the transmit buffer.
489 */
490 unsigned int idx = (pin->tx_bit / 10);
491 u8 val = idx;
492
493 if (idx < pin->tx_msg.len)
494 val = pin->tx_msg.msg[idx];
495 v = val & (1 << (7 - (pin->tx_bit % 10)));
496
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300497 pin->state = v ? CEC_ST_TX_DATA_BIT_1_LOW :
Hans Verkuil865463f2017-10-31 09:55:09 -0400498 CEC_ST_TX_DATA_BIT_0_LOW;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300499 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400500 }
501 case EOM_BIT: {
502 unsigned int tot_len = pin->tx_msg.len +
503 pin->tx_extra_bytes;
504 unsigned int tx_byte_idx = pin->tx_bit / 10;
505
506 v = !pin->tx_post_eom && tx_byte_idx == tot_len - 1;
507 if (tot_len > 1 && tx_byte_idx == tot_len - 2 &&
508 tx_early_eom(pin)) {
509 /* Error injection: set EOM one byte early */
510 v = true;
511 pin->tx_post_eom = true;
512 } else if (v && tx_no_eom(pin)) {
513 /* Error injection: no EOM */
514 v = false;
515 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300516 pin->state = v ? CEC_ST_TX_DATA_BIT_1_LOW :
Hans Verkuil865463f2017-10-31 09:55:09 -0400517 CEC_ST_TX_DATA_BIT_0_LOW;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300518 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400519 }
520 case ACK_BIT:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300521 pin->state = CEC_ST_TX_DATA_BIT_1_LOW;
522 break;
523 }
Hans Verkuil865463f2017-10-31 09:55:09 -0400524 if (tx_custom_bit(pin))
525 pin->state = CEC_ST_TX_DATA_BIT_LOW_CUSTOM;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300526 cec_pin_low(pin);
527 break;
528
529 case CEC_ST_TX_DATA_BIT_0_LOW:
530 case CEC_ST_TX_DATA_BIT_1_LOW:
531 v = pin->state == CEC_ST_TX_DATA_BIT_1_LOW;
Hans Verkuil865463f2017-10-31 09:55:09 -0400532 is_ack_bit = pin->tx_bit % 10 == ACK_BIT;
533 if (v && (pin->tx_bit < 4 || is_ack_bit)) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300534 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE;
Hans Verkuil865463f2017-10-31 09:55:09 -0400535 } else if (!is_ack_bit && tx_short_bit(pin)) {
536 /* Error Injection: send an invalid (too short) bit */
537 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH_SHORT :
538 CEC_ST_TX_DATA_BIT_0_HIGH_SHORT;
539 } else if (!is_ack_bit && tx_long_bit(pin)) {
540 /* Error Injection: send an invalid (too long) bit */
541 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH_LONG :
542 CEC_ST_TX_DATA_BIT_0_HIGH_LONG;
543 } else {
544 pin->state = v ? CEC_ST_TX_DATA_BIT_1_HIGH :
545 CEC_ST_TX_DATA_BIT_0_HIGH;
546 }
547 cec_pin_high(pin);
548 break;
549
550 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
551 pin->state = CEC_ST_TX_DATA_BIT_HIGH_CUSTOM;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300552 cec_pin_high(pin);
553 break;
554
555 case CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE:
556 /* Read the CEC value at the sample time */
557 v = cec_pin_read(pin);
Hans Verkuil865463f2017-10-31 09:55:09 -0400558 is_ack_bit = pin->tx_bit % 10 == ACK_BIT;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300559 /*
560 * If v == 0 and we're within the first 4 bits
561 * of the initiator, then someone else started
562 * transmitting and we lost the arbitration
563 * (i.e. the logical address of the other
564 * transmitter has more leading 0 bits in the
565 * initiator).
566 */
Hans Verkuil865463f2017-10-31 09:55:09 -0400567 if (!v && !is_ack_bit && !pin->tx_generated_poll) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300568 pin->tx_msg.len = 0;
569 pin->work_tx_ts = ts;
570 pin->work_tx_status = CEC_TX_STATUS_ARB_LOST;
571 wake_up_interruptible(&pin->kthread_waitq);
572 pin->rx_bit = pin->tx_bit;
573 pin->tx_bit = 0;
574 memset(pin->rx_msg.msg, 0, sizeof(pin->rx_msg.msg));
575 pin->rx_msg.msg[0] = pin->tx_msg.msg[0];
Hans Verkuil865463f2017-10-31 09:55:09 -0400576 pin->rx_msg.msg[0] &= (0xff << (8 - pin->rx_bit));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300577 pin->rx_msg.len = 0;
Hans Verkuil865463f2017-10-31 09:55:09 -0400578 pin->ts = ktime_sub_us(ts, CEC_TIM_DATA_BIT_SAMPLE);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300579 pin->state = CEC_ST_RX_DATA_POST_SAMPLE;
580 pin->rx_bit++;
581 break;
582 }
583 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE;
Hans Verkuil865463f2017-10-31 09:55:09 -0400584 if (!is_ack_bit && tx_short_bit(pin)) {
585 /* Error Injection: send an invalid (too short) bit */
586 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT;
587 } else if (!is_ack_bit && tx_long_bit(pin)) {
588 /* Error Injection: send an invalid (too long) bit */
589 pin->state = CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG;
590 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300591 if (!is_ack_bit)
592 break;
593 /* Was the message ACKed? */
594 ack = cec_msg_is_broadcast(&pin->tx_msg) ? v : !v;
Hans Verkuil865463f2017-10-31 09:55:09 -0400595 if (!ack && !pin->tx_ignore_nack_until_eom &&
596 pin->tx_bit / 10 < pin->tx_msg.len && !pin->tx_post_eom) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300597 /*
598 * Note: the CEC spec is ambiguous regarding
599 * what action to take when a NACK appears
600 * before the last byte of the payload was
601 * transmitted: either stop transmitting
602 * immediately, or wait until the last byte
603 * was transmitted.
604 *
605 * Most CEC implementations appear to stop
606 * immediately, and that's what we do here
607 * as well.
608 */
609 pin->tx_nacked = true;
610 }
611 break;
612
Hans Verkuil865463f2017-10-31 09:55:09 -0400613 case CEC_ST_TX_PULSE_LOW_CUSTOM:
614 cec_pin_high(pin);
615 pin->state = CEC_ST_TX_PULSE_HIGH_CUSTOM;
616 break;
617
618 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
619 cec_pin_to_idle(pin);
620 break;
621
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300622 default:
623 break;
624 }
625}
626
627/*
628 * Handle Receive-related states
629 *
630 * Basic state changes when receiving:
631 *
632 * Rx Start Bit Low -> Rx Start Bit High ->
633 * Regular data bits + EOM:
634 * Rx Data Sample -> Rx Data Post Sample -> Rx Data High ->
635 * Ack bit 0:
636 * Rx Ack Low -> Rx Ack Low Post -> Rx Data High ->
637 * Ack bit 1:
638 * Rx Ack High Post -> Rx Data High ->
639 * Ack bit 0 && EOM:
640 * Rx Ack Low -> Rx Ack Low Post -> Rx Ack Finish -> Idle
641 */
642static void cec_pin_rx_states(struct cec_pin *pin, ktime_t ts)
643{
644 s32 delta;
645 bool v;
646 bool ack;
647 bool bcast, for_us;
648 u8 dest;
Hans Verkuil865463f2017-10-31 09:55:09 -0400649 u8 poll;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300650
651 switch (pin->state) {
652 /* Receive states */
653 case CEC_ST_RX_START_BIT_LOW:
654 v = cec_pin_read(pin);
655 if (!v)
656 break;
657 pin->state = CEC_ST_RX_START_BIT_HIGH;
658 delta = ktime_us_delta(ts, pin->ts);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300659 /* Start bit low is too short, go back to idle */
Hans Verkuil865463f2017-10-31 09:55:09 -0400660 if (delta < CEC_TIM_START_BIT_LOW_MIN - CEC_TIM_IDLE_SAMPLE) {
Hans Verkuil2b76e532018-03-01 02:02:24 -0500661 if (!pin->rx_start_bit_low_too_short_cnt++) {
662 pin->rx_start_bit_low_too_short_ts = pin->ts;
663 pin->rx_start_bit_low_too_short_delta = delta;
664 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300665 cec_pin_to_idle(pin);
Hans Verkuil865463f2017-10-31 09:55:09 -0400666 break;
667 }
668 if (rx_arb_lost(pin, &poll)) {
669 cec_msg_init(&pin->tx_msg, poll >> 4, poll & 0xf);
670 pin->tx_generated_poll = true;
671 pin->tx_extra_bytes = 0;
672 pin->state = CEC_ST_TX_START_BIT_HIGH;
673 pin->ts = ts;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300674 }
675 break;
676
677 case CEC_ST_RX_START_BIT_HIGH:
678 v = cec_pin_read(pin);
679 delta = ktime_us_delta(ts, pin->ts);
Hans Verkuil865463f2017-10-31 09:55:09 -0400680 /*
681 * Unfortunately the spec does not specify when to give up
682 * and go to idle. We just pick TOTAL_LONG.
683 */
684 if (v && delta > CEC_TIM_START_BIT_TOTAL_LONG) {
Hans Verkuil2b76e532018-03-01 02:02:24 -0500685 pin->rx_start_bit_too_long_cnt++;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300686 cec_pin_to_idle(pin);
687 break;
688 }
689 if (v)
690 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400691 /* Start bit is too short, go back to idle */
692 if (delta < CEC_TIM_START_BIT_TOTAL_MIN - CEC_TIM_IDLE_SAMPLE) {
Hans Verkuil2b76e532018-03-01 02:02:24 -0500693 if (!pin->rx_start_bit_too_short_cnt++) {
694 pin->rx_start_bit_too_short_ts = pin->ts;
695 pin->rx_start_bit_too_short_delta = delta;
696 }
Hans Verkuil865463f2017-10-31 09:55:09 -0400697 cec_pin_to_idle(pin);
698 break;
699 }
700 if (rx_low_drive(pin)) {
701 /* Error injection: go to low drive */
702 cec_pin_low(pin);
703 pin->state = CEC_ST_RX_LOW_DRIVE;
Hans Verkuil2b76e532018-03-01 02:02:24 -0500704 pin->rx_low_drive_cnt++;
Hans Verkuil865463f2017-10-31 09:55:09 -0400705 break;
706 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300707 pin->state = CEC_ST_RX_DATA_SAMPLE;
708 pin->ts = ts;
709 pin->rx_eom = false;
710 break;
711
712 case CEC_ST_RX_DATA_SAMPLE:
713 v = cec_pin_read(pin);
714 pin->state = CEC_ST_RX_DATA_POST_SAMPLE;
715 switch (pin->rx_bit % 10) {
716 default:
717 if (pin->rx_bit / 10 < CEC_MAX_MSG_SIZE)
718 pin->rx_msg.msg[pin->rx_bit / 10] |=
719 v << (7 - (pin->rx_bit % 10));
720 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400721 case EOM_BIT:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300722 pin->rx_eom = v;
723 pin->rx_msg.len = pin->rx_bit / 10 + 1;
724 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400725 case ACK_BIT:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300726 break;
727 }
728 pin->rx_bit++;
729 break;
730
731 case CEC_ST_RX_DATA_POST_SAMPLE:
Hans Verkuil865463f2017-10-31 09:55:09 -0400732 pin->state = CEC_ST_RX_DATA_WAIT_FOR_LOW;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300733 break;
734
Hans Verkuil865463f2017-10-31 09:55:09 -0400735 case CEC_ST_RX_DATA_WAIT_FOR_LOW:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300736 v = cec_pin_read(pin);
737 delta = ktime_us_delta(ts, pin->ts);
Hans Verkuil865463f2017-10-31 09:55:09 -0400738 /*
739 * Unfortunately the spec does not specify when to give up
740 * and go to idle. We just pick TOTAL_LONG.
741 */
742 if (v && delta > CEC_TIM_DATA_BIT_TOTAL_LONG) {
Hans Verkuil2b76e532018-03-01 02:02:24 -0500743 pin->rx_data_bit_too_long_cnt++;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300744 cec_pin_to_idle(pin);
745 break;
746 }
747 if (v)
748 break;
Hans Verkuil865463f2017-10-31 09:55:09 -0400749
750 if (rx_low_drive(pin)) {
751 /* Error injection: go to low drive */
752 cec_pin_low(pin);
753 pin->state = CEC_ST_RX_LOW_DRIVE;
Hans Verkuil2b76e532018-03-01 02:02:24 -0500754 pin->rx_low_drive_cnt++;
Hans Verkuil865463f2017-10-31 09:55:09 -0400755 break;
756 }
757
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300758 /*
759 * Go to low drive state when the total bit time is
760 * too short.
761 */
762 if (delta < CEC_TIM_DATA_BIT_TOTAL_MIN) {
Hans Verkuil2b76e532018-03-01 02:02:24 -0500763 if (!pin->rx_data_bit_too_short_cnt++) {
764 pin->rx_data_bit_too_short_ts = pin->ts;
765 pin->rx_data_bit_too_short_delta = delta;
766 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300767 cec_pin_low(pin);
Hans Verkuil865463f2017-10-31 09:55:09 -0400768 pin->state = CEC_ST_RX_LOW_DRIVE;
Hans Verkuil2b76e532018-03-01 02:02:24 -0500769 pin->rx_low_drive_cnt++;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300770 break;
771 }
772 pin->ts = ts;
773 if (pin->rx_bit % 10 != 9) {
774 pin->state = CEC_ST_RX_DATA_SAMPLE;
775 break;
776 }
777
778 dest = cec_msg_destination(&pin->rx_msg);
779 bcast = dest == CEC_LOG_ADDR_BROADCAST;
780 /* for_us == broadcast or directed to us */
781 for_us = bcast || (pin->la_mask & (1 << dest));
782 /* ACK bit value */
783 ack = bcast ? 1 : !for_us;
784
Hans Verkuil865463f2017-10-31 09:55:09 -0400785 if (for_us && rx_nack(pin)) {
786 /* Error injection: toggle the ACK bit */
787 ack = !ack;
788 }
789
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300790 if (ack) {
791 /* No need to write to the bus, just wait */
792 pin->state = CEC_ST_RX_ACK_HIGH_POST;
793 break;
794 }
795 cec_pin_low(pin);
796 pin->state = CEC_ST_RX_ACK_LOW;
797 break;
798
799 case CEC_ST_RX_ACK_LOW:
800 cec_pin_high(pin);
801 pin->state = CEC_ST_RX_ACK_LOW_POST;
802 break;
803
804 case CEC_ST_RX_ACK_LOW_POST:
805 case CEC_ST_RX_ACK_HIGH_POST:
806 v = cec_pin_read(pin);
807 if (v && pin->rx_eom) {
808 pin->work_rx_msg = pin->rx_msg;
Hans Verkuil805f23a2017-09-01 04:37:54 -0400809 pin->work_rx_msg.rx_ts = ktime_to_ns(ts);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300810 wake_up_interruptible(&pin->kthread_waitq);
811 pin->ts = ts;
812 pin->state = CEC_ST_RX_ACK_FINISH;
813 break;
814 }
815 pin->rx_bit++;
Hans Verkuil865463f2017-10-31 09:55:09 -0400816 pin->state = CEC_ST_RX_DATA_WAIT_FOR_LOW;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300817 break;
818
819 case CEC_ST_RX_ACK_FINISH:
820 cec_pin_to_idle(pin);
821 break;
822
823 default:
824 break;
825 }
826}
827
828/*
829 * Main timer function
830 *
831 */
832static enum hrtimer_restart cec_pin_timer(struct hrtimer *timer)
833{
834 struct cec_pin *pin = container_of(timer, struct cec_pin, timer);
835 struct cec_adapter *adap = pin->adap;
836 ktime_t ts;
837 s32 delta;
Hans Verkuil865463f2017-10-31 09:55:09 -0400838 u32 usecs;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300839
840 ts = ktime_get();
Hans Verkuil805f23a2017-09-01 04:37:54 -0400841 if (ktime_to_ns(pin->timer_ts)) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300842 delta = ktime_us_delta(ts, pin->timer_ts);
843 pin->timer_cnt++;
844 if (delta > 100 && pin->state != CEC_ST_IDLE) {
845 /* Keep track of timer overruns */
846 pin->timer_sum_overrun += delta;
847 pin->timer_100ms_overruns++;
848 if (delta > 300)
849 pin->timer_300ms_overruns++;
850 if (delta > pin->timer_max_overrun)
851 pin->timer_max_overrun = delta;
852 }
853 }
854 if (adap->monitor_pin_cnt)
855 cec_pin_read(pin);
856
857 if (pin->wait_usecs) {
858 /*
859 * If we are monitoring the pin, then we have to
860 * sample at regular intervals.
861 */
862 if (pin->wait_usecs > 150) {
863 pin->wait_usecs -= 100;
864 pin->timer_ts = ktime_add_us(ts, 100);
Hans Verkuil805f23a2017-09-01 04:37:54 -0400865 hrtimer_forward_now(timer, ns_to_ktime(100000));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300866 return HRTIMER_RESTART;
867 }
868 if (pin->wait_usecs > 100) {
869 pin->wait_usecs /= 2;
870 pin->timer_ts = ktime_add_us(ts, pin->wait_usecs);
Hans Verkuil805f23a2017-09-01 04:37:54 -0400871 hrtimer_forward_now(timer,
872 ns_to_ktime(pin->wait_usecs * 1000));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300873 return HRTIMER_RESTART;
874 }
875 pin->timer_ts = ktime_add_us(ts, pin->wait_usecs);
Hans Verkuil805f23a2017-09-01 04:37:54 -0400876 hrtimer_forward_now(timer,
877 ns_to_ktime(pin->wait_usecs * 1000));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300878 pin->wait_usecs = 0;
879 return HRTIMER_RESTART;
880 }
881
882 switch (pin->state) {
883 /* Transmit states */
884 case CEC_ST_TX_WAIT_FOR_HIGH:
885 case CEC_ST_TX_START_BIT_LOW:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300886 case CEC_ST_TX_START_BIT_HIGH:
Hans Verkuil865463f2017-10-31 09:55:09 -0400887 case CEC_ST_TX_START_BIT_HIGH_SHORT:
888 case CEC_ST_TX_START_BIT_HIGH_LONG:
889 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
890 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300891 case CEC_ST_TX_DATA_BIT_0_LOW:
Hans Verkuil865463f2017-10-31 09:55:09 -0400892 case CEC_ST_TX_DATA_BIT_0_HIGH:
893 case CEC_ST_TX_DATA_BIT_0_HIGH_SHORT:
894 case CEC_ST_TX_DATA_BIT_0_HIGH_LONG:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300895 case CEC_ST_TX_DATA_BIT_1_LOW:
Hans Verkuil865463f2017-10-31 09:55:09 -0400896 case CEC_ST_TX_DATA_BIT_1_HIGH:
897 case CEC_ST_TX_DATA_BIT_1_HIGH_SHORT:
898 case CEC_ST_TX_DATA_BIT_1_HIGH_LONG:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300899 case CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE:
Hans Verkuil865463f2017-10-31 09:55:09 -0400900 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE:
901 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT:
902 case CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG:
903 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
904 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
905 case CEC_ST_TX_PULSE_LOW_CUSTOM:
906 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300907 cec_pin_tx_states(pin, ts);
908 break;
909
910 /* Receive states */
911 case CEC_ST_RX_START_BIT_LOW:
912 case CEC_ST_RX_START_BIT_HIGH:
913 case CEC_ST_RX_DATA_SAMPLE:
914 case CEC_ST_RX_DATA_POST_SAMPLE:
Hans Verkuil865463f2017-10-31 09:55:09 -0400915 case CEC_ST_RX_DATA_WAIT_FOR_LOW:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300916 case CEC_ST_RX_ACK_LOW:
917 case CEC_ST_RX_ACK_LOW_POST:
918 case CEC_ST_RX_ACK_HIGH_POST:
919 case CEC_ST_RX_ACK_FINISH:
920 cec_pin_rx_states(pin, ts);
921 break;
922
923 case CEC_ST_IDLE:
924 case CEC_ST_TX_WAIT:
925 if (!cec_pin_high(pin)) {
926 /* Start bit, switch to receive state */
927 pin->ts = ts;
928 pin->state = CEC_ST_RX_START_BIT_LOW;
929 break;
930 }
Hans Verkuil805f23a2017-09-01 04:37:54 -0400931 if (ktime_to_ns(pin->ts) == 0)
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300932 pin->ts = ts;
933 if (pin->tx_msg.len) {
934 /*
935 * Check if the bus has been free for long enough
936 * so we can kick off the pending transmit.
937 */
938 delta = ktime_us_delta(ts, pin->ts);
939 if (delta / CEC_TIM_DATA_BIT_TOTAL >
940 pin->tx_signal_free_time) {
941 pin->tx_nacked = false;
Hans Verkuil865463f2017-10-31 09:55:09 -0400942 if (tx_custom_start(pin))
943 pin->state = CEC_ST_TX_START_BIT_LOW_CUSTOM;
944 else
945 pin->state = CEC_ST_TX_START_BIT_LOW;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300946 /* Generate start bit */
947 cec_pin_low(pin);
948 break;
949 }
950 if (delta / CEC_TIM_DATA_BIT_TOTAL >
951 pin->tx_signal_free_time - 1)
952 pin->state = CEC_ST_TX_WAIT;
953 break;
954 }
Hans Verkuil865463f2017-10-31 09:55:09 -0400955 if (pin->tx_custom_pulse && pin->state == CEC_ST_IDLE) {
956 pin->tx_custom_pulse = false;
957 /* Generate custom pulse */
958 cec_pin_low(pin);
959 pin->state = CEC_ST_TX_PULSE_LOW_CUSTOM;
960 break;
961 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300962 if (pin->state != CEC_ST_IDLE || pin->ops->enable_irq == NULL ||
963 pin->enable_irq_failed || adap->is_configuring ||
964 adap->is_configured || adap->monitor_all_cnt)
965 break;
966 /* Switch to interrupt mode */
Hans Verkuilcb747492017-08-16 03:13:02 -0400967 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_ENABLE);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300968 pin->state = CEC_ST_RX_IRQ;
969 wake_up_interruptible(&pin->kthread_waitq);
970 return HRTIMER_NORESTART;
971
Hans Verkuil865463f2017-10-31 09:55:09 -0400972 case CEC_ST_TX_LOW_DRIVE:
973 case CEC_ST_RX_LOW_DRIVE:
974 cec_pin_high(pin);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300975 cec_pin_to_idle(pin);
976 break;
977
978 default:
979 break;
980 }
Hans Verkuil865463f2017-10-31 09:55:09 -0400981
982 switch (pin->state) {
983 case CEC_ST_TX_START_BIT_LOW_CUSTOM:
984 case CEC_ST_TX_DATA_BIT_LOW_CUSTOM:
985 case CEC_ST_TX_PULSE_LOW_CUSTOM:
986 usecs = pin->tx_custom_low_usecs;
987 break;
988 case CEC_ST_TX_START_BIT_HIGH_CUSTOM:
989 case CEC_ST_TX_DATA_BIT_HIGH_CUSTOM:
990 case CEC_ST_TX_PULSE_HIGH_CUSTOM:
991 usecs = pin->tx_custom_high_usecs;
992 break;
993 default:
994 usecs = states[pin->state].usecs;
995 break;
996 }
997
998 if (!adap->monitor_pin_cnt || usecs <= 150) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -0300999 pin->wait_usecs = 0;
Hans Verkuil865463f2017-10-31 09:55:09 -04001000 pin->timer_ts = ktime_add_us(ts, usecs);
Hans Verkuil805f23a2017-09-01 04:37:54 -04001001 hrtimer_forward_now(timer,
Hans Verkuil865463f2017-10-31 09:55:09 -04001002 ns_to_ktime(usecs * 1000));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001003 return HRTIMER_RESTART;
1004 }
Hans Verkuil865463f2017-10-31 09:55:09 -04001005 pin->wait_usecs = usecs - 100;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001006 pin->timer_ts = ktime_add_us(ts, 100);
Hans Verkuil805f23a2017-09-01 04:37:54 -04001007 hrtimer_forward_now(timer, ns_to_ktime(100000));
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001008 return HRTIMER_RESTART;
1009}
1010
1011static int cec_pin_thread_func(void *_adap)
1012{
1013 struct cec_adapter *adap = _adap;
1014 struct cec_pin *pin = adap->pin;
1015
1016 for (;;) {
1017 wait_event_interruptible(pin->kthread_waitq,
1018 kthread_should_stop() ||
1019 pin->work_rx_msg.len ||
1020 pin->work_tx_status ||
Hans Verkuilcb747492017-08-16 03:13:02 -04001021 atomic_read(&pin->work_irq_change) ||
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001022 atomic_read(&pin->work_pin_events));
1023
1024 if (pin->work_rx_msg.len) {
Hans Verkuil865463f2017-10-31 09:55:09 -04001025 struct cec_msg *msg = &pin->work_rx_msg;
1026
1027 if (msg->len > 1 && msg->len < CEC_MAX_MSG_SIZE &&
1028 rx_add_byte(pin)) {
1029 /* Error injection: add byte to the message */
1030 msg->msg[msg->len++] = 0x55;
1031 }
1032 if (msg->len > 2 && rx_remove_byte(pin)) {
1033 /* Error injection: remove byte from message */
1034 msg->len--;
1035 }
1036 if (msg->len > CEC_MAX_MSG_SIZE)
1037 msg->len = CEC_MAX_MSG_SIZE;
1038 cec_received_msg_ts(adap, msg,
Hans Verkuil805f23a2017-09-01 04:37:54 -04001039 ns_to_ktime(pin->work_rx_msg.rx_ts));
Hans Verkuil865463f2017-10-31 09:55:09 -04001040 msg->len = 0;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001041 }
1042 if (pin->work_tx_status) {
1043 unsigned int tx_status = pin->work_tx_status;
1044
1045 pin->work_tx_status = 0;
1046 cec_transmit_attempt_done_ts(adap, tx_status,
1047 pin->work_tx_ts);
1048 }
Hans Verkuilcb747492017-08-16 03:13:02 -04001049
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001050 while (atomic_read(&pin->work_pin_events)) {
1051 unsigned int idx = pin->work_pin_events_rd;
1052
Hans Verkuil9a6b2a82017-08-15 15:26:25 -04001053 cec_queue_pin_cec_event(adap,
1054 pin->work_pin_is_high[idx],
1055 pin->work_pin_ts[idx]);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001056 pin->work_pin_events_rd = (idx + 1) % CEC_NUM_PIN_EVENTS;
1057 atomic_dec(&pin->work_pin_events);
1058 }
Hans Verkuilcb747492017-08-16 03:13:02 -04001059
1060 switch (atomic_xchg(&pin->work_irq_change,
1061 CEC_PIN_IRQ_UNCHANGED)) {
1062 case CEC_PIN_IRQ_DISABLE:
1063 pin->ops->disable_irq(adap);
1064 cec_pin_high(pin);
1065 cec_pin_to_idle(pin);
Hans Verkuil805f23a2017-09-01 04:37:54 -04001066 hrtimer_start(&pin->timer, ns_to_ktime(0),
1067 HRTIMER_MODE_REL);
Hans Verkuilcb747492017-08-16 03:13:02 -04001068 break;
1069 case CEC_PIN_IRQ_ENABLE:
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001070 pin->enable_irq_failed = !pin->ops->enable_irq(adap);
1071 if (pin->enable_irq_failed) {
1072 cec_pin_to_idle(pin);
Hans Verkuil805f23a2017-09-01 04:37:54 -04001073 hrtimer_start(&pin->timer, ns_to_ktime(0),
1074 HRTIMER_MODE_REL);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001075 }
Hans Verkuilcb747492017-08-16 03:13:02 -04001076 break;
1077 default:
1078 break;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001079 }
Hans Verkuilcb747492017-08-16 03:13:02 -04001080
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001081 if (kthread_should_stop())
1082 break;
1083 }
1084 return 0;
1085}
1086
1087static int cec_pin_adap_enable(struct cec_adapter *adap, bool enable)
1088{
1089 struct cec_pin *pin = adap->pin;
1090
1091 pin->enabled = enable;
1092 if (enable) {
1093 atomic_set(&pin->work_pin_events, 0);
1094 pin->work_pin_events_rd = pin->work_pin_events_wr = 0;
1095 cec_pin_read(pin);
1096 cec_pin_to_idle(pin);
1097 pin->tx_msg.len = 0;
Hans Verkuil805f23a2017-09-01 04:37:54 -04001098 pin->timer_ts = ns_to_ktime(0);
Hans Verkuilcb747492017-08-16 03:13:02 -04001099 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_UNCHANGED);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001100 pin->kthread = kthread_run(cec_pin_thread_func, adap,
1101 "cec-pin");
1102 if (IS_ERR(pin->kthread)) {
1103 pr_err("cec-pin: kernel_thread() failed\n");
1104 return PTR_ERR(pin->kthread);
1105 }
Hans Verkuil805f23a2017-09-01 04:37:54 -04001106 hrtimer_start(&pin->timer, ns_to_ktime(0),
1107 HRTIMER_MODE_REL);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001108 } else {
1109 if (pin->ops->disable_irq)
1110 pin->ops->disable_irq(adap);
1111 hrtimer_cancel(&pin->timer);
1112 kthread_stop(pin->kthread);
1113 cec_pin_read(pin);
1114 cec_pin_to_idle(pin);
1115 pin->state = CEC_ST_OFF;
1116 }
1117 return 0;
1118}
1119
1120static int cec_pin_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
1121{
1122 struct cec_pin *pin = adap->pin;
1123
1124 if (log_addr == CEC_LOG_ADDR_INVALID)
1125 pin->la_mask = 0;
1126 else
1127 pin->la_mask |= (1 << log_addr);
1128 return 0;
1129}
1130
Hans Verkuil0ee492a2017-10-31 09:55:09 -04001131void cec_pin_start_timer(struct cec_pin *pin)
1132{
1133 if (pin->state != CEC_ST_RX_IRQ)
1134 return;
1135
1136 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_UNCHANGED);
1137 pin->ops->disable_irq(pin->adap);
1138 cec_pin_high(pin);
1139 cec_pin_to_idle(pin);
1140 hrtimer_start(&pin->timer, ns_to_ktime(0), HRTIMER_MODE_REL);
1141}
1142
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001143static int cec_pin_adap_transmit(struct cec_adapter *adap, u8 attempts,
1144 u32 signal_free_time, struct cec_msg *msg)
1145{
1146 struct cec_pin *pin = adap->pin;
1147
1148 pin->tx_signal_free_time = signal_free_time;
Hans Verkuil865463f2017-10-31 09:55:09 -04001149 pin->tx_extra_bytes = 0;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001150 pin->tx_msg = *msg;
Hans Verkuil865463f2017-10-31 09:55:09 -04001151 if (msg->len > 1) {
1152 /* Error injection: add byte to the message */
1153 pin->tx_extra_bytes = tx_add_bytes(pin);
1154 }
1155 if (msg->len > 2 && tx_remove_byte(pin)) {
1156 /* Error injection: remove byte from the message */
1157 pin->tx_msg.len--;
1158 }
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001159 pin->work_tx_status = 0;
1160 pin->tx_bit = 0;
Hans Verkuil0ee492a2017-10-31 09:55:09 -04001161 cec_pin_start_timer(pin);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001162 return 0;
1163}
1164
1165static void cec_pin_adap_status(struct cec_adapter *adap,
1166 struct seq_file *file)
1167{
1168 struct cec_pin *pin = adap->pin;
1169
Hans Verkuil2b76e532018-03-01 02:02:24 -05001170 seq_printf(file, "state: %s\n", states[pin->state].name);
1171 seq_printf(file, "tx_bit: %d\n", pin->tx_bit);
1172 seq_printf(file, "rx_bit: %d\n", pin->rx_bit);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001173 seq_printf(file, "cec pin: %d\n", pin->ops->read(adap));
1174 seq_printf(file, "irq failed: %d\n", pin->enable_irq_failed);
1175 if (pin->timer_100ms_overruns) {
1176 seq_printf(file, "timer overruns > 100ms: %u of %u\n",
1177 pin->timer_100ms_overruns, pin->timer_cnt);
1178 seq_printf(file, "timer overruns > 300ms: %u of %u\n",
1179 pin->timer_300ms_overruns, pin->timer_cnt);
1180 seq_printf(file, "max timer overrun: %u usecs\n",
1181 pin->timer_max_overrun);
1182 seq_printf(file, "avg timer overrun: %u usecs\n",
1183 pin->timer_sum_overrun / pin->timer_100ms_overruns);
1184 }
Hans Verkuil2b76e532018-03-01 02:02:24 -05001185 if (pin->rx_start_bit_low_too_short_cnt)
1186 seq_printf(file,
1187 "rx start bit low too short: %u (delta %u, ts %llu)\n",
1188 pin->rx_start_bit_low_too_short_cnt,
1189 pin->rx_start_bit_low_too_short_delta,
1190 pin->rx_start_bit_low_too_short_ts);
1191 if (pin->rx_start_bit_too_short_cnt)
1192 seq_printf(file,
1193 "rx start bit too short: %u (delta %u, ts %llu)\n",
1194 pin->rx_start_bit_too_short_cnt,
1195 pin->rx_start_bit_too_short_delta,
1196 pin->rx_start_bit_too_short_ts);
1197 if (pin->rx_start_bit_too_long_cnt)
1198 seq_printf(file, "rx start bit too long: %u\n",
1199 pin->rx_start_bit_too_long_cnt);
1200 if (pin->rx_data_bit_too_short_cnt)
1201 seq_printf(file,
1202 "rx data bit too short: %u (delta %u, ts %llu)\n",
1203 pin->rx_data_bit_too_short_cnt,
1204 pin->rx_data_bit_too_short_delta,
1205 pin->rx_data_bit_too_short_ts);
1206 if (pin->rx_data_bit_too_long_cnt)
1207 seq_printf(file, "rx data bit too long: %u\n",
1208 pin->rx_data_bit_too_long_cnt);
1209 seq_printf(file, "rx initiated low drive: %u\n", pin->rx_low_drive_cnt);
1210 seq_printf(file, "tx detected low drive: %u\n", pin->tx_low_drive_cnt);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001211 pin->timer_cnt = 0;
1212 pin->timer_100ms_overruns = 0;
1213 pin->timer_300ms_overruns = 0;
1214 pin->timer_max_overrun = 0;
1215 pin->timer_sum_overrun = 0;
Hans Verkuil2b76e532018-03-01 02:02:24 -05001216 pin->rx_start_bit_low_too_short_cnt = 0;
1217 pin->rx_start_bit_too_short_cnt = 0;
1218 pin->rx_start_bit_too_long_cnt = 0;
1219 pin->rx_data_bit_too_short_cnt = 0;
1220 pin->rx_data_bit_too_long_cnt = 0;
1221 pin->rx_low_drive_cnt = 0;
1222 pin->tx_low_drive_cnt = 0;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001223 if (pin->ops->status)
1224 pin->ops->status(adap, file);
1225}
1226
1227static int cec_pin_adap_monitor_all_enable(struct cec_adapter *adap,
1228 bool enable)
1229{
1230 struct cec_pin *pin = adap->pin;
1231
1232 pin->monitor_all = enable;
1233 return 0;
1234}
1235
1236static void cec_pin_adap_free(struct cec_adapter *adap)
1237{
1238 struct cec_pin *pin = adap->pin;
1239
1240 if (pin->ops->free)
1241 pin->ops->free(adap);
1242 adap->pin = NULL;
1243 kfree(pin);
1244}
1245
1246void cec_pin_changed(struct cec_adapter *adap, bool value)
1247{
1248 struct cec_pin *pin = adap->pin;
1249
1250 cec_pin_update(pin, value, false);
1251 if (!value && (adap->is_configuring || adap->is_configured ||
Hans Verkuilcb747492017-08-16 03:13:02 -04001252 adap->monitor_all_cnt))
1253 atomic_set(&pin->work_irq_change, CEC_PIN_IRQ_DISABLE);
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001254}
1255EXPORT_SYMBOL_GPL(cec_pin_changed);
1256
1257static const struct cec_adap_ops cec_pin_adap_ops = {
1258 .adap_enable = cec_pin_adap_enable,
1259 .adap_monitor_all_enable = cec_pin_adap_monitor_all_enable,
1260 .adap_log_addr = cec_pin_adap_log_addr,
1261 .adap_transmit = cec_pin_adap_transmit,
1262 .adap_status = cec_pin_adap_status,
1263 .adap_free = cec_pin_adap_free,
Hans Verkuil22712b32017-10-31 09:55:09 -04001264#ifdef CONFIG_CEC_PIN_ERROR_INJ
1265 .error_inj_parse_line = cec_pin_error_inj_parse_line,
1266 .error_inj_show = cec_pin_error_inj_show,
1267#endif
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001268};
1269
1270struct cec_adapter *cec_pin_allocate_adapter(const struct cec_pin_ops *pin_ops,
1271 void *priv, const char *name, u32 caps)
1272{
1273 struct cec_adapter *adap;
1274 struct cec_pin *pin = kzalloc(sizeof(*pin), GFP_KERNEL);
1275
1276 if (pin == NULL)
1277 return ERR_PTR(-ENOMEM);
1278 pin->ops = pin_ops;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001279 hrtimer_init(&pin->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1280 pin->timer.function = cec_pin_timer;
1281 init_waitqueue_head(&pin->kthread_waitq);
Hans Verkuil22712b32017-10-31 09:55:09 -04001282 pin->tx_custom_low_usecs = CEC_TIM_CUSTOM_DEFAULT;
1283 pin->tx_custom_high_usecs = CEC_TIM_CUSTOM_DEFAULT;
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001284
1285 adap = cec_allocate_adapter(&cec_pin_adap_ops, priv, name,
1286 caps | CEC_CAP_MONITOR_ALL | CEC_CAP_MONITOR_PIN,
1287 CEC_MAX_LOG_ADDRS);
1288
Hans Verkuil60757ee2017-10-18 04:11:46 -04001289 if (IS_ERR(adap)) {
Hans Verkuilea5c8ef2017-07-11 03:30:42 -03001290 kfree(pin);
1291 return adap;
1292 }
1293
1294 adap->pin = pin;
1295 pin->adap = adap;
1296 cec_pin_update(pin, cec_pin_high(pin), true);
1297 return adap;
1298}
1299EXPORT_SYMBOL_GPL(cec_pin_allocate_adapter);