Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 426ec66c authored by Viswanadha Raju Thotakura's avatar Viswanadha Raju Thotakura
Browse files

msm: camera: Add common sensor functionality



Add utilities and common functionalities for
camera sensor and its associated modules.

CRs-Fixed: 2015567
Change-Id: If2547f6272a1c4c3b87ad8760f82a8778defca40
Signed-off-by: default avatarViswanadha Raju Thotakura <viswanad@codeaurora.org>
parent ff3d7de3
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -165,6 +165,15 @@ Optional properties:
  should contain phandle of respective ir-cut node
- qcom,special-support-sensors: if only some special sensors are supported
  on this board, add sensor name in this property.
- qcom,clock-rates: clock rate in Hz.
- qcom,clock-cntl-support: Says whether clock control support is present or not
- qcom,clock-control: The valid fields are "NO_SET_RATE", "INIT_RATE" and
  "SET_RATE". "NO_SET_RATE" the corresponding clock is enabled without setting
  the rate assuming some other driver has already set it to appropriate rate.
  "INIT_RATE" clock rate is not queried assuming some other driver has set
  the clock rate and ispif will set the the clock to this rate.
  "SET_RATE" clock is enabled and the rate is set to the value specified
  in the property qcom,clock-rates.

* Qualcomm Technologies, Inc. MSM ACTUATOR

@@ -205,6 +214,7 @@ Required properties:
  sensor
  - 0 -> MASTER 0
  - 1 -> MASTER 1
- qcom,clock-rates: clock rate in Hz.

Optional properties:
- qcom,cam-vreg-name : should contain names of all regulators needed by this
+1 −0
Original line number Diff line number Diff line
@@ -6,3 +6,4 @@ obj-$(CONFIG_SPECTRA_CAMERA) += cam_smmu/
obj-$(CONFIG_SPECTRA_CAMERA) += cam_cpas/
obj-$(CONFIG_SPECTRA_CAMERA) += cam_cdm/
obj-$(CONFIG_SPECTRA_CAMERA) += cam_isp/
obj-$(CONFIG_SPECTRA_CAMERA) += cam_sensor_module/
+1 −0
Original line number Diff line number Diff line
obj-$(CONFIG_SPECTRA_CAMERA) += cam_sensor_utils/
+6 −0
Original line number Diff line number Diff line
ccflags-y += -Idrivers/media/platform/msm/camera/cam_req_mgr
ccflags-y += -Idrivers/media/platform/msm/camera/cam_utils
ccflags-y += -Idrivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_io
ccflags-y += -Idrivers/media/platform/msm/camera/cam_sensor_module/cam_cci

obj-$(CONFIG_SPECTRA_CAMERA) +=  cam_sensor_util.o cam_sensor_soc_api.o
 No newline at end of file
+375 −0
Original line number Diff line number Diff line
/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef _CAM_SENSOR_CMN_HEADER_
#define _CAM_SENSOR_CMN_HEADER_

#include <linux/i2c.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <media/cam_sensor.h>
#include <media/cam_req_mgr.h>

#define MAX_REGULATOR 5
#define MAX_POWER_CONFIG 12

#define MAX_PER_FRAME_ARRAY 8

#define CAM_SENSOR_NAME    "cam-sensor"
#define CAM_ACTUATOR_NAME  "cam-actuator"
#define CAM_CSIPHY_NAME    "cam-csiphy"

#define MAX_SYSTEM_PIPELINE_DELAY 2

#define CAM_PKT_NOP_OPCODE 127

enum camera_sensor_cmd_type {
	CAMERA_SENSOR_CMD_TYPE_INVALID,
	CAMERA_SENSOR_CMD_TYPE_PROBE,
	CAMERA_SENSOR_CMD_TYPE_PWR_UP,
	CAMERA_SENSOR_CMD_TYPE_PWR_DOWN,
	CAMERA_SENSOR_CMD_TYPE_I2C_INFO,
	CAMERA_SENSOR_CMD_TYPE_I2C_RNDM_WR,
	CAMERA_SENSOR_CMD_TYPE_I2C_RNDM_RD,
	CAMERA_SENSOR_CMD_TYPE_I2C_CONT_WR,
	CAMERA_SENSOR_CMD_TYPE_I2C_CONT_RD,
	CAMERA_SENSOR_CMD_TYPE_WAIT,
	CAMERA_SENSOR_CMD_TYPE_MAX,
};

enum camera_sensor_i2c_op_code {
	CAMERA_SENSOR_I2C_OP_INVALID,
	CAMERA_SENSOR_I2C_OP_RNDM_WR,
	CAMERA_SENSOR_I2C_OP_RNDM_WR_VERF,
	CAMERA_SENSOR_I2C_OP_CONT_WR_BRST,
	CAMERA_SENSOR_I2C_OP_CONT_WR_BRST_VERF,
	CAMERA_SENSOR_I2C_OP_CONT_WR_SEQN,
	CAMERA_SENSOR_I2C_OP_CONT_WR_SEQN_VERF,
	CAMERA_SENSOR_I2C_OP_MAX,
};

