/*
 * Copyright   2012-2019, Samsung Electronics Co. Ltd
 * This software is proprietary of Samsung Electronics.
 * No part of this software, either material or conceptual may be copied or
 * distributed, transmitted,
 * transcribed, stored in a retrieval system or translated into any human
 * or computer language in any form by any means,
 * electronic, mechanical, manual or otherwise, or disclosed
 * to third parties without the express written permission of Samsung
 * Electronics.
 */

#ifndef __DECON_H__
#define __DECON_H__

enum decon_trig_mode {
    DECON_HW_TRIG = 0,
    DECON_SW_TRIG
};

enum decon_psr_mode {
    DECON_VIDEO_MODE = 0,
    DECON_DP_PSR_MODE = 1,
    DECON_MIPI_COMMAND_MODE = 2,
};

enum decon_set_trig {
    DECON_TRIG_DISABLE = 0,
    DECON_TRIG_ENABLE
};

struct decon_mode_info {
    enum decon_psr_mode psr_mode;
    enum decon_trig_mode trig_mode;
};

/* Porter Duff Compositing Operators */
enum decon_win_func {
    PD_FUNC_CLEAR = 0x0,
    PD_FUNC_COPY = 0x1,
    PD_FUNC_DESTINATION = 0x2,
    PD_FUNC_SOURCE_OVER = 0x3,
    PD_FUNC_DESTINATION_OVER = 0x4,
    PD_FUNC_SOURCE_IN = 0x5,
    PD_FUNC_DESTINATION_IN = 0x6,
    PD_FUNC_SOURCE_OUT = 0x7,
    PD_FUNC_DESTINATION_OUT = 0x8,
    PD_FUNC_SOURCE_A_TOP = 0x9,
    PD_FUNC_DESTINATION_A_TOP = 0xa,
    PD_FUNC_XOR = 0xb,
    PD_FUNC_PLUS = 0xc,
    PD_FUNC_USER_DEFINED = 0xd,
};

enum decon_pixel_format {
    /* RGB 32bit */
    DECON_PIXEL_FORMAT_ARGB_8888 = 0,
    DECON_PIXEL_FORMAT_ABGR_8888,
    DECON_PIXEL_FORMAT_RGBA_8888,
    DECON_PIXEL_FORMAT_BGRA_8888,
    DECON_PIXEL_FORMAT_XRGB_8888,
    DECON_PIXEL_FORMAT_XBGR_8888,
    DECON_PIXEL_FORMAT_RGBX_8888,
    DECON_PIXEL_FORMAT_BGRX_8888,
    /* RGB 16 bit */
    DECON_PIXEL_FORMAT_RGBA_5551,
    DECON_PIXEL_FORMAT_RGB_565,
    /* YUV422 2P */
    DECON_PIXEL_FORMAT_NV16,
    DECON_PIXEL_FORMAT_NV61,
    /* YUV422 3P */
    DECON_PIXEL_FORMAT_YVU422_3P,
    /* YUV420 2P */
    DECON_PIXEL_FORMAT_NV12,
    DECON_PIXEL_FORMAT_NV21,
    DECON_PIXEL_FORMAT_NV12M,
    DECON_PIXEL_FORMAT_NV21M,
    /* YUV420 3P */
    DECON_PIXEL_FORMAT_YUV420,
    DECON_PIXEL_FORMAT_YVU420,
    DECON_PIXEL_FORMAT_YUV420M,
    DECON_PIXEL_FORMAT_YVU420M,
    DECON_PIXEL_FORMAT_NV12N,

    DECON_PIXEL_FORMAT_MAX,
};

enum decon_win_alpha_coef {
    BND_COEF_ZERO = 0x0,
    BND_COEF_ONE = 0x1,
    BND_COEF_AF = 0x2,
    BND_COEF_1_M_AF = 0x3,
    BND_COEF_AB = 0x4,
    BND_COEF_1_M_AB = 0x5,
    BND_COEF_PLNAE_ALPHA0 = 0x6,
    BND_COEF_1_M_PLNAE_ALPHA0 = 0x7,
    BND_COEF_PLNAE_ALPHA1 = 0x8,
    BND_COEF_1_M_PLNAE_ALPHA1 = 0x9,
    BND_COEF_ALPHA_MULT = 0xA,
    BND_COEF_1_M_ALPHA_MULT = 0xB,
};

enum decon_win_alpha_sel {
    ALPHA_MULT_SRC_SEL_ALPHA0 = 0,
    ALPHA_MULT_SRC_SEL_ALPHA1 = 1,
    ALPHA_MULT_SRC_SEL_AF = 2,
    ALPHA_MULT_SRC_SEL_AB = 3,
};

enum decon_blending {
    DECON_BLENDING_NONE = 0,
    DECON_BLENDING_PREMULT = 1,
    DECON_BLENDING_COVERAGE = 2,
    DECON_BLENDING_MAX = 3,
};

struct decon_window_regs {
    uint32_t wincon;
    uint32_t start_pos;
    uint32_t end_pos;
    uint32_t colormap;
    uint32_t start_time;
    uint32_t pixel_count;
    uint32_t whole_w;
    uint32_t whole_h;
    uint32_t offset_x;
    uint32_t offset_y;
    uint32_t winmap_state;
    uint32_t type;
    int plane_alpha;
    uint32_t format;
    uint32_t blend;
};

/********** EXTERNAL FUNCTION: H/W access API **********/
void tui_decon_init(uint32_t width, uint32_t height);
int tui_decon_ready(uint32_t fb_addr);
int tui_decon_oneshot(void);
void tui_decon_deinit(void);

#endif /* __DECON_H__ */