hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*
 * Driver for Rockchip TSP  Controller
 *
 * Copyright (C) 2012-2016 ROCKCHIP, Inc.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 */
 
#ifndef _RK_TSP_H
#define _RK_TSP_H
 
#include <linux/types.h>
 
#define _SBF(s, v)        ((v) << (s))
 
#define TSP_GCFG        0x0000
#define TSOUT_ON        BIT(3)
#define PVR_ON            BIT(2)
#define PTI1_ON            BIT(1)
#define PTI0_ON            BIT(0)
 
#define PVR_CTRL        0x0004
#define PVR_BURST_INCR4        _SBF(4, 0x00)
#define PVR_BURST_INCR8        _SBF(4, 0x01)
#define PVR_BURST_INCR16    _SBF(4, 0x02)
#define PVR_SOURCE_NO_PID_FILTER_PTI0    _SBF(2, 0x00)
#define PVR_SOURCE_PID_FILTER_PTI0    _SBF(2, 0x01)
#define PVR_SOURCE_NO_PID_FILTER_PTI1    _SBF(2, 0x02)
#define PVR_SOURCE_PID_FILTER_PTI1    _SBF(2, 0x03)
#define PVR_STOP        BIT(1)
#define PVR_START        BIT(0)
 
#define PVR_LEN            0x0008
#define PVR_ADDR        0x000c
#define PVR_INT_STS        0x0010
#define PVR_INT_ENA        0x0014
#define TSOUT_CTRL        0x0018
 
#define PVR_TOP_ADDR        0x001c
#define PVR_WRITE_ADDR        0x0020
 
#define PTI0_CTRL        0x0100
#define TS_ERROR_NOT_OUTPUT        _SBF(19, 0x00)
#define TS_ERROR_SET_INDICATOR        _SBF(19, 0x01)
#define TS_ERROR_NOT_CARE        _SBF(19, 0x02)
#define TS_CLK_PHASE_SEL        BIT(18)
#define DEMUX_BURST_INCR4        _SBF(16, 0x00)
#define DEMUX_BURST_INCR8        _SBF(16, 0x01)
#define DEMUX_BURST_INCR16        _SBF(16, 0x02)
#define SYNC_BYPASS            BIT(15)
#define CW_BYTEORDER            BIT(14)
#define CM_ON                BIT(13)
#define SERIAL_SYNC_VALID_MODE        _SBF(11, 0x00)
#define PARALLEL_SYNC_VALID_MODE    _SBF(11, 0x01)
#define PARALLEL_SYNC_BURST_MODE    _SBF(11, 0x02)
#define PARALLEL_NOSYNC_VALID_MODE    _SBF(11, 0x03)
#define TSI_BIT_ORDER        BIT(10)
/* 0: memory, 1: hsadc */
#define TSI_SEL            BIT(9)
#define OUT_BYTESWAP        BIT(8)
#define IN_BYTESWAP        BIT(7)
#define SOFT_CLEAR        BIT(0)
 
#define PTI0_LLP_CFG        0x0104
#define PTI0_LLP_BASE        0x0108
#define PTI0_LLP_WRITE        0x010c
#define PTI0_LLP_READ        0x0110
#define PTI0_PID_STS0        0x0114
#define PTI0_PID_STS1        0x0118
#define PTI0_PID_STS2        0x011c
#define PTI0_PID_STS3        0x0120
#define PTI0_PID_INT_ENA0    0x0124
#define PTI0_PID_INT_ENA1    0x0128
#define PTI0_PID_INT_ENA2    0x012c
#define PTI0_PID_INT_ENA3    0x0130
#define PTI0_PCR_INT_STS    0x0134
#define PTI0_PCR_INT_ENA    0x0138
#define PTI0_PCR0_CTRL        0x013c
#define PTI0_PCR0_H        0x015c
#define PTI0_PCR0_L        0x0160
#define PTI0_DMA_STS        0x019c
#define PTI0_DMA_ENA        0x01a0
#define PTI0_DATA_FLAG0        0x01a4
#define PTI0_DATA_FLAG1        0x01a8
#define PTI0_LIST_FLAG        0x01ac
#define PTI0_DST_STS0        0x01b0
#define PTI0_DST_STS1        0x01b4
#define PTI0_DST_ENA0        0x01b8
#define PTI0_DST_ENA1        0x01bc
#define PTI0_ECW0_H        0x0200
#define PTI0_ECW0_L        0x0204
#define PTI0_OCW0_H        0x0208
#define PTI0_OCW0_L        0x020c
#define PTI0_PID0_CTRL        0x0300
#define PTI0_PID0_BASE        0x0400
#define PTI0_PID0_TOP        0x0404
#define PTI0_PID0_WRITE        0x0408
#define PTI0_PID0_READ        0x040c
#define PTI0_LIST0_BASE        0x0800
#define PTI0_LIST0_TOP        0x0804
#define PTI0_LIST0_WRITE    0x0808
#define PTI0_LIST0_READ        0x080c
#define PTI0_PID0_CFG        0x0900
#define PTI0_PID0_FILT_0    0x0904
#define PTI0_PID0_FILT_1    0x0908
#define PTI0_PID0_FILT_2    0x090c
#define PTI0_PID0_FILT_3    0x0910
 
