/*
 * include/amlogicmedia/vout/lcd/bl_extern.h
 *
 * Copyright (C) 2015 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.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef _INC_AML_BL_EXTERN_H_
#define _INC_AML_BL_EXTERN_H_

enum bl_extern_type_e {
	BL_EXTERN_I2C = 0,
	BL_EXTERN_SPI,
	BL_EXTERN_MIPI,
	BL_EXTERN_MAX,
};

#define BL_EXTERN_I2C_BUS_A          0
#define BL_EXTERN_I2C_BUS_B          1
#define BL_EXTERN_I2C_BUS_C          2
#define BL_EXTERN_I2C_BUS_D          3
#define BL_EXTERN_I2C_BUS_AO         4

#define BL_EXTERN_I2C_BUS_0          BL_EXTERN_I2C_BUS_A
#define BL_EXTERN_I2C_BUS_1          BL_EXTERN_I2C_BUS_B
#define BL_EXTERN_I2C_BUS_2          BL_EXTERN_I2C_BUS_C
#define BL_EXTERN_I2C_BUS_3          BL_EXTERN_I2C_BUS_D
#define BL_EXTERN_I2C_BUS_4          BL_EXTERN_I2C_BUS_AO
#define BL_EXTERN_I2C_BUS_MAX        5

#define BL_EXTERN_INIT_ON_MAX       200
#define BL_EXTERN_INIT_OFF_MAX      50

#define BL_EXTERN_GPIO_NUM_MAX      6
#define BL_EXTERN_INDEX_INVALID     0xff
#define BL_EXTERN_NAME_LEN_MAX      30
struct bl_extern_config_s {
	unsigned char index;
	char name[BL_EXTERN_NAME_LEN_MAX];
	enum bl_extern_type_e type;
	unsigned char i2c_addr;
	unsigned char i2c_bus;
	unsigned int dim_min;
	unsigned int dim_max;

	unsigned char init_loaded;
	unsigned char cmd_size;
	unsigned char *init_on;
	unsigned char *init_off;
	unsigned int init_on_cnt;
	unsigned int init_off_cnt;
};

/* global API */
#define BL_EXT_DRIVER_MAX    10
struct aml_bl_extern_driver_s {
	int (*power_on)(void);
	int (*power_off)(void);
	int (*set_level)(unsigned int level);
	void (*config_print)(void);
	int (*device_power_on)(void);
	int (*device_power_off)(void);
	int (*device_bri_update)(unsigned int level);
	struct bl_extern_config_s *config;
};

extern struct aml_bl_extern_driver_s *aml_bl_extern_get_driver(void);
extern int aml_bl_extern_device_load(const void *dt_blob, int index);
extern struct bl_extern_config_s bl_extern_config_dtf;
#ifdef CONFIG_AML_LCD_TABLET
extern int dsi_write_cmd(unsigned char *payload);
#endif

#endif

