/* 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>

/**
 * 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;
};

/**
 * struct ccs_pdaf_pix_loc_block_desc - PDAF pixel location block descriptor
 * @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__ */
