231 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Driver for Rockchip TSP  Controller
 | |
|  *
 | |
|  * Copyright (C) 2012-2016 Rockchip Electronics Co., Ltd.
 | |
|  *
 | |
|  * 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
 |