0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef S5C73M3_H_
0010 #define S5C73M3_H_
0011
0012 #include <linux/clk.h>
0013 #include <linux/kernel.h>
0014 #include <linux/regulator/consumer.h>
0015 #include <media/v4l2-common.h>
0016 #include <media/v4l2-ctrls.h>
0017 #include <media/v4l2-subdev.h>
0018 #include <media/i2c/s5c73m3.h>
0019
0020 #define DRIVER_NAME "S5C73M3"
0021
0022 #define S5C73M3_ISP_FMT MEDIA_BUS_FMT_VYUY8_2X8
0023 #define S5C73M3_JPEG_FMT MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8
0024
0025
0026 enum s5c73m3_pads {
0027 S5C73M3_ISP_PAD,
0028 S5C73M3_JPEG_PAD,
0029 S5C73M3_NUM_PADS
0030 };
0031
0032 enum s5c73m3_oif_pads {
0033 OIF_ISP_PAD,
0034 OIF_JPEG_PAD,
0035 OIF_SOURCE_PAD,
0036 OIF_NUM_PADS
0037 };
0038
0039 #define S5C73M3_SENSOR_FW_LEN 6
0040 #define S5C73M3_SENSOR_TYPE_LEN 12
0041
0042 #define S5C73M3_REG(_addrh, _addrl) (((_addrh) << 16) | _addrl)
0043
0044 #define AHB_MSB_ADDR_PTR 0xfcfc
0045 #define REG_CMDWR_ADDRH 0x0050
0046 #define REG_CMDWR_ADDRL 0x0054
0047 #define REG_CMDRD_ADDRH 0x0058
0048 #define REG_CMDRD_ADDRL 0x005c
0049 #define REG_CMDBUF_ADDR 0x0f14
0050
0051 #define REG_I2C_SEQ_STATUS S5C73M3_REG(0x0009, 0x59A6)
0052 #define SEQ_END_PLL (1<<0x0)
0053 #define SEQ_END_SENSOR (1<<0x1)
0054 #define SEQ_END_GPIO (1<<0x2)
0055 #define SEQ_END_FROM (1<<0x3)
0056 #define SEQ_END_STABLE_AE_AWB (1<<0x4)
0057 #define SEQ_END_READY_I2C_CMD (1<<0x5)
0058
0059 #define REG_I2C_STATUS S5C73M3_REG(0x0009, 0x599E)
0060 #define I2C_STATUS_CIS_I2C (1<<0x0)
0061 #define I2C_STATUS_AF_INIT (1<<0x1)
0062 #define I2C_STATUS_CAL_DATA (1<<0x2)
0063 #define I2C_STATUS_FRAME_COUNT (1<<0x3)
0064 #define I2C_STATUS_FROM_INIT (1<<0x4)
0065 #define I2C_STATUS_I2C_CIS_STREAM_OFF (1<<0x5)
0066 #define I2C_STATUS_I2C_N_CMD_OVER (1<<0x6)
0067 #define I2C_STATUS_I2C_N_CMD_MISMATCH (1<<0x7)
0068 #define I2C_STATUS_CHECK_BIN_CRC (1<<0x8)
0069 #define I2C_STATUS_EXCEPTION (1<<0x9)
0070 #define I2C_STATUS_INIF_INIT_STATE (0x8)
0071
0072 #define REG_STATUS S5C73M3_REG(0x0009, 0x5080)
0073 #define REG_STATUS_BOOT_SUB_MAIN_ENTER 0xff01
0074 #define REG_STATUS_BOOT_SRAM_TIMING_OK 0xff02
0075 #define REG_STATUS_BOOT_INTERRUPTS_EN 0xff03
0076 #define REG_STATUS_BOOT_R_PLL_DONE 0xff04
0077 #define REG_STATUS_BOOT_R_PLL_LOCKTIME_DONE 0xff05
0078 #define REG_STATUS_BOOT_DELAY_COUNT_DONE 0xff06
0079 #define REG_STATUS_BOOT_I_PLL_DONE 0xff07
0080 #define REG_STATUS_BOOT_I_PLL_LOCKTIME_DONE 0xff08
0081 #define REG_STATUS_BOOT_PLL_INIT_OK 0xff09
0082 #define REG_STATUS_BOOT_SENSOR_INIT_OK 0xff0a
0083 #define REG_STATUS_BOOT_GPIO_SETTING_OK 0xff0b
0084 #define REG_STATUS_BOOT_READ_CAL_DATA_OK 0xff0c
0085 #define REG_STATUS_BOOT_STABLE_AE_AWB_OK 0xff0d
0086 #define REG_STATUS_ISP_COMMAND_COMPLETED 0xffff
0087 #define REG_STATUS_EXCEPTION_OCCURED 0xdead
0088
0089 #define COMM_RESULT_OFFSET S5C73M3_REG(0x0009, 0x5000)
0090
0091 #define COMM_IMG_OUTPUT 0x0902
0092 #define COMM_IMG_OUTPUT_HDR 0x0008
0093 #define COMM_IMG_OUTPUT_YUV 0x0009
0094 #define COMM_IMG_OUTPUT_INTERLEAVED 0x000d
0095
0096 #define COMM_STILL_PRE_FLASH 0x0a00
0097 #define COMM_STILL_PRE_FLASH_FIRE 0x0000
0098 #define COMM_STILL_PRE_FLASH_NON_FIRED 0x0000
0099 #define COMM_STILL_PRE_FLASH_FIRED 0x0001
0100
0101 #define COMM_STILL_MAIN_FLASH 0x0a02
0102 #define COMM_STILL_MAIN_FLASH_CANCEL 0x0001
0103 #define COMM_STILL_MAIN_FLASH_FIRE 0x0002
0104
0105 #define COMM_ZOOM_STEP 0x0b00
0106
0107 #define COMM_IMAGE_EFFECT 0x0b0a
0108 #define COMM_IMAGE_EFFECT_NONE 0x0001
0109 #define COMM_IMAGE_EFFECT_NEGATIVE 0x0002
0110 #define COMM_IMAGE_EFFECT_AQUA 0x0003
0111 #define COMM_IMAGE_EFFECT_SEPIA 0x0004
0112 #define COMM_IMAGE_EFFECT_MONO 0x0005
0113
0114 #define COMM_IMAGE_QUALITY 0x0b0c
0115 #define COMM_IMAGE_QUALITY_SUPERFINE 0x0000
0116 #define COMM_IMAGE_QUALITY_FINE 0x0001
0117 #define COMM_IMAGE_QUALITY_NORMAL 0x0002
0118
0119 #define COMM_FLASH_MODE 0x0b0e
0120 #define COMM_FLASH_MODE_OFF 0x0000
0121 #define COMM_FLASH_MODE_ON 0x0001
0122 #define COMM_FLASH_MODE_AUTO 0x0002
0123
0124 #define COMM_FLASH_STATUS 0x0b80
0125 #define COMM_FLASH_STATUS_OFF 0x0001
0126 #define COMM_FLASH_STATUS_ON 0x0002
0127 #define COMM_FLASH_STATUS_AUTO 0x0003
0128
0129 #define COMM_FLASH_TORCH 0x0b12
0130 #define COMM_FLASH_TORCH_OFF 0x0000
0131 #define COMM_FLASH_TORCH_ON 0x0001
0132
0133 #define COMM_AE_NEEDS_FLASH 0x0cba
0134 #define COMM_AE_NEEDS_FLASH_OFF 0x0000
0135 #define COMM_AE_NEEDS_FLASH_ON 0x0001
0136
0137 #define COMM_CHG_MODE 0x0b10
0138 #define COMM_CHG_MODE_NEW 0x8000
0139 #define COMM_CHG_MODE_SUBSAMPLING_HALF 0x2000
0140 #define COMM_CHG_MODE_SUBSAMPLING_QUARTER 0x4000
0141
0142 #define COMM_CHG_MODE_YUV_320_240 0x0001
0143 #define COMM_CHG_MODE_YUV_640_480 0x0002
0144 #define COMM_CHG_MODE_YUV_880_720 0x0003
0145 #define COMM_CHG_MODE_YUV_960_720 0x0004
0146 #define COMM_CHG_MODE_YUV_1184_666 0x0005
0147 #define COMM_CHG_MODE_YUV_1280_720 0x0006
0148 #define COMM_CHG_MODE_YUV_1536_864 0x0007
0149 #define COMM_CHG_MODE_YUV_1600_1200 0x0008
0150 #define COMM_CHG_MODE_YUV_1632_1224 0x0009
0151 #define COMM_CHG_MODE_YUV_1920_1080 0x000a
0152 #define COMM_CHG_MODE_YUV_1920_1440 0x000b
0153 #define COMM_CHG_MODE_YUV_2304_1296 0x000c
0154 #define COMM_CHG_MODE_YUV_3264_2448 0x000d
0155 #define COMM_CHG_MODE_YUV_352_288 0x000e
0156 #define COMM_CHG_MODE_YUV_1008_672 0x000f
0157
0158 #define COMM_CHG_MODE_JPEG_640_480 0x0010
0159 #define COMM_CHG_MODE_JPEG_800_450 0x0020
0160 #define COMM_CHG_MODE_JPEG_800_600 0x0030
0161 #define COMM_CHG_MODE_JPEG_1280_720 0x0040
0162 #define COMM_CHG_MODE_JPEG_1280_960 0x0050
0163 #define COMM_CHG_MODE_JPEG_1600_900 0x0060
0164 #define COMM_CHG_MODE_JPEG_1600_1200 0x0070
0165 #define COMM_CHG_MODE_JPEG_2048_1152 0x0080
0166 #define COMM_CHG_MODE_JPEG_2048_1536 0x0090
0167 #define COMM_CHG_MODE_JPEG_2560_1440 0x00a0
0168 #define COMM_CHG_MODE_JPEG_2560_1920 0x00b0
0169 #define COMM_CHG_MODE_JPEG_3264_2176 0x00c0
0170 #define COMM_CHG_MODE_JPEG_1024_768 0x00d0
0171 #define COMM_CHG_MODE_JPEG_3264_1836 0x00e0
0172 #define COMM_CHG_MODE_JPEG_3264_2448 0x00f0
0173
0174 #define COMM_AF_CON 0x0e00
0175 #define COMM_AF_CON_STOP 0x0000
0176 #define COMM_AF_CON_SCAN 0x0001
0177 #define COMM_AF_CON_START 0x0002
0178
0179 #define COMM_AF_CAL 0x0e06
0180 #define COMM_AF_TOUCH_AF 0x0e0a
0181
0182 #define REG_AF_STATUS S5C73M3_REG(0x0009, 0x5e80)
0183 #define REG_CAF_STATUS_FIND_SEARCH_DIR 0x0001
0184 #define REG_CAF_STATUS_FOCUSING 0x0002
0185 #define REG_CAF_STATUS_FOCUSED 0x0003
0186 #define REG_CAF_STATUS_UNFOCUSED 0x0004
0187 #define REG_AF_STATUS_INVALID 0x0010
0188 #define REG_AF_STATUS_FOCUSING 0x0020
0189 #define REG_AF_STATUS_FOCUSED 0x0030
0190 #define REG_AF_STATUS_UNFOCUSED 0x0040
0191
0192 #define REG_AF_TOUCH_POSITION S5C73M3_REG(0x0009, 0x5e8e)
0193 #define COMM_AF_FACE_ZOOM 0x0e10
0194
0195 #define COMM_AF_MODE 0x0e02
0196 #define COMM_AF_MODE_NORMAL 0x0000
0197 #define COMM_AF_MODE_MACRO 0x0001
0198 #define COMM_AF_MODE_MOVIE_CAF_START 0x0002
0199 #define COMM_AF_MODE_MOVIE_CAF_STOP 0x0003
0200 #define COMM_AF_MODE_PREVIEW_CAF_START 0x0004
0201 #define COMM_AF_MODE_PREVIEW_CAF_STOP 0x0005
0202
0203 #define COMM_AF_SOFTLANDING 0x0e16
0204 #define COMM_AF_SOFTLANDING_ON 0x0000
0205 #define COMM_AF_SOFTLANDING_RES_COMPLETE 0x0001
0206
0207 #define COMM_FACE_DET 0x0e0c
0208 #define COMM_FACE_DET_OFF 0x0000
0209 #define COMM_FACE_DET_ON 0x0001
0210
0211 #define COMM_FACE_DET_OSD 0x0e0e
0212 #define COMM_FACE_DET_OSD_OFF 0x0000
0213 #define COMM_FACE_DET_OSD_ON 0x0001
0214
0215 #define COMM_AE_CON 0x0c00
0216 #define COMM_AE_STOP 0x0000
0217 #define COMM_AE_START 0x0001
0218
0219 #define COMM_ISO 0x0c02
0220 #define COMM_ISO_AUTO 0x0000
0221 #define COMM_ISO_100 0x0001
0222 #define COMM_ISO_200 0x0002
0223 #define COMM_ISO_400 0x0003
0224 #define COMM_ISO_800 0x0004
0225 #define COMM_ISO_SPORTS 0x0005
0226 #define COMM_ISO_NIGHT 0x0006
0227 #define COMM_ISO_INDOOR 0x0007
0228
0229
0230 #define COMM_EV 0x0c04
0231
0232 #define COMM_METERING 0x0c06
0233 #define COMM_METERING_CENTER 0x0000
0234 #define COMM_METERING_SPOT 0x0001
0235 #define COMM_METERING_AVERAGE 0x0002
0236 #define COMM_METERING_SMART 0x0003
0237
0238 #define COMM_WDR 0x0c08
0239 #define COMM_WDR_OFF 0x0000
0240 #define COMM_WDR_ON 0x0001
0241
0242 #define COMM_FLICKER_MODE 0x0c12
0243 #define COMM_FLICKER_NONE 0x0000
0244 #define COMM_FLICKER_MANUAL_50HZ 0x0001
0245 #define COMM_FLICKER_MANUAL_60HZ 0x0002
0246 #define COMM_FLICKER_AUTO 0x0003
0247 #define COMM_FLICKER_AUTO_50HZ 0x0004
0248 #define COMM_FLICKER_AUTO_60HZ 0x0005
0249
0250 #define COMM_FRAME_RATE 0x0c1e
0251 #define COMM_FRAME_RATE_AUTO_SET 0x0000
0252 #define COMM_FRAME_RATE_FIXED_30FPS 0x0002
0253 #define COMM_FRAME_RATE_FIXED_20FPS 0x0003
0254 #define COMM_FRAME_RATE_FIXED_15FPS 0x0004
0255 #define COMM_FRAME_RATE_FIXED_60FPS 0x0007
0256 #define COMM_FRAME_RATE_FIXED_120FPS 0x0008
0257 #define COMM_FRAME_RATE_FIXED_7FPS 0x0009
0258 #define COMM_FRAME_RATE_FIXED_10FPS 0x000a
0259 #define COMM_FRAME_RATE_FIXED_90FPS 0x000b
0260 #define COMM_FRAME_RATE_ANTI_SHAKE 0x0013
0261
0262
0263 #define COMM_SHARPNESS 0x0c14
0264
0265
0266 #define COMM_SATURATION 0x0c16
0267
0268
0269 #define COMM_CONTRAST 0x0c18
0270
0271 #define COMM_SCENE_MODE 0x0c1a
0272 #define COMM_SCENE_MODE_NONE 0x0000
0273 #define COMM_SCENE_MODE_PORTRAIT 0x0001
0274 #define COMM_SCENE_MODE_LANDSCAPE 0x0002
0275 #define COMM_SCENE_MODE_SPORTS 0x0003
0276 #define COMM_SCENE_MODE_INDOOR 0x0004
0277 #define COMM_SCENE_MODE_BEACH 0x0005
0278 #define COMM_SCENE_MODE_SUNSET 0x0006
0279 #define COMM_SCENE_MODE_DAWN 0x0007
0280 #define COMM_SCENE_MODE_FALL 0x0008
0281 #define COMM_SCENE_MODE_NIGHT 0x0009
0282 #define COMM_SCENE_MODE_AGAINST_LIGHT 0x000a
0283 #define COMM_SCENE_MODE_FIRE 0x000b
0284 #define COMM_SCENE_MODE_TEXT 0x000c
0285 #define COMM_SCENE_MODE_CANDLE 0x000d
0286
0287 #define COMM_AE_AUTO_BRACKET 0x0b14
0288 #define COMM_AE_AUTO_BRAKET_EV05 0x0080
0289 #define COMM_AE_AUTO_BRAKET_EV10 0x0100
0290 #define COMM_AE_AUTO_BRAKET_EV15 0x0180
0291 #define COMM_AE_AUTO_BRAKET_EV20 0x0200
0292
0293 #define COMM_SENSOR_STREAMING 0x090a
0294 #define COMM_SENSOR_STREAMING_OFF 0x0000
0295 #define COMM_SENSOR_STREAMING_ON 0x0001
0296
0297 #define COMM_AWB_MODE 0x0d02
0298 #define COMM_AWB_MODE_INCANDESCENT 0x0000
0299 #define COMM_AWB_MODE_FLUORESCENT1 0x0001
0300 #define COMM_AWB_MODE_FLUORESCENT2 0x0002
0301 #define COMM_AWB_MODE_DAYLIGHT 0x0003
0302 #define COMM_AWB_MODE_CLOUDY 0x0004
0303 #define COMM_AWB_MODE_AUTO 0x0005
0304
0305 #define COMM_AWB_CON 0x0d00
0306 #define COMM_AWB_STOP 0x0000
0307 #define COMM_AWB_START 0x0001
0308
0309 #define COMM_FW_UPDATE 0x0906
0310 #define COMM_FW_UPDATE_NOT_READY 0x0000
0311 #define COMM_FW_UPDATE_SUCCESS 0x0005
0312 #define COMM_FW_UPDATE_FAIL 0x0007
0313 #define COMM_FW_UPDATE_BUSY 0xffff
0314
0315
0316 #define S5C73M3_MAX_SUPPLIES 6
0317 #define S5C73M3_DEFAULT_MCLK_FREQ 24000000U
0318
0319 struct s5c73m3_ctrls {
0320 struct v4l2_ctrl_handler handler;
0321 struct {
0322
0323 struct v4l2_ctrl *auto_exposure;
0324 struct v4l2_ctrl *exposure_bias;
0325 struct v4l2_ctrl *exposure_metering;
0326 };
0327 struct {
0328
0329 struct v4l2_ctrl *auto_iso;
0330 struct v4l2_ctrl *iso;
0331 };
0332 struct v4l2_ctrl *auto_wb;
0333 struct {
0334
0335 struct v4l2_ctrl *focus_auto;
0336 struct v4l2_ctrl *af_start;
0337 struct v4l2_ctrl *af_stop;
0338 struct v4l2_ctrl *af_status;
0339 struct v4l2_ctrl *af_distance;
0340 };
0341
0342 struct v4l2_ctrl *aaa_lock;
0343 struct v4l2_ctrl *colorfx;
0344 struct v4l2_ctrl *contrast;
0345 struct v4l2_ctrl *saturation;
0346 struct v4l2_ctrl *sharpness;
0347 struct v4l2_ctrl *zoom;
0348 struct v4l2_ctrl *wdr;
0349 struct v4l2_ctrl *stabilization;
0350 struct v4l2_ctrl *jpeg_quality;
0351 struct v4l2_ctrl *scene_mode;
0352 };
0353
0354 enum s5c73m3_gpio_id {
0355 STBY,
0356 RSET,
0357 GPIO_NUM,
0358 };
0359
0360 enum s5c73m3_resolution_types {
0361 RES_ISP,
0362 RES_JPEG,
0363 };
0364
0365 struct s5c73m3_interval {
0366 u16 fps_reg;
0367 struct v4l2_fract interval;
0368
0369 struct v4l2_frmsize_discrete size;
0370 };
0371
0372 struct s5c73m3 {
0373 struct v4l2_subdev sensor_sd;
0374 struct media_pad sensor_pads[S5C73M3_NUM_PADS];
0375
0376 struct v4l2_subdev oif_sd;
0377 struct media_pad oif_pads[OIF_NUM_PADS];
0378
0379 struct spi_driver spidrv;
0380 struct spi_device *spi_dev;
0381 struct i2c_client *i2c_client;
0382 u32 i2c_write_address;
0383 u32 i2c_read_address;
0384
0385 struct regulator_bulk_data supplies[S5C73M3_MAX_SUPPLIES];
0386 struct s5c73m3_gpio gpio[GPIO_NUM];
0387
0388 struct clk *clock;
0389
0390
0391 u32 mclk_frequency;
0392
0393 enum v4l2_mbus_type bus_type;
0394
0395 const struct s5c73m3_frame_size *sensor_pix_size[2];
0396 const struct s5c73m3_frame_size *oif_pix_size[2];
0397 u32 mbus_code;
0398
0399 const struct s5c73m3_interval *fiv;
0400
0401 struct v4l2_mbus_frame_desc frame_desc;
0402
0403 struct mutex lock;
0404
0405 struct s5c73m3_ctrls ctrls;
0406
0407 u8 streaming:1;
0408 u8 apply_fmt:1;
0409 u8 apply_fiv:1;
0410 u8 isp_ready:1;
0411
0412 short power;
0413
0414 char sensor_fw[S5C73M3_SENSOR_FW_LEN + 2];
0415 char sensor_type[S5C73M3_SENSOR_TYPE_LEN + 2];
0416 char fw_file_version[2];
0417 unsigned int fw_size;
0418 };
0419
0420 struct s5c73m3_frame_size {
0421 u32 width;
0422 u32 height;
0423 u8 reg_val;
0424 };
0425
0426 extern int s5c73m3_dbg;
0427
0428 int s5c73m3_register_spi_driver(struct s5c73m3 *state);
0429 void s5c73m3_unregister_spi_driver(struct s5c73m3 *state);
0430 int s5c73m3_spi_write(struct s5c73m3 *state, const void *addr,
0431 const unsigned int len, const unsigned int tx_size);
0432 int s5c73m3_spi_read(struct s5c73m3 *state, void *addr,
0433 const unsigned int len, const unsigned int tx_size);
0434
0435 int s5c73m3_read(struct s5c73m3 *state, u32 addr, u16 *data);
0436 int s5c73m3_write(struct s5c73m3 *state, u32 addr, u16 data);
0437 int s5c73m3_isp_command(struct s5c73m3 *state, u16 command, u16 data);
0438 int s5c73m3_init_controls(struct s5c73m3 *state);
0439
0440 static inline struct v4l2_subdev *ctrl_to_sensor_sd(struct v4l2_ctrl *ctrl)
0441 {
0442 return &container_of(ctrl->handler, struct s5c73m3,
0443 ctrls.handler)->sensor_sd;
0444 }
0445
0446 static inline struct s5c73m3 *sensor_sd_to_s5c73m3(struct v4l2_subdev *sd)
0447 {
0448 return container_of(sd, struct s5c73m3, sensor_sd);
0449 }
0450
0451 static inline struct s5c73m3 *oif_sd_to_s5c73m3(struct v4l2_subdev *sd)
0452 {
0453 return container_of(sd, struct s5c73m3, oif_sd);
0454 }
0455 #endif