Lines Matching refs:s5k6aa
230 struct s5k6aa { struct
306 return &container_of(ctrl->handler, struct s5k6aa, ctrls.handler)->sd; in ctrl_to_sd()
309 static inline struct s5k6aa *to_s5k6aa(struct v4l2_subdev *sd) in to_s5k6aa()
311 return container_of(sd, struct s5k6aa, sd); in to_s5k6aa()
315 static void s5k6aa_presets_data_init(struct s5k6aa *s5k6aa) in s5k6aa_presets_data_init() argument
317 struct s5k6aa_preset *preset = &s5k6aa->presets[0]; in s5k6aa_presets_data_init()
329 s5k6aa->fiv = &s5k6aa_intervals[S5K6AA_INTERVAL_DEF_INDEX]; in s5k6aa_presets_data_init()
330 s5k6aa->preset = &s5k6aa->presets[0]; in s5k6aa_presets_data_init()
428 static int s5k6aa_configure_pixel_clocks(struct s5k6aa *s5k6aa) in s5k6aa_configure_pixel_clocks() argument
430 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_configure_pixel_clocks()
431 unsigned long fmclk = s5k6aa->mclk_frequency / 1000; in s5k6aa_configure_pixel_clocks()
439 s5k6aa->pclk_fmin = PCLK_FREQ_MIN; in s5k6aa_configure_pixel_clocks()
440 s5k6aa->pclk_fmax = PCLK_FREQ_MAX; in s5k6aa_configure_pixel_clocks()
441 s5k6aa->clk_fop = SYS_PLL_OUT_FREQ; in s5k6aa_configure_pixel_clocks()
451 ret = s5k6aa_write(c, REG_I_OPCLK_4KHZ(0), s5k6aa->clk_fop); in s5k6aa_configure_pixel_clocks()
454 s5k6aa->pclk_fmin); in s5k6aa_configure_pixel_clocks()
457 s5k6aa->pclk_fmax); in s5k6aa_configure_pixel_clocks()
467 static int s5k6aa_set_mirror(struct s5k6aa *s5k6aa, int horiz_flip) in s5k6aa_set_mirror() argument
469 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_mirror()
470 int index = s5k6aa->preset->index; in s5k6aa_set_mirror()
472 unsigned int vflip = s5k6aa->ctrls.vflip->val ^ s5k6aa->inv_vflip; in s5k6aa_set_mirror()
473 unsigned int flip = (horiz_flip ^ s5k6aa->inv_hflip) | (vflip << 1); in s5k6aa_set_mirror()
479 static int s5k6aa_set_awb(struct s5k6aa *s5k6aa, int awb) in s5k6aa_set_awb() argument
481 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_awb()
482 struct s5k6aa_ctrls *ctrls = &s5k6aa->ctrls; in s5k6aa_set_awb()
534 static int s5k6aa_set_auto_exposure(struct s5k6aa *s5k6aa, int value) in s5k6aa_set_auto_exposure() argument
536 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_auto_exposure()
537 unsigned int exp_time = s5k6aa->ctrls.exposure->val; in s5k6aa_set_auto_exposure()
553 ret = s5k6aa_set_user_gain(c, s5k6aa->ctrls.gain->val); in s5k6aa_set_auto_exposure()
562 static int s5k6aa_set_anti_flicker(struct s5k6aa *s5k6aa, int value) in s5k6aa_set_anti_flicker() argument
564 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_anti_flicker()
589 static int s5k6aa_set_colorfx(struct s5k6aa *s5k6aa, int val) in s5k6aa_set_colorfx() argument
591 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_colorfx()
619 static int s5k6aa_get_pixfmt_index(struct s5k6aa *s5k6aa, in s5k6aa_get_pixfmt_index() argument
631 static int s5k6aa_set_output_framefmt(struct s5k6aa *s5k6aa, in s5k6aa_set_output_framefmt() argument
634 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_output_framefmt()
635 int fmt_index = s5k6aa_get_pixfmt_index(s5k6aa, &preset->mbus_fmt); in s5k6aa_set_output_framefmt()
649 static int s5k6aa_set_input_params(struct s5k6aa *s5k6aa) in s5k6aa_set_input_params() argument
651 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_input_params()
652 struct v4l2_rect *r = &s5k6aa->ccd_rect; in s5k6aa_set_input_params()
665 s5k6aa->apply_crop = 0; in s5k6aa_set_input_params()
677 static int s5k6aa_configure_video_bus(struct s5k6aa *s5k6aa, in s5k6aa_configure_video_bus() argument
680 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_configure_video_bus()
731 static int s5k6aa_set_prev_config(struct s5k6aa *s5k6aa, in s5k6aa_set_prev_config() argument
734 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_prev_config()
739 if (s5k6aa->fiv->reg_fr_time >= S5K6AA_MAX_HIGHRES_FR_TIME) in s5k6aa_set_prev_config()
744 ret = s5k6aa_set_output_framefmt(s5k6aa, preset); in s5k6aa_set_prev_config()
747 s5k6aa->pclk_fmax); in s5k6aa_set_prev_config()
750 s5k6aa->pclk_fmin); in s5k6aa_set_prev_config()
762 s5k6aa->fiv->reg_fr_time + 33); in s5k6aa_set_prev_config()
765 s5k6aa->fiv->reg_fr_time - 33); in s5k6aa_set_prev_config()
771 s5k6aa->apply_cfg = 0; in s5k6aa_set_prev_config()
774 s5k6aa->fiv->reg_fr_time, ret); in s5k6aa_set_prev_config()
789 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_initialize_isp() local
792 s5k6aa->apply_crop = 1; in s5k6aa_initialize_isp()
793 s5k6aa->apply_cfg = 1; in s5k6aa_initialize_isp()
799 ret = s5k6aa_configure_video_bus(s5k6aa, s5k6aa->bus_type, in s5k6aa_initialize_isp()
800 s5k6aa->mipi_lanes); in s5k6aa_initialize_isp()
808 return s5k6aa_configure_pixel_clocks(s5k6aa); in s5k6aa_initialize_isp()
811 static int s5k6aa_gpio_set_value(struct s5k6aa *priv, int id, u32 val) in s5k6aa_gpio_set_value()
819 static int s5k6aa_gpio_assert(struct s5k6aa *priv, int id) in s5k6aa_gpio_assert()
824 static int s5k6aa_gpio_deassert(struct s5k6aa *priv, int id) in s5k6aa_gpio_deassert()
829 static int __s5k6aa_power_on(struct s5k6aa *s5k6aa) in __s5k6aa_power_on() argument
833 ret = regulator_bulk_enable(S5K6AA_NUM_SUPPLIES, s5k6aa->supplies); in __s5k6aa_power_on()
836 if (s5k6aa_gpio_deassert(s5k6aa, STBY)) in __s5k6aa_power_on()
839 if (s5k6aa->s_power) in __s5k6aa_power_on()
840 ret = s5k6aa->s_power(1); in __s5k6aa_power_on()
843 if (s5k6aa_gpio_deassert(s5k6aa, RST)) in __s5k6aa_power_on()
849 static int __s5k6aa_power_off(struct s5k6aa *s5k6aa) in __s5k6aa_power_off() argument
853 if (s5k6aa_gpio_assert(s5k6aa, RST)) in __s5k6aa_power_off()
856 if (s5k6aa->s_power) { in __s5k6aa_power_off()
857 ret = s5k6aa->s_power(0); in __s5k6aa_power_off()
861 if (s5k6aa_gpio_assert(s5k6aa, STBY)) in __s5k6aa_power_off()
863 s5k6aa->streaming = 0; in __s5k6aa_power_off()
865 return regulator_bulk_disable(S5K6AA_NUM_SUPPLIES, s5k6aa->supplies); in __s5k6aa_power_off()
873 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_power() local
876 mutex_lock(&s5k6aa->lock); in s5k6aa_set_power()
878 if (!on == s5k6aa->power) { in s5k6aa_set_power()
880 ret = __s5k6aa_power_on(s5k6aa); in s5k6aa_set_power()
884 ret = __s5k6aa_power_off(s5k6aa); in s5k6aa_set_power()
888 s5k6aa->power += on ? 1 : -1; in s5k6aa_set_power()
891 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_power()
893 if (!on || ret || s5k6aa->power != 1) in s5k6aa_set_power()
899 static int __s5k6aa_stream(struct s5k6aa *s5k6aa, int enable) in __s5k6aa_stream() argument
901 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in __s5k6aa_stream()
908 s5k6aa->streaming = enable; in __s5k6aa_stream()
915 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_stream() local
918 mutex_lock(&s5k6aa->lock); in s5k6aa_s_stream()
920 if (s5k6aa->streaming == !on) { in s5k6aa_s_stream()
921 if (!ret && s5k6aa->apply_cfg) in s5k6aa_s_stream()
922 ret = s5k6aa_set_prev_config(s5k6aa, s5k6aa->preset); in s5k6aa_s_stream()
923 if (s5k6aa->apply_crop) in s5k6aa_s_stream()
924 ret = s5k6aa_set_input_params(s5k6aa); in s5k6aa_s_stream()
926 ret = __s5k6aa_stream(s5k6aa, !!on); in s5k6aa_s_stream()
928 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_stream()
936 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_g_frame_interval() local
938 mutex_lock(&s5k6aa->lock); in s5k6aa_g_frame_interval()
939 fi->interval = s5k6aa->fiv->interval; in s5k6aa_g_frame_interval()
940 mutex_unlock(&s5k6aa->lock); in s5k6aa_g_frame_interval()
945 static int __s5k6aa_set_frame_interval(struct s5k6aa *s5k6aa, in __s5k6aa_set_frame_interval() argument
948 struct v4l2_mbus_framefmt *mbus_fmt = &s5k6aa->preset->mbus_fmt; in __s5k6aa_set_frame_interval()
971 s5k6aa->fiv = fiv; in __s5k6aa_set_frame_interval()
973 v4l2_dbg(1, debug, &s5k6aa->sd, "Changed frame interval to %d us\n", in __s5k6aa_set_frame_interval()
981 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_frame_interval() local
987 mutex_lock(&s5k6aa->lock); in s5k6aa_s_frame_interval()
988 ret = __s5k6aa_set_frame_interval(s5k6aa, fi); in s5k6aa_s_frame_interval()
989 s5k6aa->apply_cfg = 1; in s5k6aa_s_frame_interval()
991 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_frame_interval()
1002 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_enum_frame_interval() local
1014 mutex_lock(&s5k6aa->lock); in s5k6aa_enum_frame_interval()
1020 mutex_unlock(&s5k6aa->lock); in s5k6aa_enum_frame_interval()
1059 __s5k6aa_get_crop_rect(struct s5k6aa *s5k6aa, struct v4l2_subdev_pad_config *cfg, in __s5k6aa_get_crop_rect() argument
1063 return &s5k6aa->ccd_rect; in __s5k6aa_get_crop_rect()
1066 return v4l2_subdev_get_try_crop(&s5k6aa->sd, cfg, 0); in __s5k6aa_get_crop_rect()
1069 static void s5k6aa_try_format(struct s5k6aa *s5k6aa, in s5k6aa_try_format() argument
1083 index = s5k6aa_get_pixfmt_index(s5k6aa, mf); in s5k6aa_try_format()
1093 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_get_fmt() local
1104 mutex_lock(&s5k6aa->lock); in s5k6aa_get_fmt()
1105 fmt->format = s5k6aa->preset->mbus_fmt; in s5k6aa_get_fmt()
1106 mutex_unlock(&s5k6aa->lock); in s5k6aa_get_fmt()
1114 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_fmt() local
1115 struct s5k6aa_preset *preset = s5k6aa->preset; in s5k6aa_set_fmt()
1120 mutex_lock(&s5k6aa->lock); in s5k6aa_set_fmt()
1121 s5k6aa_try_format(s5k6aa, &fmt->format); in s5k6aa_set_fmt()
1127 if (s5k6aa->streaming) { in s5k6aa_set_fmt()
1131 crop = &s5k6aa->ccd_rect; in s5k6aa_set_fmt()
1132 s5k6aa->apply_cfg = 1; in s5k6aa_set_fmt()
1157 ret = __s5k6aa_set_frame_interval(s5k6aa, &fiv); in s5k6aa_set_fmt()
1159 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_fmt()
1168 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_get_selection() local
1176 mutex_lock(&s5k6aa->lock); in s5k6aa_get_selection()
1177 rect = __s5k6aa_get_crop_rect(s5k6aa, cfg, sel->which); in s5k6aa_get_selection()
1179 mutex_unlock(&s5k6aa->lock); in s5k6aa_get_selection()
1191 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_selection() local
1199 mutex_lock(&s5k6aa->lock); in s5k6aa_set_selection()
1200 crop_r = __s5k6aa_get_crop_rect(s5k6aa, cfg, sel->which); in s5k6aa_set_selection()
1203 mf = &s5k6aa->preset->mbus_fmt; in s5k6aa_set_selection()
1204 s5k6aa->apply_crop = 1; in s5k6aa_set_selection()
1221 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_selection()
1253 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_ctrl() local
1258 mutex_lock(&s5k6aa->lock); in s5k6aa_s_ctrl()
1264 if (s5k6aa->power == 0) in s5k6aa_s_ctrl()
1266 idx = s5k6aa->preset->index; in s5k6aa_s_ctrl()
1270 err = s5k6aa_set_awb(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1278 err = s5k6aa_set_colorfx(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1286 err = s5k6aa_set_auto_exposure(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1290 err = s5k6aa_set_mirror(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1297 err = s5k6aa_set_anti_flicker(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1316 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_ctrl()
1365 static int s5k6aa_initialize_ctrls(struct s5k6aa *s5k6aa) in s5k6aa_initialize_ctrls() argument
1368 struct s5k6aa_ctrls *ctrls = &s5k6aa->ctrls; in s5k6aa_initialize_ctrls()
1418 s5k6aa->sd.ctrl_handler = hdl; in s5k6aa_initialize_ctrls()
1444 static int s5k6aa_check_fw_revision(struct s5k6aa *s5k6aa) in s5k6aa_check_fw_revision() argument
1446 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_check_fw_revision()
1456 v4l2_err(&s5k6aa->sd, "FW revision check failed!\n"); in s5k6aa_check_fw_revision()
1460 v4l2_info(&s5k6aa->sd, "FW API ver.: 0x%X, FW rev.: 0x%X\n", in s5k6aa_check_fw_revision()
1468 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_registered() local
1471 mutex_lock(&s5k6aa->lock); in s5k6aa_registered()
1472 ret = __s5k6aa_power_on(s5k6aa); in s5k6aa_registered()
1475 ret = s5k6aa_check_fw_revision(s5k6aa); in s5k6aa_registered()
1476 __s5k6aa_power_off(s5k6aa); in s5k6aa_registered()
1478 mutex_unlock(&s5k6aa->lock); in s5k6aa_registered()
1503 static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa, in s5k6aa_configure_gpios() argument
1506 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_configure_gpios()
1511 s5k6aa->gpio[STBY].gpio = -EINVAL; in s5k6aa_configure_gpios()
1512 s5k6aa->gpio[RST].gpio = -EINVAL; in s5k6aa_configure_gpios()
1523 s5k6aa->gpio[STBY] = *gpio; in s5k6aa_configure_gpios()
1535 s5k6aa->gpio[RST] = *gpio; in s5k6aa_configure_gpios()
1546 struct s5k6aa *s5k6aa; in s5k6aa_probe() local
1559 s5k6aa = devm_kzalloc(&client->dev, sizeof(*s5k6aa), GFP_KERNEL); in s5k6aa_probe()
1560 if (!s5k6aa) in s5k6aa_probe()
1563 mutex_init(&s5k6aa->lock); in s5k6aa_probe()
1565 s5k6aa->mclk_frequency = pdata->mclk_frequency; in s5k6aa_probe()
1566 s5k6aa->bus_type = pdata->bus_type; in s5k6aa_probe()
1567 s5k6aa->mipi_lanes = pdata->nlanes; in s5k6aa_probe()
1568 s5k6aa->s_power = pdata->set_power; in s5k6aa_probe()
1569 s5k6aa->inv_hflip = pdata->horiz_flip; in s5k6aa_probe()
1570 s5k6aa->inv_vflip = pdata->vert_flip; in s5k6aa_probe()
1572 sd = &s5k6aa->sd; in s5k6aa_probe()
1579 s5k6aa->pad.flags = MEDIA_PAD_FL_SOURCE; in s5k6aa_probe()
1581 ret = media_entity_init(&sd->entity, 1, &s5k6aa->pad, 0); in s5k6aa_probe()
1585 ret = s5k6aa_configure_gpios(s5k6aa, pdata); in s5k6aa_probe()
1590 s5k6aa->supplies[i].supply = s5k6aa_supply_names[i]; in s5k6aa_probe()
1593 s5k6aa->supplies); in s5k6aa_probe()
1599 ret = s5k6aa_initialize_ctrls(s5k6aa); in s5k6aa_probe()
1603 s5k6aa_presets_data_init(s5k6aa); in s5k6aa_probe()
1605 s5k6aa->ccd_rect.width = S5K6AA_WIN_WIDTH_MAX; in s5k6aa_probe()
1606 s5k6aa->ccd_rect.height = S5K6AA_WIN_HEIGHT_MAX; in s5k6aa_probe()
1607 s5k6aa->ccd_rect.left = 0; in s5k6aa_probe()
1608 s5k6aa->ccd_rect.top = 0; in s5k6aa_probe()
1613 media_entity_cleanup(&s5k6aa->sd.entity); in s5k6aa_probe()