/*
 * include/amlogic/aml_bl_extern.h
 *
 * 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 named License,
 * or 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.
 *
 */

#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,
};

enum bl_extern_i2c_bus_e {
	BL_EXTERN_I2C_BUS_AO = 0,
	BL_EXTERN_I2C_BUS_A,
	BL_EXTERN_I2C_BUS_B,
	BL_EXTERN_I2C_BUS_C,
	BL_EXTERN_I2C_BUS_D,
	BL_EXTERN_I2C_BUS_MAX,
};
#define BL_EXTERN_I2C_BUS_INVALID   0xff

#define BL_EXTERN_SPI_CLK_FREQ_DFT  10000 /* default 10k */

#define BL_EXTERN_INIT_TABLE_MAX    500

#define BL_EXTERN_INIT_CMD          0x00
#define BL_EXTERN_INIT_NONE         0xf0
#define BL_EXTERN_INIT_END          0xff

#define BL_EXTERN_DYNAMIC_LEN		0xff

#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;
};

/* 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(char *dtaddr, 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

