#ifndef _MDSS_ROTATOR_H_
#define _MDSS_ROTATOR_H_

#include <linux/msm_mdp_ext.h>

#define MDSS_ROTATOR_IOCTL_MAGIC 'w'

/* open a rotation session */
#define MDSS_ROTATION_OPEN \
	_IOWR(MDSS_ROTATOR_IOCTL_MAGIC, 1, struct mdp_rotation_config *)

/* change the rotation session configuration */
#define MDSS_ROTATION_CONFIG \
	_IOWR(MDSS_ROTATOR_IOCTL_MAGIC, 2, struct mdp_rotation_config *)

/* queue the rotation request */
#define MDSS_ROTATION_REQUEST \
	_IOWR(MDSS_ROTATOR_IOCTL_MAGIC, 3, struct mdp_rotation_request *)

/* close a rotation session with the specified rotation session ID */
#define MDSS_ROTATION_CLOSE	_IOW(MDSS_ROTATOR_IOCTL_MAGIC, 4, unsigned int)

/*
 * Rotation request flag
 */
/* no rotation flag, i.e. color space conversion */
#define MDP_ROTATION_NOP	0x01

/* left/right flip */
#define MDP_ROTATION_FLIP_LR	0x02

/* up/down flip */
#define MDP_ROTATION_FLIP_UD	0x04

/* rotate 90 degree */
#define MDP_ROTATION_90		0x08

/* rotate 180 degre */
#define MDP_ROTATION_180	(MDP_ROTATION_FLIP_LR | MDP_ROTATION_FLIP_UD)

/* rotate 270 degree */
#define MDP_ROTATION_270	(MDP_ROTATION_90 | MDP_ROTATION_180)

/* format is interlaced */
#define MDP_ROTATION_DEINTERLACE 0x10

/* enable bwc */
#define MDP_ROTATION_BWC_EN	0x40

/* secure data */
#define MDP_ROTATION_SECURE	0x80

/*
 * Rotation commit flag
 */
/* Flag indicates to validate the rotation request */
#define MDSS_ROTATION_REQUEST_VALIDATE	0x01

#define MDP_ROTATION_REQUEST_VERSION_1_0	0x00010000

/*
 * Client can let driver to allocate the hardware resources with
 * this particular hw resource id.
 */
#define MDSS_ROTATION_HW_ANY	0xFFFFFFFF

/*
 * Configuration Structures
 */
struct mdp_rotation_buf_info {
	uint32_t width;
	uint32_t height;
	uint32_t format;
	struct mult_factor comp_ratio;
};

struct mdp_rotation_config {
	uint32_t	version;
	uint32_t	session_id;
	struct mdp_rotation_buf_info	input;
	struct mdp_rotation_buf_info	output;
	uint32_t	frame_rate;
	uint32_t	flags;
	uint32_t	reserved[6];
};

struct mdp_rotation_item {
	/* rotation request flag */
	uint32_t	flags;

	/* Source crop rectangle */
	struct mdp_rect	src_rect;

	/* Destination rectangle */
	struct mdp_rect	dst_rect;

	/* Input buffer for the request */
	struct mdp_layer_buffer	input;

	/* The output buffer for the request */
	struct mdp_layer_buffer	output;

	/*
	 * DMA pipe selection for this request by client:
	 * 0: DMA pipe 0
	 * 1: DMA pipe 1
	 * or MDSS_ROTATION_HW_ANY if client wants
	 * driver to allocate any that is available
	 */
	uint32_t	pipe_idx;

	/*
	 * Write-back block selection for this request by client:
	 * 0: Write-back block 0
	 * 1: Write-back block 1
	 * or MDSS_ROTATION_HW_ANY if client wants
	 * driver to allocate any that is available
	 */
	uint32_t	wb_idx;

	/* Which session ID is this request scheduled on */
	uint32_t	session_id;

	/* 32bits reserved value for future usage */
	uint32_t	reserved[6];
};

struct mdp_rotation_request {
	/* 32bit version indicates the request structure */
	uint32_t	version;

	uint32_t	flags;

	/* Number of rotation request items in the list */
	uint32_t	count;

	/* Pointer to a list of rotation request items */
	struct mdp_rotation_item *list;

	/* 32bits reserved value for future usage*/
	uint32_t	reserved[6];
};

#endif /* _MDSS_ROTATOR_H_*/