/*
 * drivers/amlogic/media/stream_input/parser/tsdemux.h
 *
 * Copyright (C) 2016 Amlogic, Inc. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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 TSDEMUX_H
#define TSDEMUX_H
#include <linux/amlogic/media/utils/amports_config.h>

/* TODO: move to register headers */
#define NEW_PDTS_READY             4
#define AUDIO_PTS_READY            2
#define VIDEO_PTS_READY            0
#define DIS_CONTINUITY_PACKET      6
#define SUB_PES_READY              7
#define PCR_READY                  11

#define PARSER_INTSTAT_FETCH_CMD    (1<<7)

#define FETCH_ENDIAN                27
#define FETCH_ENDIAN_MASK           (0x7<<27)

#define RESET_DEMUXSTB      (1<<1)
#define RESET_PARSER        (1<<8)

#define VIDEO_PACKET               0
#define AUDIO_PACKET               1
#define SUB_PACKET                 2

#define OTHER_ENDIAN               6
#define BYPASS_ENDIAN              3
#define SECTION_ENDIAN             0

#define USE_HI_BSF_INTERFACE       7
#define DES_OUT_DLY                8
#define TRANSPORT_SCRAMBLING_CONTROL_ODD 6
#define TS_HIU_ENABLE               5
#define FEC_FILE_CLK_DIV            0
#define STB_DEMUX_ENABLE            4
#define KEEP_DUPLICATE_PACKAGE      6

#define ES_VID_MAN_RD_PTR            (1<<0)
#define ES_AUD_MAN_RD_PTR            (1<<4)

#define PS_CFG_PFIFO_EMPTY_CNT_BIT      16
#define PS_CFG_MAX_ES_WR_CYCLE_BIT      12
#define PS_CFG_MAX_FETCH_CYCLE_BIT      0

#define ES_SUB_WR_ENDIAN_BIT         9
#define ES_SUB_MAN_RD_PTR           (1<<8)
#define PARSER_INTSTAT_FETCH_CMD    (1<<7)

#define PARSER_INT_HOST_EN_BIT      8

struct stream_buf_s;
struct vdec_s;

extern s32 tsdemux_init(u32 vid, u32 aid, u32 sid, u32 pcrid, bool is_hevc,
	struct vdec_s *vdec);

extern void tsdemux_release(void);
extern ssize_t drm_tswrite(struct file *file,
		struct stream_buf_s *vbuf,
		struct stream_buf_s *abuf,
		const char __user *buf, size_t count);

extern ssize_t tsdemux_write(struct file *file,
		struct stream_buf_s *vbuf,
		struct stream_buf_s *abuf,
		const char __user *buf, size_t count);

extern u32 tsdemux_pcrscr_get(void);
extern u8 tsdemux_pcrscr_valid(void);
extern u8 tsdemux_pcraudio_valid(void);
extern u8 tsdemux_pcrvideo_valid(void);
extern u32 tsdemux_first_pcrscr_get(void);
extern void timestamp_pcrscr_enable(u32 enable);
extern void timestamp_pcrscr_set(u32 pts);
int get_discontinue_counter(void);

int tsdemux_class_register(void);
void tsdemux_class_unregister(void);
void tsdemux_change_avid(unsigned int vid, unsigned int aid);
void tsdemux_change_sid(unsigned int sid);
void tsdemux_audio_reset(void);
void tsdemux_sub_reset(void);
void tsdemux_set_skipbyte(int skipbyte);
void tsdemux_set_demux(int dev);
void tsdemux_tsync_func_init(void);


#endif /* TSDEMUX_H */
