linux/drivers/media/i2c/ccs/ccs-data.h
<<
>>
Prefs
   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
  13struct 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 */
  23struct 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 */
  37struct 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 */
  49struct 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 */
  60struct 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 */
  72struct 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 */
  84struct 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 */
 100struct 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 */
 116struct 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 */
 128struct 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 */
 140struct 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 */
 152struct 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 */
 169struct 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 */
 205struct 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
 227int 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