Lines Matching refs:state

182 int s5c73m3_write(struct s5c73m3 *state, u32 addr, u16 data)  in s5c73m3_write()  argument
184 struct i2c_client *client = state->i2c_client; in s5c73m3_write()
187 if ((addr ^ state->i2c_write_address) & 0xffff0000) { in s5c73m3_write()
190 state->i2c_write_address = 0; in s5c73m3_write()
195 if ((addr ^ state->i2c_write_address) & 0xffff) { in s5c73m3_write()
198 state->i2c_write_address = 0; in s5c73m3_write()
203 state->i2c_write_address = addr; in s5c73m3_write()
209 state->i2c_write_address += 2; in s5c73m3_write()
214 int s5c73m3_read(struct s5c73m3 *state, u32 addr, u16 *data) in s5c73m3_read() argument
216 struct i2c_client *client = state->i2c_client; in s5c73m3_read()
219 if ((addr ^ state->i2c_read_address) & 0xffff0000) { in s5c73m3_read()
222 state->i2c_read_address = 0; in s5c73m3_read()
227 if ((addr ^ state->i2c_read_address) & 0xffff) { in s5c73m3_read()
230 state->i2c_read_address = 0; in s5c73m3_read()
235 state->i2c_read_address = addr; in s5c73m3_read()
241 state->i2c_read_address += 2; in s5c73m3_read()
246 static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value) in s5c73m3_check_status() argument
255 ret = s5c73m3_read(state, REG_STATUS, &status); in s5c73m3_check_status()
263 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, in s5c73m3_check_status()
271 s5c73m3_read(state, REG_I2C_STATUS, &i2c_status); in s5c73m3_check_status()
272 s5c73m3_read(state, REG_I2C_SEQ_STATUS, &i2c_seq_status); in s5c73m3_check_status()
274 v4l2_err(&state->sensor_sd, in s5c73m3_check_status()
284 int s5c73m3_isp_command(struct s5c73m3 *state, u16 command, u16 data) in s5c73m3_isp_command() argument
288 ret = s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED); in s5c73m3_isp_command()
292 ret = s5c73m3_write(state, 0x00095000, command); in s5c73m3_isp_command()
296 ret = s5c73m3_write(state, 0x00095002, data); in s5c73m3_isp_command()
300 return s5c73m3_write(state, REG_STATUS, 0x0001); in s5c73m3_isp_command()
303 static int s5c73m3_isp_comm_result(struct s5c73m3 *state, u16 command, in s5c73m3_isp_comm_result() argument
306 return s5c73m3_read(state, COMM_RESULT_OFFSET + command, data); in s5c73m3_isp_comm_result()
309 static int s5c73m3_set_af_softlanding(struct s5c73m3 *state) in s5c73m3_set_af_softlanding() argument
317 ret = s5c73m3_isp_command(state, COMM_AF_SOFTLANDING, in s5c73m3_set_af_softlanding()
320 v4l2_info(&state->sensor_sd, "AF soft-landing failed\n"); in s5c73m3_set_af_softlanding()
325 ret = s5c73m3_isp_comm_result(state, COMM_AF_SOFTLANDING, in s5c73m3_set_af_softlanding()
343 v4l2_info(&state->sensor_sd, "AF soft-landing %s after %dms\n", in s5c73m3_set_af_softlanding()
351 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); in s5c73m3_load_fw() local
352 struct i2c_client *client = state->i2c_client; in s5c73m3_load_fw()
358 state->fw_file_version); in s5c73m3_load_fw()
367 ret = s5c73m3_spi_write(state, fw->data, fw->size, 64); in s5c73m3_load_fw()
370 state->isp_ready = 1; in s5c73m3_load_fw()
379 static int s5c73m3_set_frame_size(struct s5c73m3 *state) in s5c73m3_set_frame_size() argument
382 state->sensor_pix_size[RES_ISP]; in s5c73m3_set_frame_size()
384 state->sensor_pix_size[RES_JPEG]; in s5c73m3_set_frame_size()
387 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, in s5c73m3_set_frame_size()
393 if (state->mbus_code == S5C73M3_JPEG_FMT) { in s5c73m3_set_frame_size()
394 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, in s5c73m3_set_frame_size()
400 return s5c73m3_isp_command(state, COMM_CHG_MODE, chg_mode); in s5c73m3_set_frame_size()
403 static int s5c73m3_set_frame_rate(struct s5c73m3 *state) in s5c73m3_set_frame_rate() argument
407 if (state->ctrls.stabilization->val) in s5c73m3_set_frame_rate()
410 if (WARN_ON(state->fiv == NULL)) in s5c73m3_set_frame_rate()
413 ret = s5c73m3_isp_command(state, COMM_FRAME_RATE, state->fiv->fps_reg); in s5c73m3_set_frame_rate()
415 state->apply_fiv = 0; in s5c73m3_set_frame_rate()
420 static int __s5c73m3_s_stream(struct s5c73m3 *state, struct v4l2_subdev *sd, in __s5c73m3_s_stream() argument
426 if (on && state->apply_fmt) { in __s5c73m3_s_stream()
427 if (state->mbus_code == S5C73M3_JPEG_FMT) in __s5c73m3_s_stream()
432 ret = s5c73m3_isp_command(state, COMM_IMG_OUTPUT, mode); in __s5c73m3_s_stream()
434 ret = s5c73m3_set_frame_size(state); in __s5c73m3_s_stream()
437 state->apply_fmt = 0; in __s5c73m3_s_stream()
440 ret = s5c73m3_isp_command(state, COMM_SENSOR_STREAMING, !!on); in __s5c73m3_s_stream()
444 state->streaming = !!on; in __s5c73m3_s_stream()
449 if (state->apply_fiv) { in __s5c73m3_s_stream()
450 ret = s5c73m3_set_frame_rate(state); in __s5c73m3_s_stream()
455 return s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED); in __s5c73m3_s_stream()
460 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_s_stream() local
463 mutex_lock(&state->lock); in s5c73m3_oif_s_stream()
464 ret = __s5c73m3_s_stream(state, sd, on); in s5c73m3_oif_s_stream()
465 mutex_unlock(&state->lock); in s5c73m3_oif_s_stream()
470 static int s5c73m3_system_status_wait(struct s5c73m3 *state, u32 value, in s5c73m3_system_status_wait() argument
476 int ret = s5c73m3_read(state, 0x30100010, &reg); in s5c73m3_system_status_wait()
486 static int s5c73m3_read_fw_version(struct s5c73m3 *state) in s5c73m3_read_fw_version() argument
488 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_read_fw_version()
493 offset = state->isp_ready ? 0x60 : 0; in s5c73m3_read_fw_version()
496 ret = s5c73m3_read(state, offset + i * 2, data); in s5c73m3_read_fw_version()
499 state->sensor_fw[i * 2] = (char)(*data & 0xff); in s5c73m3_read_fw_version()
500 state->sensor_fw[i * 2 + 1] = (char)(*data >> 8); in s5c73m3_read_fw_version()
502 state->sensor_fw[S5C73M3_SENSOR_FW_LEN] = '\0'; in s5c73m3_read_fw_version()
506 ret = s5c73m3_read(state, offset + 6 + i * 2, data); in s5c73m3_read_fw_version()
509 state->sensor_type[i * 2] = (char)(*data & 0xff); in s5c73m3_read_fw_version()
510 state->sensor_type[i * 2 + 1] = (char)(*data >> 8); in s5c73m3_read_fw_version()
512 state->sensor_type[S5C73M3_SENSOR_TYPE_LEN] = '\0'; in s5c73m3_read_fw_version()
514 ret = s5c73m3_read(state, offset + 0x14, data); in s5c73m3_read_fw_version()
516 ret = s5c73m3_read(state, offset + 0x16, data + 1); in s5c73m3_read_fw_version()
518 state->fw_size = data[0] + (data[1] << 16); in s5c73m3_read_fw_version()
522 state->sensor_type, state->sensor_fw); in s5c73m3_read_fw_version()
526 static int s5c73m3_fw_update_from(struct s5c73m3 *state) in s5c73m3_fw_update_from() argument
528 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_fw_update_from()
536 ret = s5c73m3_isp_command(state, COMM_FW_UPDATE, 0); in s5c73m3_fw_update_from()
541 ret = s5c73m3_read(state, 0x00095906, &status); in s5c73m3_fw_update_from()
560 static int s5c73m3_spi_boot(struct s5c73m3 *state, bool load_fw) in s5c73m3_spi_boot() argument
562 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_spi_boot()
566 ret = s5c73m3_write(state, 0x30000004, 0xffff); in s5c73m3_spi_boot()
573 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3); in s5c73m3_spi_boot()
580 ret = s5c73m3_write(state, 0x30100014, 0x2146); in s5c73m3_spi_boot()
584 ret = s5c73m3_write(state, 0x30100010, 0x210c); in s5c73m3_spi_boot()
591 ret = s5c73m3_system_status_wait(state, 0x210d, 100, 300); in s5c73m3_spi_boot()
600 ret = s5c73m3_write(state, 0x30000004, 0xfffd); in s5c73m3_spi_boot()
605 ret = s5c73m3_write(state, 0x301000a4, 0x0183); in s5c73m3_spi_boot()
610 ret = s5c73m3_write(state, 0x30000004, 0xffff); in s5c73m3_spi_boot()
614 ret = s5c73m3_read_fw_version(state); in s5c73m3_spi_boot()
619 ret = s5c73m3_fw_update_from(state); in s5c73m3_spi_boot()
626 static int s5c73m3_set_timing_register_for_vdd(struct s5c73m3 *state) in s5c73m3_set_timing_register_for_vdd() argument
637 ret = s5c73m3_write(state, regs[i][0], regs[i][1]); in s5c73m3_set_timing_register_for_vdd()
645 static void s5c73m3_set_fw_file_version(struct s5c73m3 *state) in s5c73m3_set_fw_file_version() argument
647 switch (state->sensor_fw[0]) { in s5c73m3_set_fw_file_version()
650 state->fw_file_version[0] = 'G'; in s5c73m3_set_fw_file_version()
654 state->fw_file_version[0] = 'Z'; in s5c73m3_set_fw_file_version()
658 switch (state->sensor_fw[1]) { in s5c73m3_set_fw_file_version()
660 state->fw_file_version[1] = state->sensor_fw[1]; in s5c73m3_set_fw_file_version()
665 static int s5c73m3_get_fw_version(struct s5c73m3 *state) in s5c73m3_get_fw_version() argument
667 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_get_fw_version()
671 ret = s5c73m3_write(state, 0x30000004, 0xffff); in s5c73m3_get_fw_version()
677 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3); in s5c73m3_get_fw_version()
685 ret = s5c73m3_write(state, 0x30100120, 0x0820); in s5c73m3_get_fw_version()
686 ret = s5c73m3_write(state, 0x30100124, 0x0820); in s5c73m3_get_fw_version()
689 ret = s5c73m3_write(state, 0x00010418, 0x0008); in s5c73m3_get_fw_version()
692 ret = s5c73m3_write(state, 0x30100014, 0x2146); in s5c73m3_get_fw_version()
695 ret = s5c73m3_write(state, 0x30100010, 0x230c); in s5c73m3_get_fw_version()
702 ret = s5c73m3_system_status_wait(state, 0x230e, 100, 300); in s5c73m3_get_fw_version()
707 ret = s5c73m3_write(state, 0x30000004, 0xfffd); in s5c73m3_get_fw_version()
712 ret = s5c73m3_write(state, 0x301000a4, 0x0183); in s5c73m3_get_fw_version()
716 s5c73m3_set_timing_register_for_vdd(state); in s5c73m3_get_fw_version()
718 ret = s5c73m3_read_fw_version(state); in s5c73m3_get_fw_version()
720 s5c73m3_set_fw_file_version(state); in s5c73m3_get_fw_version()
725 static int s5c73m3_rom_boot(struct s5c73m3 *state, bool load_fw) in s5c73m3_rom_boot() argument
737 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_rom_boot()
741 ret = s5c73m3_write(state, 0x30000004, 0xffff); in s5c73m3_rom_boot()
747 ret = s5c73m3_system_status_wait(state, 0x0c, 100, 4); in s5c73m3_rom_boot()
754 ret = s5c73m3_write(state, boot_regs[i][0], boot_regs[i][1]); in s5c73m3_rom_boot()
761 ret = s5c73m3_system_status_wait(state, 0x230e, 1000, 150); in s5c73m3_rom_boot()
768 ret = s5c73m3_write(state, 0x30000004, 0xfffd); in s5c73m3_rom_boot()
772 ret = s5c73m3_write(state, 0x301000a4, 0x0183); in s5c73m3_rom_boot()
776 ret = s5c73m3_write(state, 0x30000004, 0xffff); in s5c73m3_rom_boot()
780 state->isp_ready = 1; in s5c73m3_rom_boot()
782 return s5c73m3_read_fw_version(state); in s5c73m3_rom_boot()
785 static int s5c73m3_isp_init(struct s5c73m3 *state) in s5c73m3_isp_init() argument
789 state->i2c_read_address = 0; in s5c73m3_isp_init()
790 state->i2c_write_address = 0; in s5c73m3_isp_init()
792 ret = s5c73m3_i2c_write(state->i2c_client, AHB_MSB_ADDR_PTR, 0x3310); in s5c73m3_isp_init()
797 return s5c73m3_rom_boot(state, true); in s5c73m3_isp_init()
799 return s5c73m3_spi_boot(state, true); in s5c73m3_isp_init()
826 static void s5c73m3_oif_try_format(struct s5c73m3 *state, in s5c73m3_oif_try_format() argument
831 struct v4l2_subdev *sd = &state->sensor_sd; in s5c73m3_oif_try_format()
851 *fs = state->oif_pix_size[RES_ISP]; in s5c73m3_oif_try_format()
863 static void s5c73m3_try_format(struct s5c73m3 *state, in s5c73m3_try_format() argument
884 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_g_frame_interval() local
889 mutex_lock(&state->lock); in s5c73m3_oif_g_frame_interval()
890 fi->interval = state->fiv->interval; in s5c73m3_oif_g_frame_interval()
891 mutex_unlock(&state->lock); in s5c73m3_oif_g_frame_interval()
896 static int __s5c73m3_set_frame_interval(struct s5c73m3 *state, in __s5c73m3_set_frame_interval() argument
900 state->sensor_pix_size[RES_ISP]; in __s5c73m3_set_frame_interval()
923 state->fiv = fiv; in __s5c73m3_set_frame_interval()
925 v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, in __s5c73m3_set_frame_interval()
933 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_s_frame_interval() local
942 mutex_lock(&state->lock); in s5c73m3_oif_s_frame_interval()
944 ret = __s5c73m3_set_frame_interval(state, fi); in s5c73m3_oif_s_frame_interval()
946 if (state->streaming) in s5c73m3_oif_s_frame_interval()
947 ret = s5c73m3_set_frame_rate(state); in s5c73m3_oif_s_frame_interval()
949 state->apply_fiv = 1; in s5c73m3_oif_s_frame_interval()
951 mutex_unlock(&state->lock); in s5c73m3_oif_s_frame_interval()
959 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_enum_frame_interval() local
968 mutex_lock(&state->lock); in s5c73m3_oif_enum_frame_interval()
974 mutex_unlock(&state->lock); in s5c73m3_oif_enum_frame_interval()
997 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); in s5c73m3_get_fmt() local
1006 mutex_lock(&state->lock); in s5c73m3_get_fmt()
1011 fs = state->sensor_pix_size[RES_ISP]; in s5c73m3_get_fmt()
1015 fs = state->sensor_pix_size[RES_JPEG]; in s5c73m3_get_fmt()
1018 mutex_unlock(&state->lock); in s5c73m3_get_fmt()
1023 mutex_unlock(&state->lock); in s5c73m3_get_fmt()
1031 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_get_fmt() local
1040 mutex_lock(&state->lock); in s5c73m3_oif_get_fmt()
1045 fs = state->oif_pix_size[RES_ISP]; in s5c73m3_oif_get_fmt()
1049 fs = state->oif_pix_size[RES_JPEG]; in s5c73m3_oif_get_fmt()
1052 code = state->mbus_code; in s5c73m3_oif_get_fmt()
1053 fs = state->oif_pix_size[RES_ISP]; in s5c73m3_oif_get_fmt()
1056 mutex_unlock(&state->lock); in s5c73m3_oif_get_fmt()
1061 mutex_unlock(&state->lock); in s5c73m3_oif_get_fmt()
1070 struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd); in s5c73m3_set_fmt() local
1074 mutex_lock(&state->lock); in s5c73m3_set_fmt()
1076 s5c73m3_try_format(state, cfg, fmt, &frame_size); in s5c73m3_set_fmt()
1084 state->sensor_pix_size[RES_ISP] = frame_size; in s5c73m3_set_fmt()
1087 state->sensor_pix_size[RES_JPEG] = frame_size; in s5c73m3_set_fmt()
1093 if (state->streaming) in s5c73m3_set_fmt()
1096 state->apply_fmt = 1; in s5c73m3_set_fmt()
1099 mutex_unlock(&state->lock); in s5c73m3_set_fmt()
1109 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_set_fmt() local
1113 mutex_lock(&state->lock); in s5c73m3_oif_set_fmt()
1115 s5c73m3_oif_try_format(state, cfg, fmt, &frame_size); in s5c73m3_oif_set_fmt()
1128 state->oif_pix_size[RES_ISP] = frame_size; in s5c73m3_oif_set_fmt()
1131 state->oif_pix_size[RES_JPEG] = frame_size; in s5c73m3_oif_set_fmt()
1134 state->mbus_code = fmt->format.code; in s5c73m3_oif_set_fmt()
1140 if (state->streaming) in s5c73m3_oif_set_fmt()
1143 state->apply_fmt = 1; in s5c73m3_oif_set_fmt()
1146 mutex_unlock(&state->lock); in s5c73m3_oif_set_fmt()
1154 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_get_frame_desc() local
1160 mutex_lock(&state->lock); in s5c73m3_oif_get_frame_desc()
1163 fd->entry[i] = state->frame_desc.entry[i]; in s5c73m3_oif_get_frame_desc()
1164 mutex_unlock(&state->lock); in s5c73m3_oif_get_frame_desc()
1172 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_set_frame_desc() local
1173 struct v4l2_mbus_frame_desc *frame_desc = &state->frame_desc; in s5c73m3_oif_set_frame_desc()
1184 mutex_lock(&state->lock); in s5c73m3_oif_set_frame_desc()
1187 mutex_unlock(&state->lock); in s5c73m3_oif_set_frame_desc()
1254 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_enum_frame_size() local
1277 fs = state->oif_pix_size[RES_ISP]; in s5c73m3_oif_enum_frame_size()
1311 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_log_status() local
1315 v4l2_info(sd, "power: %d, apply_fmt: %d\n", state->power, in s5c73m3_oif_log_status()
1316 state->apply_fmt); in s5c73m3_oif_log_status()
1372 static int __s5c73m3_power_on(struct s5c73m3 *state) in __s5c73m3_power_on() argument
1377 ret = regulator_enable(state->supplies[i].consumer); in __s5c73m3_power_on()
1382 ret = clk_set_rate(state->clock, state->mclk_frequency); in __s5c73m3_power_on()
1386 ret = clk_prepare_enable(state->clock); in __s5c73m3_power_on()
1390 v4l2_dbg(1, s5c73m3_dbg, &state->oif_sd, "clock frequency: %ld\n", in __s5c73m3_power_on()
1391 clk_get_rate(state->clock)); in __s5c73m3_power_on()
1393 s5c73m3_gpio_deassert(state, STBY); in __s5c73m3_power_on()
1396 s5c73m3_gpio_deassert(state, RST); in __s5c73m3_power_on()
1403 regulator_disable(state->supplies[i].consumer); in __s5c73m3_power_on()
1407 static int __s5c73m3_power_off(struct s5c73m3 *state) in __s5c73m3_power_off() argument
1411 if (s5c73m3_gpio_assert(state, RST)) in __s5c73m3_power_off()
1414 if (s5c73m3_gpio_assert(state, STBY)) in __s5c73m3_power_off()
1417 clk_disable_unprepare(state->clock); in __s5c73m3_power_off()
1419 state->streaming = 0; in __s5c73m3_power_off()
1420 state->isp_ready = 0; in __s5c73m3_power_off()
1423 ret = regulator_disable(state->supplies[i].consumer); in __s5c73m3_power_off()
1431 int r = regulator_enable(state->supplies[i].consumer); in __s5c73m3_power_off()
1433 v4l2_err(&state->oif_sd, "Failed to reenable %s: %d\n", in __s5c73m3_power_off()
1434 state->supplies[i].supply, r); in __s5c73m3_power_off()
1437 clk_prepare_enable(state->clock); in __s5c73m3_power_off()
1443 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_set_power() local
1446 mutex_lock(&state->lock); in s5c73m3_oif_set_power()
1448 if (on && !state->power) { in s5c73m3_oif_set_power()
1449 ret = __s5c73m3_power_on(state); in s5c73m3_oif_set_power()
1451 ret = s5c73m3_isp_init(state); in s5c73m3_oif_set_power()
1453 state->apply_fiv = 1; in s5c73m3_oif_set_power()
1454 state->apply_fmt = 1; in s5c73m3_oif_set_power()
1456 } else if (!on == state->power) { in s5c73m3_oif_set_power()
1457 ret = s5c73m3_set_af_softlanding(state); in s5c73m3_oif_set_power()
1459 ret = __s5c73m3_power_off(state); in s5c73m3_oif_set_power()
1464 state->power += on ? 1 : -1; in s5c73m3_oif_set_power()
1467 __func__, state->power); in s5c73m3_oif_set_power()
1469 mutex_unlock(&state->lock); in s5c73m3_oif_set_power()
1475 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_registered() local
1478 ret = v4l2_device_register_subdev(sd->v4l2_dev, &state->sensor_sd); in s5c73m3_oif_registered()
1481 state->oif_sd.name); in s5c73m3_oif_registered()
1485 ret = media_entity_create_link(&state->sensor_sd.entity, in s5c73m3_oif_registered()
1486 S5C73M3_ISP_PAD, &state->oif_sd.entity, OIF_ISP_PAD, in s5c73m3_oif_registered()
1489 ret = media_entity_create_link(&state->sensor_sd.entity, in s5c73m3_oif_registered()
1490 S5C73M3_JPEG_PAD, &state->oif_sd.entity, OIF_JPEG_PAD, in s5c73m3_oif_registered()
1498 struct s5c73m3 *state = oif_sd_to_s5c73m3(sd); in s5c73m3_oif_unregistered() local
1499 v4l2_device_unregister_subdev(&state->sensor_sd); in s5c73m3_oif_unregistered()
1550 static int s5c73m3_configure_gpios(struct s5c73m3 *state) in s5c73m3_configure_gpios() argument
1555 struct i2c_client *c = state->i2c_client; in s5c73m3_configure_gpios()
1556 struct s5c73m3_gpio *g = state->gpio; in s5c73m3_configure_gpios()
1574 static int s5c73m3_parse_gpios(struct s5c73m3 *state) in s5c73m3_parse_gpios() argument
1579 struct device *dev = &state->i2c_client->dev; in s5c73m3_parse_gpios()
1593 state->gpio[i].gpio = ret; in s5c73m3_parse_gpios()
1594 state->gpio[i].level = !(of_flags & OF_GPIO_ACTIVE_LOW); in s5c73m3_parse_gpios()
1599 static int s5c73m3_get_platform_data(struct s5c73m3 *state) in s5c73m3_get_platform_data() argument
1601 struct device *dev = &state->i2c_client->dev; in s5c73m3_get_platform_data()
1614 state->mclk_frequency = pdata->mclk_frequency; in s5c73m3_get_platform_data()
1615 state->gpio[STBY] = pdata->gpio_stby; in s5c73m3_get_platform_data()
1616 state->gpio[RST] = pdata->gpio_reset; in s5c73m3_get_platform_data()
1620 state->clock = devm_clk_get(dev, S5C73M3_CLK_NAME); in s5c73m3_get_platform_data()
1621 if (IS_ERR(state->clock)) in s5c73m3_get_platform_data()
1622 return PTR_ERR(state->clock); in s5c73m3_get_platform_data()
1625 &state->mclk_frequency)) { in s5c73m3_get_platform_data()
1626 state->mclk_frequency = S5C73M3_DEFAULT_MCLK_FREQ; in s5c73m3_get_platform_data()
1628 state->mclk_frequency); in s5c73m3_get_platform_data()
1631 ret = s5c73m3_parse_gpios(state); in s5c73m3_get_platform_data()
1665 struct s5c73m3 *state; in s5c73m3_probe() local
1668 state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); in s5c73m3_probe()
1669 if (!state) in s5c73m3_probe()
1672 state->i2c_client = client; in s5c73m3_probe()
1673 ret = s5c73m3_get_platform_data(state); in s5c73m3_probe()
1677 mutex_init(&state->lock); in s5c73m3_probe()
1678 sd = &state->sensor_sd; in s5c73m3_probe()
1679 oif_sd = &state->oif_sd; in s5c73m3_probe()
1683 v4l2_set_subdevdata(sd, state); in s5c73m3_probe()
1689 state->sensor_pads[S5C73M3_JPEG_PAD].flags = MEDIA_PAD_FL_SOURCE; in s5c73m3_probe()
1690 state->sensor_pads[S5C73M3_ISP_PAD].flags = MEDIA_PAD_FL_SOURCE; in s5c73m3_probe()
1694 state->sensor_pads, 0); in s5c73m3_probe()
1704 state->oif_pads[OIF_ISP_PAD].flags = MEDIA_PAD_FL_SINK; in s5c73m3_probe()
1705 state->oif_pads[OIF_JPEG_PAD].flags = MEDIA_PAD_FL_SINK; in s5c73m3_probe()
1706 state->oif_pads[OIF_SOURCE_PAD].flags = MEDIA_PAD_FL_SOURCE; in s5c73m3_probe()
1710 state->oif_pads, 0); in s5c73m3_probe()
1714 ret = s5c73m3_configure_gpios(state); in s5c73m3_probe()
1719 state->supplies[i].supply = s5c73m3_supply_names[i]; in s5c73m3_probe()
1722 state->supplies); in s5c73m3_probe()
1728 ret = s5c73m3_init_controls(state); in s5c73m3_probe()
1732 state->sensor_pix_size[RES_ISP] = &s5c73m3_isp_resolutions[1]; in s5c73m3_probe()
1733 state->sensor_pix_size[RES_JPEG] = &s5c73m3_jpeg_resolutions[1]; in s5c73m3_probe()
1734 state->oif_pix_size[RES_ISP] = state->sensor_pix_size[RES_ISP]; in s5c73m3_probe()
1735 state->oif_pix_size[RES_JPEG] = state->sensor_pix_size[RES_JPEG]; in s5c73m3_probe()
1737 state->mbus_code = S5C73M3_ISP_FMT; in s5c73m3_probe()
1739 state->fiv = &s5c73m3_intervals[S5C73M3_DEFAULT_FRAME_INTERVAL]; in s5c73m3_probe()
1741 state->fw_file_version[0] = 'G'; in s5c73m3_probe()
1742 state->fw_file_version[1] = 'C'; in s5c73m3_probe()
1744 ret = s5c73m3_register_spi_driver(state); in s5c73m3_probe()
1750 ret = __s5c73m3_power_on(state); in s5c73m3_probe()
1754 ret = s5c73m3_get_fw_version(state); in s5c73m3_probe()
1755 __s5c73m3_power_off(state); in s5c73m3_probe()
1770 s5c73m3_unregister_spi_driver(state); in s5c73m3_probe()
1779 struct s5c73m3 *state = oif_sd_to_s5c73m3(oif_sd); in s5c73m3_remove() local
1780 struct v4l2_subdev *sensor_sd = &state->sensor_sd; in s5c73m3_remove()
1790 s5c73m3_unregister_spi_driver(state); in s5c73m3_remove()