linux/drivers/media/i2c/mt9m114.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * mt9m114.c onsemi MT9M114 sensor driver
 *
 * Copyright (c) 2020-2023 Laurent Pinchart <[email protected]>
 * Copyright (c) 2012 Analog Devices Inc.
 *
 * Almost complete rewrite of work by Scott Jiang <[email protected]>
 * itself based on work from Andrew Chew <[email protected]>.
 */

#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/gpio/consumer.h>
#include <linux/i2c.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/types.h>
#include <linux/videodev2.h>

#include <media/v4l2-async.h>
#include <media/v4l2-cci.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-mediabus.h>
#include <media/v4l2-subdev.h>

/* Sysctl registers */
#define MT9M114_CHIP_ID
#define MT9M114_COMMAND_REGISTER
#define MT9M114_COMMAND_REGISTER_APPLY_PATCH
#define MT9M114_COMMAND_REGISTER_SET_STATE
#define MT9M114_COMMAND_REGISTER_REFRESH
#define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT
#define MT9M114_COMMAND_REGISTER_OK
#define MT9M114_RESET_AND_MISC_CONTROL
#define MT9M114_RESET_SOC
#define MT9M114_PAD_SLEW
#define MT9M114_PAD_CONTROL

/* XDMA registers */
#define MT9M114_ACCESS_CTL_STAT
#define MT9M114_PHYSICAL_ADDRESS_ACCESS
#define MT9M114_LOGICAL_ADDRESS_ACCESS

/* Sensor Core registers */
#define MT9M114_COARSE_INTEGRATION_TIME
#define MT9M114_FINE_INTEGRATION_TIME
#define MT9M114_RESET_REGISTER
#define MT9M114_RESET_REGISTER_LOCK_REG
#define MT9M114_RESET_REGISTER_MASK_BAD
#define MT9M114_FLASH
#define MT9M114_GREEN1_GAIN
#define MT9M114_BLUE_GAIN
#define MT9M114_RED_GAIN
#define MT9M114_GREEN2_GAIN
#define MT9M114_GLOBAL_GAIN
#define MT9M114_GAIN_DIGITAL_GAIN(n)
#define MT9M114_GAIN_DIGITAL_GAIN_MASK
#define MT9M114_GAIN_ANALOG_GAIN(n)
#define MT9M114_GAIN_ANALOG_GAIN_MASK
#define MT9M114_CUSTOMER_REV

/* Monitor registers */
#define MT9M114_MON_MAJOR_VERSION
#define MT9M114_MON_MINOR_VERSION
#define MT9M114_MON_RELEASE_VERSION

/* Auto-Exposure Track registers */
#define MT9M114_AE_TRACK_ALGO
#define MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE
#define MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED

/* Color Correction Matrix registers */
#define MT9M114_CCM_ALGO
#define MT9M114_CCM_EXEC_CALC_CCM_MATRIX
#define MT9M114_CCM_DELTA_GAIN

