Lines Matching refs:ov965x
247 struct ov965x { struct
415 return &container_of(ctrl->handler, struct ov965x, ctrls.handler)->sd; in ctrl_to_sd()
418 static inline struct ov965x *to_ov965x(struct v4l2_subdev *sd) in to_ov965x()
420 return container_of(sd, struct ov965x, sd); in to_ov965x()
472 static int ov965x_set_default_gamma_curve(struct ov965x *ov965x) in ov965x_set_default_gamma_curve() argument
485 int ret = ov965x_write(ov965x->client, addr, gamma_curve[i]); in ov965x_set_default_gamma_curve()
494 static int ov965x_set_color_matrix(struct ov965x *ov965x) in ov965x_set_color_matrix() argument
504 int ret = ov965x_write(ov965x->client, addr, mtx[i]); in ov965x_set_color_matrix()
519 static void __ov965x_set_power(struct ov965x *ov965x, int on) in __ov965x_set_power() argument
522 ov965x_gpio_set(ov965x->gpios[GPIO_PWDN], 0); in __ov965x_set_power()
523 ov965x_gpio_set(ov965x->gpios[GPIO_RST], 0); in __ov965x_set_power()
526 ov965x_gpio_set(ov965x->gpios[GPIO_RST], 1); in __ov965x_set_power()
527 ov965x_gpio_set(ov965x->gpios[GPIO_PWDN], 1); in __ov965x_set_power()
530 ov965x->streaming = 0; in __ov965x_set_power()
535 struct ov965x *ov965x = to_ov965x(sd); in ov965x_s_power() local
536 struct i2c_client *client = ov965x->client; in ov965x_s_power()
541 mutex_lock(&ov965x->lock); in ov965x_s_power()
542 if (ov965x->power == !on) { in ov965x_s_power()
543 __ov965x_set_power(ov965x, on); in ov965x_s_power()
547 ov965x->apply_frame_fmt = 1; in ov965x_s_power()
548 ov965x->ctrls.update = 1; in ov965x_s_power()
552 ov965x->power += on ? 1 : -1; in ov965x_s_power()
554 WARN_ON(ov965x->power < 0); in ov965x_s_power()
555 mutex_unlock(&ov965x->lock); in ov965x_s_power()
563 static void ov965x_update_exposure_ctrl(struct ov965x *ov965x) in ov965x_update_exposure_ctrl() argument
565 struct v4l2_ctrl *ctrl = ov965x->ctrls.exposure; in ov965x_update_exposure_ctrl()
570 mutex_lock(&ov965x->lock); in ov965x_update_exposure_ctrl()
571 if (WARN_ON(!ctrl || !ov965x->frame_size)) { in ov965x_update_exposure_ctrl()
572 mutex_unlock(&ov965x->lock); in ov965x_update_exposure_ctrl()
575 clkrc = DEF_CLKRC + ov965x->fiv->clkrc_div; in ov965x_update_exposure_ctrl()
577 fint = ov965x->mclk_frequency * ((clkrc >> 7) + 1) / in ov965x_update_exposure_ctrl()
581 max = ov965x->frame_size->max_exp_lines * trow; in ov965x_update_exposure_ctrl()
582 ov965x->exp_row_interval = trow; in ov965x_update_exposure_ctrl()
583 mutex_unlock(&ov965x->lock); in ov965x_update_exposure_ctrl()
585 v4l2_dbg(1, debug, &ov965x->sd, "clkrc: %#x, fi: %lu, tr: %lu, %d\n", in ov965x_update_exposure_ctrl()
594 v4l2_err(&ov965x->sd, "Exposure ctrl range update failed\n"); in ov965x_update_exposure_ctrl()
597 static int ov965x_set_banding_filter(struct ov965x *ov965x, int value) in ov965x_set_banding_filter() argument
603 ret = ov965x_read(ov965x->client, REG_COM8, ®); in ov965x_set_banding_filter()
609 ret = ov965x_write(ov965x->client, REG_COM8, reg); in ov965x_set_banding_filter()
613 if (WARN_ON(ov965x->fiv == NULL)) in ov965x_set_banding_filter()
620 mbd = (1000UL * ov965x->fiv->interval.denominator * in ov965x_set_banding_filter()
621 ov965x->frame_size->max_exp_lines) / in ov965x_set_banding_filter()
622 ov965x->fiv->interval.numerator; in ov965x_set_banding_filter()
625 return ov965x_write(ov965x->client, REG_MBD, mbd); in ov965x_set_banding_filter()
628 static int ov965x_set_white_balance(struct ov965x *ov965x, int awb) in ov965x_set_white_balance() argument
633 ret = ov965x_read(ov965x->client, REG_COM8, ®); in ov965x_set_white_balance()
636 ret = ov965x_write(ov965x->client, REG_COM8, reg); in ov965x_set_white_balance()
639 ret = ov965x_write(ov965x->client, REG_BLUE, in ov965x_set_white_balance()
640 ov965x->ctrls.blue_balance->val); in ov965x_set_white_balance()
643 ret = ov965x_write(ov965x->client, REG_RED, in ov965x_set_white_balance()
644 ov965x->ctrls.red_balance->val); in ov965x_set_white_balance()
652 static int ov965x_set_brightness(struct ov965x *ov965x, int val) in ov965x_set_brightness() argument
671 ret = ov965x_write(ov965x->client, regs[0][i], in ov965x_set_brightness()
676 static int ov965x_set_gain(struct ov965x *ov965x, int auto_gain) in ov965x_set_gain() argument
678 struct i2c_client *client = ov965x->client; in ov965x_set_gain()
679 struct ov965x_ctrls *ctrls = &ov965x->ctrls; in ov965x_set_gain()
731 static int ov965x_set_sharpness(struct ov965x *ov965x, unsigned int value) in ov965x_set_sharpness() argument
736 ret = ov965x_read(ov965x->client, REG_COM14, &com14); in ov965x_set_sharpness()
739 ret = ov965x_read(ov965x->client, REG_EDGE, &edge); in ov965x_set_sharpness()
750 ret = ov965x_write(ov965x->client, REG_COM14, com14); in ov965x_set_sharpness()
757 return ov965x_write(ov965x->client, REG_EDGE, edge); in ov965x_set_sharpness()
760 static int ov965x_set_exposure(struct ov965x *ov965x, int exp) in ov965x_set_exposure() argument
762 struct i2c_client *client = ov965x->client; in ov965x_set_exposure()
763 struct ov965x_ctrls *ctrls = &ov965x->ctrls; in ov965x_set_exposure()
783 / ov965x->exp_row_interval; in ov965x_set_exposure()
796 ctrls->exposure->val = ((exposure * ov965x->exp_row_interval) in ov965x_set_exposure()
802 v4l2_ctrl_activate(ov965x->ctrls.brightness, !exp); in ov965x_set_exposure()
806 static int ov965x_set_flip(struct ov965x *ov965x) in ov965x_set_flip() argument
810 if (ov965x->ctrls.hflip->val) in ov965x_set_flip()
813 if (ov965x->ctrls.vflip->val) in ov965x_set_flip()
816 return ov965x_write(ov965x->client, REG_MVFP, mvfp); in ov965x_set_flip()
822 static int ov965x_set_saturation(struct ov965x *ov965x, int val) in ov965x_set_saturation() argument
840 ret = ov965x_write(ov965x->client, addr + i, regs[val][i]); in ov965x_set_saturation()
845 static int ov965x_set_test_pattern(struct ov965x *ov965x, int value) in ov965x_set_test_pattern() argument
850 ret = ov965x_read(ov965x->client, REG_COM23, ®); in ov965x_set_test_pattern()
854 return ov965x_write(ov965x->client, REG_COM23, reg); in ov965x_set_test_pattern()
857 static int __g_volatile_ctrl(struct ov965x *ov965x, struct v4l2_ctrl *ctrl) in __g_volatile_ctrl() argument
859 struct i2c_client *client = ov965x->client; in __g_volatile_ctrl()
864 if (!ov965x->power) in __g_volatile_ctrl()
879 ov965x->ctrls.gain->val = m * (16 + (gain & 0xf)); in __g_volatile_ctrl()
894 ov965x->ctrls.exposure->val = ((exposure * in __g_volatile_ctrl()
895 ov965x->exp_row_interval) + 50) / 100; in __g_volatile_ctrl()
905 struct ov965x *ov965x = to_ov965x(sd); in ov965x_g_volatile_ctrl() local
910 mutex_lock(&ov965x->lock); in ov965x_g_volatile_ctrl()
911 ret = __g_volatile_ctrl(ov965x, ctrl); in ov965x_g_volatile_ctrl()
912 mutex_unlock(&ov965x->lock); in ov965x_g_volatile_ctrl()
919 struct ov965x *ov965x = to_ov965x(sd); in ov965x_s_ctrl() local
923 ctrl->name, ctrl->val, ov965x->power); in ov965x_s_ctrl()
925 mutex_lock(&ov965x->lock); in ov965x_s_ctrl()
930 if (ov965x->power == 0) { in ov965x_s_ctrl()
931 mutex_unlock(&ov965x->lock); in ov965x_s_ctrl()
937 ret = ov965x_set_white_balance(ov965x, ctrl->val); in ov965x_s_ctrl()
941 ret = ov965x_set_brightness(ov965x, ctrl->val); in ov965x_s_ctrl()
945 ret = ov965x_set_exposure(ov965x, ctrl->val); in ov965x_s_ctrl()
949 ret = ov965x_set_gain(ov965x, ctrl->val); in ov965x_s_ctrl()
953 ret = ov965x_set_flip(ov965x); in ov965x_s_ctrl()
957 ret = ov965x_set_banding_filter(ov965x, ctrl->val); in ov965x_s_ctrl()
961 ret = ov965x_set_saturation(ov965x, ctrl->val); in ov965x_s_ctrl()
965 ret = ov965x_set_sharpness(ov965x, ctrl->val); in ov965x_s_ctrl()
969 ret = ov965x_set_test_pattern(ov965x, ctrl->val); in ov965x_s_ctrl()
973 mutex_unlock(&ov965x->lock); in ov965x_s_ctrl()
988 static int ov965x_initialize_controls(struct ov965x *ov965x) in ov965x_initialize_controls() argument
991 struct ov965x_ctrls *ctrls = &ov965x->ctrls; in ov965x_initialize_controls()
1053 ov965x->sd.ctrl_handler = hdl; in ov965x_initialize_controls()
1106 struct ov965x *ov965x = to_ov965x(sd); in ov965x_g_frame_interval() local
1108 mutex_lock(&ov965x->lock); in ov965x_g_frame_interval()
1109 fi->interval = ov965x->fiv->interval; in ov965x_g_frame_interval()
1110 mutex_unlock(&ov965x->lock); in ov965x_g_frame_interval()
1115 static int __ov965x_set_frame_interval(struct ov965x *ov965x, in __ov965x_set_frame_interval() argument
1118 struct v4l2_mbus_framefmt *mbus_fmt = &ov965x->format; in __ov965x_set_frame_interval()
1143 ov965x->fiv = fiv; in __ov965x_set_frame_interval()
1145 v4l2_dbg(1, debug, &ov965x->sd, "Changed frame interval to %u us\n", in __ov965x_set_frame_interval()
1154 struct ov965x *ov965x = to_ov965x(sd); in ov965x_s_frame_interval() local
1160 mutex_lock(&ov965x->lock); in ov965x_s_frame_interval()
1161 ret = __ov965x_set_frame_interval(ov965x, fi); in ov965x_s_frame_interval()
1162 ov965x->apply_frame_fmt = 1; in ov965x_s_frame_interval()
1163 mutex_unlock(&ov965x->lock); in ov965x_s_frame_interval()
1170 struct ov965x *ov965x = to_ov965x(sd); in ov965x_get_fmt() local
1179 mutex_lock(&ov965x->lock); in ov965x_get_fmt()
1180 fmt->format = ov965x->format; in ov965x_get_fmt()
1181 mutex_unlock(&ov965x->lock); in ov965x_get_fmt()
1216 struct ov965x *ov965x = to_ov965x(sd); in ov965x_set_fmt() local
1230 mutex_lock(&ov965x->lock); in ov965x_set_fmt()
1238 if (ov965x->streaming) { in ov965x_set_fmt()
1241 ov965x->frame_size = size; in ov965x_set_fmt()
1242 ov965x->format = fmt->format; in ov965x_set_fmt()
1243 ov965x->tslb_reg = ov965x_formats[index].tslb_reg; in ov965x_set_fmt()
1244 ov965x->apply_frame_fmt = 1; in ov965x_set_fmt()
1253 __ov965x_set_frame_interval(ov965x, &fiv); in ov965x_set_fmt()
1255 mutex_unlock(&ov965x->lock); in ov965x_set_fmt()
1258 ov965x_update_exposure_ctrl(ov965x); in ov965x_set_fmt()
1263 static int ov965x_set_frame_size(struct ov965x *ov965x) in ov965x_set_frame_size() argument
1268 ret = ov965x_write(ov965x->client, frame_size_reg_addr[i], in ov965x_set_frame_size()
1269 ov965x->frame_size->regs[i]); in ov965x_set_frame_size()
1273 static int __ov965x_set_params(struct ov965x *ov965x) in __ov965x_set_params() argument
1275 struct i2c_client *client = ov965x->client; in __ov965x_set_params()
1276 struct ov965x_ctrls *ctrls = &ov965x->ctrls; in __ov965x_set_params()
1280 if (ov965x->apply_frame_fmt) { in __ov965x_set_params()
1281 reg = DEF_CLKRC + ov965x->fiv->clkrc_div; in __ov965x_set_params()
1285 ret = ov965x_set_frame_size(ov965x); in __ov965x_set_params()
1292 reg |= ov965x->tslb_reg; in __ov965x_set_params()
1297 ret = ov965x_set_default_gamma_curve(ov965x); in __ov965x_set_params()
1300 ret = ov965x_set_color_matrix(ov965x); in __ov965x_set_params()
1317 return ov965x_set_banding_filter(ov965x, ctrls->light_freq->val); in __ov965x_set_params()
1323 struct ov965x *ov965x = to_ov965x(sd); in ov965x_s_stream() local
1324 struct ov965x_ctrls *ctrls = &ov965x->ctrls; in ov965x_s_stream()
1329 mutex_lock(&ov965x->lock); in ov965x_s_stream()
1330 if (ov965x->streaming == !on) { in ov965x_s_stream()
1332 ret = __ov965x_set_params(ov965x); in ov965x_s_stream()
1339 mutex_unlock(&ov965x->lock); in ov965x_s_stream()
1342 mutex_lock(&ov965x->lock); in ov965x_s_stream()
1351 ov965x->streaming += on ? 1 : -1; in ov965x_s_stream()
1353 WARN_ON(ov965x->streaming < 0); in ov965x_s_stream()
1354 mutex_unlock(&ov965x->lock); in ov965x_s_stream()
1404 static int ov965x_configure_gpios(struct ov965x *ov965x, in ov965x_configure_gpios() argument
1409 ov965x->gpios[GPIO_PWDN] = pdata->gpio_pwdn; in ov965x_configure_gpios()
1410 ov965x->gpios[GPIO_RST] = pdata->gpio_reset; in ov965x_configure_gpios()
1412 for (i = 0; i < ARRAY_SIZE(ov965x->gpios); i++) { in ov965x_configure_gpios()
1413 int gpio = ov965x->gpios[i]; in ov965x_configure_gpios()
1417 ret = devm_gpio_request_one(&ov965x->client->dev, gpio, in ov965x_configure_gpios()
1421 v4l2_dbg(1, debug, &ov965x->sd, "set gpio %d to 1\n", gpio); in ov965x_configure_gpios()
1425 ov965x->gpios[i] = gpio; in ov965x_configure_gpios()
1434 struct ov965x *ov965x = to_ov965x(sd); in ov965x_detect_sensor() local
1438 mutex_lock(&ov965x->lock); in ov965x_detect_sensor()
1439 __ov965x_set_power(ov965x, 1); in ov965x_detect_sensor()
1447 __ov965x_set_power(ov965x, 0); in ov965x_detect_sensor()
1450 ov965x->id = OV965X_ID(pid, ver); in ov965x_detect_sensor()
1451 if (ov965x->id == OV9650_ID || ov965x->id == OV9652_ID) { in ov965x_detect_sensor()
1452 v4l2_info(sd, "Found OV%04X sensor\n", ov965x->id); in ov965x_detect_sensor()
1455 ov965x->id, ret); in ov965x_detect_sensor()
1459 mutex_unlock(&ov965x->lock); in ov965x_detect_sensor()
1469 struct ov965x *ov965x; in ov965x_probe() local
1482 ov965x = devm_kzalloc(&client->dev, sizeof(*ov965x), GFP_KERNEL); in ov965x_probe()
1483 if (!ov965x) in ov965x_probe()
1486 mutex_init(&ov965x->lock); in ov965x_probe()
1487 ov965x->client = client; in ov965x_probe()
1488 ov965x->mclk_frequency = pdata->mclk_frequency; in ov965x_probe()
1490 sd = &ov965x->sd; in ov965x_probe()
1498 ret = ov965x_configure_gpios(ov965x, pdata); in ov965x_probe()
1502 ov965x->pad.flags = MEDIA_PAD_FL_SOURCE; in ov965x_probe()
1504 ret = media_entity_init(&sd->entity, 1, &ov965x->pad, 0); in ov965x_probe()
1508 ret = ov965x_initialize_controls(ov965x); in ov965x_probe()
1512 ov965x_get_default_format(&ov965x->format); in ov965x_probe()
1513 ov965x->frame_size = &ov965x_framesizes[0]; in ov965x_probe()
1514 ov965x->fiv = &ov965x_intervals[0]; in ov965x_probe()
1521 ov965x_update_exposure_ctrl(ov965x); in ov965x_probe()