Lines Matching refs:gc02m2
94 #define to_gc02m2(sd) container_of(sd, struct gc02m2, subdev)
114 struct gc02m2 { struct
502 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_set_fmt() local
506 mutex_lock(&gc02m2->mutex); in gc02m2_set_fmt()
517 mutex_unlock(&gc02m2->mutex); in gc02m2_set_fmt()
521 gc02m2->cur_mode = mode; in gc02m2_set_fmt()
523 __v4l2_ctrl_modify_range(gc02m2->hblank, h_blank, in gc02m2_set_fmt()
526 __v4l2_ctrl_modify_range(gc02m2->vblank, vblank_def, in gc02m2_set_fmt()
531 mutex_unlock(&gc02m2->mutex); in gc02m2_set_fmt()
540 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_get_fmt() local
541 const struct gc02m2_mode *mode = gc02m2->cur_mode; in gc02m2_get_fmt()
543 mutex_lock(&gc02m2->mutex); in gc02m2_get_fmt()
548 mutex_unlock(&gc02m2->mutex); in gc02m2_get_fmt()
562 mutex_unlock(&gc02m2->mutex); in gc02m2_get_fmt()
571 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_enum_mbus_code() local
575 code->code = gc02m2->cur_mode->bus_fmt;; in gc02m2_enum_mbus_code()
601 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_g_frame_interval() local
602 const struct gc02m2_mode *mode = gc02m2->cur_mode; in gc02m2_g_frame_interval()
609 static void gc02m2_get_module_inf(struct gc02m2 *gc02m2, in gc02m2_get_module_inf() argument
614 strlcpy(inf->base.module, gc02m2->module_name, in gc02m2_get_module_inf()
616 strlcpy(inf->base.lens, gc02m2->len_name, sizeof(inf->base.lens)); in gc02m2_get_module_inf()
621 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_ioctl() local
629 gc02m2_get_module_inf(gc02m2, (struct rkmodule_inf *)arg); in gc02m2_ioctl()
634 ret = gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in gc02m2_ioctl()
635 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_MODE_SELECT, in gc02m2_ioctl()
637 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in gc02m2_ioctl()
639 ret = gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in gc02m2_ioctl()
640 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_MODE_SELECT, in gc02m2_ioctl()
642 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in gc02m2_ioctl()
649 hdr_cfg->hdr_mode = gc02m2->cur_mode->hdr_mode; in gc02m2_ioctl()
653 w = gc02m2->cur_mode->width; in gc02m2_ioctl()
654 h = gc02m2->cur_mode->height; in gc02m2_ioctl()
659 gc02m2->cur_mode = &supported_modes[i]; in gc02m2_ioctl()
664 dev_err(&gc02m2->client->dev, in gc02m2_ioctl()
669 w = gc02m2->cur_mode->hts_def - gc02m2->cur_mode->width; in gc02m2_ioctl()
670 h = gc02m2->cur_mode->vts_def - gc02m2->cur_mode->height; in gc02m2_ioctl()
671 __v4l2_ctrl_modify_range(gc02m2->hblank, w, w, 1, w); in gc02m2_ioctl()
672 __v4l2_ctrl_modify_range(gc02m2->vblank, h, in gc02m2_ioctl()
673 GC02M2_VTS_MAX - gc02m2->cur_mode->height, 1, h); in gc02m2_ioctl()
751 static int __gc02m2_power_on(struct gc02m2 *gc02m2) in __gc02m2_power_on() argument
755 struct device *dev = &gc02m2->client->dev; in __gc02m2_power_on()
757 if (!IS_ERR_OR_NULL(gc02m2->pins_default)) { in __gc02m2_power_on()
758 ret = pinctrl_select_state(gc02m2->pinctrl, in __gc02m2_power_on()
759 gc02m2->pins_default); in __gc02m2_power_on()
763 ret = clk_set_rate(gc02m2->xvclk, GC02M2_XVCLK_FREQ); in __gc02m2_power_on()
766 if (clk_get_rate(gc02m2->xvclk) != GC02M2_XVCLK_FREQ) in __gc02m2_power_on()
768 ret = clk_prepare_enable(gc02m2->xvclk); in __gc02m2_power_on()
774 ret = regulator_bulk_enable(GC02M2_NUM_SUPPLIES, gc02m2->supplies); in __gc02m2_power_on()
780 if (!IS_ERR(gc02m2->reset_gpio)) in __gc02m2_power_on()
781 gpiod_set_value_cansleep(gc02m2->reset_gpio, 1); in __gc02m2_power_on()
782 if (!IS_ERR(gc02m2->pwdn_gpio)) in __gc02m2_power_on()
783 gpiod_set_value_cansleep(gc02m2->pwdn_gpio, 0); in __gc02m2_power_on()
785 if (!IS_ERR(gc02m2->reset_gpio)) in __gc02m2_power_on()
786 gpiod_set_value_cansleep(gc02m2->reset_gpio, 0); in __gc02m2_power_on()
792 gc02m2->power_on = true; in __gc02m2_power_on()
796 clk_disable_unprepare(gc02m2->xvclk); in __gc02m2_power_on()
801 static void __gc02m2_power_off(struct gc02m2 *gc02m2) in __gc02m2_power_off() argument
805 struct device *dev = &gc02m2->client->dev; in __gc02m2_power_off()
807 if (!IS_ERR(gc02m2->pwdn_gpio)) in __gc02m2_power_off()
808 gpiod_set_value_cansleep(gc02m2->pwdn_gpio, 1); in __gc02m2_power_off()
809 clk_disable_unprepare(gc02m2->xvclk); in __gc02m2_power_off()
810 if (!IS_ERR(gc02m2->reset_gpio)) in __gc02m2_power_off()
811 gpiod_set_value_cansleep(gc02m2->reset_gpio, 1); in __gc02m2_power_off()
812 if (!IS_ERR_OR_NULL(gc02m2->pins_sleep)) { in __gc02m2_power_off()
813 ret = pinctrl_select_state(gc02m2->pinctrl, in __gc02m2_power_off()
814 gc02m2->pins_sleep); in __gc02m2_power_off()
818 regulator_bulk_disable(GC02M2_NUM_SUPPLIES, gc02m2->supplies); in __gc02m2_power_off()
819 gc02m2->power_on = false; in __gc02m2_power_off()
822 static int __gc02m2_start_stream(struct gc02m2 *gc02m2) in __gc02m2_start_stream() argument
827 mutex_unlock(&gc02m2->mutex); in __gc02m2_start_stream()
828 ret = v4l2_ctrl_handler_setup(&gc02m2->ctrl_handler); in __gc02m2_start_stream()
829 mutex_lock(&gc02m2->mutex); in __gc02m2_start_stream()
833 ret = gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in __gc02m2_start_stream()
834 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_MODE_SELECT, in __gc02m2_start_stream()
836 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in __gc02m2_start_stream()
841 static int __gc02m2_stop_stream(struct gc02m2 *gc02m2) in __gc02m2_stop_stream() argument
845 ret = gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in __gc02m2_stop_stream()
846 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_MODE_SELECT, in __gc02m2_stop_stream()
848 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_PAGE_SELECT, 0x00); in __gc02m2_stop_stream()
855 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_s_stream() local
856 struct i2c_client *client = gc02m2->client; in gc02m2_s_stream()
859 mutex_lock(&gc02m2->mutex); in gc02m2_s_stream()
861 if (on == gc02m2->streaming) in gc02m2_s_stream()
871 ret = __gc02m2_start_stream(gc02m2); in gc02m2_s_stream()
878 __gc02m2_stop_stream(gc02m2); in gc02m2_s_stream()
882 gc02m2->streaming = on; in gc02m2_s_stream()
885 mutex_unlock(&gc02m2->mutex); in gc02m2_s_stream()
892 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_s_power() local
893 struct i2c_client *client = gc02m2->client; in gc02m2_s_power()
896 mutex_lock(&gc02m2->mutex); in gc02m2_s_power()
899 if (gc02m2->power_on == !!on) in gc02m2_s_power()
909 ret = gc02m2_write_array(gc02m2->client, gc02m2->cur_mode->reg_list); in gc02m2_s_power()
916 gc02m2->power_on = true; in gc02m2_s_power()
919 gc02m2->power_on = false; in gc02m2_s_power()
923 mutex_unlock(&gc02m2->mutex); in gc02m2_s_power()
933 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_runtime_resume() local
935 return __gc02m2_power_on(gc02m2); in gc02m2_runtime_resume()
942 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_runtime_suspend() local
944 __gc02m2_power_off(gc02m2); in gc02m2_runtime_suspend()
952 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_open() local
957 mutex_lock(&gc02m2->mutex); in gc02m2_open()
964 mutex_unlock(&gc02m2->mutex); in gc02m2_open()
974 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_g_mbus_config() local
975 const struct gc02m2_mode *mode = gc02m2->cur_mode; in gc02m2_g_mbus_config()
1043 static int gc02m2_set_gain_reg(struct gc02m2 *gc02m2, u32 total_gain) in gc02m2_set_gain_reg() argument
1045 struct device *dev = &gc02m2->client->dev; in gc02m2_set_gain_reg()
1058 ret = gc02m2_write_reg(gc02m2->client, in gc02m2_set_gain_reg()
1060 ret |= gc02m2_write_reg(gc02m2->client, in gc02m2_set_gain_reg()
1066 ret |= gc02m2_write_reg(gc02m2->client, in gc02m2_set_gain_reg()
1069 ret |= gc02m2_write_reg(gc02m2->client, in gc02m2_set_gain_reg()
1077 struct gc02m2 *gc02m2 = container_of(ctrl->handler, in gc02m2_set_ctrl() local
1078 struct gc02m2, ctrl_handler); in gc02m2_set_ctrl()
1079 struct i2c_client *client = gc02m2->client; in gc02m2_set_ctrl()
1089 max = gc02m2->cur_mode->height + ctrl->val - 16; in gc02m2_set_ctrl()
1090 __v4l2_ctrl_modify_range(gc02m2->exposure, in gc02m2_set_ctrl()
1091 gc02m2->exposure->minimum, max, in gc02m2_set_ctrl()
1092 gc02m2->exposure->step, in gc02m2_set_ctrl()
1093 gc02m2->exposure->default_value); in gc02m2_set_ctrl()
1103 ret = gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1105 ret |= gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1108 ret |= gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1114 ret = gc02m2_set_gain_reg(gc02m2, ctrl->val); in gc02m2_set_ctrl()
1117 vts = ctrl->val + gc02m2->cur_mode->height; in gc02m2_set_ctrl()
1118 ret = gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1120 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_REG_VTS_H, in gc02m2_set_ctrl()
1122 ret |= gc02m2_write_reg(gc02m2->client, GC02M2_REG_VTS_L, in gc02m2_set_ctrl()
1126 ret = gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1128 ret |= gc02m2_read_reg(gc02m2->client, GC02M2_MIRROR_FLIP_REG, &val); in gc02m2_set_ctrl()
1133 ret = gc02m2_write_reg(gc02m2->client, in gc02m2_set_ctrl()
1135 ret |= gc02m2_read_reg(gc02m2->client, GC02M2_MIRROR_FLIP_REG, &val); in gc02m2_set_ctrl()
1154 static int gc02m2_check_sensor_id(struct gc02m2 *gc02m2, in gc02m2_check_sensor_id() argument
1157 struct device *dev = &gc02m2->client->dev; in gc02m2_check_sensor_id()
1185 static int gc02m2_configure_regulators(struct gc02m2 *gc02m2) in gc02m2_configure_regulators() argument
1190 gc02m2->supplies[i].supply = gc02m2_supply_names[i]; in gc02m2_configure_regulators()
1192 return devm_regulator_bulk_get(&gc02m2->client->dev, in gc02m2_configure_regulators()
1194 gc02m2->supplies); in gc02m2_configure_regulators()
1197 static int gc02m2_parse_of(struct gc02m2 *gc02m2) in gc02m2_parse_of() argument
1199 struct device *dev = &gc02m2->client->dev; in gc02m2_parse_of()
1217 gc02m2->lane_num = rval; in gc02m2_parse_of()
1218 if (1 == gc02m2->lane_num) { in gc02m2_parse_of()
1219 gc02m2->cur_mode = &supported_modes[0]; in gc02m2_parse_of()
1221 gc02m2->pixel_rate = GC02M2_MIPI_LINK_FREQ * 2U * gc02m2->lane_num / 10U; in gc02m2_parse_of()
1223 gc02m2->lane_num, gc02m2->pixel_rate); in gc02m2_parse_of()
1225 dev_err(dev, "unsupported lane_num(%d)\n", gc02m2->lane_num); in gc02m2_parse_of()
1231 static int gc02m2_initialize_controls(struct gc02m2 *gc02m2) in gc02m2_initialize_controls() argument
1239 struct device *dev = &gc02m2->client->dev; in gc02m2_initialize_controls()
1242 handler = &gc02m2->ctrl_handler; in gc02m2_initialize_controls()
1243 mode = gc02m2->cur_mode; in gc02m2_initialize_controls()
1247 handler->lock = &gc02m2->mutex; in gc02m2_initialize_controls()
1258 gc02m2->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc02m2_initialize_controls()
1260 if (gc02m2->hblank) in gc02m2_initialize_controls()
1261 gc02m2->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc02m2_initialize_controls()
1264 gc02m2->vblank = v4l2_ctrl_new_std(handler, &gc02m2_ctrl_ops, in gc02m2_initialize_controls()
1270 gc02m2->exposure = v4l2_ctrl_new_std(handler, &gc02m2_ctrl_ops, in gc02m2_initialize_controls()
1275 gc02m2->anal_gain = v4l2_ctrl_new_std(handler, &gc02m2_ctrl_ops, in gc02m2_initialize_controls()
1288 dev_err(&gc02m2->client->dev, in gc02m2_initialize_controls()
1293 gc02m2->subdev.ctrl_handler = handler; in gc02m2_initialize_controls()
1308 struct gc02m2 *gc02m2; in gc02m2_probe() local
1318 gc02m2 = devm_kzalloc(dev, sizeof(*gc02m2), GFP_KERNEL); in gc02m2_probe()
1319 if (!gc02m2) in gc02m2_probe()
1323 &gc02m2->module_index); in gc02m2_probe()
1325 &gc02m2->module_facing); in gc02m2_probe()
1327 &gc02m2->module_name); in gc02m2_probe()
1329 &gc02m2->len_name); in gc02m2_probe()
1335 gc02m2->client = client; in gc02m2_probe()
1336 gc02m2->cur_mode = &supported_modes[0]; in gc02m2_probe()
1338 gc02m2->xvclk = devm_clk_get(dev, "xvclk"); in gc02m2_probe()
1339 if (IS_ERR(gc02m2->xvclk)) { in gc02m2_probe()
1344 gc02m2->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in gc02m2_probe()
1345 if (IS_ERR(gc02m2->reset_gpio)) in gc02m2_probe()
1348 gc02m2->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH); in gc02m2_probe()
1349 if (IS_ERR(gc02m2->pwdn_gpio)) in gc02m2_probe()
1352 ret = gc02m2_parse_of(gc02m2); in gc02m2_probe()
1356 gc02m2->pinctrl = devm_pinctrl_get(dev); in gc02m2_probe()
1357 if (!IS_ERR(gc02m2->pinctrl)) { in gc02m2_probe()
1358 gc02m2->pins_default = in gc02m2_probe()
1359 pinctrl_lookup_state(gc02m2->pinctrl, in gc02m2_probe()
1361 if (IS_ERR(gc02m2->pins_default)) in gc02m2_probe()
1364 gc02m2->pins_sleep = in gc02m2_probe()
1365 pinctrl_lookup_state(gc02m2->pinctrl, in gc02m2_probe()
1367 if (IS_ERR(gc02m2->pins_sleep)) in gc02m2_probe()
1373 ret = gc02m2_configure_regulators(gc02m2); in gc02m2_probe()
1379 mutex_init(&gc02m2->mutex); in gc02m2_probe()
1381 sd = &gc02m2->subdev; in gc02m2_probe()
1383 ret = gc02m2_initialize_controls(gc02m2); in gc02m2_probe()
1387 ret = __gc02m2_power_on(gc02m2); in gc02m2_probe()
1391 ret = gc02m2_check_sensor_id(gc02m2, client); in gc02m2_probe()
1400 gc02m2->pad.flags = MEDIA_PAD_FL_SOURCE; in gc02m2_probe()
1402 ret = media_entity_pads_init(&sd->entity, 1, &gc02m2->pad); in gc02m2_probe()
1408 if (strcmp(gc02m2->module_facing, "back") == 0) in gc02m2_probe()
1414 gc02m2->module_index, facing, in gc02m2_probe()
1433 __gc02m2_power_off(gc02m2); in gc02m2_probe()
1435 v4l2_ctrl_handler_free(&gc02m2->ctrl_handler); in gc02m2_probe()
1437 mutex_destroy(&gc02m2->mutex); in gc02m2_probe()
1445 struct gc02m2 *gc02m2 = to_gc02m2(sd); in gc02m2_remove() local
1451 v4l2_ctrl_handler_free(&gc02m2->ctrl_handler); in gc02m2_remove()
1452 mutex_destroy(&gc02m2->mutex); in gc02m2_remove()
1456 __gc02m2_power_off(gc02m2); in gc02m2_remove()