/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name of The Linux Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef _GCDB_DISPLAY_H_
#define _GCDB_DISPLAY_H_

/*---------------------------------------------------------------------------*/
/* HEADER files                                                              */
/*---------------------------------------------------------------------------*/
#include <debug.h>
#include "include/display_resource.h"
#include "panel_display.h"

#define REGULATOR_SIZE 28
#define PHYSICAL_SIZE 16
#define STRENGTH_SIZE 8
#define BIST_SIZE 6
#define LANE_SIZE 45

/*---------------------------------------------------------------------------*/
/* API                                                                       */
/*---------------------------------------------------------------------------*/

int target_backlight_ctrl(struct backlight *bl, uint8_t enable);
int target_panel_clock(uint8_t enable, struct msm_panel_info *pinfo);
int target_panel_reset(uint8_t enable, struct panel_reset_sequence *resetseq,
						struct msm_panel_info *pinfo);
int target_ldo_ctrl(uint8_t enable, struct msm_panel_info *pinfo);
int target_display_dsi2hdmi_config(struct msm_panel_info *pinfo);
int target_dsi_phy_config(struct mdss_dsi_phy_ctrl *phy_db);

int gcdb_display_init(const char *panel_name, uint32_t rev, void *base);
int gcdb_display_cmdline_arg(char *pbuf, uint16_t buf_size);
void gcdb_display_shutdown();
int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
	struct msm_panel_info *pinfo, struct mdss_dsi_phy_ctrl *phy_db);
void set_panel_cmd_string(const char *panel_name);
struct oem_panel_data mdss_dsi_get_oem_data(void);
struct panel_struct mdss_dsi_get_panel_data(void);

struct oem_panel_data  {
	char panel[MAX_PANEL_ID_LEN];
	bool cont_splash;
	bool skip;
};

#endif /*_GCDB_DISPLAY_H_ */
