Lines Matching full:imx214
3 * imx214.c - imx214 sensor driver
36 struct imx214 { struct
427 static inline struct imx214 *to_imx214(struct v4l2_subdev *sd) in to_imx214()
429 return container_of(sd, struct imx214, sd); in to_imx214()
436 struct imx214 *imx214 = to_imx214(sd); in imx214_power_on() local
439 ret = regulator_bulk_enable(IMX214_NUM_SUPPLIES, imx214->supplies); in imx214_power_on()
441 dev_err(imx214->dev, "failed to enable regulators: %d\n", ret); in imx214_power_on()
447 ret = clk_prepare_enable(imx214->xclk); in imx214_power_on()
449 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies); in imx214_power_on()
450 dev_err(imx214->dev, "clk prepare enable failed\n"); in imx214_power_on()
454 gpiod_set_value_cansleep(imx214->enable_gpio, 1); in imx214_power_on()
464 struct imx214 *imx214 = to_imx214(sd); in imx214_power_off() local
466 gpiod_set_value_cansleep(imx214->enable_gpio, 0); in imx214_power_off()
468 clk_disable_unprepare(imx214->xclk); in imx214_power_off()
470 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies); in imx214_power_off()
508 struct imx214 *imx214 = container_of(subdev, struct imx214, sd); in imx214_s_register() local
510 return regmap_write(imx214->regmap, reg->reg, reg->val); in imx214_s_register()
516 struct imx214 *imx214 = container_of(subdev, struct imx214, sd); in imx214_g_register() local
521 ret = regmap_read(imx214->regmap, reg->reg, &aux); in imx214_g_register()
536 __imx214_get_pad_format(struct imx214 *imx214, in __imx214_get_pad_format() argument
543 return v4l2_subdev_get_try_format(&imx214->sd, cfg, pad); in __imx214_get_pad_format()
545 return &imx214->fmt; in __imx214_get_pad_format()
555 struct imx214 *imx214 = to_imx214(sd); in imx214_get_format() local
557 mutex_lock(&imx214->mutex); in imx214_get_format()
558 format->format = *__imx214_get_pad_format(imx214, cfg, format->pad, in imx214_get_format()
560 mutex_unlock(&imx214->mutex); in imx214_get_format()
566 __imx214_get_pad_crop(struct imx214 *imx214, struct v4l2_subdev_pad_config *cfg, in __imx214_get_pad_crop() argument
571 return v4l2_subdev_get_try_crop(&imx214->sd, cfg, pad); in __imx214_get_pad_crop()
573 return &imx214->crop; in __imx214_get_pad_crop()
583 struct imx214 *imx214 = to_imx214(sd); in imx214_set_format() local
588 mutex_lock(&imx214->mutex); in imx214_set_format()
590 __crop = __imx214_get_pad_crop(imx214, cfg, format->pad, format->which); in imx214_set_format()
600 __format = __imx214_get_pad_format(imx214, cfg, format->pad, in imx214_set_format()
614 mutex_unlock(&imx214->mutex); in imx214_set_format()
623 struct imx214 *imx214 = to_imx214(sd); in imx214_get_selection() local
628 mutex_lock(&imx214->mutex); in imx214_get_selection()
629 sel->r = *__imx214_get_pad_crop(imx214, cfg, sel->pad, in imx214_get_selection()
631 mutex_unlock(&imx214->mutex); in imx214_get_selection()
651 struct imx214 *imx214 = container_of(ctrl->handler, in imx214_set_ctrl() local
652 struct imx214, ctrls); in imx214_set_ctrl()
660 if (!pm_runtime_get_if_in_use(imx214->dev)) in imx214_set_ctrl()
667 ret = regmap_bulk_write(imx214->regmap, 0x202, vals, 2); in imx214_set_ctrl()
669 dev_err(imx214->dev, "Error %d\n", ret); in imx214_set_ctrl()
677 pm_runtime_put(imx214->dev); in imx214_set_ctrl()
687 static int imx214_write_table(struct imx214 *imx214, in imx214_write_table() argument
707 ret = regmap_bulk_write(imx214->regmap, table->addr, vals, i); in imx214_write_table()
710 dev_err(imx214->dev, "write_table error: %d\n", ret); in imx214_write_table()
720 static int imx214_start_streaming(struct imx214 *imx214) in imx214_start_streaming() argument
725 mutex_lock(&imx214->mutex); in imx214_start_streaming()
726 ret = imx214_write_table(imx214, mode_table_common); in imx214_start_streaming()
728 dev_err(imx214->dev, "could not sent common table %d\n", ret); in imx214_start_streaming()
734 imx214->fmt.width, imx214->fmt.height); in imx214_start_streaming()
735 ret = imx214_write_table(imx214, mode->reg_table); in imx214_start_streaming()
737 dev_err(imx214->dev, "could not sent mode table %d\n", ret); in imx214_start_streaming()
740 ret = __v4l2_ctrl_handler_setup(&imx214->ctrls); in imx214_start_streaming()
742 dev_err(imx214->dev, "could not sync v4l2 controls\n"); in imx214_start_streaming()
745 ret = regmap_write(imx214->regmap, 0x100, 1); in imx214_start_streaming()
747 dev_err(imx214->dev, "could not sent start table %d\n", ret); in imx214_start_streaming()
751 mutex_unlock(&imx214->mutex); in imx214_start_streaming()
755 mutex_unlock(&imx214->mutex); in imx214_start_streaming()
759 static int imx214_stop_streaming(struct imx214 *imx214) in imx214_stop_streaming() argument
763 ret = regmap_write(imx214->regmap, 0x100, 0); in imx214_stop_streaming()
765 dev_err(imx214->dev, "could not sent stop table %d\n", ret); in imx214_stop_streaming()
772 struct imx214 *imx214 = to_imx214(subdev); in imx214_s_stream() local
775 if (imx214->streaming == enable) in imx214_s_stream()
779 ret = pm_runtime_get_sync(imx214->dev); in imx214_s_stream()
781 pm_runtime_put_noidle(imx214->dev); in imx214_s_stream()
785 ret = imx214_start_streaming(imx214); in imx214_s_stream()
789 ret = imx214_stop_streaming(imx214); in imx214_s_stream()
792 pm_runtime_put(imx214->dev); in imx214_s_stream()
795 imx214->streaming = enable; in imx214_s_stream()
799 pm_runtime_put(imx214->dev); in imx214_s_stream()
862 static int imx214_get_regulators(struct device *dev, struct imx214 *imx214) in imx214_get_regulators() argument
867 imx214->supplies[i].supply = imx214_supply_name[i]; in imx214_get_regulators()
870 imx214->supplies); in imx214_get_regulators()
915 struct imx214 *imx214 = to_imx214(sd); in imx214_suspend() local
917 if (imx214->streaming) in imx214_suspend()
918 imx214_stop_streaming(imx214); in imx214_suspend()
927 struct imx214 *imx214 = to_imx214(sd); in imx214_resume() local
930 if (imx214->streaming) { in imx214_resume()
931 ret = imx214_start_streaming(imx214); in imx214_resume()
939 imx214_stop_streaming(imx214); in imx214_resume()
940 imx214->streaming = 0; in imx214_resume()
947 struct imx214 *imx214; in imx214_probe() local
961 imx214 = devm_kzalloc(dev, sizeof(*imx214), GFP_KERNEL); in imx214_probe()
962 if (!imx214) in imx214_probe()
965 imx214->dev = dev; in imx214_probe()
967 imx214->xclk = devm_clk_get(dev, NULL); in imx214_probe()
968 if (IS_ERR(imx214->xclk)) { in imx214_probe()
970 return PTR_ERR(imx214->xclk); in imx214_probe()
973 ret = clk_set_rate(imx214->xclk, IMX214_DEFAULT_CLK_FREQ); in imx214_probe()
979 ret = imx214_get_regulators(dev, imx214); in imx214_probe()
985 imx214->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in imx214_probe()
986 if (IS_ERR(imx214->enable_gpio)) { in imx214_probe()
988 return PTR_ERR(imx214->enable_gpio); in imx214_probe()
991 imx214->regmap = devm_regmap_init_i2c(client, &sensor_regmap_config); in imx214_probe()
992 if (IS_ERR(imx214->regmap)) { in imx214_probe()
994 return PTR_ERR(imx214->regmap); in imx214_probe()
997 v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops); in imx214_probe()
1003 imx214_power_on(imx214->dev); in imx214_probe()
1005 pm_runtime_set_active(imx214->dev); in imx214_probe()
1006 pm_runtime_enable(imx214->dev); in imx214_probe()
1007 pm_runtime_idle(imx214->dev); in imx214_probe()
1009 v4l2_ctrl_handler_init(&imx214->ctrls, 3); in imx214_probe()
1011 imx214->pixel_rate = v4l2_ctrl_new_std(&imx214->ctrls, NULL, in imx214_probe()
1015 imx214->link_freq = v4l2_ctrl_new_int_menu(&imx214->ctrls, NULL, in imx214_probe()
1019 if (imx214->link_freq) in imx214_probe()
1020 imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in imx214_probe()
1032 imx214->exposure = v4l2_ctrl_new_std(&imx214->ctrls, &imx214_ctrl_ops, in imx214_probe()
1036 imx214->unit_size = v4l2_ctrl_new_std_compound(&imx214->ctrls, in imx214_probe()
1040 ret = imx214->ctrls.error; in imx214_probe()
1047 imx214->sd.ctrl_handler = &imx214->ctrls; in imx214_probe()
1048 mutex_init(&imx214->mutex); in imx214_probe()
1049 imx214->ctrls.lock = &imx214->mutex; in imx214_probe()
1051 imx214->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in imx214_probe()
1052 imx214->pad.flags = MEDIA_PAD_FL_SOURCE; in imx214_probe()
1053 imx214->sd.dev = &client->dev; in imx214_probe()
1054 imx214->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in imx214_probe()
1056 ret = media_entity_pads_init(&imx214->sd.entity, 1, &imx214->pad); in imx214_probe()
1062 imx214_entity_init_cfg(&imx214->sd, NULL); in imx214_probe()
1064 ret = v4l2_async_register_subdev_sensor_common(&imx214->sd); in imx214_probe()
1073 media_entity_cleanup(&imx214->sd.entity); in imx214_probe()
1075 mutex_destroy(&imx214->mutex); in imx214_probe()
1076 v4l2_ctrl_handler_free(&imx214->ctrls); in imx214_probe()
1077 pm_runtime_disable(imx214->dev); in imx214_probe()
1085 struct imx214 *imx214 = to_imx214(sd); in imx214_remove() local
1087 v4l2_async_unregister_subdev(&imx214->sd); in imx214_remove()
1088 media_entity_cleanup(&imx214->sd.entity); in imx214_remove()
1089 v4l2_ctrl_handler_free(&imx214->ctrls); in imx214_remove()
1094 mutex_destroy(&imx214->mutex); in imx214_remove()
1100 { .compatible = "sony,imx214" },
1114 .name = "imx214",
1122 MODULE_DESCRIPTION("Sony IMX214 Camera driver");