1 | /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ |
2 | /* |
3 | * CCS static data in-memory data structure definitions |
4 | * |
5 | * Copyright 2019--2020 Intel Corporation |
6 | */ |
7 | |
8 | #ifndef __CCS_DATA_H__ |
9 | #define __CCS_DATA_H__ |
10 | |
11 | #include <linux/types.h> |
12 | |
13 | struct device; |
14 | |
15 | /** |
16 | * struct ccs_data_block_version - CCS static data version |
17 | * @version_major: Major version number |
18 | * @version_minor: Minor version number |
19 | * @date_year: Year |
20 | * @date_month: Month |
21 | * @date_day: Day |
22 | */ |
23 | struct ccs_data_block_version { |
24 | u16 version_major; |
25 | u16 version_minor; |
26 | u16 date_year; |
27 | u8 date_month; |
28 | u8 date_day; |
29 | }; |
30 | |
31 | /** |
32 | * struct ccs_reg - CCS register value |
33 | * @addr: The 16-bit address of the register |
34 | * @len: Length of the data |
35 | * @value: Data |
36 | */ |
37 | struct ccs_reg { |
38 | u16 addr; |
39 | u16 len; |
40 | u8 *value; |
41 | }; |
42 | |
43 | /** |
44 | * struct ccs_if_rule - CCS static data if rule |
45 | * @addr: Register address |
46 | * @value: Register value |
47 | * @mask: Value applied to both actual register value and @value |
48 | */ |
49 | struct ccs_if_rule { |
50 | u16 addr; |
51 | u8 value; |
52 | u8 mask; |
53 | }; |
54 | |
55 | /** |
56 | * struct ccs_frame_format_desc - CCS frame format descriptor |
57 | * @pixelcode: The pixelcode; CCS_DATA_BLOCK_FFD_PIXELCODE_* |
58 | * @value: Value related to the pixelcode |
59 | */ |
60 | struct ccs_frame_format_desc { |
61 | u8 pixelcode; |
62 | u16 value; |
63 | }; |
64 | |
65 | /** |
66 | * struct ccs_frame_format_descs - A series of CCS frame format descriptors |
67 | * @num_column_descs: Number of column descriptors |
68 | * @num_row_descs: Number of row descriptors |
69 | * @column_descs: Column descriptors |
70 | * @row_descs: Row descriptors |
71 | */ |
72 | struct ccs_frame_format_descs { |
73 | u8 num_column_descs; |
74 | u8 num_row_descs; |
75 | struct ccs_frame_format_desc *column_descs; |
76 | struct ccs_frame_format_desc *row_descs; |
77 | }; |
78 | |
79 | /** |
80 | * struct ccs_pdaf_readout - CCS PDAF data readout descriptor |
81 | * @pdaf_readout_info_order: PDAF readout order |
82 | * @ffd: Frame format of PDAF data |
83 | */ |
84 | struct ccs_pdaf_readout { |
85 | u8 pdaf_readout_info_order; |
86 | struct ccs_frame_format_descs *ffd; |
87 | }; |
88 | |
89 | /** |
90 | * struct ccs_rule - A CCS static data rule |
91 | * @num_if_rules: Number of if rules |
92 | * @if_rules: If rules |
93 | * @num_read_only_regs: Number of read-only registers |
94 | * @read_only_regs: Read-only registers |
95 | * @num_manufacturer_regs: Number of manufacturer-specific registers |
96 | * @manufacturer_regs: Manufacturer-specific registers |
97 | * @frame_format: Frame format |
98 | * @pdaf_readout: PDAF readout |
99 | */ |
100 | struct ccs_rule { |
101 | size_t num_if_rules; |
102 | struct ccs_if_rule *if_rules; |
103 | size_t num_read_only_regs; |
104 | struct ccs_reg *read_only_regs; |
105 | size_t num_manufacturer_regs; |
106 | struct ccs_reg *manufacturer_regs; |
107 | struct ccs_frame_format_descs *frame_format; |
108 | struct ccs_pdaf_readout *pdaf_readout; |
109 | }; |
110 | |
111 | /** |
112 | * struct ccs_pdaf_pix_loc_block_desc - PDAF pixel location block descriptor |
113 | * @block_type_id: Block type identifier, from 0 to n |
114 | * @repeat_x: Number of times this block is repeated to right |
115 | */ |
116 | struct ccs_pdaf_pix_loc_block_desc { |
117 | u8 block_type_id; |
118 | u16 repeat_x; |
119 | }; |
120 | |
121 | /** |
122 | * struct ccs_pdaf_pix_loc_block_desc_group - PDAF pixel location block |
123 | * descriptor group |
124 | * @repeat_y: Number of times the group is repeated down |
125 | * @num_block_descs: Number of block descriptors in @block_descs |
126 | * @block_descs: Block descriptors |
127 | */ |
128 | struct ccs_pdaf_pix_loc_block_desc_group { |
129 | u8 repeat_y; |
130 | u16 num_block_descs; |
131 | struct ccs_pdaf_pix_loc_block_desc *block_descs; |
132 | }; |
133 | |
134 | /** |
135 | * struct ccs_pdaf_pix_loc_pixel_desc - PDAF pixel location block descriptor |
136 | * @pixel_type: Type of the pixel; CCS_DATA_PDAF_PIXEL_TYPE_* |
137 | * @small_offset_x: offset X coordinate |
138 | * @small_offset_y: offset Y coordinate |
139 | */ |
140 | struct ccs_pdaf_pix_loc_pixel_desc { |
141 | u8 pixel_type; |
142 | u8 small_offset_x; |
143 | u8 small_offset_y; |
144 | }; |
145 | |
146 | /** |
147 | * struct ccs_pdaf_pix_loc_pixel_desc_group - PDAF pixel location pixel |
148 | * descriptor group |
149 | * @num_descs: Number of descriptors in @descs |
150 | * @descs: PDAF pixel location pixel descriptors |
151 | */ |
152 | struct ccs_pdaf_pix_loc_pixel_desc_group { |
153 | u8 num_descs; |
154 | struct ccs_pdaf_pix_loc_pixel_desc *descs; |
155 | }; |
156 | |
157 | /** |
158 | * struct ccs_pdaf_pix_loc - PDAF pixel locations |
159 | * @main_offset_x: Start X coordinate of PDAF pixel blocks |
160 | * @main_offset_y: Start Y coordinate of PDAF pixel blocks |
161 | * @global_pdaf_type: PDAF pattern type |
162 | * @block_width: Width of a block in pixels |
163 | * @block_height: Heigth of a block in pixels |
164 | * @num_block_desc_groups: Number of block descriptor groups |
165 | * @block_desc_groups: Block descriptor groups |
166 | * @num_pixel_desc_grups: Number of pixel descriptor groups |
167 | * @pixel_desc_groups: Pixel descriptor groups |
168 | */ |
169 | struct ccs_pdaf_pix_loc { |
170 | u16 main_offset_x; |
171 | u16 main_offset_y; |
172 | u8 global_pdaf_type; |
173 | u8 block_width; |
174 | u8 block_height; |
175 | u16 num_block_desc_groups; |
176 | struct ccs_pdaf_pix_loc_block_desc_group *block_desc_groups; |
177 | u8 num_pixel_desc_grups; |
178 | struct ccs_pdaf_pix_loc_pixel_desc_group *pixel_desc_groups; |
179 | }; |
180 | |
181 | /** |
182 | * struct ccs_data_container - In-memory CCS static data |
183 | * @version: CCS static data version |
184 | * @num_sensor_read_only_regs: Number of the read-only registers for the sensor |
185 | * @sensor_read_only_regs: Read-only registers for the sensor |
186 | * @num_sensor_manufacturer_regs: Number of the manufacturer-specific registers |
187 | * for the sensor |
188 | * @sensor_manufacturer_regs: Manufacturer-specific registers for the sensor |
189 | * @num_sensor_rules: Number of rules for the sensor |
190 | * @sensor_rules: Rules for the sensor |
191 | * @num_module_read_only_regs: Number of the read-only registers for the module |
192 | * @module_read_only_regs: Read-only registers for the module |
193 | * @num_module_manufacturer_regs: Number of the manufacturer-specific registers |
194 | * for the module |
195 | * @module_manufacturer_regs: Manufacturer-specific registers for the module |
196 | * @num_module_rules: Number of rules for the module |
197 | * @module_rules: Rules for the module |
198 | * @sensor_pdaf: PDAF data for the sensor |
199 | * @module_pdaf: PDAF data for the module |
200 | * @license_length: Lenght of the license data |
201 | * @license: License data |
202 | * @end: Whether or not there's an end block |
203 | * @backing: Raw data, pointed to from elsewhere so keep it around |
204 | */ |
205 | struct ccs_data_container { |
206 | struct ccs_data_block_version *version; |
207 | size_t num_sensor_read_only_regs; |
208 | struct ccs_reg *sensor_read_only_regs; |
209 | size_t num_sensor_manufacturer_regs; |
210 | struct ccs_reg *sensor_manufacturer_regs; |
211 | size_t num_sensor_rules; |
212 | struct ccs_rule *sensor_rules; |
213 | size_t num_module_read_only_regs; |
214 | struct ccs_reg *module_read_only_regs; |
215 | size_t num_module_manufacturer_regs; |
216 | struct ccs_reg *module_manufacturer_regs; |
217 | size_t num_module_rules; |
218 | struct ccs_rule *module_rules; |
219 | struct ccs_pdaf_pix_loc *sensor_pdaf; |
220 | struct ccs_pdaf_pix_loc *module_pdaf; |
221 | size_t license_length; |
222 | char *license; |
223 | bool end; |
224 | void *backing; |
225 | }; |
226 | |
227 | int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data, |
228 | size_t len, struct device *dev, bool verbose); |
229 | |
230 | #endif /* __CCS_DATA_H__ */ |
231 | |