1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * mt9m114.c onsemi MT9M114 sensor driver 4 * 5 * Copyright (c) 2020-2023 Laurent Pinchart <laurent.pinchart@ideasonboard.com> 6 * Copyright (c) 2012 Analog Devices Inc. 7 * 8 * Almost complete rewrite of work by Scott Jiang <Scott.Jiang.Linux@gmail.com> 9 * itself based on work from Andrew Chew <achew@nvidia.com>. 10 */ 11 12 #include <linux/clk.h> 13 #include <linux/delay.h> 14 #include <linux/errno.h> 15 #include <linux/gpio/consumer.h> 16 #include <linux/i2c.h> 17 #include <linux/mod_devicetable.h> 18 #include <linux/module.h> 19 #include <linux/mutex.h> 20 #include <linux/pm_runtime.h> 21 #include <linux/property.h> 22 #include <linux/regmap.h> 23 #include <linux/regulator/consumer.h> 24 #include <linux/types.h> 25 #include <linux/videodev2.h> 26 27 #include <media/v4l2-async.h> 28 #include <media/v4l2-cci.h> 29 #include <media/v4l2-ctrls.h> 30 #include <media/v4l2-device.h> 31 #include <media/v4l2-fwnode.h> 32 #include <media/v4l2-mediabus.h> 33 #include <media/v4l2-subdev.h> 34 35 #include "aptina-pll.h" 36 37 /* Sysctl registers */ 38 #define MT9M114_CHIP_ID CCI_REG16(0x0000) 39 #define MT9M114_COMMAND_REGISTER CCI_REG16(0x0080) 40 #define MT9M114_COMMAND_REGISTER_APPLY_PATCH BIT(0) 41 #define MT9M114_COMMAND_REGISTER_SET_STATE BIT(1) 42 #define MT9M114_COMMAND_REGISTER_REFRESH BIT(2) 43 #define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT BIT(3) 44 #define MT9M114_COMMAND_REGISTER_OK BIT(15) 45 #define MT9M114_RESET_AND_MISC_CONTROL CCI_REG16(0x001a) 46 #define MT9M114_RESET_SOC BIT(0) 47 #define MT9M114_PAD_SLEW CCI_REG16(0x001e) 48 #define MT9M114_PAD_SLEW_MIN 0 49 #define MT9M114_PAD_SLEW_MAX 7 50 #define MT9M114_PAD_SLEW_DEFAULT 7 51 #define MT9M114_PAD_CONTROL CCI_REG16(0x0032) 52 53 /* XDMA registers */ 54 #define MT9M114_ACCESS_CTL_STAT CCI_REG16(0x0982) 55 #define MT9M114_PHYSICAL_ADDRESS_ACCESS CCI_REG16(0x098a) 56 #define MT9M114_LOGICAL_ADDRESS_ACCESS CCI_REG16(0x098e) 57 58 /* Sensor Core registers */ 59 #define MT9M114_COARSE_INTEGRATION_TIME CCI_REG16(0x3012) 60 #define MT9M114_FINE_INTEGRATION_TIME CCI_REG16(0x3014) 61 #define MT9M114_RESET_REGISTER CCI_REG16(0x301a) 62 #define MT9M114_RESET_REGISTER_LOCK_REG BIT(3) 63 #define MT9M114_RESET_REGISTER_MASK_BAD BIT(9) 64 #define MT9M114_FLASH CCI_REG16(0x3046) 65 #define MT9M114_GREEN1_GAIN CCI_REG16(0x3056) 66 #define MT9M114_BLUE_GAIN CCI_REG16(0x3058) 67 #define MT9M114_RED_GAIN CCI_REG16(0x305a) 68 #define MT9M114_GREEN2_GAIN CCI_REG16(0x305c) 69 #define MT9M114_GLOBAL_GAIN CCI_REG16(0x305e) 70 #define MT9M114_GAIN_DIGITAL_GAIN(n) ((n) << 12) 71 #define MT9M114_GAIN_DIGITAL_GAIN_MASK (0xf << 12) 72 #define MT9M114_GAIN_ANALOG_GAIN(n) ((n) << 0) 73 #define MT9M114_GAIN_ANALOG_GAIN_MASK (0xff << 0) 74 #define MT9M114_CUSTOMER_REV CCI_REG16(0x31fe) 75 76 /* Monitor registers */ 77 #define MT9M114_MON_MAJOR_VERSION CCI_REG16(0x8000) 78 #define MT9M114_MON_MINOR_VERSION CCI_REG16(0x8002) 79 #define MT9M114_MON_RELEASE_VERSION CCI_REG16(0x8004) 80 81 /* Auto-Exposure Track registers */ 82 #define MT9M114_AE_TRACK_ALGO CCI_REG16(0xa804) 83 #define MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE BIT(0) 84 #define MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED CCI_REG8(0xa80a) 85 86 /* Color Correction Matrix registers */ 87 #define MT9M114_CCM_ALGO CCI_REG16(0xb404) 88 #define MT9M114_CCM_EXEC_CALC_CCM_MATRIX BIT(4) 89 #define MT9M114_CCM_DELTA_GAIN CCI_REG8(0xb42a) 90 91 /* Camera Control registers */ 92 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_START CCI_REG16(0xc800) 93 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_START CCI_REG16(0xc802) 94 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END CCI_REG16(0xc804) 95 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_END CCI_REG16(0xc806) 96 #define MT9M114_CAM_SENSOR_CFG_PIXCLK CCI_REG32(0xc808) 97 #define MT9M114_CAM_SENSOR_CFG_ROW_SPEED CCI_REG16(0xc80c) 98 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN CCI_REG16(0xc80e) 99 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX CCI_REG16(0xc810) 100 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES CCI_REG16(0xc812) 101 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 65535 102 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK CCI_REG16(0xc814) 103 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 8191 104 #define MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION CCI_REG16(0xc816) 105 #define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW CCI_REG16(0xc818) 106 #define MT9M114_CAM_SENSOR_CFG_REG_0_DATA CCI_REG16(0xc826) 107 #define MT9M114_CAM_SENSOR_CONTROL_READ_MODE CCI_REG16(0xc834) 108 #define MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN BIT(0) 109 #define MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN BIT(1) 110 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_NORMAL (0 << 4) 111 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SKIPPING (1 << 4) 112 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_AVERAGE (2 << 4) 113 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING (3 << 4) 114 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK (3 << 4) 115 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_NORMAL (0 << 8) 116 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SKIPPING (1 << 8) 117 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING (3 << 8) 118 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK (3 << 8) 119 #define MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN CCI_REG16(0xc836) 120 #define MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME CCI_REG16(0xc83c) 121 #define MT9M114_CAM_SENSOR_CONTROL_FINE_INTEGRATION_TIME CCI_REG16(0xc83e) 122 #define MT9M114_CAM_MODE_SELECT CCI_REG8(0xc84c) 123 #define MT9M114_CAM_MODE_SELECT_NORMAL (0 << 0) 124 #define MT9M114_CAM_MODE_SELECT_LENS_CALIBRATION (1 << 0) 125 #define MT9M114_CAM_MODE_SELECT_TEST_PATTERN (2 << 0) 126 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT CCI_REG8(0xc84d) 127 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID (1 << 0) 128 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS (4 << 0) 129 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM (5 << 0) 130 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS (8 << 0) 131 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B (10 << 0) 132 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B (11 << 0) 133 #define MT9M114_CAM_MODE_TEST_PATTERN_RED CCI_REG16(0xc84e) 134 #define MT9M114_CAM_MODE_TEST_PATTERN_GREEN CCI_REG16(0xc850) 135 #define MT9M114_CAM_MODE_TEST_PATTERN_BLUE CCI_REG16(0xc852) 136 #define MT9M114_CAM_CROP_WINDOW_XOFFSET CCI_REG16(0xc854) 137 #define MT9M114_CAM_CROP_WINDOW_YOFFSET CCI_REG16(0xc856) 138 #define MT9M114_CAM_CROP_WINDOW_WIDTH CCI_REG16(0xc858) 139 #define MT9M114_CAM_CROP_WINDOW_HEIGHT CCI_REG16(0xc85a) 140 #define MT9M114_CAM_CROP_CROPMODE CCI_REG8(0xc85c) 141 #define MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN BIT(0) 142 #define MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN BIT(1) 143 #define MT9M114_CAM_OUTPUT_WIDTH CCI_REG16(0xc868) 144 #define MT9M114_CAM_OUTPUT_HEIGHT CCI_REG16(0xc86a) 145 #define MT9M114_CAM_OUTPUT_FORMAT CCI_REG16(0xc86c) 146 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE BIT(0) 147 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES BIT(1) 148 #define MT9M114_CAM_OUTPUT_FORMAT_MONO_ENABLE BIT(2) 149 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_ENABLE BIT(3) 150 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_CROP_SCALE_DISABLE BIT(4) 151 #define MT9M114_CAM_OUTPUT_FORMAT_FVLV_DISABLE BIT(5) 152 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV (0 << 8) 153 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB (1 << 8) 154 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER (2 << 8) 155 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_NONE (3 << 8) 156 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK (3 << 8) 157 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10 (0 << 10) 158 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PRELSC_8_2 (1 << 10) 159 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_POSTLSC_8_2 (2 << 10) 160 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8 (3 << 10) 161 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK (3 << 10) 162 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB (0 << 12) 163 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_555RGB (1 << 12) 164 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444xRGB (2 << 12) 165 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444RGBx (3 << 12) 166 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK (3 << 12) 167 #define MT9M114_CAM_OUTPUT_FORMAT_YUV CCI_REG16(0xc86e) 168 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_CLIP BIT(5) 169 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_AUV_OFFSET BIT(4) 170 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SELECT_601 BIT(3) 171 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_NORMALISE BIT(2) 172 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVEN_UV (0 << 0) 173 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_ODD_UV (1 << 0) 174 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVENU_ODDV (2 << 0) 175 #define MT9M114_CAM_OUTPUT_Y_OFFSET CCI_REG8(0xc870) 176 #define MT9M114_CAM_AET_AEMODE CCI_REG8(0xc878) 177 #define MT9M114_CAM_AET_EXEC_SET_INDOOR BIT(0) 178 #define MT9M114_CAM_AET_DISCRETE_FRAMERATE BIT(1) 179 #define MT9M114_CAM_AET_ADAPTATIVE_TARGET_LUMA BIT(2) 180 #define MT9M114_CAM_AET_ADAPTATIVE_SKIP_FRAMES BIT(3) 181 #define MT9M114_CAM_AET_SKIP_FRAMES CCI_REG8(0xc879) 182 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA CCI_REG8(0xc87a) 183 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK CCI_REG8(0xc87b) 184 #define MT9M114_CAM_AET_BLACK_CLIPPING_TARGET CCI_REG16(0xc87c) 185 #define MT9M114_CAM_AET_AE_MIN_VIRT_INT_TIME_PCLK CCI_REG16(0xc87e) 186 #define MT9M114_CAM_AET_AE_MIN_VIRT_DGAIN CCI_REG16(0xc880) 187 #define MT9M114_CAM_AET_AE_MAX_VIRT_DGAIN CCI_REG16(0xc882) 188 #define MT9M114_CAM_AET_AE_MIN_VIRT_AGAIN CCI_REG16(0xc884) 189 #define MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN CCI_REG16(0xc886) 190 #define MT9M114_CAM_AET_AE_VIRT_GAIN_TH_EG CCI_REG16(0xc888) 191 #define MT9M114_CAM_AET_AE_EG_GATE_PERCENTAGE CCI_REG8(0xc88a) 192 #define MT9M114_CAM_AET_FLICKER_FREQ_HZ CCI_REG8(0xc88b) 193 #define MT9M114_CAM_AET_MAX_FRAME_RATE CCI_REG16(0xc88c) 194 #define MT9M114_CAM_AET_MIN_FRAME_RATE CCI_REG16(0xc88e) 195 #define MT9M114_CAM_AET_TARGET_GAIN CCI_REG16(0xc890) 196 #define MT9M114_CAM_AWB_CCM_L(n) CCI_REG16(0xc892 + (n) * 2) 197 #define MT9M114_CAM_AWB_CCM_M(n) CCI_REG16(0xc8a4 + (n) * 2) 198 #define MT9M114_CAM_AWB_CCM_R(n) CCI_REG16(0xc8b6 + (n) * 2) 199 #define MT9M114_CAM_AWB_CCM_L_RG_GAIN CCI_REG16(0xc8c8) 200 #define MT9M114_CAM_AWB_CCM_L_BG_GAIN CCI_REG16(0xc8ca) 201 #define MT9M114_CAM_AWB_CCM_M_RG_GAIN CCI_REG16(0xc8cc) 202 #define MT9M114_CAM_AWB_CCM_M_BG_GAIN CCI_REG16(0xc8ce) 203 #define MT9M114_CAM_AWB_CCM_R_RG_GAIN CCI_REG16(0xc8d0) 204 #define MT9M114_CAM_AWB_CCM_R_BG_GAIN CCI_REG16(0xc8d2) 205 #define MT9M114_CAM_AWB_CCM_L_CTEMP CCI_REG16(0xc8d4) 206 #define MT9M114_CAM_AWB_CCM_M_CTEMP CCI_REG16(0xc8d6) 207 #define MT9M114_CAM_AWB_CCM_R_CTEMP CCI_REG16(0xc8d8) 208 #define MT9M114_CAM_AWB_AWB_XSCALE CCI_REG8(0xc8f2) 209 #define MT9M114_CAM_AWB_AWB_YSCALE CCI_REG8(0xc8f3) 210 #define MT9M114_CAM_AWB_AWB_WEIGHTS(n) CCI_REG16(0xc8f4 + (n) * 2) 211 #define MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ CCI_REG16(0xc904) 212 #define MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ CCI_REG16(0xc906) 213 #define MT9M114_CAM_AWB_AWBMODE CCI_REG8(0xc909) 214 #define MT9M114_CAM_AWB_MODE_AUTO BIT(1) 215 #define MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE BIT(0) 216 #define MT9M114_CAM_AWB_K_R_L CCI_REG8(0xc90c) 217 #define MT9M114_CAM_AWB_K_G_L CCI_REG8(0xc90d) 218 #define MT9M114_CAM_AWB_K_B_L CCI_REG8(0xc90e) 219 #define MT9M114_CAM_AWB_K_R_R CCI_REG8(0xc90f) 220 #define MT9M114_CAM_AWB_K_G_R CCI_REG8(0xc910) 221 #define MT9M114_CAM_AWB_K_B_R CCI_REG8(0xc911) 222 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART CCI_REG16(0xc914) 223 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART CCI_REG16(0xc916) 224 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND CCI_REG16(0xc918) 225 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND CCI_REG16(0xc91a) 226 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART CCI_REG16(0xc91c) 227 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART CCI_REG16(0xc91e) 228 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND CCI_REG16(0xc920) 229 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND CCI_REG16(0xc922) 230 #define MT9M114_CAM_LL_LLMODE CCI_REG16(0xc924) 231 #define MT9M114_CAM_LL_START_BRIGHTNESS CCI_REG16(0xc926) 232 #define MT9M114_CAM_LL_STOP_BRIGHTNESS CCI_REG16(0xc928) 233 #define MT9M114_CAM_LL_START_SATURATION CCI_REG8(0xc92a) 234 #define MT9M114_CAM_LL_END_SATURATION CCI_REG8(0xc92b) 235 #define MT9M114_CAM_LL_START_DESATURATION CCI_REG8(0xc92c) 236 #define MT9M114_CAM_LL_END_DESATURATION CCI_REG8(0xc92d) 237 #define MT9M114_CAM_LL_START_DEMOSAICING CCI_REG8(0xc92e) 238 #define MT9M114_CAM_LL_START_AP_GAIN CCI_REG8(0xc92f) 239 #define MT9M114_CAM_LL_START_AP_THRESH CCI_REG8(0xc930) 240 #define MT9M114_CAM_LL_STOP_DEMOSAICING CCI_REG8(0xc931) 241 #define MT9M114_CAM_LL_STOP_AP_GAIN CCI_REG8(0xc932) 242 #define MT9M114_CAM_LL_STOP_AP_THRESH CCI_REG8(0xc933) 243 #define MT9M114_CAM_LL_START_NR_RED CCI_REG8(0xc934) 244 #define MT9M114_CAM_LL_START_NR_GREEN CCI_REG8(0xc935) 245 #define MT9M114_CAM_LL_START_NR_BLUE CCI_REG8(0xc936) 246 #define MT9M114_CAM_LL_START_NR_THRESH CCI_REG8(0xc937) 247 #define MT9M114_CAM_LL_STOP_NR_RED CCI_REG8(0xc938) 248 #define MT9M114_CAM_LL_STOP_NR_GREEN CCI_REG8(0xc939) 249 #define MT9M114_CAM_LL_STOP_NR_BLUE CCI_REG8(0xc93a) 250 #define MT9M114_CAM_LL_STOP_NR_THRESH CCI_REG8(0xc93b) 251 #define MT9M114_CAM_LL_START_CONTRAST_BM CCI_REG16(0xc93c) 252 #define MT9M114_CAM_LL_STOP_CONTRAST_BM CCI_REG16(0xc93e) 253 #define MT9M114_CAM_LL_GAMMA CCI_REG16(0xc940) 254 #define MT9M114_CAM_LL_START_CONTRAST_GRADIENT CCI_REG8(0xc942) 255 #define MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT CCI_REG8(0xc943) 256 #define MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc944) 257 #define MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc945) 258 #define MT9M114_CAM_LL_START_GAIN_METRIC CCI_REG16(0xc946) 259 #define MT9M114_CAM_LL_STOP_GAIN_METRIC CCI_REG16(0xc948) 260 #define MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA CCI_REG16(0xc94a) 261 #define MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA CCI_REG16(0xc94c) 262 #define MT9M114_CAM_LL_CLUSTER_DC_TH_BM CCI_REG16(0xc94e) 263 #define MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE CCI_REG8(0xc950) 264 #define MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR CCI_REG8(0xc951) 265 #define MT9M114_CAM_LL_START_TARGET_LUMA_BM CCI_REG16(0xc952) 266 #define MT9M114_CAM_LL_STOP_TARGET_LUMA_BM CCI_REG16(0xc954) 267 #define MT9M114_CAM_PGA_PGA_CONTROL CCI_REG16(0xc95e) 268 #define MT9M114_CAM_SYSCTL_PLL_ENABLE CCI_REG8(0xc97e) 269 #define MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE BIT(0) 270 #define MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE 0x00 271 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N CCI_REG16(0xc980) 272 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(m, n) ((((n) - 1) << 8) | (m)) 273 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P CCI_REG16(0xc982) 274 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(p) (((p) - 1) << 8) 275 #define MT9M114_CAM_PORT_OUTPUT_CONTROL CCI_REG16(0xc984) 276 #define MT9M114_CAM_PORT_PORT_SELECT_PARALLEL (0 << 0) 277 #define MT9M114_CAM_PORT_PORT_SELECT_MIPI (1 << 0) 278 #define MT9M114_CAM_PORT_CLOCK_SLOWDOWN BIT(3) 279 #define MT9M114_CAM_PORT_TRUNCATE_RAW_BAYER BIT(4) 280 #define MT9M114_CAM_PORT_PIXCLK_GATE BIT(5) 281 #define MT9M114_CAM_PORT_CONT_MIPI_CLK BIT(6) 282 #define MT9M114_CAM_PORT_CHAN_NUM(vc) ((vc) << 8) 283 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO CCI_REG16(0xc988) 284 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO_VALUE(n) ((n) << 8) 285 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_TRAIL CCI_REG16(0xc98a) 286 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_VALUE(n) ((n) << 8) 287 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_TRAIL_VALUE(n) ((n) << 0) 288 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_PRE CCI_REG16(0xc98c) 289 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_VALUE(n) ((n) << 8) 290 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_PRE_VALUE(n) ((n) << 0) 291 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_ZERO CCI_REG16(0xc98e) 292 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_VALUE(n) ((n) << 8) 293 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_ZERO_VALUE(n) ((n) << 0) 294 295 /* System Manager registers */ 296 #define MT9M114_SYSMGR_NEXT_STATE CCI_REG8(0xdc00) 297 #define MT9M114_SYSMGR_CURRENT_STATE CCI_REG8(0xdc01) 298 #define MT9M114_SYSMGR_CMD_STATUS CCI_REG8(0xdc02) 299 300 /* Patch Loader registers */ 301 #define MT9M114_PATCHLDR_LOADER_ADDRESS CCI_REG16(0xe000) 302 #define MT9M114_PATCHLDR_PATCH_ID CCI_REG16(0xe002) 303 #define MT9M114_PATCHLDR_FIRMWARE_ID CCI_REG32(0xe004) 304 #define MT9M114_PATCHLDR_APPLY_STATUS CCI_REG8(0xe008) 305 #define MT9M114_PATCHLDR_NUM_PATCHES CCI_REG8(0xe009) 306 #define MT9M114_PATCHLDR_PATCH_ID_0 CCI_REG16(0xe00a) 307 #define MT9M114_PATCHLDR_PATCH_ID_1 CCI_REG16(0xe00c) 308 #define MT9M114_PATCHLDR_PATCH_ID_2 CCI_REG16(0xe00e) 309 #define MT9M114_PATCHLDR_PATCH_ID_3 CCI_REG16(0xe010) 310 #define MT9M114_PATCHLDR_PATCH_ID_4 CCI_REG16(0xe012) 311 #define MT9M114_PATCHLDR_PATCH_ID_5 CCI_REG16(0xe014) 312 #define MT9M114_PATCHLDR_PATCH_ID_6 CCI_REG16(0xe016) 313 #define MT9M114_PATCHLDR_PATCH_ID_7 CCI_REG16(0xe018) 314 315 /* SYS_STATE values (for SYSMGR_NEXT_STATE and SYSMGR_CURRENT_STATE) */ 316 #define MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE 0x28 317 #define MT9M114_SYS_STATE_STREAMING 0x31 318 #define MT9M114_SYS_STATE_START_STREAMING 0x34 319 #define MT9M114_SYS_STATE_ENTER_SUSPEND 0x40 320 #define MT9M114_SYS_STATE_SUSPENDED 0x41 321 #define MT9M114_SYS_STATE_ENTER_STANDBY 0x50 322 #define MT9M114_SYS_STATE_STANDBY 0x52 323 #define MT9M114_SYS_STATE_LEAVE_STANDBY 0x54 324 325 /* Result status of last SET_STATE comamnd */ 326 #define MT9M114_SET_STATE_RESULT_ENOERR 0x00 327 #define MT9M114_SET_STATE_RESULT_EINVAL 0x0c 328 #define MT9M114_SET_STATE_RESULT_ENOSPC 0x0d 329 330 /* 331 * The minimum amount of horizontal and vertical blanking is undocumented. The 332 * minimum values that have been seen in register lists are 303 and 21, use 333 * them. 334 * 335 * Set the default to achieve full resolution (1296x976 analog crop 336 * rectangle, 1280x960 output size) at 30fps with a 48 MHz pixclock. 337 */ 338 #define MT9M114_MIN_HBLANK 303 339 #define MT9M114_MIN_VBLANK 21 340 #define MT9M114_DEF_HBLANK 308 341 #define MT9M114_DEF_VBLANK 21 342 343 #define MT9M114_DEF_FRAME_RATE 30 344 #define MT9M114_MAX_FRAME_RATE 120 345 346 #define MT9M114_DEF_PIXCLOCK 48000000 347 348 #define MT9M114_PIXEL_ARRAY_WIDTH 1296U 349 #define MT9M114_PIXEL_ARRAY_HEIGHT 976U 350 351 /* 352 * These values are not well documented and are semi-arbitrary. The pixel array 353 * minimum output size is 8 pixels larger than the minimum scaler cropped input 354 * width to account for the demosaicing. 355 */ 356 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH (32U + 8U) 357 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT (32U + 8U) 358 #define MT9M114_SCALER_CROPPED_INPUT_WIDTH 32U 359 #define MT9M114_SCALER_CROPPED_INPUT_HEIGHT 32U 360 361 /* Indices into the mt9m114.ifp.tpg array. */ 362 #define MT9M114_TPG_PATTERN 0 363 #define MT9M114_TPG_RED 1 364 #define MT9M114_TPG_GREEN 2 365 #define MT9M114_TPG_BLUE 3 366 367 /* ----------------------------------------------------------------------------- 368 * Data Structures 369 */ 370 371 struct mt9m114_model_info { 372 bool state_standby_polling; 373 }; 374 375 enum mt9m114_format_flag { 376 MT9M114_FMT_FLAG_PARALLEL = BIT(0), 377 MT9M114_FMT_FLAG_CSI2 = BIT(1), 378 }; 379 380 struct mt9m114_format_info { 381 u32 code; 382 u32 output_format; 383 u32 flags; 384 }; 385 386 struct mt9m114 { 387 struct i2c_client *client; 388 struct regmap *regmap; 389 390 struct clk *clk; 391 struct gpio_desc *reset; 392 struct regulator_bulk_data supplies[3]; 393 struct v4l2_fwnode_endpoint bus_cfg; 394 bool bypass_pll; 395 396 struct aptina_pll pll; 397 398 unsigned int pixrate; 399 bool streaming; 400 u32 pad_slew_rate; 401 402 /* Pixel Array */ 403 struct { 404 struct v4l2_subdev sd; 405 struct media_pad pad; 406 407 struct v4l2_ctrl_handler hdl; 408 struct v4l2_ctrl *exposure; 409 struct v4l2_ctrl *gain; 410 struct v4l2_ctrl *hblank; 411 struct v4l2_ctrl *vblank; 412 } pa; 413 414 /* Image Flow Processor */ 415 struct { 416 struct v4l2_subdev sd; 417 struct media_pad pads[2]; 418 419 struct v4l2_ctrl_handler hdl; 420 unsigned int frame_rate; 421 422 struct v4l2_ctrl *tpg[4]; 423 } ifp; 424 425 const struct mt9m114_model_info *info; 426 }; 427 428 /* ----------------------------------------------------------------------------- 429 * Formats 430 */ 431 432 static const struct mt9m114_format_info mt9m114_format_infos[] = { 433 { 434 /* 435 * The first two entries are used as defaults, for parallel and 436 * CSI-2 buses respectively. Keep them in that order. 437 */ 438 .code = MEDIA_BUS_FMT_UYVY8_2X8, 439 .flags = MT9M114_FMT_FLAG_PARALLEL, 440 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV, 441 }, { 442 .code = MEDIA_BUS_FMT_UYVY8_1X16, 443 .flags = MT9M114_FMT_FLAG_CSI2, 444 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV, 445 }, { 446 .code = MEDIA_BUS_FMT_YUYV8_2X8, 447 .flags = MT9M114_FMT_FLAG_PARALLEL, 448 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV 449 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 450 }, { 451 .code = MEDIA_BUS_FMT_YUYV8_1X16, 452 .flags = MT9M114_FMT_FLAG_CSI2, 453 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV 454 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 455 }, { 456 .code = MEDIA_BUS_FMT_RGB565_2X8_LE, 457 .flags = MT9M114_FMT_FLAG_PARALLEL, 458 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 459 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB 460 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 461 }, { 462 .code = MEDIA_BUS_FMT_RGB565_2X8_BE, 463 .flags = MT9M114_FMT_FLAG_PARALLEL, 464 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 465 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB, 466 }, { 467 .code = MEDIA_BUS_FMT_RGB565_1X16, 468 .flags = MT9M114_FMT_FLAG_CSI2, 469 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 470 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB, 471 }, { 472 .code = MEDIA_BUS_FMT_SGRBG8_1X8, 473 .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8 474 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER, 475 .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2, 476 }, { 477 /* Keep the format compatible with the IFP sink pad last. */ 478 .code = MEDIA_BUS_FMT_SGRBG10_1X10, 479 .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10 480 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER, 481 .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2, 482 } 483 }; 484 485 static const struct mt9m114_format_info * 486 mt9m114_default_format_info(struct mt9m114 *sensor) 487 { 488 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 489 return &mt9m114_format_infos[1]; 490 else 491 return &mt9m114_format_infos[0]; 492 } 493 494 static const struct mt9m114_format_info * 495 mt9m114_format_info(struct mt9m114 *sensor, unsigned int pad, u32 code) 496 { 497 const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos); 498 unsigned int flag; 499 unsigned int i; 500 501 switch (pad) { 502 case 0: 503 return &mt9m114_format_infos[num_formats - 1]; 504 505 case 1: 506 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 507 flag = MT9M114_FMT_FLAG_CSI2; 508 else 509 flag = MT9M114_FMT_FLAG_PARALLEL; 510 511 for (i = 0; i < num_formats; ++i) { 512 const struct mt9m114_format_info *info = 513 &mt9m114_format_infos[i]; 514 515 if (info->code == code && info->flags & flag) 516 return info; 517 } 518 519 return mt9m114_default_format_info(sensor); 520 521 default: 522 return NULL; 523 } 524 } 525 526 /* ----------------------------------------------------------------------------- 527 * Initialization 528 */ 529 530 static const struct cci_reg_sequence mt9m114_init[] = { 531 { MT9M114_RESET_REGISTER, MT9M114_RESET_REGISTER_MASK_BAD | 532 MT9M114_RESET_REGISTER_LOCK_REG | 533 0x0010 }, 534 535 /* Sensor optimization */ 536 { CCI_REG16(0x316a), 0x8270 }, 537 { CCI_REG16(0x316c), 0x8270 }, 538 { CCI_REG16(0x3ed0), 0x2305 }, 539 { CCI_REG16(0x3ed2), 0x77cf }, 540 { CCI_REG16(0x316e), 0x8202 }, 541 { CCI_REG16(0x3180), 0x87ff }, 542 { CCI_REG16(0x30d4), 0x6080 }, 543 { CCI_REG16(0xa802), 0x0008 }, 544 545 { CCI_REG16(0x3e14), 0xff39 }, 546 547 /* APGA */ 548 { MT9M114_CAM_PGA_PGA_CONTROL, 0x0000 }, 549 550 /* Automatic White balance */ 551 { MT9M114_CAM_AWB_CCM_L(0), 0x0267 }, 552 { MT9M114_CAM_AWB_CCM_L(1), 0xff1a }, 553 { MT9M114_CAM_AWB_CCM_L(2), 0xffb3 }, 554 { MT9M114_CAM_AWB_CCM_L(3), 0xff80 }, 555 { MT9M114_CAM_AWB_CCM_L(4), 0x0166 }, 556 { MT9M114_CAM_AWB_CCM_L(5), 0x0003 }, 557 { MT9M114_CAM_AWB_CCM_L(6), 0xff9a }, 558 { MT9M114_CAM_AWB_CCM_L(7), 0xfeb4 }, 559 { MT9M114_CAM_AWB_CCM_L(8), 0x024d }, 560 { MT9M114_CAM_AWB_CCM_M(0), 0x01bf }, 561 { MT9M114_CAM_AWB_CCM_M(1), 0xff01 }, 562 { MT9M114_CAM_AWB_CCM_M(2), 0xfff3 }, 563 { MT9M114_CAM_AWB_CCM_M(3), 0xff75 }, 564 { MT9M114_CAM_AWB_CCM_M(4), 0x0198 }, 565 { MT9M114_CAM_AWB_CCM_M(5), 0xfffd }, 566 { MT9M114_CAM_AWB_CCM_M(6), 0xff9a }, 567 { MT9M114_CAM_AWB_CCM_M(7), 0xfee7 }, 568 { MT9M114_CAM_AWB_CCM_M(8), 0x02a8 }, 569 { MT9M114_CAM_AWB_CCM_R(0), 0x01d9 }, 570 { MT9M114_CAM_AWB_CCM_R(1), 0xff26 }, 571 { MT9M114_CAM_AWB_CCM_R(2), 0xfff3 }, 572 { MT9M114_CAM_AWB_CCM_R(3), 0xffb3 }, 573 { MT9M114_CAM_AWB_CCM_R(4), 0x0132 }, 574 { MT9M114_CAM_AWB_CCM_R(5), 0xffe8 }, 575 { MT9M114_CAM_AWB_CCM_R(6), 0xffda }, 576 { MT9M114_CAM_AWB_CCM_R(7), 0xfecd }, 577 { MT9M114_CAM_AWB_CCM_R(8), 0x02c2 }, 578 { MT9M114_CAM_AWB_CCM_L_RG_GAIN, 0x0075 }, 579 { MT9M114_CAM_AWB_CCM_L_BG_GAIN, 0x011c }, 580 { MT9M114_CAM_AWB_CCM_M_RG_GAIN, 0x009a }, 581 { MT9M114_CAM_AWB_CCM_M_BG_GAIN, 0x0105 }, 582 { MT9M114_CAM_AWB_CCM_R_RG_GAIN, 0x00a4 }, 583 { MT9M114_CAM_AWB_CCM_R_BG_GAIN, 0x00ac }, 584 { MT9M114_CAM_AWB_CCM_L_CTEMP, 0x0a8c }, 585 { MT9M114_CAM_AWB_CCM_M_CTEMP, 0x0f0a }, 586 { MT9M114_CAM_AWB_CCM_R_CTEMP, 0x1964 }, 587 { MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ, 51 }, 588 { MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ, 60 }, 589 { MT9M114_CAM_AWB_AWB_XSCALE, 3 }, 590 { MT9M114_CAM_AWB_AWB_YSCALE, 2 }, 591 { MT9M114_CAM_AWB_AWB_WEIGHTS(0), 0x0000 }, 592 { MT9M114_CAM_AWB_AWB_WEIGHTS(1), 0x0000 }, 593 { MT9M114_CAM_AWB_AWB_WEIGHTS(2), 0x0000 }, 594 { MT9M114_CAM_AWB_AWB_WEIGHTS(3), 0xe724 }, 595 { MT9M114_CAM_AWB_AWB_WEIGHTS(4), 0x1583 }, 596 { MT9M114_CAM_AWB_AWB_WEIGHTS(5), 0x2045 }, 597 { MT9M114_CAM_AWB_AWB_WEIGHTS(6), 0x03ff }, 598 { MT9M114_CAM_AWB_AWB_WEIGHTS(7), 0x007c }, 599 { MT9M114_CAM_AWB_K_R_L, 0x80 }, 600 { MT9M114_CAM_AWB_K_G_L, 0x80 }, 601 { MT9M114_CAM_AWB_K_B_L, 0x80 }, 602 { MT9M114_CAM_AWB_K_R_R, 0x88 }, 603 { MT9M114_CAM_AWB_K_G_R, 0x80 }, 604 { MT9M114_CAM_AWB_K_B_R, 0x80 }, 605 606 /* Low-Light Image Enhancements */ 607 { MT9M114_CAM_LL_START_BRIGHTNESS, 0x0020 }, 608 { MT9M114_CAM_LL_STOP_BRIGHTNESS, 0x009a }, 609 { MT9M114_CAM_LL_START_GAIN_METRIC, 0x0070 }, 610 { MT9M114_CAM_LL_STOP_GAIN_METRIC, 0x00f3 }, 611 { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x20 }, 612 { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x9a }, 613 { MT9M114_CAM_LL_START_SATURATION, 0x80 }, 614 { MT9M114_CAM_LL_END_SATURATION, 0x4b }, 615 { MT9M114_CAM_LL_START_DESATURATION, 0x00 }, 616 { MT9M114_CAM_LL_END_DESATURATION, 0xff }, 617 { MT9M114_CAM_LL_START_DEMOSAICING, 0x3c }, 618 { MT9M114_CAM_LL_START_AP_GAIN, 0x02 }, 619 { MT9M114_CAM_LL_START_AP_THRESH, 0x06 }, 620 { MT9M114_CAM_LL_STOP_DEMOSAICING, 0x64 }, 621 { MT9M114_CAM_LL_STOP_AP_GAIN, 0x01 }, 622 { MT9M114_CAM_LL_STOP_AP_THRESH, 0x0c }, 623 { MT9M114_CAM_LL_START_NR_RED, 0x3c }, 624 { MT9M114_CAM_LL_START_NR_GREEN, 0x3c }, 625 { MT9M114_CAM_LL_START_NR_BLUE, 0x3c }, 626 { MT9M114_CAM_LL_START_NR_THRESH, 0x0f }, 627 { MT9M114_CAM_LL_STOP_NR_RED, 0x64 }, 628 { MT9M114_CAM_LL_STOP_NR_GREEN, 0x64 }, 629 { MT9M114_CAM_LL_STOP_NR_BLUE, 0x64 }, 630 { MT9M114_CAM_LL_STOP_NR_THRESH, 0x32 }, 631 { MT9M114_CAM_LL_START_CONTRAST_BM, 0x0020 }, 632 { MT9M114_CAM_LL_STOP_CONTRAST_BM, 0x009a }, 633 { MT9M114_CAM_LL_GAMMA, 0x00dc }, 634 { MT9M114_CAM_LL_START_CONTRAST_GRADIENT, 0x38 }, 635 { MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT, 0x30 }, 636 { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x50 }, 637 { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x19 }, 638 { MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA, 0x0230 }, 639 { MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA, 0x0010 }, 640 { MT9M114_CAM_LL_CLUSTER_DC_TH_BM, 0x01cd }, 641 { MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE, 0x05 }, 642 { MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR, 0x40 }, 643 644 /* Auto-Exposure */ 645 { MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK, 0x1b }, 646 { MT9M114_CAM_AET_AEMODE, 0x00 }, 647 { MT9M114_CAM_AET_TARGET_GAIN, 0x0080 }, 648 { MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN, 0x0100 }, 649 { MT9M114_CAM_AET_BLACK_CLIPPING_TARGET, 0x005a }, 650 651 { MT9M114_CCM_DELTA_GAIN, 0x05 }, 652 { MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED, 0x20 }, 653 654 /* Pixel array timings and integration time */ 655 { MT9M114_CAM_SENSOR_CFG_ROW_SPEED, 1 }, 656 { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN, 219 }, 657 { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX, 1459 }, 658 { MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION, 96 }, 659 { MT9M114_CAM_SENSOR_CFG_REG_0_DATA, 32 }, 660 }; 661 662 /* ----------------------------------------------------------------------------- 663 * Hardware Configuration 664 */ 665 666 /* Wait for a command to complete. */ 667 static int mt9m114_poll_command(struct mt9m114 *sensor, u32 command) 668 { 669 unsigned int i; 670 u64 value; 671 int ret; 672 673 for (i = 0; i < 100; ++i) { 674 ret = cci_read(sensor->regmap, MT9M114_COMMAND_REGISTER, &value, 675 NULL); 676 if (ret < 0) 677 return ret; 678 679 if (!(value & command)) 680 break; 681 682 usleep_range(5000, 6000); 683 } 684 685 if (value & command) { 686 dev_err(&sensor->client->dev, "Command %u completion timeout\n", 687 command); 688 return -ETIMEDOUT; 689 } 690 691 if (!(value & MT9M114_COMMAND_REGISTER_OK)) { 692 dev_err(&sensor->client->dev, "Command %u failed\n", command); 693 return -EIO; 694 } 695 696 return 0; 697 } 698 699 /* Wait for a state to be entered. */ 700 static int mt9m114_poll_state(struct mt9m114 *sensor, u32 state) 701 { 702 unsigned int i; 703 u64 value; 704 int ret; 705 706 for (i = 0; i < 100; ++i) { 707 ret = cci_read(sensor->regmap, MT9M114_SYSMGR_CURRENT_STATE, 708 &value, NULL); 709 if (ret < 0) 710 return ret; 711 712 if (value == state) 713 return 0; 714 715 usleep_range(1000, 1500); 716 } 717 718 dev_err(&sensor->client->dev, "Timeout waiting for state 0x%02x\n", 719 state); 720 return -ETIMEDOUT; 721 } 722 723 static int mt9m114_set_state(struct mt9m114 *sensor, u8 next_state) 724 { 725 int ret = 0; 726 727 /* Set the next desired state and start the state transition. */ 728 cci_write(sensor->regmap, MT9M114_SYSMGR_NEXT_STATE, next_state, &ret); 729 cci_write(sensor->regmap, MT9M114_COMMAND_REGISTER, 730 MT9M114_COMMAND_REGISTER_OK | 731 MT9M114_COMMAND_REGISTER_SET_STATE, &ret); 732 if (ret < 0) 733 return ret; 734 735 /* Wait for the state transition to complete. */ 736 ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE); 737 if (ret < 0) 738 return ret; 739 740 return 0; 741 } 742 743 static int mt9m114_initialize(struct mt9m114 *sensor) 744 { 745 u32 value; 746 int ret; 747 748 ret = cci_multi_reg_write(sensor->regmap, mt9m114_init, 749 ARRAY_SIZE(mt9m114_init), NULL); 750 if (ret < 0) { 751 dev_err(&sensor->client->dev, 752 "Failed to initialize the sensor\n"); 753 return ret; 754 } 755 756 /* Configure the PLL. */ 757 if (sensor->bypass_pll) { 758 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE, 759 MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE, &ret); 760 } else { 761 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE, 762 MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE, &ret); 763 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N, 764 MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(sensor->pll.m, 765 sensor->pll.n), 766 &ret); 767 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_P, 768 MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(sensor->pll.p1), 769 &ret); 770 } 771 772 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_PIXCLK, 773 sensor->pixrate, &ret); 774 775 /* Configure the output mode. */ 776 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) { 777 value = MT9M114_CAM_PORT_PORT_SELECT_MIPI 778 | MT9M114_CAM_PORT_CHAN_NUM(0) 779 | 0x8000; 780 if (!(sensor->bus_cfg.bus.mipi_csi2.flags & 781 V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK)) 782 value |= MT9M114_CAM_PORT_CONT_MIPI_CLK; 783 } else { 784 value = MT9M114_CAM_PORT_PORT_SELECT_PARALLEL 785 | 0x8000; 786 } 787 cci_write(sensor->regmap, MT9M114_CAM_PORT_OUTPUT_CONTROL, value, &ret); 788 if (ret < 0) 789 return ret; 790 791 value = sensor->pad_slew_rate 792 | sensor->pad_slew_rate << 4 793 | sensor->pad_slew_rate << 8; 794 cci_write(sensor->regmap, MT9M114_PAD_SLEW, value, &ret); 795 if (ret < 0) 796 return ret; 797 798 return 0; 799 } 800 801 static int mt9m114_configure_pa(struct mt9m114 *sensor, 802 struct v4l2_subdev_state *state) 803 { 804 const struct v4l2_mbus_framefmt *format; 805 const struct v4l2_rect *crop; 806 unsigned int hratio, vratio; 807 u64 read_mode; 808 int ret; 809 810 format = v4l2_subdev_state_get_format(state, 0); 811 crop = v4l2_subdev_state_get_crop(state, 0); 812 813 ret = cci_read(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 814 &read_mode, NULL); 815 if (ret < 0) 816 return ret; 817 818 hratio = crop->width / format->width; 819 vratio = crop->height / format->height; 820 821 /* 822 * Pixel array crop and binning. The CAM_SENSOR_CFG_CPIPE_LAST_ROW 823 * register isn't clearly documented, but is always set to the number 824 * of active rows minus 4 divided by the vertical binning factor in all 825 * example sensor modes. 826 */ 827 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_START, 828 crop->left, &ret); 829 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_START, 830 crop->top, &ret); 831 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_END, 832 crop->width + crop->left - 1, &ret); 833 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_END, 834 crop->height + crop->top - 1, &ret); 835 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW, 836 (crop->height - 4) / vratio - 1, &ret); 837 838 read_mode &= ~(MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK | 839 MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK); 840 841 if (hratio > 1) 842 read_mode |= MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING; 843 if (vratio > 1) 844 read_mode |= MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING; 845 846 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 847 read_mode, &ret); 848 849 return ret; 850 } 851 852 /* 853 * For source pad formats other then RAW10 the IFP removes a 4 pixel border from 854 * its sink pad format size for demosaicing. 855 */ 856 static int mt9m114_ifp_get_border(struct v4l2_subdev_state *state) 857 { 858 const struct v4l2_mbus_framefmt *format = 859 v4l2_subdev_state_get_format(state, 1); 860 861 return format->code == MEDIA_BUS_FMT_SGRBG10_1X10 ? 0 : 4; 862 } 863 864 static int mt9m114_configure_ifp(struct mt9m114 *sensor, 865 struct v4l2_subdev_state *state) 866 { 867 const struct mt9m114_format_info *info; 868 const struct v4l2_mbus_framefmt *format; 869 const struct v4l2_rect *crop; 870 const struct v4l2_rect *compose; 871 unsigned int border; 872 u64 output_format; 873 int ret = 0; 874 875 format = v4l2_subdev_state_get_format(state, 1); 876 info = mt9m114_format_info(sensor, 1, format->code); 877 crop = v4l2_subdev_state_get_crop(state, 0); 878 compose = v4l2_subdev_state_get_compose(state, 0); 879 880 ret = cci_read(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT, 881 &output_format, NULL); 882 if (ret < 0) 883 return ret; 884 885 /* 886 * Color pipeline (IFP) cropping and scaling. The crop window registers 887 * apply cropping after demosaicing, which itself consumes 4 pixels on 888 * each side of the image. The crop rectangle exposed to userspace 889 * includes that demosaicing border, subtract it from the left and top 890 * coordinates to configure the crop window. 891 */ 892 border = mt9m114_ifp_get_border(state); 893 894 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_XOFFSET, 895 crop->left - border, &ret); 896 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_YOFFSET, 897 crop->top - border, &ret); 898 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_WIDTH, 899 crop->width, &ret); 900 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_HEIGHT, 901 crop->height, &ret); 902 903 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_WIDTH, 904 compose->width, &ret); 905 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_HEIGHT, 906 compose->height, &ret); 907 908 /* AWB and AE windows, use the full frame. */ 909 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART, 910 0, &ret); 911 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART, 912 0, &ret); 913 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND, 914 compose->width - 1, &ret); 915 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND, 916 compose->height - 1, &ret); 917 918 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART, 919 0, &ret); 920 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART, 921 0, &ret); 922 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND, 923 compose->width / 5 - 1, &ret); 924 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND, 925 compose->height / 5 - 1, &ret); 926 927 cci_write(sensor->regmap, MT9M114_CAM_CROP_CROPMODE, 928 MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN | 929 MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN, &ret); 930 931 /* Set the media bus code. */ 932 output_format &= ~(MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK | 933 MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK | 934 MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK | 935 MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES | 936 MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE); 937 output_format |= info->output_format; 938 939 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT, 940 output_format, &ret); 941 942 return ret; 943 } 944 945 static int mt9m114_set_frame_rate(struct mt9m114 *sensor) 946 { 947 u16 frame_rate = sensor->ifp.frame_rate << 8; 948 int ret = 0; 949 950 cci_write(sensor->regmap, MT9M114_CAM_AET_MIN_FRAME_RATE, 951 frame_rate, &ret); 952 cci_write(sensor->regmap, MT9M114_CAM_AET_MAX_FRAME_RATE, 953 frame_rate, &ret); 954 955 return ret; 956 } 957 958 static int mt9m114_start_streaming(struct mt9m114 *sensor, 959 struct v4l2_subdev_state *pa_state, 960 struct v4l2_subdev_state *ifp_state) 961 { 962 int ret; 963 964 ret = pm_runtime_resume_and_get(&sensor->client->dev); 965 if (ret) 966 return ret; 967 968 ret = mt9m114_initialize(sensor); 969 if (ret) 970 goto error; 971 972 ret = mt9m114_configure_ifp(sensor, ifp_state); 973 if (ret) 974 goto error; 975 976 ret = mt9m114_configure_pa(sensor, pa_state); 977 if (ret) 978 goto error; 979 980 ret = mt9m114_set_frame_rate(sensor); 981 if (ret) 982 goto error; 983 984 ret = __v4l2_ctrl_handler_setup(&sensor->pa.hdl); 985 if (ret) 986 goto error; 987 988 ret = __v4l2_ctrl_handler_setup(&sensor->ifp.hdl); 989 if (ret) 990 goto error; 991 992 /* 993 * The Change-Config state is transient and moves to the streaming 994 * state automatically. 995 */ 996 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 997 if (ret) 998 goto error; 999 1000 sensor->streaming = true; 1001 1002 return 0; 1003 1004 error: 1005 pm_runtime_put_autosuspend(&sensor->client->dev); 1006 1007 return ret; 1008 } 1009 1010 static int mt9m114_stop_streaming(struct mt9m114 *sensor) 1011 { 1012 int ret; 1013 1014 sensor->streaming = false; 1015 1016 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND); 1017 1018 pm_runtime_put_autosuspend(&sensor->client->dev); 1019 1020 return ret; 1021 } 1022 1023 /* ----------------------------------------------------------------------------- 1024 * Common Subdev Operations 1025 */ 1026 1027 static const struct media_entity_operations mt9m114_entity_ops = { 1028 .link_validate = v4l2_subdev_link_validate, 1029 }; 1030 1031 /* ----------------------------------------------------------------------------- 1032 * Pixel Array Control Operations 1033 */ 1034 1035 static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1036 { 1037 return container_of(ctrl->handler, struct mt9m114, pa.hdl); 1038 } 1039 1040 static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl) 1041 { 1042 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1043 u64 value; 1044 int ret; 1045 1046 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1047 return 0; 1048 1049 switch (ctrl->id) { 1050 case V4L2_CID_EXPOSURE: 1051 ret = cci_read(sensor->regmap, 1052 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1053 &value, NULL); 1054 if (ret) 1055 break; 1056 1057 ctrl->val = value; 1058 break; 1059 1060 case V4L2_CID_ANALOGUE_GAIN: 1061 ret = cci_read(sensor->regmap, 1062 MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1063 &value, NULL); 1064 if (ret) 1065 break; 1066 1067 ctrl->val = value; 1068 break; 1069 1070 default: 1071 ret = -EINVAL; 1072 break; 1073 } 1074 1075 pm_runtime_put_autosuspend(&sensor->client->dev); 1076 1077 return ret; 1078 } 1079 1080 static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl) 1081 { 1082 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1083 const struct v4l2_mbus_framefmt *format; 1084 struct v4l2_subdev_state *state; 1085 int ret = 0; 1086 u64 mask; 1087 1088 /* V4L2 controls values are applied only when power is up. */ 1089 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1090 return 0; 1091 1092 state = v4l2_subdev_get_locked_active_state(&sensor->pa.sd); 1093 format = v4l2_subdev_state_get_format(state, 0); 1094 1095 switch (ctrl->id) { 1096 case V4L2_CID_HBLANK: 1097 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK, 1098 ctrl->val + format->width, &ret); 1099 break; 1100 1101 case V4L2_CID_VBLANK: 1102 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES, 1103 ctrl->val + format->height, &ret); 1104 break; 1105 1106 case V4L2_CID_EXPOSURE: 1107 cci_write(sensor->regmap, 1108 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1109 ctrl->val, &ret); 1110 break; 1111 1112 case V4L2_CID_ANALOGUE_GAIN: 1113 /* 1114 * The CAM_SENSOR_CONTROL_ANALOG_GAIN contains linear analog 1115 * gain values that are mapped to the GLOBAL_GAIN register 1116 * values by the sensor firmware. 1117 */ 1118 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1119 ctrl->val, &ret); 1120 break; 1121 1122 case V4L2_CID_HFLIP: 1123 mask = MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN; 1124 ret = cci_update_bits(sensor->regmap, 1125 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1126 mask, ctrl->val ? mask : 0, NULL); 1127 break; 1128 1129 case V4L2_CID_VFLIP: 1130 mask = MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN; 1131 ret = cci_update_bits(sensor->regmap, 1132 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1133 mask, ctrl->val ? mask : 0, NULL); 1134 break; 1135 1136 default: 1137 ret = -EINVAL; 1138 break; 1139 } 1140 1141 pm_runtime_put_autosuspend(&sensor->client->dev); 1142 1143 return ret; 1144 } 1145 1146 static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops = { 1147 .g_volatile_ctrl = mt9m114_pa_g_ctrl, 1148 .s_ctrl = mt9m114_pa_s_ctrl, 1149 }; 1150 1151 static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual) 1152 { 1153 /* 1154 * Update the volatile flag on the manual exposure and gain controls. 1155 * If the controls have switched to manual, read their current value 1156 * from the hardware to ensure that control read and write operations 1157 * will behave correctly 1158 */ 1159 if (manual) { 1160 mt9m114_pa_g_ctrl(sensor->pa.exposure); 1161 sensor->pa.exposure->cur.val = sensor->pa.exposure->val; 1162 sensor->pa.exposure->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1163 1164 mt9m114_pa_g_ctrl(sensor->pa.gain); 1165 sensor->pa.gain->cur.val = sensor->pa.gain->val; 1166 sensor->pa.gain->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1167 } else { 1168 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1169 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1170 } 1171 } 1172 1173 static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor, 1174 const struct v4l2_mbus_framefmt *format) 1175 { 1176 unsigned int max_blank; 1177 1178 /* Update the blanking controls ranges based on the output size. */ 1179 max_blank = MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 1180 - format->width; 1181 __v4l2_ctrl_modify_range(sensor->pa.hblank, MT9M114_MIN_HBLANK, 1182 max_blank, 1, MT9M114_DEF_HBLANK); 1183 1184 max_blank = MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 1185 - format->height; 1186 __v4l2_ctrl_modify_range(sensor->pa.vblank, MT9M114_MIN_VBLANK, 1187 max_blank, 1, MT9M114_DEF_VBLANK); 1188 } 1189 1190 /* ----------------------------------------------------------------------------- 1191 * Pixel Array Subdev Operations 1192 */ 1193 1194 static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd) 1195 { 1196 return container_of(sd, struct mt9m114, pa.sd); 1197 } 1198 1199 static int mt9m114_pa_init_state(struct v4l2_subdev *sd, 1200 struct v4l2_subdev_state *state) 1201 { 1202 struct v4l2_mbus_framefmt *format; 1203 struct v4l2_rect *crop; 1204 1205 crop = v4l2_subdev_state_get_crop(state, 0); 1206 1207 crop->left = 0; 1208 crop->top = 0; 1209 crop->width = MT9M114_PIXEL_ARRAY_WIDTH; 1210 crop->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1211 1212 format = v4l2_subdev_state_get_format(state, 0); 1213 1214 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1215 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1216 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1217 format->field = V4L2_FIELD_NONE; 1218 format->colorspace = V4L2_COLORSPACE_RAW; 1219 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1220 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1221 format->xfer_func = V4L2_XFER_FUNC_NONE; 1222 1223 return 0; 1224 } 1225 1226 static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd, 1227 struct v4l2_subdev_state *state, 1228 struct v4l2_subdev_mbus_code_enum *code) 1229 { 1230 if (code->index > 0) 1231 return -EINVAL; 1232 1233 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1234 1235 return 0; 1236 } 1237 1238 static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd, 1239 struct v4l2_subdev_state *state, 1240 struct v4l2_subdev_frame_size_enum *fse) 1241 { 1242 if (fse->index > 1) 1243 return -EINVAL; 1244 1245 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) 1246 return -EINVAL; 1247 1248 /* Report binning capability through frame size enumeration. */ 1249 fse->min_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1250 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1251 fse->min_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1252 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1253 1254 return 0; 1255 } 1256 1257 static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd, 1258 struct v4l2_subdev_state *state, 1259 struct v4l2_subdev_format *fmt) 1260 { 1261 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1262 struct v4l2_mbus_framefmt *format; 1263 struct v4l2_rect *crop; 1264 unsigned int hscale; 1265 unsigned int vscale; 1266 1267 crop = v4l2_subdev_state_get_crop(state, fmt->pad); 1268 format = v4l2_subdev_state_get_format(state, fmt->pad); 1269 1270 /* The sensor can bin horizontally and vertically. */ 1271 hscale = DIV_ROUND_CLOSEST(crop->width, fmt->format.width ? : 1); 1272 vscale = DIV_ROUND_CLOSEST(crop->height, fmt->format.height ? : 1); 1273 format->width = crop->width / clamp(hscale, 1U, 2U); 1274 format->height = crop->height / clamp(vscale, 1U, 2U); 1275 1276 fmt->format = *format; 1277 1278 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) 1279 mt9m114_pa_ctrl_update_blanking(sensor, format); 1280 1281 return 0; 1282 } 1283 1284 static int mt9m114_pa_get_selection(struct v4l2_subdev *sd, 1285 struct v4l2_subdev_state *state, 1286 struct v4l2_subdev_selection *sel) 1287 { 1288 switch (sel->target) { 1289 case V4L2_SEL_TGT_CROP: 1290 sel->r = *v4l2_subdev_state_get_crop(state, sel->pad); 1291 return 0; 1292 1293 case V4L2_SEL_TGT_CROP_DEFAULT: 1294 case V4L2_SEL_TGT_CROP_BOUNDS: 1295 case V4L2_SEL_TGT_NATIVE_SIZE: 1296 sel->r.left = 0; 1297 sel->r.top = 0; 1298 sel->r.width = MT9M114_PIXEL_ARRAY_WIDTH; 1299 sel->r.height = MT9M114_PIXEL_ARRAY_HEIGHT; 1300 return 0; 1301 1302 default: 1303 return -EINVAL; 1304 } 1305 } 1306 1307 static int mt9m114_pa_set_selection(struct v4l2_subdev *sd, 1308 struct v4l2_subdev_state *state, 1309 struct v4l2_subdev_selection *sel) 1310 { 1311 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1312 struct v4l2_mbus_framefmt *format; 1313 struct v4l2_rect *crop; 1314 int ret = 0; 1315 1316 if (sel->target != V4L2_SEL_TGT_CROP) 1317 return -EINVAL; 1318 1319 crop = v4l2_subdev_state_get_crop(state, sel->pad); 1320 format = v4l2_subdev_state_get_format(state, sel->pad); 1321 1322 /* 1323 * Clamp the crop rectangle. The vertical coordinates must be even, and 1324 * the horizontal coordinates must be a multiple of 4. 1325 * 1326 * FIXME: The horizontal coordinates must be a multiple of 8 when 1327 * binning, but binning is configured after setting the selection, so 1328 * we can't know tell here if it will be used. 1329 */ 1330 sel->r.left = ALIGN(sel->r.left, 4); 1331 sel->r.top = ALIGN(sel->r.top, 2); 1332 sel->r.width = clamp_t(unsigned int, ALIGN(sel->r.width, 4), 1333 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1334 MT9M114_PIXEL_ARRAY_WIDTH - sel->r.left); 1335 sel->r.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1336 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1337 MT9M114_PIXEL_ARRAY_HEIGHT - sel->r.top); 1338 1339 /* Changing the selection size is not allowed in streaming state. */ 1340 if (sensor->streaming && 1341 (sel->r.height != crop->height || sel->r.width != crop->width)) 1342 return -EBUSY; 1343 1344 *crop = sel->r; 1345 1346 /* Reset the format. */ 1347 format->width = crop->width; 1348 format->height = crop->height; 1349 1350 if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1351 return ret; 1352 1353 mt9m114_pa_ctrl_update_blanking(sensor, format); 1354 1355 /* Apply values immediately if streaming. */ 1356 if (sensor->streaming) { 1357 ret = mt9m114_configure_pa(sensor, state); 1358 if (ret) 1359 return ret; 1360 /* Changing the cropping config requires a CONFIG_CHANGE. */ 1361 ret = mt9m114_set_state(sensor, 1362 MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 1363 } 1364 return ret; 1365 } 1366 1367 static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = { 1368 .enum_mbus_code = mt9m114_pa_enum_mbus_code, 1369 .enum_frame_size = mt9m114_pa_enum_framesizes, 1370 .get_fmt = v4l2_subdev_get_fmt, 1371 .set_fmt = mt9m114_pa_set_fmt, 1372 .get_selection = mt9m114_pa_get_selection, 1373 .set_selection = mt9m114_pa_set_selection, 1374 }; 1375 1376 static const struct v4l2_subdev_ops mt9m114_pa_ops = { 1377 .pad = &mt9m114_pa_pad_ops, 1378 }; 1379 1380 static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = { 1381 .init_state = mt9m114_pa_init_state, 1382 }; 1383 1384 static int mt9m114_pa_init(struct mt9m114 *sensor) 1385 { 1386 struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl; 1387 struct v4l2_subdev *sd = &sensor->pa.sd; 1388 struct media_pad *pads = &sensor->pa.pad; 1389 const struct v4l2_mbus_framefmt *format; 1390 struct v4l2_subdev_state *state; 1391 unsigned int max_exposure; 1392 int ret; 1393 1394 /* Initialize the subdev. */ 1395 v4l2_subdev_init(sd, &mt9m114_pa_ops); 1396 sd->internal_ops = &mt9m114_pa_internal_ops; 1397 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array"); 1398 1399 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1400 sd->owner = THIS_MODULE; 1401 sd->dev = &sensor->client->dev; 1402 v4l2_set_subdevdata(sd, sensor->client); 1403 1404 /* Initialize the media entity. */ 1405 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; 1406 sd->entity.ops = &mt9m114_entity_ops; 1407 pads[0].flags = MEDIA_PAD_FL_SOURCE; 1408 ret = media_entity_pads_init(&sd->entity, 1, pads); 1409 if (ret < 0) 1410 return ret; 1411 1412 /* Initialize the control handler. */ 1413 v4l2_ctrl_handler_init(hdl, 7); 1414 1415 /* The range of the HBLANK and VBLANK controls will be updated below. */ 1416 sensor->pa.hblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1417 V4L2_CID_HBLANK, 1418 MT9M114_DEF_HBLANK, 1419 MT9M114_DEF_HBLANK, 1, 1420 MT9M114_DEF_HBLANK); 1421 sensor->pa.vblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1422 V4L2_CID_VBLANK, 1423 MT9M114_DEF_VBLANK, 1424 MT9M114_DEF_VBLANK, 1, 1425 MT9M114_DEF_VBLANK); 1426 1427 /* 1428 * The maximum coarse integration time is the frame length in lines 1429 * minus two. The default is taken directly from the datasheet, but 1430 * makes little sense as auto-exposure is enabled by default. 1431 */ 1432 max_exposure = MT9M114_PIXEL_ARRAY_HEIGHT + MT9M114_MIN_VBLANK - 2; 1433 sensor->pa.exposure = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1434 V4L2_CID_EXPOSURE, 1, 1435 max_exposure, 1, 16); 1436 if (sensor->pa.exposure) 1437 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1438 1439 sensor->pa.gain = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1440 V4L2_CID_ANALOGUE_GAIN, 1, 1441 511, 1, 32); 1442 if (sensor->pa.gain) 1443 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1444 1445 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1446 V4L2_CID_PIXEL_RATE, 1447 sensor->pixrate, sensor->pixrate, 1, 1448 sensor->pixrate); 1449 1450 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1451 V4L2_CID_HFLIP, 1452 0, 1, 1, 0); 1453 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1454 V4L2_CID_VFLIP, 1455 0, 1, 1, 0); 1456 1457 if (hdl->error) { 1458 ret = hdl->error; 1459 goto error; 1460 } 1461 1462 sd->state_lock = hdl->lock; 1463 1464 ret = v4l2_subdev_init_finalize(sd); 1465 if (ret) 1466 goto error; 1467 1468 /* Update the range of the blanking controls based on the format. */ 1469 state = v4l2_subdev_lock_and_get_active_state(sd); 1470 format = v4l2_subdev_state_get_format(state, 0); 1471 mt9m114_pa_ctrl_update_blanking(sensor, format); 1472 v4l2_subdev_unlock_state(state); 1473 1474 sd->ctrl_handler = hdl; 1475 1476 return 0; 1477 1478 error: 1479 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1480 media_entity_cleanup(&sensor->pa.sd.entity); 1481 return ret; 1482 } 1483 1484 static void mt9m114_pa_cleanup(struct mt9m114 *sensor) 1485 { 1486 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1487 media_entity_cleanup(&sensor->pa.sd.entity); 1488 } 1489 1490 /* ----------------------------------------------------------------------------- 1491 * Image Flow Processor Control Operations 1492 */ 1493 1494 static const char * const mt9m114_test_pattern_menu[] = { 1495 "Disabled", 1496 "Solid Color", 1497 "100% Color Bars", 1498 "Pseudo-Random", 1499 "Fade-to-Gray Color Bars", 1500 "Walking Ones 10-bit", 1501 "Walking Ones 8-bit", 1502 }; 1503 1504 /* Keep in sync with mt9m114_test_pattern_menu */ 1505 static const unsigned int mt9m114_test_pattern_value[] = { 1506 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID, 1507 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS, 1508 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM, 1509 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS, 1510 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B, 1511 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B, 1512 }; 1513 1514 static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1515 { 1516 return container_of(ctrl->handler, struct mt9m114, ifp.hdl); 1517 } 1518 1519 static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl) 1520 { 1521 struct mt9m114 *sensor = ifp_ctrl_to_mt9m114(ctrl); 1522 u32 value; 1523 int ret = 0; 1524 1525 if (ctrl->id == V4L2_CID_EXPOSURE_AUTO) 1526 mt9m114_pa_ctrl_update_exposure(sensor, 1527 ctrl->val != V4L2_EXPOSURE_AUTO); 1528 1529 /* V4L2 controls values are applied only when power is up. */ 1530 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1531 return 0; 1532 1533 switch (ctrl->id) { 1534 case V4L2_CID_AUTO_WHITE_BALANCE: 1535 /* Control both the AWB mode and the CCM algorithm. */ 1536 if (ctrl->val) 1537 value = MT9M114_CAM_AWB_MODE_AUTO 1538 | MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE; 1539 else 1540 value = 0; 1541 1542 cci_write(sensor->regmap, MT9M114_CAM_AWB_AWBMODE, value, &ret); 1543 1544 if (ctrl->val) 1545 value = MT9M114_CCM_EXEC_CALC_CCM_MATRIX | 0x22; 1546 else 1547 value = 0; 1548 1549 cci_write(sensor->regmap, MT9M114_CCM_ALGO, value, &ret); 1550 break; 1551 1552 case V4L2_CID_EXPOSURE_AUTO: 1553 if (ctrl->val == V4L2_EXPOSURE_AUTO) 1554 value = MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE 1555 | 0x00fe; 1556 else 1557 value = 0; 1558 1559 cci_write(sensor->regmap, MT9M114_AE_TRACK_ALGO, value, &ret); 1560 if (ret) 1561 break; 1562 1563 break; 1564 1565 case V4L2_CID_TEST_PATTERN: 1566 case V4L2_CID_TEST_PATTERN_RED: 1567 case V4L2_CID_TEST_PATTERN_GREENR: 1568 case V4L2_CID_TEST_PATTERN_BLUE: { 1569 unsigned int pattern = sensor->ifp.tpg[MT9M114_TPG_PATTERN]->val; 1570 1571 if (pattern) { 1572 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1573 MT9M114_CAM_MODE_SELECT_TEST_PATTERN, &ret); 1574 cci_write(sensor->regmap, 1575 MT9M114_CAM_MODE_TEST_PATTERN_SELECT, 1576 mt9m114_test_pattern_value[pattern - 1], &ret); 1577 cci_write(sensor->regmap, 1578 MT9M114_CAM_MODE_TEST_PATTERN_RED, 1579 sensor->ifp.tpg[MT9M114_TPG_RED]->val, &ret); 1580 cci_write(sensor->regmap, 1581 MT9M114_CAM_MODE_TEST_PATTERN_GREEN, 1582 sensor->ifp.tpg[MT9M114_TPG_GREEN]->val, &ret); 1583 cci_write(sensor->regmap, 1584 MT9M114_CAM_MODE_TEST_PATTERN_BLUE, 1585 sensor->ifp.tpg[MT9M114_TPG_BLUE]->val, &ret); 1586 } else { 1587 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1588 MT9M114_CAM_MODE_SELECT_NORMAL, &ret); 1589 } 1590 1591 /* 1592 * A Config-Change needs to be issued for the change to take 1593 * effect. If we're not streaming ignore this, the change will 1594 * be applied when the stream is started. 1595 */ 1596 if (ret || !sensor->streaming) 1597 break; 1598 1599 ret = mt9m114_set_state(sensor, 1600 MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 1601 break; 1602 } 1603 1604 default: 1605 ret = -EINVAL; 1606 break; 1607 } 1608 1609 pm_runtime_put_autosuspend(&sensor->client->dev); 1610 1611 return ret; 1612 } 1613 1614 static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops = { 1615 .s_ctrl = mt9m114_ifp_s_ctrl, 1616 }; 1617 1618 /* ----------------------------------------------------------------------------- 1619 * Image Flow Processor Subdev Operations 1620 */ 1621 1622 static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd) 1623 { 1624 return container_of(sd, struct mt9m114, ifp.sd); 1625 } 1626 1627 static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable) 1628 { 1629 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1630 struct v4l2_subdev_state *pa_state; 1631 struct v4l2_subdev_state *ifp_state; 1632 int ret; 1633 1634 if (!enable) 1635 return mt9m114_stop_streaming(sensor); 1636 1637 ifp_state = v4l2_subdev_lock_and_get_active_state(&sensor->ifp.sd); 1638 pa_state = v4l2_subdev_lock_and_get_active_state(&sensor->pa.sd); 1639 1640 ret = mt9m114_start_streaming(sensor, pa_state, ifp_state); 1641 1642 v4l2_subdev_unlock_state(pa_state); 1643 v4l2_subdev_unlock_state(ifp_state); 1644 1645 return ret; 1646 } 1647 1648 static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd, 1649 struct v4l2_subdev_state *sd_state, 1650 struct v4l2_subdev_frame_interval *interval) 1651 { 1652 struct v4l2_fract *ival = &interval->interval; 1653 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1654 1655 /* 1656 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1657 * subdev active state API. 1658 */ 1659 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1660 return -EINVAL; 1661 1662 ival->numerator = 1; 1663 ival->denominator = sensor->ifp.frame_rate; 1664 1665 return 0; 1666 } 1667 1668 static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd, 1669 struct v4l2_subdev_state *sd_state, 1670 struct v4l2_subdev_frame_interval *interval) 1671 { 1672 struct v4l2_fract *ival = &interval->interval; 1673 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1674 int ret = 0; 1675 1676 /* 1677 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1678 * subdev active state API. 1679 */ 1680 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1681 return -EINVAL; 1682 1683 if (ival->numerator != 0 && ival->denominator != 0) 1684 sensor->ifp.frame_rate = min_t(unsigned int, 1685 ival->denominator / ival->numerator, 1686 MT9M114_MAX_FRAME_RATE); 1687 else 1688 sensor->ifp.frame_rate = MT9M114_MAX_FRAME_RATE; 1689 1690 ival->numerator = 1; 1691 ival->denominator = sensor->ifp.frame_rate; 1692 1693 if (sensor->streaming) 1694 ret = mt9m114_set_frame_rate(sensor); 1695 1696 return ret; 1697 } 1698 1699 static int mt9m114_ifp_init_state(struct v4l2_subdev *sd, 1700 struct v4l2_subdev_state *state) 1701 { 1702 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1703 struct v4l2_mbus_framefmt *format; 1704 struct v4l2_rect *crop; 1705 struct v4l2_rect *compose; 1706 1707 format = v4l2_subdev_state_get_format(state, 0); 1708 1709 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1710 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1711 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1712 format->field = V4L2_FIELD_NONE; 1713 format->colorspace = V4L2_COLORSPACE_RAW; 1714 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1715 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1716 format->xfer_func = V4L2_XFER_FUNC_NONE; 1717 1718 crop = v4l2_subdev_state_get_crop(state, 0); 1719 1720 crop->left = 4; 1721 crop->top = 4; 1722 crop->width = format->width - 8; 1723 crop->height = format->height - 8; 1724 1725 compose = v4l2_subdev_state_get_compose(state, 0); 1726 1727 compose->left = 0; 1728 compose->top = 0; 1729 compose->width = crop->width; 1730 compose->height = crop->height; 1731 1732 format = v4l2_subdev_state_get_format(state, 1); 1733 1734 format->width = compose->width; 1735 format->height = compose->height; 1736 format->code = mt9m114_default_format_info(sensor)->code; 1737 format->field = V4L2_FIELD_NONE; 1738 format->colorspace = V4L2_COLORSPACE_SRGB; 1739 format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 1740 format->quantization = V4L2_QUANTIZATION_DEFAULT; 1741 format->xfer_func = V4L2_XFER_FUNC_DEFAULT; 1742 1743 return 0; 1744 } 1745 1746 static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd, 1747 struct v4l2_subdev_state *state, 1748 struct v4l2_subdev_mbus_code_enum *code) 1749 { 1750 const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos); 1751 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1752 unsigned int index = 0; 1753 unsigned int flag; 1754 unsigned int i; 1755 1756 switch (code->pad) { 1757 case 0: 1758 if (code->index != 0) 1759 return -EINVAL; 1760 1761 code->code = mt9m114_format_infos[num_formats - 1].code; 1762 return 0; 1763 1764 case 1: 1765 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 1766 flag = MT9M114_FMT_FLAG_CSI2; 1767 else 1768 flag = MT9M114_FMT_FLAG_PARALLEL; 1769 1770 for (i = 0; i < num_formats; ++i) { 1771 const struct mt9m114_format_info *info = 1772 &mt9m114_format_infos[i]; 1773 1774 if (info->flags & flag) { 1775 if (index == code->index) { 1776 code->code = info->code; 1777 return 0; 1778 } 1779 1780 index++; 1781 } 1782 } 1783 1784 return -EINVAL; 1785 1786 default: 1787 return -EINVAL; 1788 } 1789 } 1790 1791 static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd, 1792 struct v4l2_subdev_state *state, 1793 struct v4l2_subdev_frame_size_enum *fse) 1794 { 1795 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1796 const struct mt9m114_format_info *info; 1797 1798 if (fse->index > 0) 1799 return -EINVAL; 1800 1801 info = mt9m114_format_info(sensor, fse->pad, fse->code); 1802 if (!info || info->code != fse->code) 1803 return -EINVAL; 1804 1805 if (fse->pad == 0) { 1806 fse->min_width = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH; 1807 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH; 1808 fse->min_height = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT; 1809 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT; 1810 } else { 1811 const struct v4l2_rect *crop; 1812 1813 crop = v4l2_subdev_state_get_crop(state, 0); 1814 1815 fse->max_width = crop->width; 1816 fse->max_height = crop->height; 1817 1818 fse->min_width = fse->max_width / 4; 1819 fse->min_height = fse->max_height / 4; 1820 } 1821 1822 return 0; 1823 } 1824 1825 static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd, 1826 struct v4l2_subdev_state *state, 1827 struct v4l2_subdev_frame_interval_enum *fie) 1828 { 1829 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1830 const struct mt9m114_format_info *info; 1831 1832 if (fie->index > 0) 1833 return -EINVAL; 1834 1835 info = mt9m114_format_info(sensor, fie->pad, fie->code); 1836 if (!info || info->code != fie->code) 1837 return -EINVAL; 1838 1839 fie->interval.numerator = 1; 1840 fie->interval.denominator = MT9M114_MAX_FRAME_RATE; 1841 1842 return 0; 1843 } 1844 1845 /* 1846 * Helper function to update IFP crop, compose rectangles and source format 1847 * when the pixel border size changes, which requires resetting these. 1848 */ 1849 static void mt9m114_ifp_update_sel_and_src_fmt(struct v4l2_subdev_state *state) 1850 { 1851 struct v4l2_mbus_framefmt *src_format, *sink_format; 1852 struct v4l2_rect *crop; 1853 unsigned int border; 1854 1855 sink_format = v4l2_subdev_state_get_format(state, 0); 1856 src_format = v4l2_subdev_state_get_format(state, 1); 1857 crop = v4l2_subdev_state_get_crop(state, 0); 1858 border = mt9m114_ifp_get_border(state); 1859 1860 crop->left = border; 1861 crop->top = border; 1862 crop->width = sink_format->width - 2 * border; 1863 crop->height = sink_format->height - 2 * border; 1864 *v4l2_subdev_state_get_compose(state, 0) = *crop; 1865 1866 src_format->width = crop->width; 1867 src_format->height = crop->height; 1868 1869 if (src_format->code == MEDIA_BUS_FMT_SGRBG10_1X10) { 1870 src_format->colorspace = V4L2_COLORSPACE_RAW; 1871 src_format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1872 src_format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1873 } else { 1874 src_format->colorspace = V4L2_COLORSPACE_SRGB; 1875 src_format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 1876 src_format->quantization = V4L2_QUANTIZATION_DEFAULT; 1877 } 1878 } 1879 1880 static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd, 1881 struct v4l2_subdev_state *state, 1882 struct v4l2_subdev_format *fmt) 1883 { 1884 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1885 struct v4l2_mbus_framefmt *format; 1886 1887 format = v4l2_subdev_state_get_format(state, fmt->pad); 1888 1889 if (fmt->pad == 0) { 1890 /* Only the size can be changed on the sink pad. */ 1891 format->width = clamp(ALIGN(fmt->format.width, 8), 1892 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1893 MT9M114_PIXEL_ARRAY_WIDTH); 1894 format->height = clamp(ALIGN(fmt->format.height, 8), 1895 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1896 MT9M114_PIXEL_ARRAY_HEIGHT); 1897 1898 /* Propagate changes downstream. */ 1899 mt9m114_ifp_update_sel_and_src_fmt(state); 1900 } else { 1901 const struct mt9m114_format_info *info; 1902 1903 /* Only the media bus code can be changed on the source pad. */ 1904 info = mt9m114_format_info(sensor, 1, fmt->format.code); 1905 1906 /* 1907 * If the output format changes from/to RAW10 then the crop 1908 * rectangle needs to be adjusted to add / remove the 4 pixel 1909 * border used for demosaicing. And these changes then need to 1910 * be propagated to the compose rectangle and source format. 1911 */ 1912 if ((format->code == MEDIA_BUS_FMT_SGRBG10_1X10) != 1913 (info->code == MEDIA_BUS_FMT_SGRBG10_1X10)) { 1914 format->code = info->code; 1915 mt9m114_ifp_update_sel_and_src_fmt(state); 1916 } else { 1917 format->code = info->code; 1918 } 1919 } 1920 1921 fmt->format = *format; 1922 1923 return 0; 1924 } 1925 1926 static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd, 1927 struct v4l2_subdev_state *state, 1928 struct v4l2_subdev_selection *sel) 1929 { 1930 const struct v4l2_mbus_framefmt *format; 1931 const struct v4l2_rect *crop; 1932 unsigned int border; 1933 int ret = 0; 1934 1935 /* Crop and compose are only supported on the sink pad. */ 1936 if (sel->pad != 0) 1937 return -EINVAL; 1938 1939 switch (sel->target) { 1940 case V4L2_SEL_TGT_CROP: 1941 sel->r = *v4l2_subdev_state_get_crop(state, 0); 1942 break; 1943 1944 case V4L2_SEL_TGT_CROP_DEFAULT: 1945 case V4L2_SEL_TGT_CROP_BOUNDS: 1946 /* 1947 * Crop defaults and bounds are equal to the sink format size. 1948 * For source pad formats other then RAW10 this gets reduced 1949 * by 4 pixels on each side for demosaicing. 1950 */ 1951 format = v4l2_subdev_state_get_format(state, 0); 1952 border = mt9m114_ifp_get_border(state); 1953 1954 sel->r.left = border; 1955 sel->r.top = border; 1956 sel->r.width = format->width - 2 * border; 1957 sel->r.height = format->height - 2 * border; 1958 break; 1959 1960 case V4L2_SEL_TGT_COMPOSE: 1961 sel->r = *v4l2_subdev_state_get_compose(state, 0); 1962 break; 1963 1964 case V4L2_SEL_TGT_COMPOSE_DEFAULT: 1965 case V4L2_SEL_TGT_COMPOSE_BOUNDS: 1966 /* 1967 * The compose default and bounds sizes are equal to the sink 1968 * crop rectangle size. 1969 */ 1970 crop = v4l2_subdev_state_get_crop(state, 0); 1971 sel->r.left = 0; 1972 sel->r.top = 0; 1973 sel->r.width = crop->width; 1974 sel->r.height = crop->height; 1975 break; 1976 1977 default: 1978 ret = -EINVAL; 1979 break; 1980 } 1981 1982 return ret; 1983 } 1984 1985 static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd, 1986 struct v4l2_subdev_state *state, 1987 struct v4l2_subdev_selection *sel) 1988 { 1989 struct v4l2_mbus_framefmt *format, *src_format; 1990 struct v4l2_rect *crop; 1991 struct v4l2_rect *compose; 1992 unsigned int border; 1993 1994 if (sel->target != V4L2_SEL_TGT_CROP && 1995 sel->target != V4L2_SEL_TGT_COMPOSE) 1996 return -EINVAL; 1997 1998 /* Crop and compose are only supported on the sink pad. */ 1999 if (sel->pad != 0) 2000 return -EINVAL; 2001 2002 crop = v4l2_subdev_state_get_crop(state, 0); 2003 2004 /* Crop and compose cannot be changed when bypassing the scaler. */ 2005 src_format = v4l2_subdev_state_get_format(state, 1); 2006 if (src_format->code == MEDIA_BUS_FMT_SGRBG10_1X10) { 2007 sel->r = *crop; 2008 return 0; 2009 } 2010 2011 format = v4l2_subdev_state_get_format(state, 0); 2012 compose = v4l2_subdev_state_get_compose(state, 0); 2013 2014 if (sel->target == V4L2_SEL_TGT_CROP) { 2015 /* 2016 * Clamp the crop rectangle. For source pad formats other then 2017 * RAW10 demosaicing removes 4 pixels on each side of the image. 2018 */ 2019 border = mt9m114_ifp_get_border(state); 2020 2021 crop->left = clamp_t(unsigned int, ALIGN(sel->r.left, 2), border, 2022 format->width - border - 2023 MT9M114_SCALER_CROPPED_INPUT_WIDTH); 2024 crop->top = clamp_t(unsigned int, ALIGN(sel->r.top, 2), border, 2025 format->height - border - 2026 MT9M114_SCALER_CROPPED_INPUT_HEIGHT); 2027 crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 2028 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 2029 format->width - border - crop->left); 2030 crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 2031 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 2032 format->height - border - crop->top); 2033 2034 sel->r = *crop; 2035 2036 /* Propagate to the compose rectangle. */ 2037 compose->width = crop->width; 2038 compose->height = crop->height; 2039 } else { 2040 /* 2041 * Clamp the compose rectangle. The scaler can only downscale. 2042 */ 2043 compose->left = 0; 2044 compose->top = 0; 2045 compose->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 2046 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 2047 crop->width); 2048 compose->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 2049 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 2050 crop->height); 2051 2052 sel->r = *compose; 2053 } 2054 2055 /* Propagate the compose rectangle to the source format. */ 2056 src_format->width = compose->width; 2057 src_format->height = compose->height; 2058 2059 return 0; 2060 } 2061 2062 static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd) 2063 { 2064 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2065 2066 v4l2_device_unregister_subdev(&sensor->pa.sd); 2067 } 2068 2069 static int mt9m114_ifp_registered(struct v4l2_subdev *sd) 2070 { 2071 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2072 int ret; 2073 2074 ret = v4l2_device_register_subdev(sd->v4l2_dev, &sensor->pa.sd); 2075 if (ret < 0) { 2076 dev_err(&sensor->client->dev, 2077 "Failed to register pixel array subdev\n"); 2078 return ret; 2079 } 2080 2081 ret = media_create_pad_link(&sensor->pa.sd.entity, 0, 2082 &sensor->ifp.sd.entity, 0, 2083 MEDIA_LNK_FL_ENABLED | 2084 MEDIA_LNK_FL_IMMUTABLE); 2085 if (ret < 0) { 2086 dev_err(&sensor->client->dev, 2087 "Failed to link pixel array to ifp\n"); 2088 v4l2_device_unregister_subdev(&sensor->pa.sd); 2089 return ret; 2090 } 2091 2092 return 0; 2093 } 2094 2095 static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = { 2096 .s_stream = mt9m114_ifp_s_stream, 2097 }; 2098 2099 static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = { 2100 .enum_mbus_code = mt9m114_ifp_enum_mbus_code, 2101 .enum_frame_size = mt9m114_ifp_enum_framesizes, 2102 .enum_frame_interval = mt9m114_ifp_enum_frameintervals, 2103 .get_fmt = v4l2_subdev_get_fmt, 2104 .set_fmt = mt9m114_ifp_set_fmt, 2105 .get_selection = mt9m114_ifp_get_selection, 2106 .set_selection = mt9m114_ifp_set_selection, 2107 .get_frame_interval = mt9m114_ifp_get_frame_interval, 2108 .set_frame_interval = mt9m114_ifp_set_frame_interval, 2109 }; 2110 2111 static const struct v4l2_subdev_ops mt9m114_ifp_ops = { 2112 .video = &mt9m114_ifp_video_ops, 2113 .pad = &mt9m114_ifp_pad_ops, 2114 }; 2115 2116 static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = { 2117 .init_state = mt9m114_ifp_init_state, 2118 .registered = mt9m114_ifp_registered, 2119 .unregistered = mt9m114_ifp_unregistered, 2120 }; 2121 2122 static int mt9m114_ifp_init(struct mt9m114 *sensor) 2123 { 2124 struct v4l2_subdev *sd = &sensor->ifp.sd; 2125 struct media_pad *pads = sensor->ifp.pads; 2126 struct v4l2_ctrl_handler *hdl = &sensor->ifp.hdl; 2127 struct v4l2_ctrl *link_freq; 2128 int ret; 2129 2130 /* Initialize the subdev. */ 2131 v4l2_i2c_subdev_init(sd, sensor->client, &mt9m114_ifp_ops); 2132 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " ifp"); 2133 2134 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 2135 sd->internal_ops = &mt9m114_ifp_internal_ops; 2136 2137 /* Initialize the media entity. */ 2138 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP; 2139 sd->entity.ops = &mt9m114_entity_ops; 2140 pads[0].flags = MEDIA_PAD_FL_SINK; 2141 pads[1].flags = MEDIA_PAD_FL_SOURCE; 2142 ret = media_entity_pads_init(&sd->entity, 2, pads); 2143 if (ret < 0) 2144 return ret; 2145 2146 sensor->ifp.frame_rate = MT9M114_DEF_FRAME_RATE; 2147 2148 /* Initialize the control handler. */ 2149 v4l2_ctrl_handler_init(hdl, 8); 2150 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2151 V4L2_CID_AUTO_WHITE_BALANCE, 2152 0, 1, 1, 1); 2153 v4l2_ctrl_new_std_menu(hdl, &mt9m114_ifp_ctrl_ops, 2154 V4L2_CID_EXPOSURE_AUTO, 2155 V4L2_EXPOSURE_MANUAL, 0, 2156 V4L2_EXPOSURE_AUTO); 2157 2158 link_freq = v4l2_ctrl_new_int_menu(hdl, &mt9m114_ifp_ctrl_ops, 2159 V4L2_CID_LINK_FREQ, 2160 sensor->bus_cfg.nr_of_link_frequencies - 1, 2161 0, sensor->bus_cfg.link_frequencies); 2162 if (link_freq) 2163 link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; 2164 2165 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2166 V4L2_CID_PIXEL_RATE, 2167 sensor->pixrate, sensor->pixrate, 1, 2168 sensor->pixrate); 2169 2170 sensor->ifp.tpg[MT9M114_TPG_PATTERN] = 2171 v4l2_ctrl_new_std_menu_items(hdl, &mt9m114_ifp_ctrl_ops, 2172 V4L2_CID_TEST_PATTERN, 2173 ARRAY_SIZE(mt9m114_test_pattern_menu) - 1, 2174 0, 0, mt9m114_test_pattern_menu); 2175 sensor->ifp.tpg[MT9M114_TPG_RED] = 2176 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2177 V4L2_CID_TEST_PATTERN_RED, 2178 0, 1023, 1, 1023); 2179 sensor->ifp.tpg[MT9M114_TPG_GREEN] = 2180 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2181 V4L2_CID_TEST_PATTERN_GREENR, 2182 0, 1023, 1, 1023); 2183 sensor->ifp.tpg[MT9M114_TPG_BLUE] = 2184 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2185 V4L2_CID_TEST_PATTERN_BLUE, 2186 0, 1023, 1, 1023); 2187 2188 v4l2_ctrl_cluster(ARRAY_SIZE(sensor->ifp.tpg), sensor->ifp.tpg); 2189 2190 if (hdl->error) { 2191 ret = hdl->error; 2192 goto error; 2193 } 2194 2195 sd->ctrl_handler = hdl; 2196 sd->state_lock = hdl->lock; 2197 2198 ret = v4l2_subdev_init_finalize(sd); 2199 if (ret) 2200 goto error; 2201 2202 return 0; 2203 2204 error: 2205 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2206 media_entity_cleanup(&sensor->ifp.sd.entity); 2207 return ret; 2208 } 2209 2210 static void mt9m114_ifp_cleanup(struct mt9m114 *sensor) 2211 { 2212 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2213 media_entity_cleanup(&sensor->ifp.sd.entity); 2214 } 2215 2216 /* ----------------------------------------------------------------------------- 2217 * Power Management 2218 */ 2219 2220 static int mt9m114_power_on(struct mt9m114 *sensor) 2221 { 2222 int ret; 2223 2224 /* Enable power and clocks. */ 2225 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), 2226 sensor->supplies); 2227 if (ret < 0) 2228 return ret; 2229 2230 ret = clk_prepare_enable(sensor->clk); 2231 if (ret < 0) 2232 goto error_regulator; 2233 2234 /* Perform a hard reset if available, or a soft reset otherwise. */ 2235 if (sensor->reset) { 2236 long freq = clk_get_rate(sensor->clk); 2237 unsigned int duration; 2238 2239 /* 2240 * The minimum duration is 50 clock cycles, thus typically 2241 * around 2µs. Double it to be safe. 2242 */ 2243 duration = DIV_ROUND_UP(2 * 50 * 1000000, freq); 2244 2245 gpiod_set_value(sensor->reset, 1); 2246 fsleep(duration); 2247 gpiod_set_value(sensor->reset, 0); 2248 } else { 2249 /* 2250 * The power may have just been turned on, we need to wait for 2251 * the sensor to be ready to accept I2C commands. 2252 */ 2253 usleep_range(44500, 50000); 2254 2255 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 2256 MT9M114_RESET_SOC, &ret); 2257 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 0, 2258 &ret); 2259 2260 if (ret < 0) { 2261 dev_err(&sensor->client->dev, "Soft reset failed\n"); 2262 goto error_clock; 2263 } 2264 } 2265 2266 /* 2267 * Wait for the sensor to be ready to accept I2C commands by polling the 2268 * command register to wait for initialization to complete. 2269 */ 2270 usleep_range(44500, 50000); 2271 2272 ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE); 2273 if (ret < 0) 2274 goto error_clock; 2275 2276 if (sensor->bus_cfg.bus_type == V4L2_MBUS_PARALLEL) { 2277 /* 2278 * In parallel mode (OE set to low), the sensor will enter the 2279 * streaming state after initialization. Enter the standby 2280 * manually to stop streaming. 2281 */ 2282 ret = mt9m114_set_state(sensor, 2283 MT9M114_SYS_STATE_ENTER_STANDBY); 2284 if (ret < 0) 2285 goto error_clock; 2286 } 2287 2288 /* 2289 * Before issuing any Set-State command, we must ensure that the sensor 2290 * reaches the standby mode (either initiated manually above in 2291 * parallel mode, or automatically after reset in MIPI mode). 2292 */ 2293 if (sensor->info->state_standby_polling) { 2294 ret = mt9m114_poll_state(sensor, MT9M114_SYS_STATE_STANDBY); 2295 if (ret < 0) 2296 goto error_clock; 2297 } 2298 2299 return 0; 2300 2301 error_clock: 2302 clk_disable_unprepare(sensor->clk); 2303 error_regulator: 2304 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2305 return ret; 2306 } 2307 2308 static void mt9m114_power_off(struct mt9m114 *sensor) 2309 { 2310 unsigned int duration; 2311 2312 gpiod_set_value(sensor->reset, 1); 2313 /* Power off takes 10 clock cycles. Double it to be safe. */ 2314 duration = DIV_ROUND_UP(2 * 10 * 1000000, clk_get_rate(sensor->clk)); 2315 fsleep(duration); 2316 2317 clk_disable_unprepare(sensor->clk); 2318 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2319 } 2320 2321 static int __maybe_unused mt9m114_runtime_resume(struct device *dev) 2322 { 2323 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2324 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2325 2326 return mt9m114_power_on(sensor); 2327 } 2328 2329 static int __maybe_unused mt9m114_runtime_suspend(struct device *dev) 2330 { 2331 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2332 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2333 2334 mt9m114_power_off(sensor); 2335 2336 return 0; 2337 } 2338 2339 static const struct dev_pm_ops mt9m114_pm_ops = { 2340 SET_RUNTIME_PM_OPS(mt9m114_runtime_suspend, mt9m114_runtime_resume, NULL) 2341 }; 2342 2343 /* ----------------------------------------------------------------------------- 2344 * Probe & Remove 2345 */ 2346 2347 static int mt9m114_verify_link_frequency(struct mt9m114 *sensor, 2348 unsigned int pixrate) 2349 { 2350 unsigned int link_freq = sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY 2351 ? pixrate * 8 : pixrate * 2; 2352 2353 if (sensor->bus_cfg.nr_of_link_frequencies != 1 || 2354 sensor->bus_cfg.link_frequencies[0] != link_freq) 2355 return -EINVAL; 2356 2357 return 0; 2358 } 2359 2360 /* 2361 * Based on the docs the PLL is believed to have the following setup: 2362 * 2363 * +-----+ +-----+ +-----+ +-----+ +-----+ 2364 * Fin --> | / N | --> | x M | --> | x 2 | --> | / P | --> | / 2 | --> 2365 * +-----+ +-----+ +-----+ +-----+ +-----+ 2366 * fBit fWord fSensor 2367 * ext_clock int_clock out_clock pix_clock 2368 * 2369 * The MT9M114 docs give a max fBit rate of 768 MHz which translates to 2370 * an out_clock_max of 384 MHz. 2371 */ 2372 static int mt9m114_clk_init(struct mt9m114 *sensor) 2373 { 2374 static const struct aptina_pll_limits limits = { 2375 .ext_clock_min = 6000000, 2376 .ext_clock_max = 54000000, 2377 /* int_clock_* limits are not documented taken from mt9p031.c */ 2378 .int_clock_min = 2000000, 2379 .int_clock_max = 13500000, 2380 /* out_clock_min is not documented, taken from mt9p031.c */ 2381 .out_clock_min = 180000000, 2382 .out_clock_max = 384000000, 2383 .pix_clock_max = 48000000, 2384 .n_min = 1, 2385 .n_max = 64, 2386 .m_min = 16, 2387 .m_max = 192, 2388 .p1_min = 8, 2389 .p1_max = 8, 2390 }; 2391 unsigned int pixrate; 2392 int ret; 2393 2394 /* 2395 * Calculate the pixel rate and link frequency. The CSI-2 bus is clocked 2396 * for 16-bit per pixel, transmitted in DDR over a single lane. For 2397 * parallel mode, the sensor ouputs one pixel in two PIXCLK cycles. 2398 */ 2399 2400 /* 2401 * Check if EXTCLK fits the configured link frequency. Bypass the PLL 2402 * in this case. 2403 */ 2404 pixrate = clk_get_rate(sensor->clk) / 2; 2405 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2406 sensor->pixrate = pixrate; 2407 sensor->bypass_pll = true; 2408 return 0; 2409 } 2410 2411 /* Check if the PLL configuration fits the configured link frequency. */ 2412 sensor->pll.ext_clock = clk_get_rate(sensor->clk); 2413 sensor->pll.pix_clock = MT9M114_DEF_PIXCLOCK; 2414 2415 ret = aptina_pll_calculate(&sensor->client->dev, &limits, &sensor->pll); 2416 if (ret) 2417 return ret; 2418 2419 pixrate = sensor->pll.ext_clock * sensor->pll.m 2420 / (sensor->pll.n * sensor->pll.p1); 2421 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2422 sensor->pixrate = pixrate; 2423 sensor->bypass_pll = false; 2424 return 0; 2425 } 2426 2427 dev_err(&sensor->client->dev, "Unsupported DT link-frequencies\n"); 2428 return -EINVAL; 2429 } 2430 2431 static int mt9m114_identify(struct mt9m114 *sensor) 2432 { 2433 u64 major, minor, release, customer; 2434 u64 value; 2435 int ret; 2436 2437 ret = cci_read(sensor->regmap, MT9M114_CHIP_ID, &value, NULL); 2438 if (ret) { 2439 dev_err(&sensor->client->dev, "Failed to read chip ID\n"); 2440 return -ENXIO; 2441 } 2442 2443 if (value != 0x2481) { 2444 dev_err(&sensor->client->dev, "Invalid chip ID 0x%04llx\n", 2445 value); 2446 return -ENXIO; 2447 } 2448 2449 cci_read(sensor->regmap, MT9M114_MON_MAJOR_VERSION, &major, &ret); 2450 cci_read(sensor->regmap, MT9M114_MON_MINOR_VERSION, &minor, &ret); 2451 cci_read(sensor->regmap, MT9M114_MON_RELEASE_VERSION, &release, &ret); 2452 cci_read(sensor->regmap, MT9M114_CUSTOMER_REV, &customer, &ret); 2453 if (ret) { 2454 dev_err(&sensor->client->dev, "Failed to read version\n"); 2455 return -ENXIO; 2456 } 2457 2458 dev_dbg(&sensor->client->dev, 2459 "monitor v%llu.%llu.%04llx customer rev 0x%04llx\n", 2460 major, minor, release, customer); 2461 2462 return 0; 2463 } 2464 2465 static int mt9m114_parse_dt(struct mt9m114 *sensor) 2466 { 2467 struct fwnode_handle *fwnode = dev_fwnode(&sensor->client->dev); 2468 struct fwnode_handle *ep; 2469 int ret; 2470 2471 /* 2472 * On ACPI systems the fwnode graph can be initialized by a bridge 2473 * driver, which may not have probed yet. Wait for this. 2474 * 2475 * TODO: Return an error once bridge driver code will have moved 2476 * to the ACPI core. 2477 */ 2478 ep = fwnode_graph_get_next_endpoint(fwnode, NULL); 2479 if (!ep) 2480 return dev_err_probe(&sensor->client->dev, -EPROBE_DEFER, 2481 "waiting for fwnode graph endpoint\n"); 2482 2483 sensor->bus_cfg.bus_type = V4L2_MBUS_UNKNOWN; 2484 ret = v4l2_fwnode_endpoint_alloc_parse(ep, &sensor->bus_cfg); 2485 fwnode_handle_put(ep); 2486 if (ret < 0) { 2487 dev_err(&sensor->client->dev, "Failed to parse endpoint\n"); 2488 goto error; 2489 } 2490 2491 switch (sensor->bus_cfg.bus_type) { 2492 case V4L2_MBUS_CSI2_DPHY: 2493 case V4L2_MBUS_PARALLEL: 2494 break; 2495 2496 default: 2497 dev_err(&sensor->client->dev, "unsupported bus type %u\n", 2498 sensor->bus_cfg.bus_type); 2499 ret = -EINVAL; 2500 goto error; 2501 } 2502 2503 sensor->pad_slew_rate = MT9M114_PAD_SLEW_DEFAULT; 2504 device_property_read_u32(&sensor->client->dev, "slew-rate", 2505 &sensor->pad_slew_rate); 2506 2507 if (sensor->pad_slew_rate < MT9M114_PAD_SLEW_MIN || 2508 sensor->pad_slew_rate > MT9M114_PAD_SLEW_MAX) { 2509 dev_err(&sensor->client->dev, "Invalid slew-rate %u\n", 2510 sensor->pad_slew_rate); 2511 return -EINVAL; 2512 } 2513 2514 return 0; 2515 2516 error: 2517 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2518 return ret; 2519 } 2520 2521 static int mt9m114_probe(struct i2c_client *client) 2522 { 2523 struct device *dev = &client->dev; 2524 struct mt9m114 *sensor; 2525 int ret; 2526 2527 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); 2528 if (!sensor) 2529 return -ENOMEM; 2530 2531 sensor->client = client; 2532 2533 sensor->regmap = devm_cci_regmap_init_i2c(client, 16); 2534 if (IS_ERR(sensor->regmap)) { 2535 dev_err(dev, "Unable to initialize I2C\n"); 2536 return -ENODEV; 2537 } 2538 2539 ret = mt9m114_parse_dt(sensor); 2540 if (ret < 0) 2541 return ret; 2542 2543 sensor->info = device_get_match_data(dev); 2544 if (!sensor->info) 2545 return -ENODEV; 2546 2547 /* Acquire clocks, GPIOs and regulators. */ 2548 sensor->clk = devm_v4l2_sensor_clk_get(dev, NULL); 2549 if (IS_ERR(sensor->clk)) { 2550 ret = dev_err_probe(dev, PTR_ERR(sensor->clk), 2551 "Failed to get clock\n"); 2552 goto error_ep_free; 2553 } 2554 2555 sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); 2556 if (IS_ERR(sensor->reset)) { 2557 ret = PTR_ERR(sensor->reset); 2558 dev_err_probe(dev, ret, "Failed to get reset GPIO\n"); 2559 goto error_ep_free; 2560 } 2561 2562 sensor->supplies[0].supply = "vddio"; 2563 sensor->supplies[1].supply = "vdd"; 2564 sensor->supplies[2].supply = "vaa"; 2565 2566 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies), 2567 sensor->supplies); 2568 if (ret < 0) { 2569 dev_err_probe(dev, ret, "Failed to get regulators\n"); 2570 goto error_ep_free; 2571 } 2572 2573 ret = mt9m114_clk_init(sensor); 2574 if (ret) 2575 goto error_ep_free; 2576 2577 /* 2578 * Identify the sensor. The driver supports runtime PM, but needs to 2579 * work when runtime PM is disabled in the kernel. To that end, power 2580 * the sensor on manually here to reach the same state as if resumed 2581 * through runtime PM. 2582 */ 2583 ret = mt9m114_power_on(sensor); 2584 if (ret < 0) { 2585 dev_err_probe(dev, ret, "Could not power on the device\n"); 2586 goto error_ep_free; 2587 } 2588 2589 ret = mt9m114_identify(sensor); 2590 if (ret < 0) 2591 goto error_power_off; 2592 2593 /* 2594 * Enable runtime PM with autosuspend. As the device has been powered 2595 * manually, mark it as active, and increase the usage count without 2596 * resuming the device. 2597 */ 2598 pm_runtime_set_active(dev); 2599 pm_runtime_get_noresume(dev); 2600 pm_runtime_enable(dev); 2601 pm_runtime_set_autosuspend_delay(dev, 1000); 2602 pm_runtime_use_autosuspend(dev); 2603 2604 /* Initialize the subdevices. */ 2605 ret = mt9m114_pa_init(sensor); 2606 if (ret < 0) 2607 goto error_pm_cleanup; 2608 2609 ret = mt9m114_ifp_init(sensor); 2610 if (ret < 0) 2611 goto error_pa_cleanup; 2612 2613 ret = v4l2_async_register_subdev(&sensor->ifp.sd); 2614 if (ret < 0) 2615 goto error_ifp_cleanup; 2616 2617 /* 2618 * Decrease the PM usage count. The device will get suspended after the 2619 * autosuspend delay, turning the power off. 2620 */ 2621 pm_runtime_put_autosuspend(dev); 2622 2623 return 0; 2624 2625 error_ifp_cleanup: 2626 mt9m114_ifp_cleanup(sensor); 2627 error_pa_cleanup: 2628 mt9m114_pa_cleanup(sensor); 2629 error_pm_cleanup: 2630 pm_runtime_disable(dev); 2631 pm_runtime_put_noidle(dev); 2632 error_power_off: 2633 mt9m114_power_off(sensor); 2634 error_ep_free: 2635 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2636 return ret; 2637 } 2638 2639 static void mt9m114_remove(struct i2c_client *client) 2640 { 2641 struct v4l2_subdev *sd = i2c_get_clientdata(client); 2642 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2643 struct device *dev = &client->dev; 2644 2645 v4l2_async_unregister_subdev(&sensor->ifp.sd); 2646 2647 mt9m114_ifp_cleanup(sensor); 2648 mt9m114_pa_cleanup(sensor); 2649 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2650 2651 /* 2652 * Disable runtime PM. In case runtime PM is disabled in the kernel, 2653 * make sure to turn power off manually. 2654 */ 2655 pm_runtime_disable(dev); 2656 if (!pm_runtime_status_suspended(dev)) 2657 mt9m114_power_off(sensor); 2658 pm_runtime_set_suspended(dev); 2659 } 2660 2661 static const struct mt9m114_model_info mt9m114_models_default = { 2662 .state_standby_polling = true, 2663 }; 2664 2665 static const struct mt9m114_model_info mt9m114_models_aptina = { 2666 .state_standby_polling = false, 2667 }; 2668 2669 static const struct of_device_id mt9m114_of_ids[] = { 2670 { .compatible = "onnn,mt9m114", .data = &mt9m114_models_default }, 2671 { .compatible = "aptina,mi1040", .data = &mt9m114_models_aptina }, 2672 { /* sentinel */ } 2673 }; 2674 MODULE_DEVICE_TABLE(of, mt9m114_of_ids); 2675 2676 static const struct acpi_device_id mt9m114_acpi_ids[] = { 2677 { "INT33F0", (kernel_ulong_t)&mt9m114_models_default }, 2678 { /* sentinel */ } 2679 }; 2680 MODULE_DEVICE_TABLE(acpi, mt9m114_acpi_ids); 2681 2682 static struct i2c_driver mt9m114_driver = { 2683 .driver = { 2684 .name = "mt9m114", 2685 .pm = &mt9m114_pm_ops, 2686 .of_match_table = mt9m114_of_ids, 2687 .acpi_match_table = mt9m114_acpi_ids, 2688 }, 2689 .probe = mt9m114_probe, 2690 .remove = mt9m114_remove, 2691 }; 2692 2693 module_i2c_driver(mt9m114_driver); 2694 2695 MODULE_DESCRIPTION("onsemi MT9M114 Sensor Driver"); 2696 MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>"); 2697 MODULE_LICENSE("GPL"); 2698