/*
 * drivers/amlogic/media/stream_input/parser/esparser.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 ESPARSER_H
#define ESPARSER_H

#include "../../frame_provider/decoder/utils/vdec.h"

extern ssize_t drm_write(struct file *file,
		struct stream_buf_s *stbuf,
		const char __user *buf, size_t count);

extern s32 esparser_init(struct stream_buf_s *buf, struct vdec_s *vdec);
extern s32 esparser_init_s(struct stream_buf_s *buf);
extern void esparser_release(struct stream_buf_s *buf);
extern ssize_t esparser_write(struct file *file,
	struct stream_buf_s *stbuf,
	const char __user *buf, size_t count);
extern ssize_t esparser_write_ex(struct file *file,
			struct stream_buf_s *stbuf,
			const char __user *buf, size_t count,
			int is_phy);

extern s32 es_vpts_checkin_us64(struct stream_buf_s *buf, u64 us64);

extern s32 es_apts_checkin_us64(struct stream_buf_s *buf, u64 us64);

extern int es_vpts_checkin(struct stream_buf_s *buf, u32 pts);

extern int es_apts_checkin(struct stream_buf_s *buf, u32 pts);

extern void esparser_audio_reset(struct stream_buf_s *buf);
extern void esparser_audio_reset_s(struct stream_buf_s *buf);

extern void esparser_sub_reset(void);

#ifdef CONFIG_AM_DVB
extern int tsdemux_set_reset_flag(void);
#endif

/* TODO: move to register headers */
#define ES_PACK_SIZE_BIT                8
#define ES_PACK_SIZE_WID                24

#define ES_CTRL_WID                     8
#define ES_CTRL_BIT                     0
#define ES_TYPE_MASK                    (3 << 6)
#define ES_TYPE_VIDEO                   (0 << 6)
#define ES_TYPE_AUDIO                   (1 << 6)
#define ES_TYPE_SUBTITLE                (2 << 6)

#define ES_WRITE                        (1<<5)
#define ES_PASSTHROUGH                  (1<<4)
#define ES_INSERT_BEFORE_ES_WRITE       (1<<3)
#define ES_DISCARD                      (1<<2)
#define ES_SEARCH                       (1<<1)
#define ES_PARSER_START                 (1<<0)
#define ES_PARSER_BUSY                  (1<<0)

#define PARSER_INTSTAT_FETCH_CMD    (1<<7)
#define PARSER_INTSTAT_PARSE        (1<<4)
#define PARSER_INTSTAT_DISCARD      (1<<3)
#define PARSER_INTSTAT_INSZERO      (1<<2)
#define PARSER_INTSTAT_ACT_NOSSC    (1<<1)
#define PARSER_INTSTAT_SC_FOUND     (1<<0)

#define FETCH_CIR_BUF               (1<<31)
#define FETCH_CHK_BUF_STOP          (1<<30)
#define FETCH_PASSTHROUGH           (1<<29)
#define FETCH_ENDIAN                27
#define FETCH_PASSTHROUGH_TYPE_MASK (0x3<<27)
#define FETCH_ENDIAN_MASK           (0x7<<27)
#define FETCH_BUF_SIZE_MASK         (0x7ffffff)
#define FETCH_CMD_PTR_MASK          3
#define FETCH_CMD_RD_PTR_BIT        5
#define FETCH_CMD_WR_PTR_BIT        3
#define FETCH_CMD_NUM_MASK          3
#define FETCH_CMD_NUM_BIT           0

#define ES_COUNT_MASK                0xfff
#define ES_COUNT_BIT                 20
#define ES_REQ_PENDING               (1<<19)
#define ES_PASSTHROUGH_EN            (1<<18)
#define ES_PASSTHROUGH_TYPE_MASK     (3<<16)
#define ES_PASSTHROUGH_TYPE_VIDEO    (0<<16)
#define ES_PASSTHROUGH_TYPE_AUDIO    (1<<16)
#define ES_PASSTHROUGH_TYPE_SUBTITLE (2<<16)
#define ES_WR_ENDIAN_MASK            (0x7)
#define ES_SUB_WR_ENDIAN_BIT         9
#define ES_SUB_MAN_RD_PTR            (1<<8)
#define ES_AUD_WR_ENDIAN_BIT         5
#define ES_AUD_MAN_RD_PTR            (1<<4)
#define ES_VID_WR_ENDIAN_BIT         1
#define ES_VID_MAN_RD_PTR            (1<<0)

#define PS_CFG_FETCH_DMA_URGENT         (1<<31)
#define PS_CFG_STREAM_DMA_URGENT        (1<<30)
#define PS_CFG_FORCE_PFIFO_REN          (1<<29)
#define PS_CFG_PFIFO_PEAK_EN            (1<<28)
#define PS_CFG_SRC_SEL_BIT              24
#define PS_CFG_SRC_SEL_MASK             (3<<PS_CFG_SRC_SEL_BIT)
#define PS_CFG_SRC_SEL_FETCH            (0<<PS_CFG_SRC_SEL_BIT)
#define PS_CFG_SRC_SEL_AUX1             (1<<PS_CFG_SRC_SEL_BIT)	/*from NDMA */
#define PS_CFG_SRC_SEL_AUX2             (2<<PS_CFG_SRC_SEL_BIT)
#define PS_CFG_SRC_SEL_AUX3             (3<<PS_CFG_SRC_SEL_BIT)
#define PS_CFG_PFIFO_EMPTY_CNT_BIT      16
#define PS_CFG_PFIFO_EMPTY_CNT_MASK     0xff
#define PS_CFG_MAX_ES_WR_CYCLE_BIT      12
#define PS_CFG_MAX_ES_WR_CYCLE_MASK     0xf
#define PS_CFG_STARTCODE_WID_MASK       (0x3<<10)
#define PS_CFG_STARTCODE_WID_8          (0x0<<10)
#define PS_CFG_STARTCODE_WID_16         (0x1<<10)
#define PS_CFG_STARTCODE_WID_24         (0x2<<10)
#define PS_CFG_STARTCODE_WID_32         (0x3<<10)
#define PS_CFG_PFIFO_ACCESS_WID_MASK    (0x3<<8)
#define PS_CFG_PFIFO_ACCESS_WID_8       (0x0<<8)
#define PS_CFG_PFIFO_ACCESS_WID_16      (0x1<<8)
#define PS_CFG_PFIFO_ACCESS_WID_24      (0x2<<8)
#define PS_CFG_PFIFO_ACCESS_WID_32      (0x3<<8)
#define PS_CFG_MAX_FETCH_CYCLE_BIT      0
#define PS_CFG_MAX_FETCH_CYCLE_MASK     0xff

#define PARSER_INT_DISABLE_CNT_MASK 0xffff
#define PARSER_INT_DISABLE_CNT_BIT  16
#define PARSER_INT_HOST_EN_MASK     0xff
#define PARSER_INT_HOST_EN_BIT      8
#define PARSER_INT_AMRISC_EN_MASK   0xff
#define PARSER_INT_AMRISC_EN_BIT    0
#define PARSER_INT_ALL              0xff

#define RESET_PARSER        (1<<8)
#define TS_HIU_ENABLE              5
#define USE_HI_BSF_INTERFACE       7

#define DRM_PRNT(fmt, args...)
#define  TRACE()	pr_info("drm--[%s::%d]\n", __func__, __LINE__)

#endif /* ESPARSER_H */
