/* Copyright (c) 2015-2016, The Linux Foundation. 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 version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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 __SDE_ROTATOR_R1_INTERNAL_H__
#define __SDE_ROTATOR_R1_INTERNAL_H__

#include <linux/types.h>
#include <linux/file.h>
#include <linux/kref.h>
#include <linux/kernel.h>

#include "sde_rotator_util.h"

/**
 * enum sde_commit_stage_type - Indicate different commit stages
 */
enum sde_commit_stage_type {
	SDE_COMMIT_STAGE_SETUP_DONE,
	SDE_COMMIT_STAGE_READY_FOR_KICKOFF,
};

enum sde_mdp_wb_ctl_type {
	SDE_MDP_WB_CTL_TYPE_BLOCK = 1,
	SDE_MDP_WB_CTL_TYPE_LINE
};

enum sde_mdp_mixer_mux {
	SDE_MDP_MIXER_MUX_DEFAULT,
	SDE_MDP_MIXER_MUX_LEFT,
	SDE_MDP_MIXER_MUX_RIGHT,
};

enum sde_mdp_pipe_type {
	SDE_MDP_PIPE_TYPE_UNUSED,
	SDE_MDP_PIPE_TYPE_VIG,
	SDE_MDP_PIPE_TYPE_RGB,
	SDE_MDP_PIPE_TYPE_DMA,
	SDE_MDP_PIPE_TYPE_CURSOR,
};

struct sde_mdp_data;
struct sde_mdp_ctl;
struct sde_mdp_pipe;
struct sde_mdp_mixer;
struct sde_mdp_wb;

struct sde_mdp_writeback {
	u32 num;
	char __iomem *base;
	u32 offset;
};

struct sde_mdp_ctl_intfs_ops {
	int (*start_fnc)(struct sde_mdp_ctl *ctl);
	int (*stop_fnc)(struct sde_mdp_ctl *ctl, int panel_power_state);
	int (*prepare_fnc)(struct sde_mdp_ctl *ctl, void *arg);
	int (*display_fnc)(struct sde_mdp_ctl *ctl, void *arg);
	int (*wait_fnc)(struct sde_mdp_ctl *ctl, void *arg);
};

struct sde_mdp_ctl {
	u32 num;
	char __iomem *base;
	u32 opmode;
	u32 flush_bits;
	u32 flush_reg_data;
	bool is_secure;
	struct sde_rot_data_type *mdata;
	struct sde_mdp_mixer *mixer_left;
	struct sde_mdp_mixer *mixer_right;
	void *priv_data;
	u32 wb_type;
	struct sde_mdp_writeback *wb;
	struct sde_mdp_ctl_intfs_ops ops;
	u32 offset;
	int irq_num;
};

struct sde_mdp_mixer {
	u32 num;
	char __iomem *base;
	u8 rotator_mode;
	struct sde_mdp_ctl *ctl;
	u32 offset;
};

struct sde_mdp_shared_reg_ctrl {
	u32 reg_off;
	u32 bit_off;
};

struct sde_mdp_pipe {
	u32 num;
	u32 type;
	u32 ndx;
	char __iomem *base;
	u32 xin_id;
	u32 flags;
	u32 bwc_mode;
	u16 img_width;
	u16 img_height;
	u8 horz_deci;
	u8 vert_deci;
	struct sde_rect src;
	struct sde_rect dst;
	struct sde_mdp_format_params *src_fmt;
	struct sde_mdp_plane_sizes src_planes;
	struct sde_mdp_mixer *mixer_left;
	struct sde_mdp_mixer *mixer_right;
	struct sde_mdp_shared_reg_ctrl clk_ctrl;
	u32 params_changed;
	u32 offset;
};

struct sde_mdp_writeback_arg {
	struct sde_mdp_data *data;
	void *priv_data;
};

struct sde_mdp_commit_cb {
	void *data;
	int (*commit_cb_fnc)(enum sde_commit_stage_type commit_state,
		void *data);
};

static inline void sde_mdp_ctl_write(struct sde_mdp_ctl *ctl,
				      u32 reg, u32 val)
{
	SDEROT_DBG("ctl%d:%6.6x:%8.8x\n", ctl->num, ctl->offset + reg, val);
	writel_relaxed(val, ctl->base + reg);
}

static inline bool sde_mdp_is_nrt_vbif_client(struct sde_rot_data_type *mdata,
					struct sde_mdp_pipe *pipe)
{
	return mdata->vbif_nrt_io.base && pipe->mixer_left &&
			pipe->mixer_left->rotator_mode;
}
int sde_mdp_set_intr_callback(u32 intr_type, u32 intf_num,
				void (*fnc_ptr)(void *), void *arg);
int sde_mdp_display_wait4comp(struct sde_mdp_ctl *ctl);
int sde_mdp_writeback_display_commit(struct sde_mdp_ctl *ctl, void *arg);
int sde_mdp_pipe_queue_data(struct sde_mdp_pipe *pipe,
			     struct sde_mdp_data *src_data);
struct sde_mdp_ctl *sde_mdp_ctl_alloc(struct sde_rot_data_type *mdata,
					       u32 off);
struct sde_mdp_writeback *sde_mdp_wb_assign(u32 num, u32 reg_index);
void sde_mdp_wb_free(struct sde_mdp_writeback *wb);
struct sde_mdp_mixer *sde_mdp_mixer_assign(u32 id, bool wb);
int sde_mdp_writeback_start(struct sde_mdp_ctl *ctl);
struct sde_mdp_pipe *sde_mdp_pipe_assign(struct sde_rot_data_type *mdata,
	struct sde_mdp_mixer *mixer, u32 ndx);
int sde_mdp_pipe_destroy(struct sde_mdp_pipe *pipe);
int sde_mdp_ctl_free(struct sde_mdp_ctl *ctl);
int sde_mdp_display_commit(struct sde_mdp_ctl *ctl, void *arg,
	struct sde_mdp_commit_cb *commit_cb);
int sde_mdp_mixer_pipe_update(struct sde_mdp_pipe *pipe,
			 struct sde_mdp_mixer *mixer, int params_changed);
int sde_mdp_get_pipe_flush_bits(struct sde_mdp_pipe *pipe);
struct sde_mdp_ctl *sde_mdp_ctl_mixer_switch(struct sde_mdp_ctl *ctl,
					       u32 return_type);
struct sde_mdp_mixer *sde_mdp_mixer_get(struct sde_mdp_ctl *ctl, int mux);
#endif /* __SDE_ROTATOR_R1_INTERNAL_H__ */