enum camera_sensor_wait_op_code {
	CAMERA_SENSOR_WAIT_OP_INVALID,
	CAMERA_SENSOR_WAIT_OP_COND,
	CAMERA_SENSOR_WAIT_OP_HW_UCND,
	CAMERA_SENSOR_WAIT_OP_SW_UCND,
	CAMERA_SENSOR_WAIT_OP_MAX,
};

enum camera_sensor_i2c_type {
	CAMERA_SENSOR_I2C_TYPE_INVALID,
	CAMERA_SENSOR_I2C_TYPE_BYTE,
	CAMERA_SENSOR_I2C_TYPE_WORD,
	CAMERA_SENSOR_I2C_TYPE_3B,
	CAMERA_SENSOR_I2C_TYPE_DWORD,
	CAMERA_SENSOR_I2C_TYPE_MAX,
};

enum i2c_freq_mode {
	I2C_STANDARD_MODE,
	I2C_FAST_MODE,
	I2C_CUSTOM_MODE,
	I2C_FAST_PLUS_MODE,
	I2C_MAX_MODES,
};

enum position_roll {
	ROLL_0       = 0,
	ROLL_90      = 90,
	ROLL_180     = 180,
	ROLL_270     = 270,
	ROLL_INVALID = 360,
};

enum position_yaw {
	FRONT_CAMERA_YAW = 0,
	REAR_CAMERA_YAW  = 180,
	INVALID_YAW      = 360,
};

enum position_pitch {
	LEVEL_PITCH    = 0,
	INVALID_PITCH  = 360,
};

enum sensor_sub_module {
	SUB_MODULE_SENSOR,
	SUB_MODULE_ACTUATOR,
	SUB_MODULE_EEPROM,
	SUB_MODULE_LED_FLASH,
	SUB_MODULE_CSID,
	SUB_MODULE_CSIPHY,
	SUB_MODULE_OIS,
	SUB_MODULE_EXT,
	SUB_MODULE_MAX,
};

enum msm_camera_power_seq_type {
	SENSOR_MCLK,
	SENSOR_VANA,
	SENSOR_VDIG,
	SENSOR_VIO,
	SENSOR_VAF,
	SENSOR_VAF_PWDM,
	SENSOR_CUSTOM_REG1,
	SENSOR_CUSTOM_REG2,
	SENSOR_RESET,
	SENSOR_STANDBY,
	SENSOR_CUSTOM_GPIO1,
	SENSOR_CUSTOM_GPIO2,
	SENSOR_SEQ_TYPE_MAX,
};

enum cam_sensor_packet_opcodes {
	CAM_SENSOR_PACKET_OPCODE_SENSOR_STREAMON,
	CAM_SENSOR_PACKET_OPCODE_SENSOR_UPDATE,
	CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG,
	CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE
};

enum cam_actuator_packet_opcodes {
	CAM_ACTUATOR_PACKET_OPCODE_INIT,
	CAM_ACTUATOR_PACKET_AUTO_MOVE_LENS,
	CAM_ACTUATOR_PACKET_MANUAL_MOVE_LENS
};

enum msm_bus_perf_setting {
	S_INIT,
	S_PREVIEW,
	S_VIDEO,
	S_CAPTURE,
	S_ZSL,
	S_STEREO_VIDEO,
	S_STEREO_CAPTURE,
	S_DEFAULT,
	S_LIVESHOT,
	S_DUAL,
	S_EXIT
};

enum msm_camera_device_type_t {
	MSM_CAMERA_I2C_DEVICE,
	MSM_CAMERA_PLATFORM_DEVICE,
	MSM_CAMERA_SPI_DEVICE,
};

enum cci_i2c_master_t {
	MASTER_0,
	MASTER_1,
	MASTER_MAX,
};

enum camera_vreg_type {
	VREG_TYPE_DEFAULT,
	VREG_TYPE_CUSTOM,
};

enum cam_sensor_i2c_cmd_type {
	CAM_SENSOR_I2C_WRITE_RANDOM,
	CAM_SENSOR_I2C_READ,
	CAM_SENSOR_I2C_POLL
};

struct common_header {
	uint16_t    first_word;
	uint8_t     third_byte;
	uint8_t     cmd_type;
};

struct camera_vreg_t {
	const char *reg_name;
	int min_voltage;
	int max_voltage;
	int op_mode;
	uint32_t delay;
	const char *custom_vreg_name;
	enum camera_vreg_type type;
};

struct cam_sensor_module_power_setting {
	enum msm_camera_power_seq_type seq_type;
	unsigned short seq_val;
	uint32_t config_val_low;
	uint32_t config_val_high;
	unsigned short delay;
};

struct msm_camera_gpio_num_info {
	uint16_t gpio_num[SENSOR_SEQ_TYPE_MAX];
	uint8_t valid[SENSOR_SEQ_TYPE_MAX];
};

struct msm_cam_clk_info {
	const char *clk_name;
	long clk_rate;
	uint32_t delay;
};

