2020-02-14 10:00:35 +01:00
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/*
* CCS static data in - memory data structure definitions
*
* Copyright 2019 - - 2020 Intel Corporation
*/
# ifndef __CCS_DATA_H__
# define __CCS_DATA_H__
# include <linux/types.h>
2020-12-11 12:30:09 +01:00
struct device ;
2020-02-14 10:00:35 +01:00
/**
* struct ccs_data_block_version - CCS static data version
* @ version_major : Major version number
* @ version_minor : Minor version number
* @ date_year : Year
* @ date_month : Month
* @ date_day : Day
*/
struct ccs_data_block_version {
u16 version_major ;
u16 version_minor ;
u16 date_year ;
u8 date_month ;
u8 date_day ;
} ;
/**
* struct ccs_reg - CCS register value
* @ addr : The 16 - bit address of the register
* @ len : Length of the data
* @ value : Data
*/
struct ccs_reg {
u16 addr ;
u16 len ;
u8 * value ;
} ;
/**
* struct ccs_if_rule - CCS static data if rule
* @ addr : Register address
* @ value : Register value
* @ mask : Value applied to both actual register value and @ value
*/
struct ccs_if_rule {
u16 addr ;
u8 value ;
u8 mask ;
} ;
/**
* struct ccs_frame_format_desc - CCS frame format descriptor
* @ pixelcode : The pixelcode ; CCS_DATA_BLOCK_FFD_PIXELCODE_ *
* @ value : Value related to the pixelcode
*/
struct ccs_frame_format_desc {
u8 pixelcode ;
u16 value ;
} ;
/**
* struct ccs_frame_format_descs - A series of CCS frame format descriptors
* @ num_column_descs : Number of column descriptors
* @ num_row_descs : Number of row descriptors
* @ column_descs : Column descriptors
* @ row_descs : Row descriptors
*/
struct ccs_frame_format_descs {
u8 num_column_descs ;
u8 num_row_descs ;
struct ccs_frame_format_desc * column_descs ;
struct ccs_frame_format_desc * row_descs ;
} ;
/**
* struct ccs_pdaf_readout - CCS PDAF data readout descriptor
* @ pdaf_readout_info_order : PDAF readout order
* @ ffd : Frame format of PDAF data
*/
struct ccs_pdaf_readout {
u8 pdaf_readout_info_order ;
struct ccs_frame_format_descs * ffd ;
} ;
/**
* struct ccs_rule - A CCS static data rule
* @ num_if_rules : Number of if rules
* @ if_rules : If rules
* @ num_read_only_regs : Number of read - only registers
* @ read_only_regs : Read - only registers
* @ num_manufacturer_regs : Number of manufacturer - specific registers
* @ manufacturer_regs : Manufacturer - specific registers
* @ frame_format : Frame format
* @ pdaf_readout : PDAF readout
*/
struct ccs_rule {
size_t num_if_rules ;
struct ccs_if_rule * if_rules ;
size_t num_read_only_regs ;
struct ccs_reg * read_only_regs ;
size_t num_manufacturer_regs ;
struct ccs_reg * manufacturer_regs ;
struct ccs_frame_format_descs * frame_format ;
struct ccs_pdaf_readout * pdaf_readout ;
} ;
/**
* struct ccs_pdaf_pix_loc_block_desc - PDAF pixel location block descriptor
* @ block_type_id : Block type identifier , from 0 to n
* @ repeat_x : Number of times this block is repeated to right
*/
struct ccs_pdaf_pix_loc_block_desc {
u8 block_type_id ;
u16 repeat_x ;
} ;
/**
* struct ccs_pdaf_pix_loc_block_desc_group - PDAF pixel location block
* descriptor group
* @ repeat_y : Number of times the group is repeated down
* @ num_block_descs : Number of block descriptors in @ block_descs
* @ block_descs : Block descriptors
*/
struct ccs_pdaf_pix_loc_block_desc_group {
u8 repeat_y ;
u16 num_block_descs ;
struct ccs_pdaf_pix_loc_block_desc * block_descs ;
} ;
/**
2021-03-09 14:00:44 +01:00
* struct ccs_pdaf_pix_loc_pixel_desc - PDAF pixel location block descriptor
2020-02-14 10:00:35 +01:00
* @ pixel_type : Type of the pixel ; CCS_DATA_PDAF_PIXEL_TYPE_ *
* @ small_offset_x : offset X coordinate
* @ small_offset_y : offset Y coordinate
*/
struct ccs_pdaf_pix_loc_pixel_desc {
u8 pixel_type ;
u8 small_offset_x ;
u8 small_offset_y ;
} ;
/**
* struct ccs_pdaf_pix_loc_pixel_desc_group - PDAF pixel location pixel
* descriptor group
* @ num_descs : Number of descriptors in @ descs
* @ descs : PDAF pixel location pixel descriptors
*/
struct ccs_pdaf_pix_loc_pixel_desc_group {
u8 num_descs ;
struct ccs_pdaf_pix_loc_pixel_desc * descs ;
} ;
/**
* struct ccs_pdaf_pix_loc - PDAF pixel locations
* @ main_offset_x : Start X coordinate of PDAF pixel blocks
* @ main_offset_y : Start Y coordinate of PDAF pixel blocks
* @ global_pdaf_type : PDAF pattern type
* @ block_width : Width of a block in pixels
* @ block_height : Heigth of a block in pixels
* @ num_block_desc_groups : Number of block descriptor groups
* @ block_desc_groups : Block descriptor groups
* @ num_pixel_desc_grups : Number of pixel descriptor groups
* @ pixel_desc_groups : Pixel descriptor groups
*/
struct ccs_pdaf_pix_loc {
u16 main_offset_x ;
u16 main_offset_y ;
u8 global_pdaf_type ;
u8 block_width ;
u8 block_height ;
u16 num_block_desc_groups ;
struct ccs_pdaf_pix_loc_block_desc_group * block_desc_groups ;
u8 num_pixel_desc_grups ;
struct ccs_pdaf_pix_loc_pixel_desc_group * pixel_desc_groups ;
} ;
/**
* struct ccs_data_container - In - memory CCS static data
* @ version : CCS static data version
* @ num_sensor_read_only_regs : Number of the read - only registers for the sensor
* @ sensor_read_only_regs : Read - only registers for the sensor
* @ num_sensor_manufacturer_regs : Number of the manufacturer - specific registers
* for the sensor
* @ sensor_manufacturer_regs : Manufacturer - specific registers for the sensor
* @ num_sensor_rules : Number of rules for the sensor
* @ sensor_rules : Rules for the sensor
* @ num_module_read_only_regs : Number of the read - only registers for the module
* @ module_read_only_regs : Read - only registers for the module
* @ num_module_manufacturer_regs : Number of the manufacturer - specific registers
* for the module
* @ module_manufacturer_regs : Manufacturer - specific registers for the module
* @ num_module_rules : Number of rules for the module
* @ module_rules : Rules for the module
* @ sensor_pdaf : PDAF data for the sensor
* @ module_pdaf : PDAF data for the module
* @ license_length : Lenght of the license data
* @ license : License data
* @ end : Whether or not there ' s an end block
* @ backing : Raw data , pointed to from elsewhere so keep it around
*/
struct ccs_data_container {
struct ccs_data_block_version * version ;
size_t num_sensor_read_only_regs ;
struct ccs_reg * sensor_read_only_regs ;
size_t num_sensor_manufacturer_regs ;
struct ccs_reg * sensor_manufacturer_regs ;
size_t num_sensor_rules ;
struct ccs_rule * sensor_rules ;
size_t num_module_read_only_regs ;
struct ccs_reg * module_read_only_regs ;
size_t num_module_manufacturer_regs ;
struct ccs_reg * module_manufacturer_regs ;
size_t num_module_rules ;
struct ccs_rule * module_rules ;
struct ccs_pdaf_pix_loc * sensor_pdaf ;
struct ccs_pdaf_pix_loc * module_pdaf ;
size_t license_length ;
char * license ;
bool end ;
void * backing ;
} ;
int ccs_data_parse ( struct ccs_data_container * ccsdata , const void * data ,
size_t len , struct device * dev , bool verbose ) ;
# endif /* __CCS_DATA_H__ */