5e2e59817f495ad2213c5356116d283d01a7a052
[linux-3.10.git] / drivers / misc / tegra-cec / tegra_cec.h
1 /*
2  * drivers/misc/tegra-cec/tegra_cec.h
3  *
4  * Copyright (c) 2012-2014, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifndef TEGRA_CEC_H
20 #define TEGRA_CEC_H
21
22 #include <linux/pm.h>
23 #include <asm/atomic.h>
24
25 #define TEGRA_CEC_FRAME_MAX_LENGTH  16
26
27 struct tegra_cec {
28         struct device           *dev;
29         struct miscdevice       misc_dev;
30         struct clk              *clk;
31         struct mutex            tx_lock;
32         void __iomem            *cec_base;
33         int                     tegra_cec_irq;
34         wait_queue_head_t       rx_waitq;
35         wait_queue_head_t       tx_waitq;
36         wait_queue_head_t       init_waitq;
37         atomic_t                init_done;
38         u16                     logical_addr;
39         struct work_struct      work;
40         unsigned int            rx_wake;
41         unsigned int            tx_wake;
42         u16                     rx_buffer;
43         long                    tx_error;
44         u32                     tx_buf[TEGRA_CEC_FRAME_MAX_LENGTH];
45         u8                      tx_buf_cur;
46         u8                      tx_buf_cnt;
47 };
48 static int tegra_cec_remove(struct platform_device *pdev);
49
50 #define TEGRA_CEC_LADDR_BROADCAST   0xF
51 #define TEGRA_CEC_LADDR_MASK        0xF
52 #define TEGRA_CEC_LADDR_WIDTH       4
53 #define TEGRA_CEC_LADDR_MODE(blk) \
54         ((blk & TEGRA_CEC_LADDR_MASK) == TEGRA_CEC_LADDR_BROADCAST)
55
56 /*CEC Timing registers*/
57 #define TEGRA_CEC_SW_CONTROL     0X000
58 #define TEGRA_CEC_HW_CONTROL     0X004
59 #define TEGRA_CEC_INPUT_FILTER   0X008
60 #define TEGRA_CEC_TX_REGISTER    0X010
61 #define TEGRA_CEC_RX_REGISTER    0X014
62 #define TEGRA_CEC_RX_TIMING_0    0X018
63 #define TEGRA_CEC_RX_TIMING_1    0X01C
64 #define TEGRA_CEC_RX_TIMING_2    0X020
65 #define TEGRA_CEC_TX_TIMING_0    0X024
66 #define TEGRA_CEC_TX_TIMING_1    0X028
67 #define TEGRA_CEC_TX_TIMING_2    0X02C
68 #define TEGRA_CEC_INT_STAT       0X030
69 #define TEGRA_CEC_INT_MASK       0X034
70 #define TEGRA_CEC_HW_DEBUG_RX    0X038
71 #define TEGRA_CEC_HW_DEBUG_TX    0X03C
72
73 #define TEGRA_CEC_MAX_LOGICAL_ADDR      15
74 #define TEGRA_CEC_HWCTRL_RX_LADDR_UNREG 0x0
75 #define TEGRA_CEC_HWCTRL_RX_LADDR_MASK  0x7FFF
76 #define TEGRA_CEC_HWCTRL_RX_LADDR(x)    \
77         ((x<<0) & TEGRA_CEC_HWCTRL_RX_LADDR_MASK)
78 #define TEGRA_CEC_HWCTRL_RX_SNOOP       (1<<15)
79 #define TEGRA_CEC_HWCTRL_RX_NAK_MODE    (1<<16)
80 #define TEGRA_CEC_HWCTRL_TX_NAK_MODE    (1<<24)
81 #define TEGRA_CEC_HWCTRL_FAST_SIM_MODE  (1<<30)
82 #define TEGRA_CEC_HWCTRL_TX_RX_MODE     (1<<31)
83
84 #define TEGRA_CEC_INPUT_FILTER_MODE     (1<<31)
85 #define TEGRA_CEC_INPUT_FILTER_FIFO_LENGTH_MASK 0
86
87 #define TEGRA_CEC_TX_REG_DATA_SHIFT             0
88 #define TEGRA_CEC_TX_REG_EOM_SHIFT              8
89 #define TEGRA_CEC_TX_REG_ADDR_MODE_SHIFT        12
90 #define TEGRA_CEC_TX_REG_START_BIT_SHIFT        16
91 #define TEGRA_CEC_TX_REG_RETRY_BIT_SHIFT        17
92
93 #define TEGRA_CEC_RX_REGISTER_MASK       0
94 #define TEGRA_CEC_RX_REGISTER_EOM        (1<<8)
95 #define TEGRA_CEC_RX_REGISTER_ACK        (1<<9)
96
97 #define TEGRA_CEC_RX_TIMING_0_RX_START_BIT_MAX_LO_TIME_MASK      0
98 #define TEGRA_CEC_RX_TIMING_0_RX_START_BIT_MIN_LO_TIME_MASK      8
99 #define TEGRA_CEC_RX_TIMING_0_RX_START_BIT_MAX_DURATION_MASK     16
100 #define TEGRA_CEC_RX_TIMING_0_RX_START_BIT_MIN_DURATION_MASK     24
101
102 #define TEGRA_CEC_RX_TIMING_1_RX_DATA_BIT_MAX_LO_TIME_MASK       0
103 #define TEGRA_CEC_RX_TIMING_1_RX_DATA_BIT_SAMPLE_TIME_MASK       8
104 #define TEGRA_CEC_RX_TIMING_1_RX_DATA_BIT_MAX_DURATION_MASK      16
105 #define TEGRA_CEC_RX_TIMING_1_RX_DATA_BIT_MIN_DURATION_MASK      24
106
107 #define TEGRA_CEC_RX_TIMING_2_RX_END_OF_BLOCK_TIME_MASK  0
108
109 #define TEGRA_CEC_TX_TIMING_0_TX_START_BIT_LO_TIME_MASK         0
110 #define TEGRA_CEC_TX_TIMING_0_TX_START_BIT_DURATION_MASK        8
111 #define TEGRA_CEC_TX_TIMING_0_TX_BUS_XITION_TIME_MASK           16
112 #define TEGRA_CEC_TX_TIMING_0_TX_BUS_ERROR_LO_TIME_MASK         24
113
114 #define TEGRA_CEC_TX_TIMING_1_TX_LO_DATA_BIT_LO_TIME_MASK       0
115 #define TEGRA_CEC_TX_TIMING_1_TX_HI_DATA_BIT_LO_TIME_MASK       8
116 #define TEGRA_CEC_TX_TIMING_1_TX_DATA_BIT_DURATION_MASK         16
117 #define TEGRA_CEC_TX_TIMING_1_TX_ACK_NAK_BIT_SAMPLE_TIME_MASK   24
118
119 #define TEGRA_CEC_TX_TIMING_2_BUS_IDLE_TIME_ADDITIONAL_FRAME_MASK       0
120 #define TEGRA_CEC_TX_TIMING_2_BUS_IDLE_TIME_NEW_FRAME_MASK              4
121 #define TEGRA_CEC_TX_TIMING_2_BUS_IDLE_TIME_RETRY_FRAME_MASK            8
122
123 #define TEGRA_CEC_INT_STAT_TX_REGISTER_EMPTY                    (1<<0)
124 #define TEGRA_CEC_INT_STAT_TX_REGISTER_UNDERRUN                 (1<<1)
125 #define TEGRA_CEC_INT_STAT_TX_FRAME_OR_BLOCK_NAKD               (1<<2)
126 #define TEGRA_CEC_INT_STAT_TX_ARBITRATION_FAILED                (1<<3)
127 #define TEGRA_CEC_INT_STAT_TX_BUS_ANOMALY_DETECTED              (1<<4)
128 #define TEGRA_CEC_INT_STAT_TX_FRAME_TRANSMITTED                 (1<<5)
129 #define TEGRA_CEC_INT_STAT_RX_REGISTER_FULL                     (1<<8)
130 #define TEGRA_CEC_INT_STAT_RX_REGISTER_OVERRUN                  (1<<9)
131 #define TEGRA_CEC_INT_STAT_RX_START_BIT_DETECTED                (1<<10)
132 #define TEGRA_CEC_INT_STAT_RX_BUS_ANOMALY_DETECTED              (1<<11)
133 #define TEGRA_CEC_INT_STAT_RX_BUS_ERROR_DETECTED                (1<<12)
134 #define TEGRA_CEC_INT_STAT_FILTERED_RX_DATA_PIN_TRANSITION_H2L  (1<<13)
135 #define TEGRA_CEC_INT_STAT_FILTERED_RX_DATA_PIN_TRANSITION_L2H  (1<<14)
136
137 #define TEGRA_CEC_INT_MASK_TX_REGISTER_EMPTY                    (1<<0)
138 #define TEGRA_CEC_INT_MASK_TX_REGISTER_UNDERRUN                 (1<<1)
139 #define TEGRA_CEC_INT_MASK_TX_FRAME_OR_BLOCK_NAKD               (1<<2)
140 #define TEGRA_CEC_INT_MASK_TX_ARBITRATION_FAILED                (1<<3)
141 #define TEGRA_CEC_INT_MASK_TX_BUS_ANOMALY_DETECTED              (1<<4)
142 #define TEGRA_CEC_INT_MASK_TX_FRAME_TRANSMITTED                 (1<<5)
143 #define TEGRA_CEC_INT_MASK_RX_REGISTER_FULL                     (1<<8)
144 #define TEGRA_CEC_INT_MASK_RX_REGISTER_OVERRUN                  (1<<9)
145 #define TEGRA_CEC_INT_MASK_RX_START_BIT_DETECTED                (1<<10)
146 #define TEGRA_CEC_INT_MASK_RX_BUS_ANOMALY_DETECTED              (1<<11)
147 #define TEGRA_CEC_INT_MASK_RX_BUS_ERROR_DETECTED                (1<<12)
148 #define TEGRA_CEC_INT_MASK_FILTERED_RX_DATA_PIN_TRANSITION_H2L  (1<<13)
149 #define TEGRA_CEC_INT_MASK_FILTERED_RX_DATA_PIN_TRANSITION_L2H  (1<<14)
150
151 #define TEGRA_CEC_HW_DEBUG_TX_DURATION_COUNT_MASK       0
152 #define TEGRA_CEC_HW_DEBUG_TX_TXBIT_COUNT_MASK          17
153 #define TEGRA_CEC_HW_DEBUG_TX_STATE_MASK                21
154 #define TEGRA_CEC_HW_DEBUG_TX_FORCELOOUT                (1<<25)
155 #define TEGRA_CEC_HW_DEBUG_TX_TXDATABIT_SAMPLE_TIMER    (1<<26)
156
157 #define TEGRA_CEC_NAME "tegra_cec"
158
159 #endif /* TEGRA_CEC_H */