/* Camera Control registers */
#define MT9M114_CAM_SENSOR_CFG_Y_ADDR_START
#define MT9M114_CAM_SENSOR_CFG_X_ADDR_START
#define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END
#define MT9M114_CAM_SENSOR_CFG_X_ADDR_END
#define MT9M114_CAM_SENSOR_CFG_PIXCLK
#define MT9M114_CAM_SENSOR_CFG_ROW_SPEED
#define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN
#define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX
#define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES
#define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX
#define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK
#define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX
#define MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION
#define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW
#define MT9M114_CAM_SENSOR_CFG_REG_0_DATA
#define MT9M114_CAM_SENSOR_CONTROL_READ_MODE
#define MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN
#define MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN
#define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_NORMAL
#define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SKIPPING
#define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_AVERAGE
#define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING
#define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK
#define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_NORMAL
#define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SKIPPING
#define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING
#define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK
#define MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN
#define MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME
#define MT9M114_CAM_SENSOR_CONTROL_FINE_INTEGRATION_TIME
#define MT9M114_CAM_MODE_SELECT
#define MT9M114_CAM_MODE_SELECT_NORMAL
#define MT9M114_CAM_MODE_SELECT_LENS_CALIBRATION
#define MT9M114_CAM_MODE_SELECT_TEST_PATTERN
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B
#define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B
#define MT9M114_CAM_MODE_TEST_PATTERN_RED
#define MT9M114_CAM_MODE_TEST_PATTERN_GREEN
#define MT9M114_CAM_MODE_TEST_PATTERN_BLUE
#define MT9M114_CAM_CROP_WINDOW_XOFFSET
#define MT9M114_CAM_CROP_WINDOW_YOFFSET
#define MT9M114_CAM_CROP_WINDOW_WIDTH
#define MT9M114_CAM_CROP_WINDOW_HEIGHT
#define MT9M114_CAM_CROP_CROPMODE
#define MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN
#define MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN
#define MT9M114_CAM_OUTPUT_WIDTH
#define MT9M114_CAM_OUTPUT_HEIGHT
#define MT9M114_CAM_OUTPUT_FORMAT
#define MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE
#define MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES
#define MT9M114_CAM_OUTPUT_FORMAT_MONO_ENABLE
#define MT9M114_CAM_OUTPUT_FORMAT_BT656_ENABLE
#define MT9M114_CAM_OUTPUT_FORMAT_BT656_CROP_SCALE_DISABLE
#define MT9M114_CAM_OUTPUT_FORMAT_FVLV_DISABLE
#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV
#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB
#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER
#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_NONE
#define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK
#define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10
#define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PRELSC_8_2
#define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_POSTLSC_8_2
#define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8
#define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK
#define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB
#define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_555RGB
#define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444xRGB
#define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444RGBx
#define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK
#define MT9M114_CAM_OUTPUT_FORMAT_YUV
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_CLIP
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_AUV_OFFSET
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_SELECT_601
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_NORMALISE
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVEN_UV
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_ODD_UV
#define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVENU_ODDV
#define MT9M114_CAM_OUTPUT_Y_OFFSET
#define MT9M114_CAM_AET_AEMODE
#define MT9M114_CAM_AET_EXEC_SET_INDOOR
#define MT9M114_CAM_AET_DISCRETE_FRAMERATE
#define MT9M114_CAM_AET_ADAPTATIVE_TARGET_LUMA
#define MT9M114_CAM_AET_ADAPTATIVE_SKIP_FRAMES
#define MT9M114_CAM_AET_SKIP_FRAMES
#define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA
#define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK
#define MT9M114_CAM_AET_BLACK_CLIPPING_TARGET
#define MT9M114_CAM_AET_AE_MIN_VIRT_INT_TIME_PCLK
#define MT9M114_CAM_AET_AE_MIN_VIRT_DGAIN
#define MT9M114_CAM_AET_AE_MAX_VIRT_DGAIN
#define MT9M114_CAM_AET_AE_MIN_VIRT_AGAIN
#define MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN
#define MT9M114_CAM_AET_AE_VIRT_GAIN_TH_EG
#define MT9M114_CAM_AET_AE_EG_GATE_PERCENTAGE
#define MT9M114_CAM_AET_FLICKER_FREQ_HZ
#define MT9M114_CAM_AET_MAX_FRAME_RATE
#define MT9M114_CAM_AET_MIN_FRAME_RATE
#define MT9M114_CAM_AET_TARGET_GAIN
#define MT9M114_CAM_AWB_CCM_L(n)
#define MT9M114_CAM_AWB_CCM_M(n)
#define MT9M114_CAM_AWB_CCM_R(n)
#define MT9M114_CAM_AWB_CCM_L_RG_GAIN
#define MT9M114_CAM_AWB_CCM_L_BG_GAIN
#define MT9M114_CAM_AWB_CCM_M_RG_GAIN
#define MT9M114_CAM_AWB_CCM_M_BG_GAIN
#define MT9M114_CAM_AWB_CCM_R_RG_GAIN
#define MT9M114_CAM_AWB_CCM_R_BG_GAIN
#define MT9M114_CAM_AWB_CCM_L_CTEMP
#define MT9M114_CAM_AWB_CCM_M_CTEMP
#define MT9M114_CAM_AWB_CCM_R_CTEMP
#define MT9M114_CAM_AWB_AWB_XSCALE
#define MT9M114_CAM_AWB_AWB_YSCALE
#define MT9M114_CAM_AWB_AWB_WEIGHTS(n)
#define MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ
#define MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ
#define MT9M114_CAM_AWB_AWBMODE
#define MT9M114_CAM_AWB_MODE_AUTO
#define MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE
#define MT9M114_CAM_AWB_K_R_L
#define MT9M114_CAM_AWB_K_G_L
#define MT9M114_CAM_AWB_K_B_L
#define MT9M114_CAM_AWB_K_R_R
#define MT9M114_CAM_AWB_K_G_R
#define MT9M114_CAM_AWB_K_B_R
#define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART
#define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART
#define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND
#define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND
#define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART
#define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART
#define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND
#define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND
#define MT9M114_CAM_LL_LLMODE
#define MT9M114_CAM_LL_START_BRIGHTNESS
#define MT9M114_CAM_LL_STOP_BRIGHTNESS
#define MT9M114_CAM_LL_START_SATURATION
#define MT9M114_CAM_LL_END_SATURATION
#define MT9M114_CAM_LL_START_DESATURATION
#define MT9M114_CAM_LL_END_DESATURATION
#define MT9M114_CAM_LL_START_DEMOSAICING
#define MT9M114_CAM_LL_START_AP_GAIN
#define MT9M114_CAM_LL_START_AP_THRESH
#define MT9M114_CAM_LL_STOP_DEMOSAICING
#define MT9M114_CAM_LL_STOP_AP_GAIN
#define MT9M114_CAM_LL_STOP_AP_THRESH
#define MT9M114_CAM_LL_START_NR_RED
#define MT9M114_CAM_LL_START_NR_GREEN
#define MT9M114_CAM_LL_START_NR_BLUE
#define MT9M114_CAM_LL_START_NR_THRESH
#define MT9M114_CAM_LL_STOP_NR_RED
#define MT9M114_CAM_LL_STOP_NR_GREEN
#define MT9M114_CAM_LL_STOP_NR_BLUE
#define MT9M114_CAM_LL_STOP_NR_THRESH
#define MT9M114_CAM_LL_START_CONTRAST_BM
#define MT9M114_CAM_LL_STOP_CONTRAST_BM
#define MT9M114_CAM_LL_GAMMA
#define MT9M114_CAM_LL_START_CONTRAST_GRADIENT
#define MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT
#define MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE
#define MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE
#define MT9M114_CAM_LL_START_GAIN_METRIC
#define MT9M114_CAM_LL_STOP_GAIN_METRIC
#define MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA
#define MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA
#define MT9M114_CAM_LL_CLUSTER_DC_TH_BM
#define MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE
#define MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR
#define MT9M114_CAM_LL_START_TARGET_LUMA_BM
#define MT9M114_CAM_LL_STOP_TARGET_LUMA_BM
#define MT9M114_CAM_PGA_PGA_CONTROL
#define MT9M114_CAM_SYSCTL_PLL_ENABLE
#define MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE
#define MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N
#define MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(m, n)
#define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P
#define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(p)
#define MT9M114_CAM_PORT_OUTPUT_CONTROL
#define MT9M114_CAM_PORT_PORT_SELECT_PARALLEL
#define MT9M114_CAM_PORT_PORT_SELECT_MIPI
#define MT9M114_CAM_PORT_CLOCK_SLOWDOWN
#define MT9M114_CAM_PORT_TRUNCATE_RAW_BAYER
#define MT9M114_CAM_PORT_PIXCLK_GATE
#define MT9M114_CAM_PORT_CONT_MIPI_CLK
#define MT9M114_CAM_PORT_CHAN_NUM(vc)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO
#define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_TRAIL
#define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_TRAIL_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_PRE
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_PRE_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_ZERO
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_VALUE(n)
#define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_ZERO_VALUE(n)

