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