Lines Matching full:state
412 static u16 s5k5baf_i2c_read(struct s5k5baf *state, u16 addr) in s5k5baf_i2c_read() argument
414 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_i2c_read()
425 if (state->error) in s5k5baf_i2c_read()
436 state->error = ret; in s5k5baf_i2c_read()
441 static void s5k5baf_i2c_write(struct s5k5baf *state, u16 addr, u16 val) in s5k5baf_i2c_write() argument
444 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_i2c_write()
447 if (state->error) in s5k5baf_i2c_write()
455 state->error = ret; in s5k5baf_i2c_write()
459 static u16 s5k5baf_read(struct s5k5baf *state, u16 addr) in s5k5baf_read() argument
461 s5k5baf_i2c_write(state, REG_CMDRD_ADDR, addr); in s5k5baf_read()
462 return s5k5baf_i2c_read(state, REG_CMD_BUF); in s5k5baf_read()
465 static void s5k5baf_write(struct s5k5baf *state, u16 addr, u16 val) in s5k5baf_write() argument
467 s5k5baf_i2c_write(state, REG_CMDWR_ADDR, addr); in s5k5baf_write()
468 s5k5baf_i2c_write(state, REG_CMD_BUF, val); in s5k5baf_write()
471 static void s5k5baf_write_arr_seq(struct s5k5baf *state, u16 addr, in s5k5baf_write_arr_seq() argument
474 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_write_arr_seq()
477 s5k5baf_i2c_write(state, REG_CMDWR_ADDR, addr); in s5k5baf_write_arr_seq()
478 if (state->error) in s5k5baf_write_arr_seq()
497 state->error = ret; in s5k5baf_write_arr_seq()
505 #define s5k5baf_write_seq(state, addr, seq...) \ argument
506 s5k5baf_write_arr_seq(state, addr, sizeof((char[]){ seq }), \
520 static void s5k5baf_write_nseq(struct s5k5baf *state, const u16 *nseq) in s5k5baf_write_nseq() argument
528 s5k5baf_write_arr_seq(state, addr, count, nseq); in s5k5baf_write_nseq()
533 static void s5k5baf_synchronize(struct s5k5baf *state, int timeout, u16 addr) in s5k5baf_synchronize() argument
538 s5k5baf_write(state, addr, 1); in s5k5baf_synchronize()
540 reg = s5k5baf_read(state, addr); in s5k5baf_synchronize()
541 if (state->error || !reg) in s5k5baf_synchronize()
546 v4l2_err(&state->sd, "timeout on register synchronize (%#x)\n", addr); in s5k5baf_synchronize()
547 state->error = -ETIMEDOUT; in s5k5baf_synchronize()
550 static u16 *s5k5baf_fw_get_seq(struct s5k5baf *state, u16 seq_id) in s5k5baf_fw_get_seq() argument
552 struct s5k5baf_fw *fw = state->fw; in s5k5baf_fw_get_seq()
569 static void s5k5baf_hw_patch(struct s5k5baf *state) in s5k5baf_hw_patch() argument
571 u16 *seq = s5k5baf_fw_get_seq(state, S5K5BAF_FW_ID_PATCH); in s5k5baf_hw_patch()
574 s5k5baf_write_nseq(state, seq); in s5k5baf_hw_patch()
577 static void s5k5baf_hw_set_clocks(struct s5k5baf *state) in s5k5baf_hw_set_clocks() argument
579 unsigned long mclk = state->mclk_frequency / 1000; in s5k5baf_hw_set_clocks()
590 s5k5baf_write_seq(state, REG_I_INCLK_FREQ_L, mclk & 0xffff, mclk >> 16); in s5k5baf_hw_set_clocks()
591 s5k5baf_write_nseq(state, nseq_clk_cfg); in s5k5baf_hw_set_clocks()
593 s5k5baf_synchronize(state, 250, REG_I_INIT_PARAMS_UPDATED); in s5k5baf_hw_set_clocks()
594 status = s5k5baf_read(state, REG_I_ERROR_INFO); in s5k5baf_hw_set_clocks()
595 if (!state->error && status) { in s5k5baf_hw_set_clocks()
596 v4l2_err(&state->sd, "error configuring PLL (%d)\n", status); in s5k5baf_hw_set_clocks()
597 state->error = -EINVAL; in s5k5baf_hw_set_clocks()
602 static void s5k5baf_hw_set_ccm(struct s5k5baf *state) in s5k5baf_hw_set_ccm() argument
604 u16 *seq = s5k5baf_fw_get_seq(state, S5K5BAF_FW_ID_CCM); in s5k5baf_hw_set_ccm()
607 s5k5baf_write_nseq(state, seq); in s5k5baf_hw_set_ccm()
611 static void s5k5baf_hw_set_cis(struct s5k5baf *state) in s5k5baf_hw_set_cis() argument
613 u16 *seq = s5k5baf_fw_get_seq(state, S5K5BAF_FW_ID_CIS); in s5k5baf_hw_set_cis()
618 s5k5baf_i2c_write(state, REG_CMDWR_PAGE, PAGE_IF_HW); in s5k5baf_hw_set_cis()
619 s5k5baf_write_nseq(state, seq); in s5k5baf_hw_set_cis()
620 s5k5baf_i2c_write(state, REG_CMDWR_PAGE, PAGE_IF_SW); in s5k5baf_hw_set_cis()
623 static void s5k5baf_hw_sync_cfg(struct s5k5baf *state) in s5k5baf_hw_sync_cfg() argument
625 s5k5baf_write(state, REG_G_PREV_CFG_CHG, 1); in s5k5baf_hw_sync_cfg()
626 if (state->apply_crop) { in s5k5baf_hw_sync_cfg()
627 s5k5baf_write(state, REG_G_INPUTS_CHANGE_REQ, 1); in s5k5baf_hw_sync_cfg()
628 s5k5baf_write(state, REG_G_PREV_CFG_BYPASS_CHANGED, 1); in s5k5baf_hw_sync_cfg()
630 s5k5baf_synchronize(state, 500, REG_G_NEW_CFG_SYNC); in s5k5baf_hw_sync_cfg()
633 static void s5k5baf_hw_set_mirror(struct s5k5baf *state) in s5k5baf_hw_set_mirror() argument
635 u16 flip = state->ctrls.vflip->val | (state->ctrls.vflip->val << 1); in s5k5baf_hw_set_mirror()
637 s5k5baf_write(state, REG_P_PREV_MIRROR(0), flip); in s5k5baf_hw_set_mirror()
638 if (state->streaming) in s5k5baf_hw_set_mirror()
639 s5k5baf_hw_sync_cfg(state); in s5k5baf_hw_set_mirror()
642 static void s5k5baf_hw_set_alg(struct s5k5baf *state, u16 alg, bool enable) in s5k5baf_hw_set_alg() argument
646 if (!state->valid_auto_alg) in s5k5baf_hw_set_alg()
647 cur_alg = s5k5baf_read(state, REG_DBG_AUTOALG_EN); in s5k5baf_hw_set_alg()
649 cur_alg = state->auto_alg; in s5k5baf_hw_set_alg()
654 s5k5baf_write(state, REG_DBG_AUTOALG_EN, new_alg); in s5k5baf_hw_set_alg()
656 if (state->error) in s5k5baf_hw_set_alg()
659 state->valid_auto_alg = 1; in s5k5baf_hw_set_alg()
660 state->auto_alg = new_alg; in s5k5baf_hw_set_alg()
664 static void s5k5baf_hw_set_awb(struct s5k5baf *state, int awb) in s5k5baf_hw_set_awb() argument
666 struct s5k5baf_ctrls *ctrls = &state->ctrls; in s5k5baf_hw_set_awb()
669 s5k5baf_write_seq(state, REG_SF_RGAIN, in s5k5baf_hw_set_awb()
675 s5k5baf_hw_set_alg(state, AALG_WB_EN, awb); in s5k5baf_hw_set_awb()
679 static void s5k5baf_hw_set_user_exposure(struct s5k5baf *state, int exposure) in s5k5baf_hw_set_user_exposure() argument
683 s5k5baf_write_seq(state, REG_SF_USR_EXPOSURE_L, in s5k5baf_hw_set_user_exposure()
687 static void s5k5baf_hw_set_user_gain(struct s5k5baf *state, int gain) in s5k5baf_hw_set_user_gain() argument
689 s5k5baf_write_seq(state, REG_SF_USR_TOT_GAIN, gain, 1); in s5k5baf_hw_set_user_gain()
693 static void s5k5baf_hw_set_auto_exposure(struct s5k5baf *state, int value) in s5k5baf_hw_set_auto_exposure() argument
696 s5k5baf_hw_set_alg(state, AALG_AE_EN | AALG_DIVLEI_EN, true); in s5k5baf_hw_set_auto_exposure()
698 unsigned int exp_time = state->ctrls.exposure->val; in s5k5baf_hw_set_auto_exposure()
700 s5k5baf_hw_set_user_exposure(state, exp_time); in s5k5baf_hw_set_auto_exposure()
701 s5k5baf_hw_set_user_gain(state, state->ctrls.gain->val); in s5k5baf_hw_set_auto_exposure()
702 s5k5baf_hw_set_alg(state, AALG_AE_EN | AALG_DIVLEI_EN, false); in s5k5baf_hw_set_auto_exposure()
706 static void s5k5baf_hw_set_anti_flicker(struct s5k5baf *state, int v) in s5k5baf_hw_set_anti_flicker() argument
709 s5k5baf_hw_set_alg(state, AALG_FLICKER_EN, true); in s5k5baf_hw_set_anti_flicker()
713 s5k5baf_write_seq(state, REG_SF_FLICKER_QUANT, v, 1); in s5k5baf_hw_set_anti_flicker()
714 s5k5baf_hw_set_alg(state, AALG_FLICKER_EN, false); in s5k5baf_hw_set_anti_flicker()
718 static void s5k5baf_hw_set_colorfx(struct s5k5baf *state, int val) in s5k5baf_hw_set_colorfx() argument
729 s5k5baf_write(state, REG_G_SPEC_EFFECTS, colorfx[val]); in s5k5baf_hw_set_colorfx()
747 static int s5k5baf_clear_error(struct s5k5baf *state) in s5k5baf_clear_error() argument
749 int ret = state->error; in s5k5baf_clear_error()
751 state->error = 0; in s5k5baf_clear_error()
755 static int s5k5baf_hw_set_video_bus(struct s5k5baf *state) in s5k5baf_hw_set_video_bus() argument
759 if (state->bus_type == V4L2_MBUS_CSI2_DPHY) in s5k5baf_hw_set_video_bus()
764 s5k5baf_write_seq(state, REG_OIF_EN_MIPI_LANES, in s5k5baf_hw_set_video_bus()
765 state->nlanes, en_pkts, 1); in s5k5baf_hw_set_video_bus()
767 return s5k5baf_clear_error(state); in s5k5baf_hw_set_video_bus()
770 static u16 s5k5baf_get_cfg_error(struct s5k5baf *state) in s5k5baf_get_cfg_error() argument
772 u16 err = s5k5baf_read(state, REG_G_PREV_CFG_ERROR); in s5k5baf_get_cfg_error()
774 s5k5baf_write(state, REG_G_PREV_CFG_ERROR, 0); in s5k5baf_get_cfg_error()
778 static void s5k5baf_hw_set_fiv(struct s5k5baf *state, u16 fiv) in s5k5baf_hw_set_fiv() argument
780 s5k5baf_write(state, REG_P_MAX_FR_TIME(0), fiv); in s5k5baf_hw_set_fiv()
781 s5k5baf_hw_sync_cfg(state); in s5k5baf_hw_set_fiv()
784 static void s5k5baf_hw_find_min_fiv(struct s5k5baf *state) in s5k5baf_hw_find_min_fiv() argument
789 fiv = s5k5baf_read(state, REG_G_ACTUAL_P_FR_TIME); in s5k5baf_hw_find_min_fiv()
790 if (state->error) in s5k5baf_hw_find_min_fiv()
794 s5k5baf_hw_set_fiv(state, fiv); in s5k5baf_hw_find_min_fiv()
795 err = s5k5baf_get_cfg_error(state); in s5k5baf_hw_find_min_fiv()
796 if (state->error) in s5k5baf_hw_find_min_fiv()
803 state->fiv = fiv; in s5k5baf_hw_find_min_fiv()
804 v4l2_info(&state->sd, in s5k5baf_hw_find_min_fiv()
808 v4l2_err(&state->sd, in s5k5baf_hw_find_min_fiv()
810 state->error = -EINVAL; in s5k5baf_hw_find_min_fiv()
813 v4l2_err(&state->sd, "cannot find correct frame interval\n"); in s5k5baf_hw_find_min_fiv()
814 state->error = -ERANGE; in s5k5baf_hw_find_min_fiv()
817 static void s5k5baf_hw_validate_cfg(struct s5k5baf *state) in s5k5baf_hw_validate_cfg() argument
821 err = s5k5baf_get_cfg_error(state); in s5k5baf_hw_validate_cfg()
822 if (state->error) in s5k5baf_hw_validate_cfg()
827 state->apply_cfg = 1; in s5k5baf_hw_validate_cfg()
830 s5k5baf_hw_find_min_fiv(state); in s5k5baf_hw_validate_cfg()
831 if (!state->error) in s5k5baf_hw_validate_cfg()
832 state->apply_cfg = 1; in s5k5baf_hw_validate_cfg()
835 v4l2_err(&state->sd, in s5k5baf_hw_validate_cfg()
837 state->error = -EINVAL; in s5k5baf_hw_validate_cfg()
851 static int s5k5baf_hw_set_crop_rects(struct s5k5baf *state) in s5k5baf_hw_set_crop_rects() argument
857 p = &state->crop_sink; in s5k5baf_hw_set_crop_rects()
858 s5k5baf_write_seq(state, REG_G_PREVREQ_IN_WIDTH, p->width, p->height, in s5k5baf_hw_set_crop_rects()
861 s5k5baf_rescale(&r, &state->crop_source, &state->crop_sink, in s5k5baf_hw_set_crop_rects()
862 &state->compose); in s5k5baf_hw_set_crop_rects()
863 s5k5baf_write_seq(state, REG_G_PREVZOOM_IN_WIDTH, r.width, r.height, in s5k5baf_hw_set_crop_rects()
866 s5k5baf_synchronize(state, 500, REG_G_INPUTS_CHANGE_REQ); in s5k5baf_hw_set_crop_rects()
867 s5k5baf_synchronize(state, 500, REG_G_PREV_CFG_BYPASS_CHANGED); in s5k5baf_hw_set_crop_rects()
868 err = s5k5baf_get_cfg_error(state); in s5k5baf_hw_set_crop_rects()
869 ret = s5k5baf_clear_error(state); in s5k5baf_hw_set_crop_rects()
878 s5k5baf_hw_set_fiv(state, S5K5BAF_MAX_FR_TIME); in s5k5baf_hw_set_crop_rects()
879 err = s5k5baf_get_cfg_error(state); in s5k5baf_hw_set_crop_rects()
880 ret = s5k5baf_clear_error(state); in s5k5baf_hw_set_crop_rects()
884 v4l2_err(&state->sd, in s5k5baf_hw_set_crop_rects()
886 state->error = -EINVAL; in s5k5baf_hw_set_crop_rects()
888 s5k5baf_hw_set_fiv(state, state->req_fiv); in s5k5baf_hw_set_crop_rects()
889 s5k5baf_hw_validate_cfg(state); in s5k5baf_hw_set_crop_rects()
892 v4l2_err(&state->sd, "crop error: %d\n", err); in s5k5baf_hw_set_crop_rects()
896 if (!state->apply_cfg) in s5k5baf_hw_set_crop_rects()
899 p = &state->crop_source; in s5k5baf_hw_set_crop_rects()
900 s5k5baf_write_seq(state, REG_P_OUT_WIDTH(0), p->width, p->height); in s5k5baf_hw_set_crop_rects()
901 s5k5baf_hw_set_fiv(state, state->req_fiv); in s5k5baf_hw_set_crop_rects()
902 s5k5baf_hw_validate_cfg(state); in s5k5baf_hw_set_crop_rects()
904 return s5k5baf_clear_error(state); in s5k5baf_hw_set_crop_rects()
907 static void s5k5baf_hw_set_config(struct s5k5baf *state) in s5k5baf_hw_set_config() argument
909 u16 reg_fmt = s5k5baf_formats[state->pixfmt].reg_p_fmt; in s5k5baf_hw_set_config()
910 struct v4l2_rect *r = &state->crop_source; in s5k5baf_hw_set_config()
912 s5k5baf_write_seq(state, REG_P_OUT_WIDTH(0), in s5k5baf_hw_set_config()
917 state->req_fiv, S5K5BAF_MIN_FR_TIME); in s5k5baf_hw_set_config()
918 s5k5baf_hw_sync_cfg(state); in s5k5baf_hw_set_config()
919 s5k5baf_hw_validate_cfg(state); in s5k5baf_hw_set_config()
923 static void s5k5baf_hw_set_test_pattern(struct s5k5baf *state, int id) in s5k5baf_hw_set_test_pattern() argument
925 s5k5baf_i2c_write(state, REG_PATTERN_WIDTH, 800); in s5k5baf_hw_set_test_pattern()
926 s5k5baf_i2c_write(state, REG_PATTERN_HEIGHT, 511); in s5k5baf_hw_set_test_pattern()
927 s5k5baf_i2c_write(state, REG_PATTERN_PARAM, 0); in s5k5baf_hw_set_test_pattern()
928 s5k5baf_i2c_write(state, REG_PATTERN_SET, id); in s5k5baf_hw_set_test_pattern()
931 static void s5k5baf_gpio_assert(struct s5k5baf *state, int id) in s5k5baf_gpio_assert() argument
933 gpiod_set_value_cansleep(state->gpios[id], 1); in s5k5baf_gpio_assert()
936 static void s5k5baf_gpio_deassert(struct s5k5baf *state, int id) in s5k5baf_gpio_deassert() argument
938 gpiod_set_value_cansleep(state->gpios[id], 0); in s5k5baf_gpio_deassert()
941 static int s5k5baf_power_on(struct s5k5baf *state) in s5k5baf_power_on() argument
945 ret = regulator_bulk_enable(S5K5BAF_NUM_SUPPLIES, state->supplies); in s5k5baf_power_on()
949 ret = clk_set_rate(state->clock, state->mclk_frequency); in s5k5baf_power_on()
953 ret = clk_prepare_enable(state->clock); in s5k5baf_power_on()
957 v4l2_dbg(1, debug, &state->sd, "clock frequency: %ld\n", in s5k5baf_power_on()
958 clk_get_rate(state->clock)); in s5k5baf_power_on()
960 s5k5baf_gpio_deassert(state, STBY); in s5k5baf_power_on()
962 s5k5baf_gpio_deassert(state, RSET); in s5k5baf_power_on()
966 regulator_bulk_disable(S5K5BAF_NUM_SUPPLIES, state->supplies); in s5k5baf_power_on()
968 v4l2_err(&state->sd, "%s() failed (%d)\n", __func__, ret); in s5k5baf_power_on()
972 static int s5k5baf_power_off(struct s5k5baf *state) in s5k5baf_power_off() argument
976 state->streaming = 0; in s5k5baf_power_off()
977 state->apply_cfg = 0; in s5k5baf_power_off()
978 state->apply_crop = 0; in s5k5baf_power_off()
980 s5k5baf_gpio_assert(state, RSET); in s5k5baf_power_off()
981 s5k5baf_gpio_assert(state, STBY); in s5k5baf_power_off()
983 if (!IS_ERR(state->clock)) in s5k5baf_power_off()
984 clk_disable_unprepare(state->clock); in s5k5baf_power_off()
987 state->supplies); in s5k5baf_power_off()
989 v4l2_err(&state->sd, "failed to disable regulators\n"); in s5k5baf_power_off()
994 static void s5k5baf_hw_init(struct s5k5baf *state) in s5k5baf_hw_init() argument
996 s5k5baf_i2c_write(state, AHB_MSB_ADDR_PTR, PAGE_IF_HW); in s5k5baf_hw_init()
997 s5k5baf_i2c_write(state, REG_CLEAR_HOST_INT, 0); in s5k5baf_hw_init()
998 s5k5baf_i2c_write(state, REG_SW_LOAD_COMPLETE, 1); in s5k5baf_hw_init()
999 s5k5baf_i2c_write(state, REG_CMDRD_PAGE, PAGE_IF_SW); in s5k5baf_hw_init()
1000 s5k5baf_i2c_write(state, REG_CMDWR_PAGE, PAGE_IF_SW); in s5k5baf_hw_init()
1007 static void s5k5baf_initialize_data(struct s5k5baf *state) in s5k5baf_initialize_data() argument
1009 state->pixfmt = 0; in s5k5baf_initialize_data()
1010 state->req_fiv = 10000 / 15; in s5k5baf_initialize_data()
1011 state->fiv = state->req_fiv; in s5k5baf_initialize_data()
1012 state->valid_auto_alg = 0; in s5k5baf_initialize_data()
1015 static int s5k5baf_load_setfile(struct s5k5baf *state) in s5k5baf_load_setfile() argument
1017 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_load_setfile()
1028 ret = s5k5baf_fw_parse(&c->dev, &state->fw, fw->size / 2, in s5k5baf_load_setfile()
1038 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_set_power() local
1041 mutex_lock(&state->lock); in s5k5baf_set_power()
1043 if (state->power != !on) in s5k5baf_set_power()
1047 if (state->fw == NULL) in s5k5baf_set_power()
1048 s5k5baf_load_setfile(state); in s5k5baf_set_power()
1050 s5k5baf_initialize_data(state); in s5k5baf_set_power()
1051 ret = s5k5baf_power_on(state); in s5k5baf_set_power()
1055 s5k5baf_hw_init(state); in s5k5baf_set_power()
1056 s5k5baf_hw_patch(state); in s5k5baf_set_power()
1057 s5k5baf_i2c_write(state, REG_SET_HOST_INT, 1); in s5k5baf_set_power()
1058 s5k5baf_hw_set_clocks(state); in s5k5baf_set_power()
1060 ret = s5k5baf_hw_set_video_bus(state); in s5k5baf_set_power()
1064 s5k5baf_hw_set_cis(state); in s5k5baf_set_power()
1065 s5k5baf_hw_set_ccm(state); in s5k5baf_set_power()
1067 ret = s5k5baf_clear_error(state); in s5k5baf_set_power()
1069 state->power++; in s5k5baf_set_power()
1071 s5k5baf_power_off(state); in s5k5baf_set_power()
1072 state->power--; in s5k5baf_set_power()
1076 mutex_unlock(&state->lock); in s5k5baf_set_power()
1079 ret = v4l2_ctrl_handler_setup(&state->ctrls.handler); in s5k5baf_set_power()
1084 static void s5k5baf_hw_set_stream(struct s5k5baf *state, int enable) in s5k5baf_hw_set_stream() argument
1086 s5k5baf_write_seq(state, REG_G_ENABLE_PREV, enable, 1); in s5k5baf_hw_set_stream()
1091 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_s_stream() local
1094 mutex_lock(&state->lock); in s5k5baf_s_stream()
1096 if (state->streaming == !!on) { in s5k5baf_s_stream()
1102 s5k5baf_hw_set_config(state); in s5k5baf_s_stream()
1103 ret = s5k5baf_hw_set_crop_rects(state); in s5k5baf_s_stream()
1106 s5k5baf_hw_set_stream(state, 1); in s5k5baf_s_stream()
1107 s5k5baf_i2c_write(state, 0xb0cc, 0x000b); in s5k5baf_s_stream()
1109 s5k5baf_hw_set_stream(state, 0); in s5k5baf_s_stream()
1111 ret = s5k5baf_clear_error(state); in s5k5baf_s_stream()
1113 state->streaming = !state->streaming; in s5k5baf_s_stream()
1116 mutex_unlock(&state->lock); in s5k5baf_s_stream()
1125 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_get_frame_interval() local
1129 * subdev active state API. in s5k5baf_get_frame_interval()
1134 mutex_lock(&state->lock); in s5k5baf_get_frame_interval()
1135 fi->interval.numerator = state->fiv; in s5k5baf_get_frame_interval()
1137 mutex_unlock(&state->lock); in s5k5baf_get_frame_interval()
1142 static void __s5k5baf_set_frame_interval(struct s5k5baf *state, in __s5k5baf_set_frame_interval() argument
1148 state->req_fiv = S5K5BAF_MAX_FR_TIME; in __s5k5baf_set_frame_interval()
1150 state->req_fiv = clamp_t(u32, in __s5k5baf_set_frame_interval()
1155 state->fiv = state->req_fiv; in __s5k5baf_set_frame_interval()
1156 if (state->apply_cfg) { in __s5k5baf_set_frame_interval()
1157 s5k5baf_hw_set_fiv(state, state->req_fiv); in __s5k5baf_set_frame_interval()
1158 s5k5baf_hw_validate_cfg(state); in __s5k5baf_set_frame_interval()
1160 *i = (struct v4l2_fract){ state->fiv, 10000 }; in __s5k5baf_set_frame_interval()
1161 if (state->fiv == state->req_fiv) in __s5k5baf_set_frame_interval()
1162 v4l2_info(&state->sd, "frame interval changed to %d00us\n", in __s5k5baf_set_frame_interval()
1163 state->fiv); in __s5k5baf_set_frame_interval()
1170 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_set_frame_interval() local
1174 * subdev active state API. in s5k5baf_set_frame_interval()
1179 mutex_lock(&state->lock); in s5k5baf_set_frame_interval()
1180 __s5k5baf_set_frame_interval(state, fi); in s5k5baf_set_frame_interval()
1181 mutex_unlock(&state->lock); in s5k5baf_set_frame_interval()
1287 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_get_fmt() local
1303 mutex_lock(&state->lock); in s5k5baf_get_fmt()
1304 pixfmt = &s5k5baf_formats[state->pixfmt]; in s5k5baf_get_fmt()
1305 mf->width = state->crop_source.width; in s5k5baf_get_fmt()
1306 mf->height = state->crop_source.height; in s5k5baf_get_fmt()
1309 mutex_unlock(&state->lock); in s5k5baf_get_fmt()
1319 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_set_fmt() local
1335 mutex_lock(&state->lock); in s5k5baf_set_fmt()
1337 if (state->streaming) { in s5k5baf_set_fmt()
1338 mutex_unlock(&state->lock); in s5k5baf_set_fmt()
1342 state->pixfmt = s5k5baf_try_isp_format(mf); in s5k5baf_set_fmt()
1343 pixfmt = &s5k5baf_formats[state->pixfmt]; in s5k5baf_set_fmt()
1346 mf->width = state->crop_source.width; in s5k5baf_set_fmt()
1347 mf->height = state->crop_source.height; in s5k5baf_set_fmt()
1349 mutex_unlock(&state->lock); in s5k5baf_set_fmt()
1382 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_get_selection() local
1406 mutex_lock(&state->lock); in s5k5baf_get_selection()
1409 sel->r = state->crop_sink; in s5k5baf_get_selection()
1412 sel->r = state->compose; in s5k5baf_get_selection()
1415 sel->r = state->crop_source; in s5k5baf_get_selection()
1424 mutex_unlock(&state->lock); in s5k5baf_get_selection()
1475 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_set_selection() local
1502 &state->crop_sink, in s5k5baf_set_selection()
1503 &state->compose, in s5k5baf_set_selection()
1504 &state->crop_source in s5k5baf_set_selection()
1506 mutex_lock(&state->lock); in s5k5baf_set_selection()
1507 if (state->streaming) { in s5k5baf_set_selection()
1510 if (sel->r.width < state->crop_source.width) in s5k5baf_set_selection()
1511 sel->r.width = state->crop_source.width; in s5k5baf_set_selection()
1512 if (sel->r.height < state->crop_source.height) in s5k5baf_set_selection()
1513 sel->r.height = state->crop_source.height; in s5k5baf_set_selection()
1515 sel->r.width = state->crop_source.width; in s5k5baf_set_selection()
1516 sel->r.height = state->crop_source.height; in s5k5baf_set_selection()
1520 if (!s5k5baf_cmp_rect(&state->crop_sink, &s5k5baf_cis_rect) || in s5k5baf_set_selection()
1521 !s5k5baf_cmp_rect(&state->compose, &s5k5baf_cis_rect)) in s5k5baf_set_selection()
1522 state->apply_crop = 1; in s5k5baf_set_selection()
1523 if (state->streaming) in s5k5baf_set_selection()
1524 ret = s5k5baf_hw_set_crop_rects(state); in s5k5baf_set_selection()
1525 mutex_unlock(&state->lock); in s5k5baf_set_selection()
1560 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_s_ctrl() local
1565 mutex_lock(&state->lock); in s5k5baf_s_ctrl()
1567 if (state->power == 0) in s5k5baf_s_ctrl()
1572 s5k5baf_hw_set_awb(state, ctrl->val); in s5k5baf_s_ctrl()
1576 s5k5baf_write(state, REG_USER_BRIGHTNESS, ctrl->val); in s5k5baf_s_ctrl()
1580 s5k5baf_hw_set_colorfx(state, ctrl->val); in s5k5baf_s_ctrl()
1584 s5k5baf_write(state, REG_USER_CONTRAST, ctrl->val); in s5k5baf_s_ctrl()
1588 s5k5baf_hw_set_auto_exposure(state, ctrl->val); in s5k5baf_s_ctrl()
1592 s5k5baf_hw_set_mirror(state); in s5k5baf_s_ctrl()
1596 s5k5baf_hw_set_anti_flicker(state, ctrl->val); in s5k5baf_s_ctrl()
1600 s5k5baf_write(state, REG_USER_SATURATION, ctrl->val); in s5k5baf_s_ctrl()
1604 s5k5baf_write(state, REG_USER_SHARPBLUR, ctrl->val); in s5k5baf_s_ctrl()
1608 s5k5baf_write(state, REG_P_COLORTEMP(0), ctrl->val); in s5k5baf_s_ctrl()
1609 if (state->apply_cfg) in s5k5baf_s_ctrl()
1610 s5k5baf_hw_sync_cfg(state); in s5k5baf_s_ctrl()
1614 s5k5baf_hw_set_test_pattern(state, ctrl->val); in s5k5baf_s_ctrl()
1618 ret = s5k5baf_clear_error(state); in s5k5baf_s_ctrl()
1619 mutex_unlock(&state->lock); in s5k5baf_s_ctrl()
1637 static int s5k5baf_initialize_ctrls(struct s5k5baf *state) in s5k5baf_initialize_ctrls() argument
1640 struct s5k5baf_ctrls *ctrls = &state->ctrls; in s5k5baf_initialize_ctrls()
1646 v4l2_err(&state->sd, "cannot init ctrl handler (%d)\n", ret); in s5k5baf_initialize_ctrls()
1694 v4l2_err(&state->sd, "error creating controls (%d)\n", in s5k5baf_initialize_ctrls()
1701 state->sd.ctrl_handler = hdl; in s5k5baf_initialize_ctrls()
1712 mf = v4l2_subdev_state_get_format(fh->state, PAD_CIS); in s5k5baf_open()
1718 mf = v4l2_subdev_state_get_format(fh->state, PAD_OUT); in s5k5baf_open()
1725 *v4l2_subdev_state_get_crop(fh->state, PAD_CIS) = s5k5baf_cis_rect; in s5k5baf_open()
1726 *v4l2_subdev_state_get_compose(fh->state, PAD_CIS) = s5k5baf_cis_rect; in s5k5baf_open()
1727 *v4l2_subdev_state_get_crop(fh->state, PAD_OUT) = s5k5baf_cis_rect; in s5k5baf_open()
1732 static int s5k5baf_check_fw_revision(struct s5k5baf *state) in s5k5baf_check_fw_revision() argument
1737 api_ver = s5k5baf_read(state, REG_FW_APIVER); in s5k5baf_check_fw_revision()
1738 fw_rev = s5k5baf_read(state, REG_FW_REVISION) & 0xff; in s5k5baf_check_fw_revision()
1739 s_id = s5k5baf_read(state, REG_FW_SENSOR_ID); in s5k5baf_check_fw_revision()
1740 ret = s5k5baf_clear_error(state); in s5k5baf_check_fw_revision()
1744 v4l2_info(&state->sd, "FW API=%#x, revision=%#x sensor_id=%#x\n", in s5k5baf_check_fw_revision()
1748 v4l2_err(&state->sd, "FW API version not supported\n"); in s5k5baf_check_fw_revision()
1757 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_registered() local
1760 ret = v4l2_device_register_subdev(sd->v4l2_dev, &state->cis_sd); in s5k5baf_registered()
1763 state->cis_sd.name); in s5k5baf_registered()
1765 ret = media_create_pad_link(&state->cis_sd.entity, PAD_CIS, in s5k5baf_registered()
1766 &state->sd.entity, PAD_CIS, in s5k5baf_registered()
1774 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_unregistered() local
1775 v4l2_device_unregister_subdev(&state->cis_sd); in s5k5baf_unregistered()
1803 static int s5k5baf_configure_gpios(struct s5k5baf *state) in s5k5baf_configure_gpios() argument
1807 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_configure_gpios()
1827 state->gpios[i] = gpio; in s5k5baf_configure_gpios()
1832 static int s5k5baf_parse_device_node(struct s5k5baf *state, struct device *dev) in s5k5baf_parse_device_node() argument
1845 &state->mclk_frequency); in s5k5baf_parse_device_node()
1847 state->mclk_frequency = S5K5BAF_DEFAULT_MCLK_FREQ; in s5k5baf_parse_device_node()
1849 state->mclk_frequency); in s5k5baf_parse_device_node()
1863 state->bus_type = ep.bus_type; in s5k5baf_parse_device_node()
1865 switch (state->bus_type) { in s5k5baf_parse_device_node()
1867 state->nlanes = ep.bus.mipi_csi2.num_data_lanes; in s5k5baf_parse_device_node()
1880 static int s5k5baf_configure_subdevs(struct s5k5baf *state, in s5k5baf_configure_subdevs() argument
1886 sd = &state->cis_sd; in s5k5baf_configure_subdevs()
1889 v4l2_set_subdevdata(sd, state); in s5k5baf_configure_subdevs()
1896 state->cis_pad.flags = MEDIA_PAD_FL_SOURCE; in s5k5baf_configure_subdevs()
1898 ret = media_entity_pads_init(&sd->entity, NUM_CIS_PADS, &state->cis_pad); in s5k5baf_configure_subdevs()
1902 sd = &state->sd; in s5k5baf_configure_subdevs()
1910 state->pads[PAD_CIS].flags = MEDIA_PAD_FL_SINK; in s5k5baf_configure_subdevs()
1911 state->pads[PAD_OUT].flags = MEDIA_PAD_FL_SOURCE; in s5k5baf_configure_subdevs()
1913 ret = media_entity_pads_init(&sd->entity, NUM_ISP_PADS, state->pads); in s5k5baf_configure_subdevs()
1918 media_entity_cleanup(&state->cis_sd.entity); in s5k5baf_configure_subdevs()
1924 static int s5k5baf_configure_regulators(struct s5k5baf *state) in s5k5baf_configure_regulators() argument
1926 struct i2c_client *c = v4l2_get_subdevdata(&state->sd); in s5k5baf_configure_regulators()
1931 state->supplies[i].supply = s5k5baf_supply_names[i]; in s5k5baf_configure_regulators()
1934 state->supplies); in s5k5baf_configure_regulators()
1942 struct s5k5baf *state; in s5k5baf_probe() local
1945 state = devm_kzalloc(&c->dev, sizeof(*state), GFP_KERNEL); in s5k5baf_probe()
1946 if (!state) in s5k5baf_probe()
1949 mutex_init(&state->lock); in s5k5baf_probe()
1950 state->crop_sink = s5k5baf_cis_rect; in s5k5baf_probe()
1951 state->compose = s5k5baf_cis_rect; in s5k5baf_probe()
1952 state->crop_source = s5k5baf_cis_rect; in s5k5baf_probe()
1954 ret = s5k5baf_parse_device_node(state, &c->dev); in s5k5baf_probe()
1958 ret = s5k5baf_configure_subdevs(state, c); in s5k5baf_probe()
1962 ret = s5k5baf_configure_gpios(state); in s5k5baf_probe()
1966 ret = s5k5baf_configure_regulators(state); in s5k5baf_probe()
1970 state->clock = devm_clk_get(state->sd.dev, S5K5BAF_CLK_NAME); in s5k5baf_probe()
1971 if (IS_ERR(state->clock)) { in s5k5baf_probe()
1976 ret = s5k5baf_power_on(state); in s5k5baf_probe()
1981 s5k5baf_hw_init(state); in s5k5baf_probe()
1982 ret = s5k5baf_check_fw_revision(state); in s5k5baf_probe()
1984 s5k5baf_power_off(state); in s5k5baf_probe()
1988 ret = s5k5baf_initialize_ctrls(state); in s5k5baf_probe()
1992 ret = v4l2_async_register_subdev(&state->sd); in s5k5baf_probe()
1999 v4l2_ctrl_handler_free(state->sd.ctrl_handler); in s5k5baf_probe()
2001 media_entity_cleanup(&state->sd.entity); in s5k5baf_probe()
2002 media_entity_cleanup(&state->cis_sd.entity); in s5k5baf_probe()
2009 struct s5k5baf *state = to_s5k5baf(sd); in s5k5baf_remove() local
2015 sd = &state->cis_sd; in s5k5baf_remove()