/* System Manager registers */
#define MT9M114_SYSMGR_NEXT_STATE
#define MT9M114_SYSMGR_CURRENT_STATE
#define MT9M114_SYSMGR_CMD_STATUS

/* Patch Loader registers */
#define MT9M114_PATCHLDR_LOADER_ADDRESS
#define MT9M114_PATCHLDR_PATCH_ID
#define MT9M114_PATCHLDR_FIRMWARE_ID
#define MT9M114_PATCHLDR_APPLY_STATUS
#define MT9M114_PATCHLDR_NUM_PATCHES
#define MT9M114_PATCHLDR_PATCH_ID_0
#define MT9M114_PATCHLDR_PATCH_ID_1
#define MT9M114_PATCHLDR_PATCH_ID_2
#define MT9M114_PATCHLDR_PATCH_ID_3
#define MT9M114_PATCHLDR_PATCH_ID_4
#define MT9M114_PATCHLDR_PATCH_ID_5
#define MT9M114_PATCHLDR_PATCH_ID_6
#define MT9M114_PATCHLDR_PATCH_ID_7

/* SYS_STATE values (for SYSMGR_NEXT_STATE and SYSMGR_CURRENT_STATE) */
#define MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE
#define MT9M114_SYS_STATE_STREAMING
#define MT9M114_SYS_STATE_START_STREAMING
#define MT9M114_SYS_STATE_ENTER_SUSPEND
#define MT9M114_SYS_STATE_SUSPENDED
#define MT9M114_SYS_STATE_ENTER_STANDBY
#define MT9M114_SYS_STATE_STANDBY
#define MT9M114_SYS_STATE_LEAVE_STANDBY

