/*
 * include/linux/amlogic/media/ppmgr/ppmgr.h
 *
 * Copyright (C) 2017 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 _PPMGR_MAIN_H
#define  _PPMGR_MAIN_H
#include <linux/interrupt.h>
/*#include <mach/am_regs.h>*/
#include <linux/amlogic/media/canvas/canvas.h>
#include <linux/fb.h>
#include <linux/list.h>
#include <linux/uaccess.h>
#include <linux/sysfs.h>
#include  <linux/spinlock.h>
#include <linux/kthread.h>

#define PPMGR_IOC_MAGIC  'P'
#define PPMGR_IOC_2OSD0		_IOW(PPMGR_IOC_MAGIC, 0x00, unsigned int)
#define PPMGR_IOC_ENABLE_PP _IOW(PPMGR_IOC_MAGIC, 0X01, unsigned int)
#define PPMGR_IOC_CONFIG_FRAME  _IOW(PPMGR_IOC_MAGIC, 0X02, unsigned int)
#define PPMGR_IOC_GET_ANGLE  _IOR(PPMGR_IOC_MAGIC, 0X03, unsigned int)
#define PPMGR_IOC_SET_ANGLE  _IOW(PPMGR_IOC_MAGIC, 0X04, unsigned int)

#ifdef CONFIG_AMLOGIC_POST_PROCESS_MANAGER_3D_PROCESS
#define PPMGR_IOC_VIEW_MODE  _IOW(PPMGR_IOC_MAGIC, 0X05, unsigned int)
#define PPMGR_IOC_HOR_VER_DOUBLE  _IOW(PPMGR_IOC_MAGIC, 0X06, unsigned int)
#define PPMGR_IOC_SWITCHMODE  _IOW(PPMGR_IOC_MAGIC, 0X07, unsigned int)
#define PPMGR_IOC_3D_DIRECTION  _IOW(PPMGR_IOC_MAGIC, 0X08, unsigned int)
#define PPMGR_IOC_3D_SCALE_DOWN  _IOW(PPMGR_IOC_MAGIC, 0X09, unsigned int)
#endif



struct frame_info_t {
int width;
int height;
int bpp;
int angle;
int format;
};

#ifdef CONFIG_AMLOGIC_POST_PROCESS_MANAGER_3D_PROCESS
/*mode: bit0-7, process type: disable, 3d, 2d->3d, 3d->2d*/
#define PPMGR_3D_PROCESS_MODE_MASK                    0xff
#define PPMGR_3D_PROCESS_MODE_SHIFT                   0
#define PPMGR_3D_PROCESS_MODE_DISABLE                 0
#define PPMGR_3D_PROCESS_MODE_3D_ENABLE               1
#define PPMGR_3D_PROCESS_MODE_3D_TO_2D                2
#define PPMGR_3D_PROCESS_MODE_2D_TO_3D                3

/*mode: bit 8-9, detect src format: 0-auto check, 1- lr format, 2-tb format*/
#define PPMGR_3D_PROCESS_SRC_FOMRAT_MASK              0x00000300
#define PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT             8
#define PPMGR_3D_PROCESS_SRC_FOMRAT_AUTO              0
#define PPMGR_3D_PROCESS_SRC_FOMRAT_LR                1
#define PPMGR_3D_PROCESS_SRC_FOMRAT_TB                2

/*mode: bit 10, L-R/T-B switch flag: 0-no switch, 1-switch*/
#define PPMGR_3D_PROCESS_SWITCH_FLAG                  0x00000400

/*mode: bit 11, 3D->2D, use L/T frame : 0-L/T, 1-R/B*/
#define PPMGR_3D_PROCESS_3D_TO_2D_SRC_FRAME           0x00000800

/* mode: bit 12-13, horizontal/vertical double mode,
 * for full/half format 3d src: 0-none, 1-hor double, 2-ver double
 */
#define PPMGR_3D_PROCESS_DOUBLE_TYPE                  0x00003000
#define PPMGR_3D_PROCESS_DOUBLE_TYPE_SHIFT            12
#define PPMGR_3D_PROCESS_DOUBLE_TYPE_NONE             0
#define PPMGR_3D_PROCESS_DOUBLE_TYPE_HOR              1
#define PPMGR_3D_PROCESS_DOUBLE_TYPE_VER              2

/*mode: bit 14-15 2d to 3d control*/
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_MASK        0x0000c000
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_SHIFT       14
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_NONE        0
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_LEFT_MOVE   1
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_RIGHT_MOVE  2

/*mode: bit 16-19, 2D->3D function: 0-normal, 1- field depth*/
#define PPMGR_3D_PROCESS_2D_TO_3D_MASK                0x000f0000
#define PPMGR_3D_PROCESS_2D_TO_3D_SHIFT               16
#define PPMGR_3D_PROCESS_2D_TO_3D_NORMAL              0
#define PPMGR_3D_PROCESS_2D_TO_3D_FIELD_DEPTH         1

/*mode: bit 20-27 2d to 3d control value*/
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_VALUE_MASK  0x0ff00000
#define PPMGR_3D_PROCESS_2D_TO_3D_CONTROL_VALUE_SHIFT 20

