Lines Matching refs:gc1084

82 #define to_gc1084(sd) container_of(sd, struct gc1084, subdev)
109 struct gc1084 { struct
329 static inline int gc1084_read_reg(struct gc1084 *gc1084, u16 addr, u8 *value) in gc1084_read_reg() argument
334 ret = regmap_read(gc1084->regmap, addr, &val); in gc1084_read_reg()
336 dev_err(gc1084->dev, "i2c read failed at addr: %x\n", addr); in gc1084_read_reg()
345 static inline int gc1084_write_reg(struct gc1084 *gc1084, u16 addr, u8 value) in gc1084_write_reg() argument
349 ret = regmap_write(gc1084->regmap, addr, value); in gc1084_write_reg()
351 dev_err(gc1084->dev, "i2c write failed at addr: %x\n", addr); in gc1084_write_reg()
386 static int gc1084_set_gain(struct gc1084 *gc1084, u32 gain) in gc1084_set_gain() argument
395 ret = gc1084_write_reg(gc1084, 0x00d1, (gain_reg_configs[i].analog_gain >> 8) & 0x3f); in gc1084_set_gain()
396 ret |= gc1084_write_reg(gc1084, 0x00d0, gain_reg_configs[i].analog_gain & 0xff); in gc1084_set_gain()
398 ret |= gc1084_write_reg(gc1084, 0x031d, 0x2e); in gc1084_set_gain()
400 ret |= gc1084_write_reg(gc1084, 0x0dc1, (gain_reg_configs[i].analog_gain >> 14) & 1); in gc1084_set_gain()
402 ret |= gc1084_write_reg(gc1084, 0x031d, 0x28); in gc1084_set_gain()
404 ret |= gc1084_write_reg(gc1084, 0x0155, gain_reg_configs[i].reserved & 0xff); in gc1084_set_gain()
406 ret |= gc1084_write_reg(gc1084, 0x00b8, gain_reg_configs[i].col_gain >> 8); in gc1084_set_gain()
407 ret |= gc1084_write_reg(gc1084, 0x00b9, gain_reg_configs[i].col_gain & 0xff); in gc1084_set_gain()
411 ret |= gc1084_write_reg(gc1084, 0x00b1, (pre_gain >> 6)); in gc1084_set_gain()
412 ret |= gc1084_write_reg(gc1084, 0x00b2, ((pre_gain & 0x3f) << 2)); in gc1084_set_gain()
419 struct gc1084 *gc1084 = container_of(ctrl->handler, in gc1084_set_ctrl() local
420 struct gc1084, ctrl_handler); in gc1084_set_ctrl()
429 max = gc1084->cur_mode->height + ctrl->val - 4; in gc1084_set_ctrl()
430 __v4l2_ctrl_modify_range(gc1084->exposure, in gc1084_set_ctrl()
431 gc1084->exposure->minimum, max, in gc1084_set_ctrl()
432 gc1084->exposure->step, in gc1084_set_ctrl()
433 gc1084->exposure->default_value); in gc1084_set_ctrl()
436 if (!pm_runtime_get_if_in_use(gc1084->dev)) in gc1084_set_ctrl()
441 if (gc1084->cur_mode->hdr_mode != NO_HDR) in gc1084_set_ctrl()
443 dev_dbg(gc1084->dev, "set exposure value 0x%x\n", ctrl->val); in gc1084_set_ctrl()
444 ret = gc1084_write_reg(gc1084, GC1084_REG_EXP_H, in gc1084_set_ctrl()
446 ret |= gc1084_write_reg(gc1084, GC1084_REG_EXP_L, in gc1084_set_ctrl()
450 if (gc1084->cur_mode->hdr_mode != NO_HDR) in gc1084_set_ctrl()
452 dev_dbg(gc1084->dev, "set gain value 0x%x\n", ctrl->val); in gc1084_set_ctrl()
453 gc1084_set_gain(gc1084, ctrl->val); in gc1084_set_ctrl()
456 vts = gc1084->cur_mode->height + ctrl->val; in gc1084_set_ctrl()
457 gc1084->cur_vts = vts; in gc1084_set_ctrl()
458 ret = gc1084_write_reg(gc1084, GC1084_REG_VTS_H, in gc1084_set_ctrl()
460 ret |= gc1084_write_reg(gc1084, GC1084_REG_VTS_L, in gc1084_set_ctrl()
462 dev_dbg(gc1084->dev, " set blank value 0x%x\n", ctrl->val); in gc1084_set_ctrl()
465 dev_warn(gc1084->dev, "%s Unhandled id:0x%x, val:0x%x\n", in gc1084_set_ctrl()
471 pm_runtime_put(gc1084->dev); in gc1084_set_ctrl()
479 static int gc1084_get_regulators(struct gc1084 *gc1084) in gc1084_get_regulators() argument
484 gc1084->supplies[i].supply = gc1084_supply_names[i]; in gc1084_get_regulators()
486 return devm_regulator_bulk_get(gc1084->dev, in gc1084_get_regulators()
488 gc1084->supplies); in gc1084_get_regulators()
491 static int gc1084_initialize_controls(struct gc1084 *gc1084) in gc1084_initialize_controls() argument
499 handler = &gc1084->ctrl_handler; in gc1084_initialize_controls()
500 mode = gc1084->cur_mode; in gc1084_initialize_controls()
504 handler->lock = &gc1084->lock; in gc1084_initialize_controls()
506 gc1084->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, in gc1084_initialize_controls()
510 gc1084->pixel_rate = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_PIXEL_RATE, in gc1084_initialize_controls()
515 gc1084->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc1084_initialize_controls()
517 if (gc1084->hblank) in gc1084_initialize_controls()
518 gc1084->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc1084_initialize_controls()
521 gc1084->cur_vts = mode->vts_def; in gc1084_initialize_controls()
522 gc1084->vblank = v4l2_ctrl_new_std(handler, &gc1084_ctrl_ops, in gc1084_initialize_controls()
528 gc1084->exposure = v4l2_ctrl_new_std(handler, &gc1084_ctrl_ops, in gc1084_initialize_controls()
533 gc1084->anal_gain = v4l2_ctrl_new_std(handler, &gc1084_ctrl_ops, in gc1084_initialize_controls()
538 gc1084->h_flip = v4l2_ctrl_new_std(handler, &gc1084_ctrl_ops, in gc1084_initialize_controls()
541 gc1084->v_flip = v4l2_ctrl_new_std(handler, &gc1084_ctrl_ops, in gc1084_initialize_controls()
546 dev_err(gc1084->dev, "Failed to init controls(%d)\n", ret); in gc1084_initialize_controls()
550 gc1084->subdev.ctrl_handler = handler; in gc1084_initialize_controls()
551 gc1084->has_init_exp = false; in gc1084_initialize_controls()
560 static int __gc1084_power_on(struct gc1084 *gc1084) in __gc1084_power_on() argument
563 struct device *dev = gc1084->dev; in __gc1084_power_on()
565 ret = clk_set_rate(gc1084->xvclk, GC1084_XVCLK_FREQ); in __gc1084_power_on()
569 if (clk_get_rate(gc1084->xvclk) != GC1084_XVCLK_FREQ) in __gc1084_power_on()
572 ret = clk_prepare_enable(gc1084->xvclk); in __gc1084_power_on()
578 ret = regulator_bulk_enable(GC1084_NUM_SUPPLIES, gc1084->supplies); in __gc1084_power_on()
584 if (!IS_ERR(gc1084->reset_gpio)) in __gc1084_power_on()
585 gpiod_set_value_cansleep(gc1084->reset_gpio, 1); in __gc1084_power_on()
589 if (!IS_ERR(gc1084->pwdn_gpio)) in __gc1084_power_on()
590 gpiod_set_value_cansleep(gc1084->pwdn_gpio, 1); in __gc1084_power_on()
591 if (!IS_ERR(gc1084->reset_gpio)) in __gc1084_power_on()
592 gpiod_set_value_cansleep(gc1084->reset_gpio, 0); in __gc1084_power_on()
599 clk_disable_unprepare(gc1084->xvclk); in __gc1084_power_on()
603 static void __gc1084_power_off(struct gc1084 *gc1084) in __gc1084_power_off() argument
605 if (!IS_ERR(gc1084->reset_gpio)) in __gc1084_power_off()
606 gpiod_set_value_cansleep(gc1084->reset_gpio, 1); in __gc1084_power_off()
607 if (!IS_ERR(gc1084->pwdn_gpio)) in __gc1084_power_off()
608 gpiod_set_value_cansleep(gc1084->pwdn_gpio, 0); in __gc1084_power_off()
610 regulator_bulk_disable(GC1084_NUM_SUPPLIES, gc1084->supplies); in __gc1084_power_off()
611 clk_disable_unprepare(gc1084->xvclk); in __gc1084_power_off()
614 static int gc1084_check_sensor_id(struct gc1084 *gc1084) in gc1084_check_sensor_id() argument
620 ret = gc1084_read_reg(gc1084, GC1084_REG_CHIP_ID_H, &id_h); in gc1084_check_sensor_id()
621 ret |= gc1084_read_reg(gc1084, GC1084_REG_CHIP_ID_L, &id_l); in gc1084_check_sensor_id()
623 dev_err(gc1084->dev, "Failed to read sensor id, (%d)\n", ret); in gc1084_check_sensor_id()
629 dev_err(gc1084->dev, "sensor id: %04X mismatched\n", id); in gc1084_check_sensor_id()
633 dev_info(gc1084->dev, "Detected GC1084 sensor\n"); in gc1084_check_sensor_id()
637 static void gc1084_get_module_inf(struct gc1084 *gc1084, in gc1084_get_module_inf() argument
641 strlcpy(inf->base.lens, gc1084->len_name, sizeof(inf->base.lens)); in gc1084_get_module_inf()
643 strlcpy(inf->base.module, gc1084->module_name, sizeof(inf->base.module)); in gc1084_get_module_inf()
648 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_ioctl() local
660 hdr_cfg->hdr_mode = gc1084->cur_mode->hdr_mode; in gc1084_ioctl()
663 gc1084_get_module_inf(gc1084, (struct rkmodule_inf *)arg); in gc1084_ioctl()
670 ret = gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, in gc1084_ioctl()
673 ret = gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, in gc1084_ioctl()
675 fps = gc1084->cur_mode->max_fps.denominator / in gc1084_ioctl()
676 gc1084->cur_mode->max_fps.numerator; in gc1084_ioctl()
677 delay_us = 1000000 / (gc1084->cur_mode->vts_def * fps / gc1084->cur_vts); in gc1084_ioctl()
683 *sync_mode = gc1084->sync_mode; in gc1084_ioctl()
687 gc1084->sync_mode = *sync_mode; in gc1084_ioctl()
696 static int __gc1084_start_stream(struct gc1084 *gc1084) in __gc1084_start_stream() argument
700 ret = regmap_multi_reg_write(gc1084->regmap, in __gc1084_start_stream()
701 gc1084->cur_mode->reg_list, in __gc1084_start_stream()
702 gc1084->cur_mode->reg_num); in __gc1084_start_stream()
707 mutex_unlock(&gc1084->lock); in __gc1084_start_stream()
708 v4l2_ctrl_handler_setup(&gc1084->ctrl_handler); in __gc1084_start_stream()
709 mutex_lock(&gc1084->lock); in __gc1084_start_stream()
711 if (gc1084->has_init_exp && gc1084->cur_mode->hdr_mode != NO_HDR) { in __gc1084_start_stream()
712 ret = gc1084_ioctl(&gc1084->subdev, PREISP_CMD_SET_HDRAE_EXP, in __gc1084_start_stream()
713 &gc1084->init_hdrae_exp); in __gc1084_start_stream()
715 dev_err(gc1084->dev, "init exp fail in hdr mode\n"); in __gc1084_start_stream()
720 if (gc1084->sync_mode == INTERNAL_MASTER_MODE) { in __gc1084_start_stream()
721 ret = regmap_multi_reg_write(gc1084->regmap, gc1084_master_mode_regs, in __gc1084_start_stream()
724 dev_err(gc1084->dev, in __gc1084_start_stream()
726 } else if (gc1084->sync_mode == EXTERNAL_MASTER_MODE) { in __gc1084_start_stream()
727 ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, in __gc1084_start_stream()
730 dev_err(gc1084->dev, in __gc1084_start_stream()
732 } else if (gc1084->sync_mode == SLAVE_MODE) { in __gc1084_start_stream()
733 ret = regmap_multi_reg_write(gc1084->regmap, gc1084_slave_mode_regs, in __gc1084_start_stream()
736 dev_err(gc1084->dev, "write slave mode reg failed %d\n", ret); in __gc1084_start_stream()
739 return gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, in __gc1084_start_stream()
743 static int __gc1084_stop_stream(struct gc1084 *gc1084) in __gc1084_stop_stream() argument
745 gc1084->has_init_exp = false; in __gc1084_stop_stream()
746 return gc1084_write_reg(gc1084, GC1084_REG_CTRL_MODE, in __gc1084_stop_stream()
853 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_s_stream() local
858 fps = DIV_ROUND_CLOSEST(gc1084->cur_mode->max_fps.denominator, in gc1084_s_stream()
859 gc1084->cur_mode->max_fps.numerator); in gc1084_s_stream()
861 dev_info(gc1084->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, in gc1084_s_stream()
862 gc1084->cur_mode->width, in gc1084_s_stream()
863 gc1084->cur_mode->height, in gc1084_s_stream()
866 mutex_lock(&gc1084->lock); in gc1084_s_stream()
868 if (on == gc1084->streaming) in gc1084_s_stream()
872 ret = pm_runtime_get_sync(gc1084->dev); in gc1084_s_stream()
874 pm_runtime_put_noidle(gc1084->dev); in gc1084_s_stream()
878 ret = __gc1084_start_stream(gc1084); in gc1084_s_stream()
880 dev_err(gc1084->dev, "Failed to start gc1084 stream\n"); in gc1084_s_stream()
881 pm_runtime_put(gc1084->dev); in gc1084_s_stream()
885 __gc1084_stop_stream(gc1084); in gc1084_s_stream()
889 dev_info(gc1084->dev, "%s: on: %d, sleep(%dus)\n", in gc1084_s_stream()
892 pm_runtime_put(gc1084->dev); in gc1084_s_stream()
895 gc1084->streaming = on; in gc1084_s_stream()
898 mutex_unlock(&gc1084->lock); in gc1084_s_stream()
905 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_g_frame_interval() local
906 const struct gc1084_mode *mode = gc1084->cur_mode; in gc1084_g_frame_interval()
916 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_g_mbus_config() local
921 config->flags = (gc1084->cur_mode->hdr_mode == NO_HDR) ? in gc1084_g_mbus_config()
941 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_enum_frame_sizes() local
943 if (fse->index >= gc1084->cfg_num) in gc1084_enum_frame_sizes()
960 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_enum_frame_interval() local
962 if (fie->index >= gc1084->cfg_num) in gc1084_enum_frame_interval()
977 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_set_fmt() local
981 mutex_lock(&gc1084->lock); in gc1084_set_fmt()
996 mutex_unlock(&gc1084->lock); in gc1084_set_fmt()
1000 gc1084->cur_mode = mode; in gc1084_set_fmt()
1001 __v4l2_ctrl_s_ctrl(gc1084->link_freq, mode->link_freq_index); in gc1084_set_fmt()
1002 __v4l2_ctrl_s_ctrl_int64(gc1084->pixel_rate, in gc1084_set_fmt()
1005 __v4l2_ctrl_modify_range(gc1084->hblank, h_blank, in gc1084_set_fmt()
1008 __v4l2_ctrl_modify_range(gc1084->vblank, vblank_def, in gc1084_set_fmt()
1013 mutex_unlock(&gc1084->lock); in gc1084_set_fmt()
1021 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_get_fmt() local
1022 const struct gc1084_mode *mode = gc1084->cur_mode; in gc1084_get_fmt()
1024 mutex_lock(&gc1084->lock); in gc1084_get_fmt()
1029 mutex_unlock(&gc1084->lock); in gc1084_get_fmt()
1045 mutex_unlock(&gc1084->lock); in gc1084_get_fmt()
1052 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_open() local
1057 mutex_lock(&gc1084->lock); in gc1084_open()
1063 mutex_unlock(&gc1084->lock); in gc1084_open()
1077 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_s_power() local
1080 mutex_lock(&gc1084->lock); in gc1084_s_power()
1082 if (gc1084->power_on == !!on) in gc1084_s_power()
1086 ret = pm_runtime_get_sync(gc1084->dev); in gc1084_s_power()
1088 pm_runtime_put_noidle(gc1084->dev); in gc1084_s_power()
1091 gc1084->power_on = true; in gc1084_s_power()
1093 pm_runtime_put(gc1084->dev); in gc1084_s_power()
1094 gc1084->power_on = false; in gc1084_s_power()
1098 mutex_unlock(&gc1084->lock); in gc1084_s_power()
1135 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_runtime_resume() local
1137 __gc1084_power_on(gc1084); in gc1084_runtime_resume()
1145 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_runtime_suspend() local
1147 __gc1084_power_off(gc1084); in gc1084_runtime_suspend()
1161 struct gc1084 *gc1084; in gc1084_probe() local
1172 gc1084 = devm_kzalloc(dev, sizeof(*gc1084), GFP_KERNEL); in gc1084_probe()
1173 if (!gc1084) in gc1084_probe()
1176 gc1084->dev = dev; in gc1084_probe()
1177 gc1084->regmap = devm_regmap_init_i2c(client, &gc1084_regmap_config); in gc1084_probe()
1178 if (IS_ERR(gc1084->regmap)) { in gc1084_probe()
1184 &gc1084->module_index); in gc1084_probe()
1186 &gc1084->module_facing); in gc1084_probe()
1188 &gc1084->module_name); in gc1084_probe()
1190 &gc1084->len_name); in gc1084_probe()
1199 gc1084->sync_mode = NO_SYNC_MODE; in gc1084_probe()
1203 gc1084->sync_mode = EXTERNAL_MASTER_MODE; in gc1084_probe()
1205 gc1084->sync_mode = INTERNAL_MASTER_MODE; in gc1084_probe()
1207 gc1084->sync_mode = SLAVE_MODE; in gc1084_probe()
1210 gc1084->xvclk = devm_clk_get(gc1084->dev, "xvclk"); in gc1084_probe()
1211 if (IS_ERR(gc1084->xvclk)) { in gc1084_probe()
1212 dev_err(gc1084->dev, "Failed to get xvclk\n"); in gc1084_probe()
1216 gc1084->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in gc1084_probe()
1217 if (IS_ERR(gc1084->reset_gpio)) in gc1084_probe()
1220 gc1084->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH); in gc1084_probe()
1221 if (IS_ERR(gc1084->pwdn_gpio)) in gc1084_probe()
1224 ret = gc1084_get_regulators(gc1084); in gc1084_probe()
1230 mutex_init(&gc1084->lock); in gc1084_probe()
1233 gc1084->cur_mode = &supported_modes[0]; in gc1084_probe()
1234 gc1084->cfg_num = ARRAY_SIZE(supported_modes); in gc1084_probe()
1235 gc1084->cur_vts = gc1084->cur_mode->vts_def; in gc1084_probe()
1237 sd = &gc1084->subdev; in gc1084_probe()
1239 ret = gc1084_initialize_controls(gc1084); in gc1084_probe()
1243 ret = __gc1084_power_on(gc1084); in gc1084_probe()
1247 ret = gc1084_check_sensor_id(gc1084); in gc1084_probe()
1257 gc1084->pad.flags = MEDIA_PAD_FL_SOURCE; in gc1084_probe()
1259 ret = media_entity_pads_init(&sd->entity, 1, &gc1084->pad); in gc1084_probe()
1265 if (strcmp(gc1084->module_facing, "back") == 0) in gc1084_probe()
1271 gc1084->module_index, facing, in gc1084_probe()
1291 __gc1084_power_off(gc1084); in gc1084_probe()
1293 v4l2_ctrl_handler_free(&gc1084->ctrl_handler); in gc1084_probe()
1295 mutex_destroy(&gc1084->lock); in gc1084_probe()
1303 struct gc1084 *gc1084 = to_gc1084(sd); in gc1084_remove() local
1309 v4l2_ctrl_handler_free(&gc1084->ctrl_handler); in gc1084_remove()
1310 mutex_destroy(&gc1084->lock); in gc1084_remove()
1314 __gc1084_power_off(gc1084); in gc1084_remove()