Lines Matching refs:s5k6aa
226 struct s5k6aa { struct
302 return &container_of(ctrl->handler, struct s5k6aa, ctrls.handler)->sd; in ctrl_to_sd()
305 static inline struct s5k6aa *to_s5k6aa(struct v4l2_subdev *sd) in to_s5k6aa()
307 return container_of(sd, struct s5k6aa, sd); in to_s5k6aa()
311 static void s5k6aa_presets_data_init(struct s5k6aa *s5k6aa) in s5k6aa_presets_data_init() argument
313 struct s5k6aa_preset *preset = &s5k6aa->presets[0]; in s5k6aa_presets_data_init()
325 s5k6aa->fiv = &s5k6aa_intervals[S5K6AA_INTERVAL_DEF_INDEX]; in s5k6aa_presets_data_init()
326 s5k6aa->preset = &s5k6aa->presets[0]; in s5k6aa_presets_data_init()
425 static int s5k6aa_configure_pixel_clocks(struct s5k6aa *s5k6aa) in s5k6aa_configure_pixel_clocks() argument
427 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_configure_pixel_clocks()
428 unsigned long fmclk = s5k6aa->mclk_frequency / 1000; in s5k6aa_configure_pixel_clocks()
436 s5k6aa->pclk_fmin = PCLK_FREQ_MIN; in s5k6aa_configure_pixel_clocks()
437 s5k6aa->pclk_fmax = PCLK_FREQ_MAX; in s5k6aa_configure_pixel_clocks()
438 s5k6aa->clk_fop = SYS_PLL_OUT_FREQ; in s5k6aa_configure_pixel_clocks()
448 ret = s5k6aa_write(c, REG_I_OPCLK_4KHZ(0), s5k6aa->clk_fop); in s5k6aa_configure_pixel_clocks()
451 s5k6aa->pclk_fmin); in s5k6aa_configure_pixel_clocks()
454 s5k6aa->pclk_fmax); in s5k6aa_configure_pixel_clocks()
464 static int s5k6aa_set_mirror(struct s5k6aa *s5k6aa, int horiz_flip) in s5k6aa_set_mirror() argument
466 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_mirror()
467 int index = s5k6aa->preset->index; in s5k6aa_set_mirror()
469 unsigned int vflip = s5k6aa->ctrls.vflip->val ^ s5k6aa->inv_vflip; in s5k6aa_set_mirror()
470 unsigned int flip = (horiz_flip ^ s5k6aa->inv_hflip) | (vflip << 1); in s5k6aa_set_mirror()
476 static int s5k6aa_set_awb(struct s5k6aa *s5k6aa, int awb) in s5k6aa_set_awb() argument
478 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_awb()
479 struct s5k6aa_ctrls *ctrls = &s5k6aa->ctrls; in s5k6aa_set_awb()
531 static int s5k6aa_set_auto_exposure(struct s5k6aa *s5k6aa, int value) in s5k6aa_set_auto_exposure() argument
533 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_auto_exposure()
534 unsigned int exp_time = s5k6aa->ctrls.exposure->val; in s5k6aa_set_auto_exposure()
550 ret = s5k6aa_set_user_gain(c, s5k6aa->ctrls.gain->val); in s5k6aa_set_auto_exposure()
559 static int s5k6aa_set_anti_flicker(struct s5k6aa *s5k6aa, int value) in s5k6aa_set_anti_flicker() argument
561 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_anti_flicker()
586 static int s5k6aa_set_colorfx(struct s5k6aa *s5k6aa, int val) in s5k6aa_set_colorfx() argument
588 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_colorfx()
616 static int s5k6aa_get_pixfmt_index(struct s5k6aa *s5k6aa, in s5k6aa_get_pixfmt_index() argument
628 static int s5k6aa_set_output_framefmt(struct s5k6aa *s5k6aa, in s5k6aa_set_output_framefmt() argument
631 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_output_framefmt()
632 int fmt_index = s5k6aa_get_pixfmt_index(s5k6aa, &preset->mbus_fmt); in s5k6aa_set_output_framefmt()
646 static int s5k6aa_set_input_params(struct s5k6aa *s5k6aa) in s5k6aa_set_input_params() argument
648 struct i2c_client *c = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_set_input_params()
649 struct v4l2_rect *r = &s5k6aa->ccd_rect; in s5k6aa_set_input_params()
662 s5k6aa->apply_crop = 0; in s5k6aa_set_input_params()
675 static int s5k6aa_configure_video_bus(struct s5k6aa *s5k6aa, in s5k6aa_configure_video_bus() argument
678 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()
790 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_initialize_isp() local
793 s5k6aa->apply_crop = 1; in s5k6aa_initialize_isp()
794 s5k6aa->apply_cfg = 1; in s5k6aa_initialize_isp()
800 ret = s5k6aa_configure_video_bus(s5k6aa, s5k6aa->bus_type, in s5k6aa_initialize_isp()
801 s5k6aa->mipi_lanes); in s5k6aa_initialize_isp()
809 return s5k6aa_configure_pixel_clocks(s5k6aa); in s5k6aa_initialize_isp()
812 static int s5k6aa_gpio_set_value(struct s5k6aa *priv, int id, u32 val) in s5k6aa_gpio_set_value()
820 static int s5k6aa_gpio_assert(struct s5k6aa *priv, int id) in s5k6aa_gpio_assert()
825 static int s5k6aa_gpio_deassert(struct s5k6aa *priv, int id) in s5k6aa_gpio_deassert()
830 static int __s5k6aa_power_on(struct s5k6aa *s5k6aa) in __s5k6aa_power_on() argument
834 ret = regulator_bulk_enable(S5K6AA_NUM_SUPPLIES, s5k6aa->supplies); in __s5k6aa_power_on()
837 if (s5k6aa_gpio_deassert(s5k6aa, STBY)) in __s5k6aa_power_on()
840 if (s5k6aa->s_power) in __s5k6aa_power_on()
841 ret = s5k6aa->s_power(1); in __s5k6aa_power_on()
844 if (s5k6aa_gpio_deassert(s5k6aa, RSET)) in __s5k6aa_power_on()
850 static int __s5k6aa_power_off(struct s5k6aa *s5k6aa) in __s5k6aa_power_off() argument
854 if (s5k6aa_gpio_assert(s5k6aa, RSET)) in __s5k6aa_power_off()
857 if (s5k6aa->s_power) { in __s5k6aa_power_off()
858 ret = s5k6aa->s_power(0); in __s5k6aa_power_off()
862 if (s5k6aa_gpio_assert(s5k6aa, STBY)) in __s5k6aa_power_off()
864 s5k6aa->streaming = 0; in __s5k6aa_power_off()
866 return regulator_bulk_disable(S5K6AA_NUM_SUPPLIES, s5k6aa->supplies); in __s5k6aa_power_off()
874 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_power() local
877 mutex_lock(&s5k6aa->lock); in s5k6aa_set_power()
879 if (s5k6aa->power == !on) { in s5k6aa_set_power()
881 ret = __s5k6aa_power_on(s5k6aa); in s5k6aa_set_power()
885 ret = __s5k6aa_power_off(s5k6aa); in s5k6aa_set_power()
889 s5k6aa->power += on ? 1 : -1; in s5k6aa_set_power()
892 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_power()
894 if (!on || ret || s5k6aa->power != 1) in s5k6aa_set_power()
900 static int __s5k6aa_stream(struct s5k6aa *s5k6aa, int enable) in __s5k6aa_stream() argument
902 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in __s5k6aa_stream()
909 s5k6aa->streaming = enable; in __s5k6aa_stream()
916 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_stream() local
919 mutex_lock(&s5k6aa->lock); in s5k6aa_s_stream()
921 if (s5k6aa->streaming == !on) { in s5k6aa_s_stream()
922 if (!ret && s5k6aa->apply_cfg) in s5k6aa_s_stream()
923 ret = s5k6aa_set_prev_config(s5k6aa, s5k6aa->preset); in s5k6aa_s_stream()
924 if (s5k6aa->apply_crop) in s5k6aa_s_stream()
925 ret = s5k6aa_set_input_params(s5k6aa); in s5k6aa_s_stream()
927 ret = __s5k6aa_stream(s5k6aa, !!on); in s5k6aa_s_stream()
929 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_stream()
937 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_g_frame_interval() local
939 mutex_lock(&s5k6aa->lock); in s5k6aa_g_frame_interval()
940 fi->interval = s5k6aa->fiv->interval; in s5k6aa_g_frame_interval()
941 mutex_unlock(&s5k6aa->lock); in s5k6aa_g_frame_interval()
946 static int __s5k6aa_set_frame_interval(struct s5k6aa *s5k6aa, in __s5k6aa_set_frame_interval() argument
949 struct v4l2_mbus_framefmt *mbus_fmt = &s5k6aa->preset->mbus_fmt; in __s5k6aa_set_frame_interval()
972 s5k6aa->fiv = fiv; in __s5k6aa_set_frame_interval()
974 v4l2_dbg(1, debug, &s5k6aa->sd, "Changed frame interval to %d us\n", in __s5k6aa_set_frame_interval()
982 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_frame_interval() local
988 mutex_lock(&s5k6aa->lock); in s5k6aa_s_frame_interval()
989 ret = __s5k6aa_set_frame_interval(s5k6aa, fi); in s5k6aa_s_frame_interval()
990 s5k6aa->apply_cfg = 1; in s5k6aa_s_frame_interval()
992 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_frame_interval()
1003 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_enum_frame_interval() local
1015 mutex_lock(&s5k6aa->lock); in s5k6aa_enum_frame_interval()
1021 mutex_unlock(&s5k6aa->lock); in s5k6aa_enum_frame_interval()
1060 __s5k6aa_get_crop_rect(struct s5k6aa *s5k6aa, struct v4l2_subdev_pad_config *cfg, in __s5k6aa_get_crop_rect() argument
1064 return &s5k6aa->ccd_rect; in __s5k6aa_get_crop_rect()
1067 return v4l2_subdev_get_try_crop(&s5k6aa->sd, cfg, 0); in __s5k6aa_get_crop_rect()
1070 static void s5k6aa_try_format(struct s5k6aa *s5k6aa, in s5k6aa_try_format() argument
1084 index = s5k6aa_get_pixfmt_index(s5k6aa, mf); in s5k6aa_try_format()
1094 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_get_fmt() local
1105 mutex_lock(&s5k6aa->lock); in s5k6aa_get_fmt()
1106 fmt->format = s5k6aa->preset->mbus_fmt; in s5k6aa_get_fmt()
1107 mutex_unlock(&s5k6aa->lock); in s5k6aa_get_fmt()
1115 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_fmt() local
1116 struct s5k6aa_preset *preset = s5k6aa->preset; in s5k6aa_set_fmt()
1121 mutex_lock(&s5k6aa->lock); in s5k6aa_set_fmt()
1122 s5k6aa_try_format(s5k6aa, &fmt->format); in s5k6aa_set_fmt()
1128 if (s5k6aa->streaming) { in s5k6aa_set_fmt()
1132 crop = &s5k6aa->ccd_rect; in s5k6aa_set_fmt()
1133 s5k6aa->apply_cfg = 1; in s5k6aa_set_fmt()
1158 ret = __s5k6aa_set_frame_interval(s5k6aa, &fiv); in s5k6aa_set_fmt()
1160 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_fmt()
1169 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_get_selection() local
1177 mutex_lock(&s5k6aa->lock); in s5k6aa_get_selection()
1178 rect = __s5k6aa_get_crop_rect(s5k6aa, cfg, sel->which); in s5k6aa_get_selection()
1180 mutex_unlock(&s5k6aa->lock); in s5k6aa_get_selection()
1192 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_set_selection() local
1200 mutex_lock(&s5k6aa->lock); in s5k6aa_set_selection()
1201 crop_r = __s5k6aa_get_crop_rect(s5k6aa, cfg, sel->which); in s5k6aa_set_selection()
1204 mf = &s5k6aa->preset->mbus_fmt; in s5k6aa_set_selection()
1205 s5k6aa->apply_crop = 1; in s5k6aa_set_selection()
1222 mutex_unlock(&s5k6aa->lock); in s5k6aa_set_selection()
1254 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_s_ctrl() local
1259 mutex_lock(&s5k6aa->lock); in s5k6aa_s_ctrl()
1265 if (s5k6aa->power == 0) in s5k6aa_s_ctrl()
1267 idx = s5k6aa->preset->index; in s5k6aa_s_ctrl()
1271 err = s5k6aa_set_awb(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1279 err = s5k6aa_set_colorfx(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1287 err = s5k6aa_set_auto_exposure(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1291 err = s5k6aa_set_mirror(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1298 err = s5k6aa_set_anti_flicker(s5k6aa, ctrl->val); in s5k6aa_s_ctrl()
1317 mutex_unlock(&s5k6aa->lock); in s5k6aa_s_ctrl()
1366 static int s5k6aa_initialize_ctrls(struct s5k6aa *s5k6aa) in s5k6aa_initialize_ctrls() argument
1369 struct s5k6aa_ctrls *ctrls = &s5k6aa->ctrls; in s5k6aa_initialize_ctrls()
1419 s5k6aa->sd.ctrl_handler = hdl; in s5k6aa_initialize_ctrls()
1445 static int s5k6aa_check_fw_revision(struct s5k6aa *s5k6aa) in s5k6aa_check_fw_revision() argument
1447 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_check_fw_revision()
1457 v4l2_err(&s5k6aa->sd, "FW revision check failed!\n"); in s5k6aa_check_fw_revision()
1461 v4l2_info(&s5k6aa->sd, "FW API ver.: 0x%X, FW rev.: 0x%X\n", in s5k6aa_check_fw_revision()
1469 struct s5k6aa *s5k6aa = to_s5k6aa(sd); in s5k6aa_registered() local
1472 mutex_lock(&s5k6aa->lock); in s5k6aa_registered()
1473 ret = __s5k6aa_power_on(s5k6aa); in s5k6aa_registered()
1476 ret = s5k6aa_check_fw_revision(s5k6aa); in s5k6aa_registered()
1477 __s5k6aa_power_off(s5k6aa); in s5k6aa_registered()
1479 mutex_unlock(&s5k6aa->lock); in s5k6aa_registered()
1504 static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa, in s5k6aa_configure_gpios() argument
1507 struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd); in s5k6aa_configure_gpios()
1512 s5k6aa->gpio[STBY].gpio = -EINVAL; in s5k6aa_configure_gpios()
1513 s5k6aa->gpio[RSET].gpio = -EINVAL; in s5k6aa_configure_gpios()
1524 s5k6aa->gpio[STBY] = *gpio; in s5k6aa_configure_gpios()
1536 s5k6aa->gpio[RSET] = *gpio; in s5k6aa_configure_gpios()
1547 struct s5k6aa *s5k6aa; in s5k6aa_probe() local
1560 s5k6aa = devm_kzalloc(&client->dev, sizeof(*s5k6aa), GFP_KERNEL); in s5k6aa_probe()
1561 if (!s5k6aa) in s5k6aa_probe()
1564 mutex_init(&s5k6aa->lock); in s5k6aa_probe()
1566 s5k6aa->mclk_frequency = pdata->mclk_frequency; in s5k6aa_probe()
1567 s5k6aa->bus_type = pdata->bus_type; in s5k6aa_probe()
1568 s5k6aa->mipi_lanes = pdata->nlanes; in s5k6aa_probe()
1569 s5k6aa->s_power = pdata->set_power; in s5k6aa_probe()
1570 s5k6aa->inv_hflip = pdata->horiz_flip; in s5k6aa_probe()
1571 s5k6aa->inv_vflip = pdata->vert_flip; in s5k6aa_probe()
1573 sd = &s5k6aa->sd; in s5k6aa_probe()
1581 s5k6aa->pad.flags = MEDIA_PAD_FL_SOURCE; in s5k6aa_probe()
1583 ret = media_entity_pads_init(&sd->entity, 1, &s5k6aa->pad); in s5k6aa_probe()
1587 ret = s5k6aa_configure_gpios(s5k6aa, pdata); in s5k6aa_probe()
1592 s5k6aa->supplies[i].supply = s5k6aa_supply_names[i]; in s5k6aa_probe()
1595 s5k6aa->supplies); in s5k6aa_probe()
1601 ret = s5k6aa_initialize_ctrls(s5k6aa); in s5k6aa_probe()
1605 s5k6aa_presets_data_init(s5k6aa); in s5k6aa_probe()
1607 s5k6aa->ccd_rect.width = S5K6AA_WIN_WIDTH_MAX; in s5k6aa_probe()
1608 s5k6aa->ccd_rect.height = S5K6AA_WIN_HEIGHT_MAX; in s5k6aa_probe()
1609 s5k6aa->ccd_rect.left = 0; in s5k6aa_probe()
1610 s5k6aa->ccd_rect.top = 0; in s5k6aa_probe()
1615 media_entity_cleanup(&s5k6aa->sd.entity); in s5k6aa_probe()