Lines Matching defs:imx214

3  * imx214.c - imx214 sensor driver
36 struct imx214 {
427 static inline struct imx214 *to_imx214(struct v4l2_subdev *sd)
429 return container_of(sd, struct imx214, sd);
436 struct imx214 *imx214 = to_imx214(sd);
439 ret = regulator_bulk_enable(IMX214_NUM_SUPPLIES, imx214->supplies);
441 dev_err(imx214->dev, "failed to enable regulators: %d\n", ret);
447 ret = clk_prepare_enable(imx214->xclk);
449 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
450 dev_err(imx214->dev, "clk prepare enable failed\n");
454 gpiod_set_value_cansleep(imx214->enable_gpio, 1);
464 struct imx214 *imx214 = to_imx214(sd);
466 gpiod_set_value_cansleep(imx214->enable_gpio, 0);
468 clk_disable_unprepare(imx214->xclk);
470 regulator_bulk_disable(IMX214_NUM_SUPPLIES, imx214->supplies);
508 struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
510 return regmap_write(imx214->regmap, reg->reg, reg->val);
516 struct imx214 *imx214 = container_of(subdev, struct imx214, sd);
521 ret = regmap_read(imx214->regmap, reg->reg, &aux);
536 __imx214_get_pad_format(struct imx214 *imx214,
543 return v4l2_subdev_get_try_format(&imx214->sd, sd_state, pad);
545 return &imx214->fmt;
555 struct imx214 *imx214 = to_imx214(sd);
557 mutex_lock(&imx214->mutex);
558 format->format = *__imx214_get_pad_format(imx214, sd_state,
561 mutex_unlock(&imx214->mutex);
567 __imx214_get_pad_crop(struct imx214 *imx214,
573 return v4l2_subdev_get_try_crop(&imx214->sd, sd_state, pad);
575 return &imx214->crop;
585 struct imx214 *imx214 = to_imx214(sd);
590 mutex_lock(&imx214->mutex);
592 __crop = __imx214_get_pad_crop(imx214, sd_state, format->pad,
603 __format = __imx214_get_pad_format(imx214, sd_state, format->pad,
617 mutex_unlock(&imx214->mutex);
626 struct imx214 *imx214 = to_imx214(sd);
631 mutex_lock(&imx214->mutex);
632 sel->r = *__imx214_get_pad_crop(imx214, sd_state, sel->pad,
634 mutex_unlock(&imx214->mutex);
654 struct imx214 *imx214 = container_of(ctrl->handler,
655 struct imx214, ctrls);
663 if (!pm_runtime_get_if_in_use(imx214->dev))
670 ret = regmap_bulk_write(imx214->regmap, 0x202, vals, 2);
672 dev_err(imx214->dev, "Error %d\n", ret);
680 pm_runtime_put(imx214->dev);
690 static int imx214_write_table(struct imx214 *imx214,
710 ret = regmap_bulk_write(imx214->regmap, table->addr, vals, i);
713 dev_err(imx214->dev, "write_table error: %d\n", ret);
723 static int imx214_start_streaming(struct imx214 *imx214)
728 mutex_lock(&imx214->mutex);
729 ret = imx214_write_table(imx214, mode_table_common);
731 dev_err(imx214->dev, "could not sent common table %d\n", ret);
737 imx214->fmt.width, imx214->fmt.height);
738 ret = imx214_write_table(imx214, mode->reg_table);
740 dev_err(imx214->dev, "could not sent mode table %d\n", ret);
743 ret = __v4l2_ctrl_handler_setup(&imx214->ctrls);
745 dev_err(imx214->dev, "could not sync v4l2 controls\n");
748 ret = regmap_write(imx214->regmap, 0x100, 1);
750 dev_err(imx214->dev, "could not sent start table %d\n", ret);
754 mutex_unlock(&imx214->mutex);
758 mutex_unlock(&imx214->mutex);
762 static int imx214_stop_streaming(struct imx214 *imx214)
766 ret = regmap_write(imx214->regmap, 0x100, 0);
768 dev_err(imx214->dev, "could not sent stop table %d\n", ret);
775 struct imx214 *imx214 = to_imx214(subdev);
778 if (imx214->streaming == enable)
782 ret = pm_runtime_resume_and_get(imx214->dev);
786 ret = imx214_start_streaming(imx214);
790 ret = imx214_stop_streaming(imx214);
793 pm_runtime_put(imx214->dev);
796 imx214->streaming = enable;
800 pm_runtime_put(imx214->dev);
863 static int imx214_get_regulators(struct device *dev, struct imx214 *imx214)
868 imx214->supplies[i].supply = imx214_supply_name[i];
871 imx214->supplies);
916 struct imx214 *imx214 = to_imx214(sd);
918 if (imx214->streaming)
919 imx214_stop_streaming(imx214);
928 struct imx214 *imx214 = to_imx214(sd);
931 if (imx214->streaming) {
932 ret = imx214_start_streaming(imx214);
940 imx214_stop_streaming(imx214);
941 imx214->streaming = 0;
948 struct imx214 *imx214;
962 imx214 = devm_kzalloc(dev, sizeof(*imx214), GFP_KERNEL);
963 if (!imx214)
966 imx214->dev = dev;
968 imx214->xclk = devm_clk_get(dev, NULL);
969 if (IS_ERR(imx214->xclk)) {
971 return PTR_ERR(imx214->xclk);
974 ret = clk_set_rate(imx214->xclk, IMX214_DEFAULT_CLK_FREQ);
980 ret = imx214_get_regulators(dev, imx214);
986 imx214->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
987 if (IS_ERR(imx214->enable_gpio)) {
989 return PTR_ERR(imx214->enable_gpio);
992 imx214->regmap = devm_regmap_init_i2c(client, &sensor_regmap_config);
993 if (IS_ERR(imx214->regmap)) {
995 return PTR_ERR(imx214->regmap);
998 v4l2_i2c_subdev_init(&imx214->sd, client, &imx214_subdev_ops);
1004 imx214_power_on(imx214->dev);
1006 pm_runtime_set_active(imx214->dev);
1007 pm_runtime_enable(imx214->dev);
1008 pm_runtime_idle(imx214->dev);
1010 v4l2_ctrl_handler_init(&imx214->ctrls, 3);
1012 imx214->pixel_rate = v4l2_ctrl_new_std(&imx214->ctrls, NULL,
1016 imx214->link_freq = v4l2_ctrl_new_int_menu(&imx214->ctrls, NULL,
1020 if (imx214->link_freq)
1021 imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1033 imx214->exposure = v4l2_ctrl_new_std(&imx214->ctrls, &imx214_ctrl_ops,
1037 imx214->unit_size = v4l2_ctrl_new_std_compound(&imx214->ctrls,
1041 ret = imx214->ctrls.error;
1048 imx214->sd.ctrl_handler = &imx214->ctrls;
1049 mutex_init(&imx214->mutex);
1050 imx214->ctrls.lock = &imx214->mutex;
1052 imx214->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1053 imx214->pad.flags = MEDIA_PAD_FL_SOURCE;
1054 imx214->sd.dev = &client->dev;
1055 imx214->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1057 ret = media_entity_pads_init(&imx214->sd.entity, 1, &imx214->pad);
1063 imx214_entity_init_cfg(&imx214->sd, NULL);
1065 ret = v4l2_async_register_subdev_sensor(&imx214->sd);
1074 media_entity_cleanup(&imx214->sd.entity);
1076 mutex_destroy(&imx214->mutex);
1077 v4l2_ctrl_handler_free(&imx214->ctrls);
1078 pm_runtime_disable(imx214->dev);
1086 struct imx214 *imx214 = to_imx214(sd);
1088 v4l2_async_unregister_subdev(&imx214->sd);
1089 media_entity_cleanup(&imx214->sd.entity);
1090 v4l2_ctrl_handler_free(&imx214->ctrls);
1095 mutex_destroy(&imx214->mutex);
1099 { .compatible = "sony,imx214" },
1113 .name = "imx214",