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