Lines Matching refs:s5k6aa

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