mt9p031.c (92fa766bb4189dc1110ba1fa10a391e27826725d) mt9p031.c (69681cd04164812e4089f3f57e450e9b7c27c1c2)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for MT9P031 CMOS Image Sensor from Aptina
4 *
5 * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com>
6 * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com>
7 * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
8 *

--- 668 unchanged lines hidden (view full) ---

677 }
678
679 *__crop = rect;
680 sel->r = rect;
681
682 return 0;
683}
684
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for MT9P031 CMOS Image Sensor from Aptina
4 *
5 * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com>
6 * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com>
7 * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
8 *

--- 668 unchanged lines hidden (view full) ---

677 }
678
679 *__crop = rect;
680 sel->r = rect;
681
682 return 0;
683}
684
685static int mt9p031_init_cfg(struct v4l2_subdev *subdev,
686 struct v4l2_subdev_state *sd_state)
687{
688 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
689 struct v4l2_mbus_framefmt *format;
690 struct v4l2_rect *crop;
691 const int which = sd_state == NULL ? V4L2_SUBDEV_FORMAT_ACTIVE :
692 V4L2_SUBDEV_FORMAT_TRY;
693
694 crop = __mt9p031_get_pad_crop(mt9p031, sd_state, 0, which);
695 v4l2_subdev_get_try_crop(subdev, sd_state, 0);
696 crop->left = MT9P031_COLUMN_START_DEF;
697 crop->top = MT9P031_ROW_START_DEF;
698 crop->width = MT9P031_WINDOW_WIDTH_DEF;
699 crop->height = MT9P031_WINDOW_HEIGHT_DEF;
700
701 format = __mt9p031_get_pad_format(mt9p031, sd_state, 0, which);
702
703 if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
704 format->code = MEDIA_BUS_FMT_Y12_1X12;
705 else
706 format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
707
708 format->width = MT9P031_WINDOW_WIDTH_DEF;
709 format->height = MT9P031_WINDOW_HEIGHT_DEF;
710 format->field = V4L2_FIELD_NONE;
711 format->colorspace = V4L2_COLORSPACE_SRGB;
712
713 return 0;
714}
715
685/* -----------------------------------------------------------------------------
686 * V4L2 subdev control operations
687 */
688
689#define V4L2_CID_BLC_AUTO (V4L2_CID_USER_BASE | 0x1002)
690#define V4L2_CID_BLC_TARGET_LEVEL (V4L2_CID_USER_BASE | 0x1003)
691#define V4L2_CID_BLC_ANALOG_OFFSET (V4L2_CID_USER_BASE | 0x1004)
692#define V4L2_CID_BLC_DIGITAL_OFFSET (V4L2_CID_USER_BASE | 0x1005)

--- 282 unchanged lines hidden (view full) ---

975 dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
976 client->addr);
977
978 return 0;
979}
980
981static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
982{
716/* -----------------------------------------------------------------------------
717 * V4L2 subdev control operations
718 */
719
720#define V4L2_CID_BLC_AUTO (V4L2_CID_USER_BASE | 0x1002)
721#define V4L2_CID_BLC_TARGET_LEVEL (V4L2_CID_USER_BASE | 0x1003)
722#define V4L2_CID_BLC_ANALOG_OFFSET (V4L2_CID_USER_BASE | 0x1004)
723#define V4L2_CID_BLC_DIGITAL_OFFSET (V4L2_CID_USER_BASE | 0x1005)

--- 282 unchanged lines hidden (view full) ---

1006 dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
1007 client->addr);
1008
1009 return 0;
1010}
1011
1012static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
1013{
983 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
984 struct v4l2_mbus_framefmt *format;
985 struct v4l2_rect *crop;
986
987 crop = v4l2_subdev_get_try_crop(subdev, fh->state, 0);
988 crop->left = MT9P031_COLUMN_START_DEF;
989 crop->top = MT9P031_ROW_START_DEF;
990 crop->width = MT9P031_WINDOW_WIDTH_DEF;
991 crop->height = MT9P031_WINDOW_HEIGHT_DEF;
992
993 format = v4l2_subdev_get_try_format(subdev, fh->state, 0);
994
995 if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
996 format->code = MEDIA_BUS_FMT_Y12_1X12;
997 else
998 format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
999
1000 format->width = MT9P031_WINDOW_WIDTH_DEF;
1001 format->height = MT9P031_WINDOW_HEIGHT_DEF;
1002 format->field = V4L2_FIELD_NONE;
1003 format->colorspace = V4L2_COLORSPACE_SRGB;
1004
1005 return mt9p031_set_power(subdev, 1);
1006}
1007
1008static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
1009{
1010 return mt9p031_set_power(subdev, 0);
1011}
1012
1013static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
1014 .s_power = mt9p031_set_power,
1015};
1016
1017static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
1018 .s_stream = mt9p031_s_stream,
1019};
1020
1021static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
1014 return mt9p031_set_power(subdev, 1);
1015}
1016
1017static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
1018{
1019 return mt9p031_set_power(subdev, 0);
1020}
1021
1022static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
1023 .s_power = mt9p031_set_power,
1024};
1025
1026static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
1027 .s_stream = mt9p031_s_stream,
1028};
1029
1030static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
1031 .init_cfg = mt9p031_init_cfg,
1022 .enum_mbus_code = mt9p031_enum_mbus_code,
1023 .enum_frame_size = mt9p031_enum_frame_size,
1024 .get_fmt = mt9p031_get_format,
1025 .set_fmt = mt9p031_set_format,
1026 .get_selection = mt9p031_get_selection,
1027 .set_selection = mt9p031_set_selection,
1028};
1029

--- 131 unchanged lines hidden (view full) ---

1161 mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1162 mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1163 ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1164 if (ret < 0)
1165 goto done;
1166
1167 mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1168
1032 .enum_mbus_code = mt9p031_enum_mbus_code,
1033 .enum_frame_size = mt9p031_enum_frame_size,
1034 .get_fmt = mt9p031_get_format,
1035 .set_fmt = mt9p031_set_format,
1036 .get_selection = mt9p031_get_selection,
1037 .set_selection = mt9p031_set_selection,
1038};
1039

--- 131 unchanged lines hidden (view full) ---

1171 mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1172 mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1173 ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1174 if (ret < 0)
1175 goto done;
1176
1177 mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1178
1169 mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF;
1170 mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF;
1171 mt9p031->crop.left = MT9P031_COLUMN_START_DEF;
1172 mt9p031->crop.top = MT9P031_ROW_START_DEF;
1179 ret = mt9p031_init_cfg(&mt9p031->subdev, NULL);
1180 if (ret)
1181 goto done;
1173
1182
1174 if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
1175 mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
1176 else
1177 mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
1178
1179 mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
1180 mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
1181 mt9p031->format.field = V4L2_FIELD_NONE;
1182 mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
1183
1184 mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1185 GPIOD_OUT_HIGH);
1186
1187 ret = mt9p031_clk_setup(mt9p031);
1188 if (ret)
1189 goto done;
1190
1191 ret = v4l2_async_register_subdev(&mt9p031->subdev);

--- 57 unchanged lines hidden ---
1183 mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1184 GPIOD_OUT_HIGH);
1185
1186 ret = mt9p031_clk_setup(mt9p031);
1187 if (ret)
1188 goto done;
1189
1190 ret = v4l2_async_register_subdev(&mt9p031->subdev);

--- 57 unchanged lines hidden ---