#define MMU_DTE_ADDR        0x08800
#define MMU_STATUS        0x08804
#define MMU_COMMAND        0x08808
#define MMU_PAGE_FAULT_ADDR    0x0880c
#define MMU_ZAP_ONE_LINE    0x08810
#define MMU_INT_RAWSTAT        0x08814
#define MMU_INT_CLEAR        0x08818
#define MMU_INT_MASK        0x0881c
#define MMU_INT_STATUS        0x08820
#define MMU_AUTO_GATING        0x08824
#define MMU_MISS_CNT        0x08828
#define MMU_BURST_CNT        0x0882c
 
#define GRF_REG_FIELD(reg, lsb, msb)    ((reg << 16) | (lsb << 8) | (msb))
 
enum soc_type {
   RK312X,
   RK3228,
   RK3328,
};
 
enum grf_fields {
   TSP_IO_GROUP_SEL,
   TSP_VALID,
   TSP_FAIL,
   TSP_CLK,
   TSP_SYNCM0,
   TSP_D0,
   TSP_D1,
   TSP_D2,
   TSP_D3,
   TSP_D4,
   TSP_D5M0,
   TSP_D6M0,
   TSP_D7M0,
   TSP_SYNCM1,
   TSP_D5M1,
   TSP_D6M1,
   TSP_D7M1,
   MAX_FIELDS,
};
 
enum tsp_filter_type {
   TSP_SECTION_FILTER = 1,
   TSP_PES_FILTER = 2,
   TSP_ES_FILTER = 4,
   TSP_TS_FILTER = 8,
};
 
struct rockchip_tsp_plat_data {
   const u32 *grf_reg_fields;
   enum soc_type soc_type;
};
 
struct tsp_ctx {
   int pid;
   int index;
   uint filter_type; /*bit 0~3: section, pes, es, ts*/
   u8 *base;
   u8 *top;
   u8 *write;
   u8 *read;
   u8 *buf;
   u32 buf_len;
   dma_addr_t dma_buf;
   u8 filter_byte[TSP_DMX_FILTER_SIZE];
   u8 filter_mask[TSP_DMX_FILTER_SIZE];
   void (*get_data_callback)(const u8 *buf, size_t count, u16 pid);
   struct list_head pid_list;
};
 
struct tsp_dev {
   struct device *dev;
   void __iomem *ioaddr;
   struct regmap *grf;
   struct clk *tsp_clk;
   struct clk *tsp_aclk;
   struct clk *tsp_hclk;
   int tsp_irq;
   int serial_parallel_mode;
   struct list_head pid_list;
   /* lock for list operate */
   spinlock_t list_lock;
 
   int is_open;
 
   /* timer */
   struct timer_list timer;
 
   /* ts workque */
   struct work_struct ts_work;
   struct workqueue_struct *ts_queue;
   /* mutex for feed buf to dvb-core */
   struct mutex ts_mutex;
 
   /* section workque */
   struct work_struct sec_work;
   struct workqueue_struct *sec_queue;
 
   int tsp_start_descram;
 
   struct rockchip_tsp_channel_info channel_info[64];
   unsigned long channel_release_timeout[64];
   const struct rockchip_tsp_plat_data *pdata;
};
 
#define TSP_CMD_IO_OPEN          _IO('o', 120)
#define TSP_CMD_IO_CLOSE         _IO('o', 121)
#define TSP_CMD_SET_PCR_PID      _IOW('o', 122, ca_descr_t)
#define TSP_CMD_GET_PCR_VAL      _IOR('o', 123, ca_descr_t)
#define TSP_CMD_SET_DESCAM_PID   _IOW('o', 124, ca_descr_t)
#define TSP_CMD_SET_LIVE_STATUS  _IOW('o', 125, ca_descr_t)
#define TSP_CMD_RESET_REGS       _IOW('o', 126, ca_descr_t)
 
#endif