struct msm_pinctrl_info {
	struct pinctrl *pinctrl;
	struct pinctrl_state *gpio_state_active;
	struct pinctrl_state *gpio_state_suspend;
	bool use_pinctrl;
};

struct cam_sensor_i2c_reg_array {
	uint32_t reg_addr;
	uint32_t reg_data;
	uint32_t delay;
	uint32_t data_mask;
};

struct cam_sensor_i2c_reg_setting {
	struct cam_sensor_i2c_reg_array *reg_setting;
	unsigned short size;
	enum camera_sensor_i2c_type addr_type;
	enum camera_sensor_i2c_type data_type;
	unsigned short delay;
};

struct i2c_settings_list {
	struct cam_sensor_i2c_reg_setting i2c_settings;
	enum cam_sensor_i2c_cmd_type op_code;
	struct list_head list;
};

struct i2c_settings_array {
	struct list_head list_head;
	int32_t is_settings_valid;
	int64_t request_id;
};

struct i2c_data_settings {
	struct i2c_settings_array init_settings;
	struct i2c_settings_array *per_frame;
};

struct cam_sensor_power_ctrl_t {
	struct device *dev;
	struct cam_sensor_power_setting *power_setting;
	uint16_t power_setting_size;
	struct cam_sensor_power_setting *power_down_setting;
	uint16_t power_down_setting_size;
	struct msm_camera_gpio_conf *gpio_conf;
	struct camera_vreg_t *cam_vreg;
	int num_vreg;
	struct clk **clk_ptr;
	struct msm_cam_clk_info *clk_info;
	struct msm_pinctrl_info pinctrl_info;
	uint8_t cam_pinctrl_status;
	size_t clk_info_size;
};

struct cam_camera_slave_info {
	uint16_t sensor_slave_addr;
	uint16_t sensor_id_reg_addr;
	uint16_t sensor_id;
	uint16_t sensor_id_mask;
};

struct msm_sensor_init_params {
	int modes_supported;
	unsigned int sensor_mount_angle;
};

enum msm_sensor_camera_id_t {
	CAMERA_0,
	CAMERA_1,
	CAMERA_2,
	CAMERA_3,
	MAX_CAMERAS,
};

struct msm_sensor_id_info_t {
	unsigned short sensor_id_reg_addr;
	unsigned short sensor_id;
	unsigned short sensor_id_mask;
};

enum msm_sensor_output_format_t {
	MSM_SENSOR_BAYER,
	MSM_SENSOR_YCBCR,
	MSM_SENSOR_META,
};

struct cam_sensor_power_setting {
	enum msm_camera_power_seq_type seq_type;
	unsigned short seq_val;
	long config_val;
	unsigned short delay;
	void *data[10];
};

struct cam_sensor_power_setting_array {
	struct cam_sensor_power_setting  power_setting_a[MAX_POWER_CONFIG];
	struct cam_sensor_power_setting *power_setting;
	unsigned short size;
	struct cam_sensor_power_setting  power_down_setting_a[MAX_POWER_CONFIG];
	struct cam_sensor_power_setting *power_down_setting;
	unsigned short size_down;
};

struct msm_camera_sensor_slave_info {
	enum msm_sensor_camera_id_t camera_id;
	unsigned short slave_addr;
	enum i2c_freq_mode i2c_freq_mode;
	enum camera_sensor_i2c_type addr_type;
	struct msm_sensor_id_info_t sensor_id_info;
	struct cam_sensor_power_setting_array power_setting_array;
	unsigned char  is_init_params_valid;
	enum msm_sensor_output_format_t output_format;
};

struct cam_sensor_board_info {
	struct cam_camera_slave_info slave_info;
	int32_t sensor_mount_angle;
	int32_t secure_mode;
	int modes_supported;
	int32_t pos_roll;
	int32_t pos_yaw;
	int32_t pos_pitch;
	int32_t  subdev_id[SUB_MODULE_MAX];
	int32_t  subdev_intf[SUB_MODULE_MAX];
	const char *misc_regulator;
	struct cam_sensor_power_ctrl_t power_info;
};

enum msm_camera_vreg_name_t {
	CAM_VDIG,
	CAM_VIO,
	CAM_VANA,
	CAM_VAF,
	CAM_V_CUSTOM1,
	CAM_V_CUSTOM2,
	CAM_VREG_MAX,
};

struct msm_camera_gpio_conf {
	void *cam_gpiomux_conf_tbl;
	uint8_t cam_gpiomux_conf_tbl_size;
	struct gpio *cam_gpio_common_tbl;
	uint8_t cam_gpio_common_tbl_size;
	struct gpio *cam_gpio_req_tbl;
	uint8_t cam_gpio_req_tbl_size;
	uint32_t gpio_no_mux;
	uint32_t *camera_off_table;
	uint8_t camera_off_table_size;
	uint32_t *camera_on_table;
	uint8_t camera_on_table_size;
	struct msm_camera_gpio_num_info *gpio_num_info;
};

#endif /* _CAM_SENSOR_CMN_HEADER_ */
Loading