/*mode: bit 28-29 3d rotate direction control*/
/*#define PPMGR_3D_PROCESS_3D_ROTATE_DIRECTION_MASK        0x30000000*/
/*#define PPMGR_3D_PROCESS_3D_ROTATE_DIRECTION_VALUE_SHIFT 28*/

/*mode bit:30-31 not used*/

/*0x00000000*/
#define EXTERNAL_MODE_3D_DISABLE         PPMGR_3D_PROCESS_MODE_DISABLE

#define EXTERNAL_MODE_3D_AUTO            (PPMGR_3D_PROCESS_MODE_3D_ENABLE| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_AUTO<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_AUTO_SWITCH     (PPMGR_3D_PROCESS_MODE_3D_ENABLE | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_AUTO<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT)|\
	PPMGR_3D_PROCESS_SWITCH_FLAG)

#define EXTERNAL_MODE_3D_LR              (PPMGR_3D_PROCESS_MODE_3D_ENABLE | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_LR<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_LR_SWITCH       (PPMGR_3D_PROCESS_MODE_3D_ENABLE | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_LR<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT)| \
	PPMGR_3D_PROCESS_SWITCH_FLAG)

#define EXTERNAL_MODE_3D_TB             (PPMGR_3D_PROCESS_MODE_3D_ENABLE | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_TB<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_TB_SWITCH       (PPMGR_3D_PROCESS_MODE_3D_ENABLE | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_TB<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT) | \
	PPMGR_3D_PROCESS_SWITCH_FLAG)

#define EXTERNAL_MODE_3D_TO_2D_AUTO_1    (PPMGR_3D_PROCESS_MODE_3D_TO_2D | \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_AUTO<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_TO_2D_AUTO_2    (PPMGR_3D_PROCESS_MODE_3D_TO_2D| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_AUTO<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT)| \
	PPMGR_3D_PROCESS_3D_TO_2D_SRC_FRAME)

#define EXTERNAL_MODE_3D_TO_2D_L         (PPMGR_3D_PROCESS_MODE_3D_TO_2D| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_LR<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_TO_2D_R         (PPMGR_3D_PROCESS_MODE_3D_TO_2D| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_LR<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT)| \
	PPMGR_3D_PROCESS_3D_TO_2D_SRC_FRAME)
#define EXTERNAL_MODE_3D_TO_2D_T         (PPMGR_3D_PROCESS_MODE_3D_TO_2D| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_TB<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT))

#define EXTERNAL_MODE_3D_TO_2D_B         (PPMGR_3D_PROCESS_MODE_3D_TO_2D| \
	(PPMGR_3D_PROCESS_SRC_FOMRAT_TB<<PPMGR_3D_PROCESS_SRC_FORMAT_SHIFT)| \
	PPMGR_3D_PROCESS_3D_TO_2D_SRC_FRAME)

#define EXTERNAL_MODE_2D_TO_3D           (PPMGR_3D_PROCESS_MODE_2D_TO_3D| \
	(PPMGR_3D_PROCESS_2D_TO_3D_NORMAL<<PPMGR_3D_PROCESS_2D_TO_3D_SHIFT))

#define EXTERNAL_MODE_FIELD_DEPTH        (PPMGR_3D_PROCESS_MODE_2D_TO_3D| \
	(PPMGR_3D_PROCESS_2D_TO_3D_FIELD_DEPTH \
	<<PPMGR_3D_PROCESS_2D_TO_3D_SHIFT))

#define TYPE_NONE           0
#define TYPE_2D_TO_3D       1
#define TYPE_3D_LR          2
#define TYPE_3D_TB          3
#define TYPE_3D_TO_2D_LR    4
#define TYPE_3D_TO_2D_TB    5

enum view_mode_t {
VIEWMODE_NORMAL = 0,
VIEWMODE_FULL,
VIEWMODE_4_3,
VIEWMODE_16_9,
VIEWMODE_1_1,
VIEWMODE_MAX
};
#endif

/*TV 3D mode*/
#define PPMGR_MODE_3D_ENABLE      0x00000001
#define PPMGR_MODE_AUTO           0x00000002
#define PPMGR_MODE_2D_TO_3D       0x00000004
#define PPMGR_MODE_LR             0x00000008
#define PPMGR_MODE_BT             0x00000010
#define PPMGR_MODE_LR_SWITCH      0x00000020
#define PPMGR_MODE_FIELD_DEPTH    0x00000040
#define PPMGR_MODE_3D_TO_2D_L     0x00000080
#define PPMGR_MODE_3D_TO_2D_R     0x00000100

#define LR_FORMAT_INDICATOR   0x00000200
#define BT_FORMAT_INDICATOR   0x00000400

#define TYPE_NONE           0
#define TYPE_2D_TO_3D       1
#define TYPE_LR             2
#define TYPE_BT             3
#define TYPE_LR_SWITCH      4
#define TYPE_FILED_DEPTH    5
#define TYPE_3D_TO_2D_L     6
#define TYPE_3D_TO_2D_R     7

enum platform_type_t {
PLATFORM_MID = 0, PLATFORM_MBX, PLATFORM_TV, PLATFORM_MID_VERTICAL
};
/*#endif*/

#endif