/* Result status of last SET_STATE comamnd */
#define MT9M114_SET_STATE_RESULT_ENOERR
#define MT9M114_SET_STATE_RESULT_EINVAL
#define MT9M114_SET_STATE_RESULT_ENOSPC

/*
 * The minimum amount of horizontal and vertical blanking is undocumented. The
 * minimum values that have been seen in register lists are 303 and 38, use
 * them.
 *
 * Set the default to achieve 1280x960 at 30fps.
 */
#define MT9M114_MIN_HBLANK
#define MT9M114_MIN_VBLANK
#define MT9M114_DEF_HBLANK
#define MT9M114_DEF_VBLANK

#define MT9M114_DEF_FRAME_RATE
#define MT9M114_MAX_FRAME_RATE

#define MT9M114_PIXEL_ARRAY_WIDTH
#define MT9M114_PIXEL_ARRAY_HEIGHT

/*
 * These values are not well documented and are semi-arbitrary. The pixel array
 * minimum output size is 8 pixels larger than the minimum scaler cropped input
 * width to account for the demosaicing.
 */
#define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH
#define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT
#define MT9M114_SCALER_CROPPED_INPUT_WIDTH
#define MT9M114_SCALER_CROPPED_INPUT_HEIGHT

/* Indices into the mt9m114.ifp.tpg array. */
#define MT9M114_TPG_PATTERN
#define MT9M114_TPG_RED
#define MT9M114_TPG_GREEN
#define MT9M114_TPG_BLUE

/* -----------------------------------------------------------------------------
 * Data Structures
 */

enum mt9m114_format_flag {};

struct mt9m114_format_info {};

struct mt9m114 {};

/* -----------------------------------------------------------------------------
 * Formats
 */

static const struct mt9m114_format_info mt9m114_format_infos[] =;

static const struct mt9m114_format_info *
mt9m114_default_format_info(struct mt9m114 *sensor)
{}

static const struct mt9m114_format_info *
mt9m114_format_info(struct mt9m114 *sensor, unsigned int pad, u32 code)
{}

/* -----------------------------------------------------------------------------
 * Initialization
 */

static const struct cci_reg_sequence mt9m114_init[] =;

/* -----------------------------------------------------------------------------
 * Hardware Configuration
 */

/* Wait for a command to complete. */
static int mt9m114_poll_command(struct mt9m114 *sensor, u32 command)
{}

/* Wait for a state to be entered. */
static int mt9m114_poll_state(struct mt9m114 *sensor, u32 state)
{}

static int mt9m114_set_state(struct mt9m114 *sensor, u8 next_state)
{}

static int mt9m114_initialize(struct mt9m114 *sensor)
{}

static int mt9m114_configure(struct mt9m114 *sensor,
			     struct v4l2_subdev_state *pa_state,
			     struct v4l2_subdev_state *ifp_state)
{}

static int mt9m114_set_frame_rate(struct mt9m114 *sensor)
{}

static int mt9m114_start_streaming(struct mt9m114 *sensor,
				   struct v4l2_subdev_state *pa_state,
				   struct v4l2_subdev_state *ifp_state)
{}

static int mt9m114_stop_streaming(struct mt9m114 *sensor)
{}

/* -----------------------------------------------------------------------------
 * Common Subdev Operations
 */

static const struct media_entity_operations mt9m114_entity_ops =;

/* -----------------------------------------------------------------------------
 * Pixel Array Control Operations
 */

static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
{}

static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl)
{}

static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl)
{}

static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops =;

static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual)
{}

static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor,
					    const struct v4l2_mbus_framefmt *format)
{}

