root/drivers/media/cec/cec-pin-priv.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * cec-pin-priv.h - internal cec-pin header
   4  *
   5  * Copyright 2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
   6  */
   7 
   8 #ifndef LINUX_CEC_PIN_PRIV_H
   9 #define LINUX_CEC_PIN_PRIV_H
  10 
  11 #include <linux/types.h>
  12 #include <linux/atomic.h>
  13 #include <media/cec-pin.h>
  14 
  15 enum cec_pin_state {
  16         /* CEC is off */
  17         CEC_ST_OFF,
  18         /* CEC is idle, waiting for Rx or Tx */
  19         CEC_ST_IDLE,
  20 
  21         /* Tx states */
  22 
  23         /* Pending Tx, waiting for Signal Free Time to expire */
  24         CEC_ST_TX_WAIT,
  25         /* Low-drive was detected, wait for bus to go high */
  26         CEC_ST_TX_WAIT_FOR_HIGH,
  27         /* Drive CEC low for the start bit */
  28         CEC_ST_TX_START_BIT_LOW,
  29         /* Drive CEC high for the start bit */
  30         CEC_ST_TX_START_BIT_HIGH,
  31         /* Generate a start bit period that is too short */
  32         CEC_ST_TX_START_BIT_HIGH_SHORT,
  33         /* Generate a start bit period that is too long */
  34         CEC_ST_TX_START_BIT_HIGH_LONG,
  35         /* Drive CEC low for the start bit using the custom timing */
  36         CEC_ST_TX_START_BIT_LOW_CUSTOM,
  37         /* Drive CEC high for the start bit using the custom timing */
  38         CEC_ST_TX_START_BIT_HIGH_CUSTOM,
  39         /* Drive CEC low for the 0 bit */
  40         CEC_ST_TX_DATA_BIT_0_LOW,
  41         /* Drive CEC high for the 0 bit */
  42         CEC_ST_TX_DATA_BIT_0_HIGH,
  43         /* Generate a bit period that is too short */
  44         CEC_ST_TX_DATA_BIT_0_HIGH_SHORT,
  45         /* Generate a bit period that is too long */
  46         CEC_ST_TX_DATA_BIT_0_HIGH_LONG,
  47         /* Drive CEC low for the 1 bit */
  48         CEC_ST_TX_DATA_BIT_1_LOW,
  49         /* Drive CEC high for the 1 bit */
  50         CEC_ST_TX_DATA_BIT_1_HIGH,
  51         /* Generate a bit period that is too short */
  52         CEC_ST_TX_DATA_BIT_1_HIGH_SHORT,
  53         /* Generate a bit period that is too long */
  54         CEC_ST_TX_DATA_BIT_1_HIGH_LONG,
  55         /*
  56          * Wait for start of sample time to check for Ack bit or first
  57          * four initiator bits to check for Arbitration Lost.
  58          */
  59         CEC_ST_TX_DATA_BIT_1_HIGH_PRE_SAMPLE,
  60         /* Wait for end of bit period after sampling */
  61         CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE,
  62         /* Generate a bit period that is too short */
  63         CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_SHORT,
  64         /* Generate a bit period that is too long */
  65         CEC_ST_TX_DATA_BIT_1_HIGH_POST_SAMPLE_LONG,
  66         /* Drive CEC low for a data bit using the custom timing */
  67         CEC_ST_TX_DATA_BIT_LOW_CUSTOM,
  68         /* Drive CEC high for a data bit using the custom timing */
  69         CEC_ST_TX_DATA_BIT_HIGH_CUSTOM,
  70         /* Drive CEC low for a standalone pulse using the custom timing */
  71         CEC_ST_TX_PULSE_LOW_CUSTOM,
  72         /* Drive CEC high for a standalone pulse using the custom timing */
  73         CEC_ST_TX_PULSE_HIGH_CUSTOM,
  74         /* Start low drive */
  75         CEC_ST_TX_LOW_DRIVE,
  76 
  77         /* Rx states */
  78 
  79         /* Start bit low detected */
  80         CEC_ST_RX_START_BIT_LOW,
  81         /* Start bit high detected */
  82         CEC_ST_RX_START_BIT_HIGH,
  83         /* Wait for bit sample time */
  84         CEC_ST_RX_DATA_SAMPLE,
  85         /* Wait for earliest end of bit period after sampling */
  86         CEC_ST_RX_DATA_POST_SAMPLE,
  87         /* Wait for CEC to go low (i.e. end of bit period) */
  88         CEC_ST_RX_DATA_WAIT_FOR_LOW,
  89         /* Drive CEC low to send 0 Ack bit */
  90         CEC_ST_RX_ACK_LOW,
  91         /* End of 0 Ack time, wait for earliest end of bit period */
  92         CEC_ST_RX_ACK_LOW_POST,
  93         /* Wait for CEC to go high (i.e. end of bit period */
  94         CEC_ST_RX_ACK_HIGH_POST,
  95         /* Wait for earliest end of bit period and end of message */
  96         CEC_ST_RX_ACK_FINISH,
  97         /* Start low drive */
  98         CEC_ST_RX_LOW_DRIVE,
  99 
 100         /* Monitor pin using interrupts */
 101         CEC_ST_RX_IRQ,
 102 
 103         /* Total number of pin states */
 104         CEC_PIN_STATES
 105 };
 106 
 107 /* Error Injection */
 108 
 109 /* Error injection modes */
 110 #define CEC_ERROR_INJ_MODE_OFF                          0
 111 #define CEC_ERROR_INJ_MODE_ONCE                         1
 112 #define CEC_ERROR_INJ_MODE_ALWAYS                       2
 113 #define CEC_ERROR_INJ_MODE_TOGGLE                       3
 114 #define CEC_ERROR_INJ_MODE_MASK                         3ULL
 115 
 116 /* Receive error injection options */
 117 #define CEC_ERROR_INJ_RX_NACK_OFFSET                    0
 118 #define CEC_ERROR_INJ_RX_LOW_DRIVE_OFFSET               2
 119 #define CEC_ERROR_INJ_RX_ADD_BYTE_OFFSET                4
 120 #define CEC_ERROR_INJ_RX_REMOVE_BYTE_OFFSET             6
 121 #define CEC_ERROR_INJ_RX_ARB_LOST_OFFSET                8
 122 #define CEC_ERROR_INJ_RX_MASK                           0xffffULL
 123 
 124 /* Transmit error injection options */
 125 #define CEC_ERROR_INJ_TX_NO_EOM_OFFSET                  16
 126 #define CEC_ERROR_INJ_TX_EARLY_EOM_OFFSET               18
 127 #define CEC_ERROR_INJ_TX_SHORT_BIT_OFFSET               20
 128 #define CEC_ERROR_INJ_TX_LONG_BIT_OFFSET                22
 129 #define CEC_ERROR_INJ_TX_CUSTOM_BIT_OFFSET              24
 130 #define CEC_ERROR_INJ_TX_SHORT_START_OFFSET             26
 131 #define CEC_ERROR_INJ_TX_LONG_START_OFFSET              28
 132 #define CEC_ERROR_INJ_TX_CUSTOM_START_OFFSET            30
 133 #define CEC_ERROR_INJ_TX_LAST_BIT_OFFSET                32
 134 #define CEC_ERROR_INJ_TX_ADD_BYTES_OFFSET               34
 135 #define CEC_ERROR_INJ_TX_REMOVE_BYTE_OFFSET             36
 136 #define CEC_ERROR_INJ_TX_LOW_DRIVE_OFFSET               38
 137 #define CEC_ERROR_INJ_TX_MASK                           0xffffffffffff0000ULL
 138 
 139 #define CEC_ERROR_INJ_RX_LOW_DRIVE_ARG_IDX              0
 140 #define CEC_ERROR_INJ_RX_ARB_LOST_ARG_IDX               1
 141 
 142 #define CEC_ERROR_INJ_TX_ADD_BYTES_ARG_IDX              2
 143 #define CEC_ERROR_INJ_TX_SHORT_BIT_ARG_IDX              3
 144 #define CEC_ERROR_INJ_TX_LONG_BIT_ARG_IDX               4
 145 #define CEC_ERROR_INJ_TX_CUSTOM_BIT_ARG_IDX             5
 146 #define CEC_ERROR_INJ_TX_LAST_BIT_ARG_IDX               6
 147 #define CEC_ERROR_INJ_TX_LOW_DRIVE_ARG_IDX              7
 148 #define CEC_ERROR_INJ_NUM_ARGS                          8
 149 
 150 /* Special CEC op values */
 151 #define CEC_ERROR_INJ_OP_ANY                            0x00000100
 152 
 153 /* The default for the low/high time of the custom pulse */
 154 #define CEC_TIM_CUSTOM_DEFAULT                          1000
 155 
 156 #define CEC_NUM_PIN_EVENTS                              128
 157 #define CEC_PIN_EVENT_FL_IS_HIGH                        (1 << 0)
 158 #define CEC_PIN_EVENT_FL_DROPPED                        (1 << 1)
 159 
 160 #define CEC_PIN_IRQ_UNCHANGED   0
 161 #define CEC_PIN_IRQ_DISABLE     1
 162 #define CEC_PIN_IRQ_ENABLE      2
 163 
 164 struct cec_pin {
 165         struct cec_adapter              *adap;
 166         const struct cec_pin_ops        *ops;
 167         struct task_struct              *kthread;
 168         wait_queue_head_t               kthread_waitq;
 169         struct hrtimer                  timer;
 170         ktime_t                         ts;
 171         unsigned int                    wait_usecs;
 172         u16                             la_mask;
 173         bool                            enabled;
 174         bool                            monitor_all;
 175         bool                            rx_eom;
 176         bool                            enable_irq_failed;
 177         enum cec_pin_state              state;
 178         struct cec_msg                  tx_msg;
 179         u32                             tx_bit;
 180         bool                            tx_nacked;
 181         u32                             tx_signal_free_time;
 182         bool                            tx_toggle;
 183         struct cec_msg                  rx_msg;
 184         u32                             rx_bit;
 185         bool                            rx_toggle;
 186         u32                             rx_start_bit_low_too_short_cnt;
 187         u64                             rx_start_bit_low_too_short_ts;
 188         u32                             rx_start_bit_low_too_short_delta;
 189         u32                             rx_start_bit_too_short_cnt;
 190         u64                             rx_start_bit_too_short_ts;
 191         u32                             rx_start_bit_too_short_delta;
 192         u32                             rx_start_bit_too_long_cnt;
 193         u32                             rx_data_bit_too_short_cnt;
 194         u64                             rx_data_bit_too_short_ts;
 195         u32                             rx_data_bit_too_short_delta;
 196         u32                             rx_data_bit_too_long_cnt;
 197         u32                             rx_low_drive_cnt;
 198 
 199         struct cec_msg                  work_rx_msg;
 200         u8                              work_tx_status;
 201         ktime_t                         work_tx_ts;
 202         atomic_t                        work_irq_change;
 203         atomic_t                        work_pin_num_events;
 204         unsigned int                    work_pin_events_wr;
 205         unsigned int                    work_pin_events_rd;
 206         ktime_t                         work_pin_ts[CEC_NUM_PIN_EVENTS];
 207         u8                              work_pin_events[CEC_NUM_PIN_EVENTS];
 208         bool                            work_pin_events_dropped;
 209         u32                             work_pin_events_dropped_cnt;
 210         ktime_t                         timer_ts;
 211         u32                             timer_cnt;
 212         u32                             timer_100ms_overruns;
 213         u32                             timer_300ms_overruns;
 214         u32                             timer_max_overrun;
 215         u32                             timer_sum_overrun;
 216 
 217         u32                             tx_custom_low_usecs;
 218         u32                             tx_custom_high_usecs;
 219         bool                            tx_ignore_nack_until_eom;
 220         bool                            tx_custom_pulse;
 221         bool                            tx_generated_poll;
 222         bool                            tx_post_eom;
 223         u8                              tx_extra_bytes;
 224         u32                             tx_low_drive_cnt;
 225 #ifdef CONFIG_CEC_PIN_ERROR_INJ
 226         u64                             error_inj[CEC_ERROR_INJ_OP_ANY + 1];
 227         u8                              error_inj_args[CEC_ERROR_INJ_OP_ANY + 1][CEC_ERROR_INJ_NUM_ARGS];
 228 #endif
 229 };
 230 
 231 void cec_pin_start_timer(struct cec_pin *pin);
 232 
 233 #ifdef CONFIG_CEC_PIN_ERROR_INJ
 234 bool cec_pin_error_inj_parse_line(struct cec_adapter *adap, char *line);
 235 int cec_pin_error_inj_show(struct cec_adapter *adap, struct seq_file *sf);
 236 
 237 u16 cec_pin_rx_error_inj(struct cec_pin *pin);
 238 u16 cec_pin_tx_error_inj(struct cec_pin *pin);
 239 #endif
 240 
 241 #endif

/* [<][>][^][v][top][bottom][index][help] */