blob: c4b807af1c4775eead80eaca60aed0e819233669 [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef INC_AML_LCD_TCON_DATA_H
#define INC_AML_LCD_TCON_DATA_H
/* for data block header flag */
#define LCD_TCON_DATA_VALID_VAC BIT(0)
#define LCD_TCON_DATA_VALID_DEMURA BIT(1)
#define LCD_TCON_DATA_VALID_ACC BIT(2)
#define LCD_TCON_DATA_VALID_DITHER BIT(3)
#define LCD_TCON_DATA_VALID_OD BIT(4)
#define LCD_TCON_DATA_VALID_LOD BIT(5)
/* for tconless data format */
/* for tconless data block type */
#define LCD_TCON_DATA_BLOCK_TYPE_NONE 0x00
#define LCD_TCON_DATA_BLOCK_TYPE_DEMURA_SET 0x01
#define LCD_TCON_DATA_BLOCK_TYPE_DEMURA_LUT 0x02
#define LCD_TCON_DATA_BLOCK_TYPE_ACC_LUT 0x03
#define LCD_TCON_DATA_BLOCK_TYPE_DITHER_LUT 0x04
#define LCD_TCON_DATA_BLOCK_TYPE_OD_LUT 0x05
#define LCD_TCON_DATA_BLOCK_TYPE_LOD_LUT 0x06
#define LCD_TCON_DATA_BLOCK_TYPE_VAC 0x11
#define LCD_TCON_DATA_BLOCK_TYPE_EXT 0xe0 /* pmu */
#define LCD_TCON_DATA_BLOCK_TYPE_MAX 0xff
/* for tconless data block part type */
#define LCD_TCON_DATA_PART_TYPE_WR_N 0xd0
#define LCD_TCON_DATA_PART_TYPE_WR_DDR 0xdd
#define LCD_TCON_DATA_PART_TYPE_WR_MASK 0xb0
#define LCD_TCON_DATA_PART_TYPE_RD_MASK 0xab
#define LCD_TCON_DATA_PART_TYPE_CHK_WR_MASK 0xcb
#define LCD_TCON_DATA_PART_TYPE_CHK_EXIT 0xce
#define LCD_TCON_DATA_PART_TYPE_PARAM 0xf0 /* only for tool */
#define LCD_TCON_DATA_PART_TYPE_DELAY 0xfd
#define LCD_TCON_DATA_PART_FLAG_TUNINTG_LUT 0x00
#define LCD_TCON_DATA_PART_FLAG_FIXED_LUT 0x10
#define LCD_TCON_DATA_PART_FLAG_TUNINTG_REG 0x01
#define LCD_TCON_DATA_PART_FLAG_FIXED_REG 0x11
#define LCD_TCON_DATA_PART_FLAG_TUNINTG_PARAM 0x0f
#define LCD_TCON_DATA_PART_FLAG_FIXED_PARAM 0x1f
#define LCD_TCON_DATA_BLOCK_HEADER_SIZE 64
#define LCD_TCON_DATA_BLOCK_NAME_SIZE 36
#define LCD_TCON_DATA_PART_NAME_SIZE 48
struct lcd_tcon_init_block_header_s {
unsigned int crc32;
unsigned int reserved;
unsigned int block_size;
unsigned short header_size;
unsigned short reserved1;
unsigned int block_type;
unsigned char reserved2[5];
unsigned char data_byte_width;
unsigned short chipid;
unsigned char name[LCD_TCON_DATA_BLOCK_NAME_SIZE];
};
struct lcd_tcon_data_block_header_s {
unsigned int crc32;
unsigned int raw_data_check;/* crc */
unsigned int block_size;
unsigned short header_size;
unsigned short ext_header_size;
unsigned int block_type;
unsigned int block_flag;
unsigned short init_priority; /*invalid*/
unsigned short chipid;
unsigned char name[LCD_TCON_DATA_BLOCK_NAME_SIZE];
};
struct lcd_tcon_data_block_ext_header_s {
unsigned short part_cnt;
unsigned char part_mapping_byte;
unsigned char reserved[13];
};
#define LCD_TCON_DATA_PART_WR_N_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 12)
struct lcd_tcon_data_part_wr_n_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned char reg_addr_byte;
unsigned char reg_data_byte;
unsigned char reg_inc;
unsigned char reg_cnt;
unsigned int data_cnt;
};
#define LCD_TCON_DATA_PART_WR_DDR_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 12)
struct lcd_tcon_data_part_wr_ddr_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned short axi_buf_id;
unsigned short data_byte;
unsigned int data_cnt;
};
#define LCD_TCON_DATA_PART_WR_MASK_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 6)
struct lcd_tcon_data_part_wr_mask_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned char reg_addr_byte;
unsigned char reg_data_byte;
};
#define LCD_TCON_DATA_PART_RD_MASK_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 6)
struct lcd_tcon_data_part_rd_mask_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned char reg_addr_byte;
unsigned char reg_data_byte;
};
#define LCD_TCON_DATA_PART_CHK_WR_MASK_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 9)
struct lcd_tcon_data_part_chk_wr_mask_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned char reg_chk_addr_byte;
unsigned char reg_chk_data_byte;
unsigned char reg_wr_addr_byte;
unsigned char reg_wr_data_byte;
unsigned char data_chk_cnt;
};
#define LCD_TCON_DATA_PART_CHK_EXIT_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 6)
struct lcd_tcon_data_part_chk_exit_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned char reg_addr_byte;
unsigned char reg_data_byte;
};
#define LCD_TCON_DATA_PART_DELAY_SIZE (LCD_TCON_DATA_PART_NAME_SIZE + 8)
struct lcd_tcon_data_part_delay_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned int delay_us;
};
#define LCD_TCON_DATA_PART_PARAM_SIZE_PRE (LCD_TCON_DATA_PART_NAME_SIZE + 8)
struct lcd_tcon_data_part_param_s {
char name[LCD_TCON_DATA_PART_NAME_SIZE];
unsigned short part_id;
unsigned char tuning_flag;
unsigned char part_type;
unsigned int param_size;
};
union lcd_tcon_data_part_u {
struct lcd_tcon_data_part_wr_n_s *wr_n;
struct lcd_tcon_data_part_wr_ddr_s *wr_ddr;
struct lcd_tcon_data_part_wr_mask_s *wr_mask;
struct lcd_tcon_data_part_rd_mask_s *rd_mask;
struct lcd_tcon_data_part_chk_wr_mask_s *chk_wr_mask;
struct lcd_tcon_data_part_chk_exit_s *chk_exit;
struct lcd_tcon_data_part_delay_s *delay;
struct lcd_tcon_data_part_param_s *param;
};
#define LCD_UKEY_TCON_SPI_BLOCK_SIZE_PRE 20
struct lcd_tcon_spi_block_s {
unsigned short data_type;
unsigned short data_index; /* tcon_data_index, equal to init priority */
unsigned int data_flag;
unsigned int spi_offset;
unsigned int spi_size;
unsigned int param_cnt;
unsigned int data_raw_check; //crc...
unsigned int data_temp_size;
unsigned int data_new_size;
unsigned int *param;
unsigned char *raw_buf;
unsigned char *temp_buf;
unsigned char *new_buf;
};
struct lcd_tcon_spi_s {
unsigned short version;
unsigned int block_cnt;
unsigned int init_flag;
struct lcd_tcon_spi_block_s **spi_block;
unsigned char *ext_buf;
unsigned int ext_init_on_cnt;
unsigned int ext_init_off_cnt;
int (*data_read)(struct lcd_tcon_spi_block_s *spi_block);
int (*data_conv)(struct lcd_tcon_spi_block_s *spi_block);
};
struct lcd_tcon_spi_s *lcd_tcon_spi_get(void);
unsigned int lcd_tcon_data_size_align(unsigned int size);
unsigned char lcd_tcon_checksum(unsigned char *buf, unsigned int len);
unsigned char lcd_tcon_lrc(unsigned char *buf, unsigned int len);
#endif /* INC_AML_LCD_VOUT_H */