Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
0002 /*
0003  * CCS static data in-memory data structure definitions
0004  *
0005  * Copyright 2019--2020 Intel Corporation
0006  */
0007 
0008 #ifndef __CCS_DATA_H__
0009 #define __CCS_DATA_H__
0010 
0011 #include <linux/types.h>
0012 
0013 struct device;
0014 
0015 /**
0016  * struct ccs_data_block_version - CCS static data version
0017  * @version_major: Major version number
0018  * @version_minor: Minor version number
0019  * @date_year: Year
0020  * @date_month: Month
0021  * @date_day: Day
0022  */
0023 struct ccs_data_block_version {
0024     u16 version_major;
0025     u16 version_minor;
0026     u16 date_year;
0027     u8 date_month;
0028     u8 date_day;
0029 };
0030 
0031 /**
0032  * struct ccs_reg - CCS register value
0033  * @addr: The 16-bit address of the register
0034  * @len: Length of the data
0035  * @value: Data
0036  */
0037 struct ccs_reg {
0038     u16 addr;
0039     u16 len;
0040     u8 *value;
0041 };
0042 
0043 /**
0044  * struct ccs_if_rule - CCS static data if rule
0045  * @addr: Register address
0046  * @value: Register value
0047  * @mask: Value applied to both actual register value and @value
0048  */
0049 struct ccs_if_rule {
0050     u16 addr;
0051     u8 value;
0052     u8 mask;
0053 };
0054 
0055 /**
0056  * struct ccs_frame_format_desc - CCS frame format descriptor
0057  * @pixelcode: The pixelcode; CCS_DATA_BLOCK_FFD_PIXELCODE_*
0058  * @value: Value related to the pixelcode
0059  */
0060 struct ccs_frame_format_desc {
0061     u8 pixelcode;
0062     u16 value;
0063 };
0064 
0065 /**
0066  * struct ccs_frame_format_descs - A series of CCS frame format descriptors
0067  * @num_column_descs: Number of column descriptors
0068  * @num_row_descs: Number of row descriptors
0069  * @column_descs: Column descriptors
0070  * @row_descs: Row descriptors
0071  */
0072 struct ccs_frame_format_descs {
0073     u8 num_column_descs;
0074     u8 num_row_descs;
0075     struct ccs_frame_format_desc *column_descs;
0076     struct ccs_frame_format_desc *row_descs;
0077 };
0078 
0079 /**
0080  * struct ccs_pdaf_readout - CCS PDAF data readout descriptor
0081  * @pdaf_readout_info_order: PDAF readout order
0082  * @ffd: Frame format of PDAF data
0083  */
0084 struct ccs_pdaf_readout {
0085     u8 pdaf_readout_info_order;
0086     struct ccs_frame_format_descs *ffd;
0087 };
0088 
0089 /**
0090  * struct ccs_rule - A CCS static data rule
0091  * @num_if_rules: Number of if rules
0092  * @if_rules: If rules
0093  * @num_read_only_regs: Number of read-only registers
0094  * @read_only_regs: Read-only registers
0095  * @num_manufacturer_regs: Number of manufacturer-specific registers
0096  * @manufacturer_regs: Manufacturer-specific registers
0097  * @frame_format: Frame format
0098  * @pdaf_readout: PDAF readout
0099  */
0100 struct ccs_rule {
0101     size_t num_if_rules;
0102     struct ccs_if_rule *if_rules;
0103     size_t num_read_only_regs;
0104     struct ccs_reg *read_only_regs;
0105     size_t num_manufacturer_regs;
0106     struct ccs_reg *manufacturer_regs;
0107     struct ccs_frame_format_descs *frame_format;
0108     struct ccs_pdaf_readout *pdaf_readout;
0109 };
0110 
0111 /**
0112  * struct ccs_pdaf_pix_loc_block_desc - PDAF pixel location block descriptor
0113  * @block_type_id: Block type identifier, from 0 to n
0114  * @repeat_x: Number of times this block is repeated to right
0115  */
0116 struct ccs_pdaf_pix_loc_block_desc {
0117     u8 block_type_id;
0118     u16 repeat_x;
0119 };
0120 
0121 /**
0122  * struct ccs_pdaf_pix_loc_block_desc_group - PDAF pixel location block
0123  *                        descriptor group
0124  * @repeat_y: Number of times the group is repeated down
0125  * @num_block_descs: Number of block descriptors in @block_descs
0126  * @block_descs: Block descriptors
0127  */
0128 struct ccs_pdaf_pix_loc_block_desc_group {
0129     u8 repeat_y;
0130     u16 num_block_descs;
0131     struct ccs_pdaf_pix_loc_block_desc *block_descs;
0132 };
0133 
0134 /**
0135  * struct ccs_pdaf_pix_loc_pixel_desc - PDAF pixel location block descriptor
0136  * @pixel_type: Type of the pixel; CCS_DATA_PDAF_PIXEL_TYPE_*
0137  * @small_offset_x: offset X coordinate
0138  * @small_offset_y: offset Y coordinate
0139  */
0140 struct ccs_pdaf_pix_loc_pixel_desc {
0141     u8 pixel_type;
0142     u8 small_offset_x;
0143     u8 small_offset_y;
0144 };
0145 
0146 /**
0147  * struct ccs_pdaf_pix_loc_pixel_desc_group - PDAF pixel location pixel
0148  *                        descriptor group
0149  * @num_descs: Number of descriptors in @descs
0150  * @descs: PDAF pixel location pixel descriptors
0151  */
0152 struct ccs_pdaf_pix_loc_pixel_desc_group {
0153     u8 num_descs;
0154     struct ccs_pdaf_pix_loc_pixel_desc *descs;
0155 };
0156 
0157 /**
0158  * struct ccs_pdaf_pix_loc - PDAF pixel locations
0159  * @main_offset_x: Start X coordinate of PDAF pixel blocks
0160  * @main_offset_y: Start Y coordinate of PDAF pixel blocks
0161  * @global_pdaf_type: PDAF pattern type
0162  * @block_width: Width of a block in pixels
0163  * @block_height: Heigth of a block in pixels
0164  * @num_block_desc_groups: Number of block descriptor groups
0165  * @block_desc_groups: Block descriptor groups
0166  * @num_pixel_desc_grups: Number of pixel descriptor groups
0167  * @pixel_desc_groups: Pixel descriptor groups
0168  */
0169 struct ccs_pdaf_pix_loc {
0170     u16 main_offset_x;
0171     u16 main_offset_y;
0172     u8 global_pdaf_type;
0173     u8 block_width;
0174     u8 block_height;
0175     u16 num_block_desc_groups;
0176     struct ccs_pdaf_pix_loc_block_desc_group *block_desc_groups;
0177     u8 num_pixel_desc_grups;
0178     struct ccs_pdaf_pix_loc_pixel_desc_group *pixel_desc_groups;
0179 };
0180 
0181 /**
0182  * struct ccs_data_container - In-memory CCS static data
0183  * @version: CCS static data version
0184  * @num_sensor_read_only_regs: Number of the read-only registers for the sensor
0185  * @sensor_read_only_regs: Read-only registers for the sensor
0186  * @num_sensor_manufacturer_regs: Number of the manufacturer-specific registers
0187  *                for the sensor
0188  * @sensor_manufacturer_regs: Manufacturer-specific registers for the sensor
0189  * @num_sensor_rules: Number of rules for the sensor
0190  * @sensor_rules: Rules for the sensor
0191  * @num_module_read_only_regs: Number of the read-only registers for the module
0192  * @module_read_only_regs: Read-only registers for the module
0193  * @num_module_manufacturer_regs: Number of the manufacturer-specific registers
0194  *                for the module
0195  * @module_manufacturer_regs: Manufacturer-specific registers for the module
0196  * @num_module_rules: Number of rules for the module
0197  * @module_rules: Rules for the module
0198  * @sensor_pdaf: PDAF data for the sensor
0199  * @module_pdaf: PDAF data for the module
0200  * @license_length: Lenght of the license data
0201  * @license: License data
0202  * @end: Whether or not there's an end block
0203  * @backing: Raw data, pointed to from elsewhere so keep it around
0204  */
0205 struct ccs_data_container {
0206     struct ccs_data_block_version *version;
0207     size_t num_sensor_read_only_regs;
0208     struct ccs_reg *sensor_read_only_regs;
0209     size_t num_sensor_manufacturer_regs;
0210     struct ccs_reg *sensor_manufacturer_regs;
0211     size_t num_sensor_rules;
0212     struct ccs_rule *sensor_rules;
0213     size_t num_module_read_only_regs;
0214     struct ccs_reg *module_read_only_regs;
0215     size_t num_module_manufacturer_regs;
0216     struct ccs_reg *module_manufacturer_regs;
0217     size_t num_module_rules;
0218     struct ccs_rule *module_rules;
0219     struct ccs_pdaf_pix_loc *sensor_pdaf;
0220     struct ccs_pdaf_pix_loc *module_pdaf;
0221     size_t license_length;
0222     char *license;
0223     bool end;
0224     void *backing;
0225 };
0226 
0227 int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
0228            size_t len, struct device *dev, bool verbose);
0229 
0230 #endif /* __CCS_DATA_H__ */