ccs-data.h 6.6 KB

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