Lines Matching refs:imx323

102 struct imx323 {  struct
128 #define to_imx323(sd) container_of(sd, struct imx323, subdev) argument
298 struct imx323 *imx323 = to_imx323(sd); in imx323_set_fmt() local
302 mutex_lock(&imx323->mutex); in imx323_set_fmt()
313 mutex_unlock(&imx323->mutex); in imx323_set_fmt()
317 imx323->cur_mode = mode; in imx323_set_fmt()
319 __v4l2_ctrl_modify_range(imx323->hblank, h_blank, in imx323_set_fmt()
322 __v4l2_ctrl_modify_range(imx323->vblank, vblank_def, in imx323_set_fmt()
327 mutex_unlock(&imx323->mutex); in imx323_set_fmt()
336 struct imx323 *imx323 = to_imx323(sd); in imx323_get_fmt() local
337 const struct imx323_mode *mode = imx323->cur_mode; in imx323_get_fmt()
339 mutex_lock(&imx323->mutex); in imx323_get_fmt()
344 mutex_unlock(&imx323->mutex); in imx323_get_fmt()
353 mutex_unlock(&imx323->mutex); in imx323_get_fmt()
387 static int imx323_enable_test_pattern(struct imx323 *imx323, u32 pattern) in imx323_enable_test_pattern() argument
392 static void imx323_get_module_inf(struct imx323 *imx323, in imx323_get_module_inf() argument
397 strlcpy(inf->base.module, imx323->module_name, in imx323_get_module_inf()
399 strlcpy(inf->base.lens, imx323->len_name, sizeof(inf->base.lens)); in imx323_get_module_inf()
404 struct imx323 *imx323 = to_imx323(sd); in imx323_ioctl() local
410 imx323_get_module_inf(imx323, (struct rkmodule_inf *)arg); in imx323_ioctl()
418 imx323_write_reg(imx323->client, IMX323_REG_CTRL_MODE, in imx323_ioctl()
421 imx323_write_reg(imx323->client, IMX323_REG_CTRL_MODE, in imx323_ioctl()
494 static int __imx323_start_stream(struct imx323 *imx323) in __imx323_start_stream() argument
498 ret = imx323_write_array(imx323->client, imx323->cur_mode->reg_list); in __imx323_start_stream()
503 mutex_unlock(&imx323->mutex); in __imx323_start_stream()
504 ret = v4l2_ctrl_handler_setup(&imx323->ctrl_handler); in __imx323_start_stream()
505 mutex_lock(&imx323->mutex); in __imx323_start_stream()
509 return imx323_write_reg(imx323->client, IMX323_REG_CTRL_MODE, in __imx323_start_stream()
513 static int __imx323_stop_stream(struct imx323 *imx323) in __imx323_stop_stream() argument
515 return imx323_write_reg(imx323->client, IMX323_REG_CTRL_MODE, in __imx323_stop_stream()
521 struct imx323 *imx323 = to_imx323(sd); in imx323_s_stream() local
522 struct i2c_client *client = imx323->client; in imx323_s_stream()
525 mutex_lock(&imx323->mutex); in imx323_s_stream()
527 if (on == imx323->streaming) in imx323_s_stream()
537 ret = __imx323_start_stream(imx323); in imx323_s_stream()
544 __imx323_stop_stream(imx323); in imx323_s_stream()
548 imx323->streaming = on; in imx323_s_stream()
550 mutex_unlock(&imx323->mutex); in imx323_s_stream()
558 struct imx323 *imx323 = to_imx323(sd); in imx323_g_frame_interval() local
559 const struct imx323_mode *mode = imx323->cur_mode; in imx323_g_frame_interval()
568 struct imx323 *imx323 = to_imx323(sd); in imx323_s_power() local
569 struct i2c_client *client = imx323->client; in imx323_s_power()
572 mutex_lock(&imx323->mutex); in imx323_s_power()
575 if (imx323->power_on == !!on) in imx323_s_power()
585 imx323->power_on = true; in imx323_s_power()
588 imx323->power_on = false; in imx323_s_power()
592 mutex_unlock(&imx323->mutex); in imx323_s_power()
603 static int __imx323_power_on(struct imx323 *imx323) in __imx323_power_on() argument
607 struct device *dev = &imx323->client->dev; in __imx323_power_on()
609 ret = clk_set_rate(imx323->xvclk, IMX323_XVCLK_FREQ); in __imx323_power_on()
615 if (clk_get_rate(imx323->xvclk) != IMX323_XVCLK_FREQ) in __imx323_power_on()
618 ret = clk_prepare_enable(imx323->xvclk); in __imx323_power_on()
624 if (!IS_ERR(imx323->reset_gpio)) in __imx323_power_on()
625 gpiod_set_value_cansleep(imx323->reset_gpio, 0); in __imx323_power_on()
628 regulator_set_voltage(imx323->supplies[i].consumer, in __imx323_power_on()
632 ret = regulator_bulk_enable(IMX323_NUM_SUPPLIES, imx323->supplies); in __imx323_power_on()
638 if (!IS_ERR(imx323->reset_gpio)) in __imx323_power_on()
639 gpiod_set_value_cansleep(imx323->reset_gpio, 1); in __imx323_power_on()
641 if (!IS_ERR(imx323->pwdn_gpio)) in __imx323_power_on()
642 gpiod_set_value_cansleep(imx323->pwdn_gpio, 1); in __imx323_power_on()
651 clk_disable_unprepare(imx323->xvclk); in __imx323_power_on()
656 static void __imx323_power_off(struct imx323 *imx323) in __imx323_power_off() argument
658 if (!IS_ERR(imx323->pwdn_gpio)) in __imx323_power_off()
659 gpiod_set_value_cansleep(imx323->pwdn_gpio, 0); in __imx323_power_off()
660 clk_disable_unprepare(imx323->xvclk); in __imx323_power_off()
661 if (!IS_ERR(imx323->reset_gpio)) in __imx323_power_off()
662 gpiod_set_value_cansleep(imx323->reset_gpio, 0); in __imx323_power_off()
663 regulator_bulk_disable(IMX323_NUM_SUPPLIES, imx323->supplies); in __imx323_power_off()
670 struct imx323 *imx323 = to_imx323(sd); in imx323_runtime_resume() local
672 return __imx323_power_on(imx323); in imx323_runtime_resume()
679 struct imx323 *imx323 = to_imx323(sd); in imx323_runtime_suspend() local
681 __imx323_power_off(imx323); in imx323_runtime_suspend()
689 struct imx323 *imx323 = to_imx323(sd); in imx323_open() local
694 mutex_lock(&imx323->mutex); in imx323_open()
700 mutex_unlock(&imx323->mutex); in imx323_open()
772 struct imx323 *imx323 = container_of(ctrl->handler, in imx323_set_ctrl() local
773 struct imx323, ctrl_handler); in imx323_set_ctrl()
774 struct i2c_client *client = imx323->client; in imx323_set_ctrl()
782 ret = imx323_write_reg(imx323->client, IMX323_REG_EXPOSURE, in imx323_set_ctrl()
786 ret = imx323_write_reg(imx323->client, IMX323_REG_ANALOG_GAIN, in imx323_set_ctrl()
790 ret = imx323_write_reg(imx323->client, IMX323_REG_VTS, in imx323_set_ctrl()
792 ctrl->val + imx323->cur_mode->height); in imx323_set_ctrl()
795 ret = imx323_enable_test_pattern(imx323, ctrl->val); in imx323_set_ctrl()
812 static int imx323_initialize_controls(struct imx323 *imx323) in imx323_initialize_controls() argument
820 handler = &imx323->ctrl_handler; in imx323_initialize_controls()
821 mode = imx323->cur_mode; in imx323_initialize_controls()
825 handler->lock = &imx323->mutex; in imx323_initialize_controls()
831 imx323->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in imx323_initialize_controls()
833 if (imx323->hblank) in imx323_initialize_controls()
834 imx323->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx323_initialize_controls()
837 imx323->vblank = v4l2_ctrl_new_std(handler, &imx323_ctrl_ops, in imx323_initialize_controls()
843 imx323->exposure = v4l2_ctrl_new_std(handler, &imx323_ctrl_ops, in imx323_initialize_controls()
848 imx323->anal_gain = v4l2_ctrl_new_std(handler, &imx323_ctrl_ops, in imx323_initialize_controls()
853 imx323->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in imx323_initialize_controls()
860 dev_err(&imx323->client->dev, in imx323_initialize_controls()
865 imx323->subdev.ctrl_handler = handler; in imx323_initialize_controls()
875 static int imx323_check_sensor_id(struct imx323 *imx323, in imx323_check_sensor_id() argument
878 struct device *dev = &imx323->client->dev; in imx323_check_sensor_id()
894 static int imx323_configure_regulators(struct imx323 *imx323) in imx323_configure_regulators() argument
899 imx323->supplies[i].supply = in imx323_configure_regulators()
902 return devm_regulator_bulk_get(&imx323->client->dev, in imx323_configure_regulators()
904 imx323->supplies); in imx323_configure_regulators()
912 struct imx323 *imx323; in imx323_probe() local
922 imx323 = devm_kzalloc(dev, sizeof(*imx323), GFP_KERNEL); in imx323_probe()
923 if (!imx323) in imx323_probe()
927 &imx323->module_index); in imx323_probe()
929 &imx323->module_facing); in imx323_probe()
931 &imx323->module_name); in imx323_probe()
933 &imx323->len_name); in imx323_probe()
939 imx323->client = client; in imx323_probe()
940 imx323->cur_mode = &supported_modes[0]; in imx323_probe()
942 imx323->xvclk = devm_clk_get(dev, "xvclk"); in imx323_probe()
943 if (IS_ERR(imx323->xvclk)) { in imx323_probe()
948 imx323->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in imx323_probe()
949 if (IS_ERR(imx323->reset_gpio)) in imx323_probe()
952 imx323->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in imx323_probe()
953 if (IS_ERR(imx323->pwdn_gpio)) in imx323_probe()
956 ret = imx323_configure_regulators(imx323); in imx323_probe()
962 mutex_init(&imx323->mutex); in imx323_probe()
964 sd = &imx323->subdev; in imx323_probe()
966 ret = imx323_initialize_controls(imx323); in imx323_probe()
970 ret = __imx323_power_on(imx323); in imx323_probe()
974 ret = imx323_check_sensor_id(imx323, client); in imx323_probe()
984 imx323->pad.flags = MEDIA_PAD_FL_SOURCE; in imx323_probe()
986 ret = media_entity_pads_init(&sd->entity, 1, &imx323->pad); in imx323_probe()
992 if (strcmp(imx323->module_facing, "back") == 0) in imx323_probe()
998 imx323->module_index, facing, in imx323_probe()
1017 __imx323_power_off(imx323); in imx323_probe()
1019 v4l2_ctrl_handler_free(&imx323->ctrl_handler); in imx323_probe()
1021 mutex_destroy(&imx323->mutex); in imx323_probe()
1029 struct imx323 *imx323 = to_imx323(sd); in imx323_remove() local
1035 v4l2_ctrl_handler_free(&imx323->ctrl_handler); in imx323_remove()
1036 mutex_destroy(&imx323->mutex); in imx323_remove()
1040 __imx323_power_off(imx323); in imx323_remove()