/* -----------------------------------------------------------------------------
 * Pixel Array Subdev Operations
 */

static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd)
{}

static int mt9m114_pa_init_state(struct v4l2_subdev *sd,
				 struct v4l2_subdev_state *state)
{}

static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd,
				     struct v4l2_subdev_state *state,
				     struct v4l2_subdev_mbus_code_enum *code)
{}

static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd,
				      struct v4l2_subdev_state *state,
				      struct v4l2_subdev_frame_size_enum *fse)
{}

static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd,
			      struct v4l2_subdev_state *state,
			      struct v4l2_subdev_format *fmt)
{}

static int mt9m114_pa_get_selection(struct v4l2_subdev *sd,
				    struct v4l2_subdev_state *state,
				    struct v4l2_subdev_selection *sel)
{}

static int mt9m114_pa_set_selection(struct v4l2_subdev *sd,
				    struct v4l2_subdev_state *state,
				    struct v4l2_subdev_selection *sel)
{}

static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops =;

static const struct v4l2_subdev_ops mt9m114_pa_ops =;

static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops =;

static int mt9m114_pa_init(struct mt9m114 *sensor)
{}

static void mt9m114_pa_cleanup(struct mt9m114 *sensor)
{}

/* -----------------------------------------------------------------------------
 * Image Flow Processor Control Operations
 */

static const char * const mt9m114_test_pattern_menu[] =;

/* Keep in sync with mt9m114_test_pattern_menu */
static const unsigned int mt9m114_test_pattern_value[] =;

static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl)
{}

static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl)
{}

static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops =;

/* -----------------------------------------------------------------------------
 * Image Flow Processor Subdev Operations
 */

static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd)
{}

static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable)
{}

static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd,
					  struct v4l2_subdev_state *sd_state,
					  struct v4l2_subdev_frame_interval *interval)
{}

static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd,
					  struct v4l2_subdev_state *sd_state,
					  struct v4l2_subdev_frame_interval *interval)
{}

static int mt9m114_ifp_init_state(struct v4l2_subdev *sd,
				  struct v4l2_subdev_state *state)
{}

static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd,
				      struct v4l2_subdev_state *state,
				      struct v4l2_subdev_mbus_code_enum *code)
{}

static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd,
				       struct v4l2_subdev_state *state,
				       struct v4l2_subdev_frame_size_enum *fse)
{}

static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd,
					   struct v4l2_subdev_state *state,
					   struct v4l2_subdev_frame_interval_enum *fie)
{}

static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd,
			       struct v4l2_subdev_state *state,
			       struct v4l2_subdev_format *fmt)
{}

static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd,
				     struct v4l2_subdev_state *state,
				     struct v4l2_subdev_selection *sel)
{}

static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd,
				     struct v4l2_subdev_state *state,
				     struct v4l2_subdev_selection *sel)
{}

static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd)
{}

static int mt9m114_ifp_registered(struct v4l2_subdev *sd)
{}

static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops =;

static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops =;

static const struct v4l2_subdev_ops mt9m114_ifp_ops =;

static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops =;

static int mt9m114_ifp_init(struct mt9m114 *sensor)
{}

static void mt9m114_ifp_cleanup(struct mt9m114 *sensor)
{}

/* -----------------------------------------------------------------------------
 * Power Management
 */

static int mt9m114_power_on(struct mt9m114 *sensor)
{}

static void mt9m114_power_off(struct mt9m114 *sensor)
{}

static int __maybe_unused mt9m114_runtime_resume(struct device *dev)
{}

static int __maybe_unused mt9m114_runtime_suspend(struct device *dev)
{}

static const struct dev_pm_ops mt9m114_pm_ops =;

/* -----------------------------------------------------------------------------
 * Probe & Remove
 */

static int mt9m114_clk_init(struct mt9m114 *sensor)
{}

static int mt9m114_identify(struct mt9m114 *sensor)
{}

static int mt9m114_parse_dt(struct mt9m114 *sensor)
{}

static int mt9m114_probe(struct i2c_client *client)
{}

static void mt9m114_remove(struct i2c_client *client)
{}

static const struct of_device_id mt9m114_of_ids[] =;
MODULE_DEVICE_TABLE(of, mt9m114_of_ids);

static struct i2c_driver mt9m114_driver =;

module_i2c_driver();

MODULE_DESCRIPTION();
MODULE_AUTHOR();
MODULE_LICENSE();