Symbol: mt9v032
drivers/media/i2c/mt9v032.c
1004
static int mt9v032_get_pdata(struct mt9v032 *mt9v032)
drivers/media/i2c/mt9v032.c
1006
struct mt9v032_platform_data *pdata = &mt9v032->pdata;
drivers/media/i2c/mt9v032.c
1011
np = of_graph_get_endpoint_by_regs(mt9v032->dev->of_node, 0, -1);
drivers/media/i2c/mt9v032.c
1023
link_freqs = devm_kcalloc(mt9v032->dev, size,
drivers/media/i2c/mt9v032.c
1044
struct mt9v032 *mt9v032;
drivers/media/i2c/mt9v032.c
1048
mt9v032 = devm_kzalloc(&client->dev, sizeof(*mt9v032), GFP_KERNEL);
drivers/media/i2c/mt9v032.c
1049
if (!mt9v032)
drivers/media/i2c/mt9v032.c
1052
mt9v032->dev = &client->dev;
drivers/media/i2c/mt9v032.c
1054
mt9v032->regmap = devm_regmap_init_i2c(client, &mt9v032_regmap_config);
drivers/media/i2c/mt9v032.c
1055
if (IS_ERR(mt9v032->regmap))
drivers/media/i2c/mt9v032.c
1056
return PTR_ERR(mt9v032->regmap);
drivers/media/i2c/mt9v032.c
1058
mt9v032->clk = devm_v4l2_sensor_clk_get(mt9v032->dev, NULL);
drivers/media/i2c/mt9v032.c
1059
if (IS_ERR(mt9v032->clk))
drivers/media/i2c/mt9v032.c
1060
return dev_err_probe(mt9v032->dev, PTR_ERR(mt9v032->clk),
drivers/media/i2c/mt9v032.c
1063
mt9v032->reset_gpio = devm_gpiod_get_optional(mt9v032->dev, "reset",
drivers/media/i2c/mt9v032.c
1065
if (IS_ERR(mt9v032->reset_gpio))
drivers/media/i2c/mt9v032.c
1066
return PTR_ERR(mt9v032->reset_gpio);
drivers/media/i2c/mt9v032.c
1068
mt9v032->standby_gpio = devm_gpiod_get_optional(mt9v032->dev, "standby",
drivers/media/i2c/mt9v032.c
1070
if (IS_ERR(mt9v032->standby_gpio))
drivers/media/i2c/mt9v032.c
1071
return PTR_ERR(mt9v032->standby_gpio);
drivers/media/i2c/mt9v032.c
1073
mutex_init(&mt9v032->power_lock);
drivers/media/i2c/mt9v032.c
1075
ret = mt9v032_get_pdata(mt9v032);
drivers/media/i2c/mt9v032.c
1077
return dev_err_probe(mt9v032->dev, -EINVAL,
drivers/media/i2c/mt9v032.c
1080
mt9v032->model = device_get_match_data(mt9v032->dev);
drivers/media/i2c/mt9v032.c
1082
v4l2_ctrl_handler_init(&mt9v032->ctrls, 11 +
drivers/media/i2c/mt9v032.c
1085
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1087
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1090
v4l2_ctrl_new_std_menu(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1093
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1094
V4L2_CID_EXPOSURE, mt9v032->model->data->min_shutter,
drivers/media/i2c/mt9v032.c
1095
mt9v032->model->data->max_shutter, 1,
drivers/media/i2c/mt9v032.c
1097
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1098
V4L2_CID_HBLANK, mt9v032->model->data->min_hblank,
drivers/media/i2c/mt9v032.c
1101
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1102
V4L2_CID_VBLANK, mt9v032->model->data->min_vblank,
drivers/media/i2c/mt9v032.c
1103
mt9v032->model->data->max_vblank, 1,
drivers/media/i2c/mt9v032.c
1105
mt9v032->test_pattern = v4l2_ctrl_new_std_menu_items(&mt9v032->ctrls,
drivers/media/i2c/mt9v032.c
1109
mt9v032->test_pattern_color = v4l2_ctrl_new_custom(&mt9v032->ctrls,
drivers/media/i2c/mt9v032.c
1112
v4l2_ctrl_new_custom(&mt9v032->ctrls,
drivers/media/i2c/mt9v032.c
1113
mt9v032->model->data->aec_max_shutter_v4l2_ctrl,
drivers/media/i2c/mt9v032.c
1116
v4l2_ctrl_new_custom(&mt9v032->ctrls, &mt9v032_aegc_controls[i],
drivers/media/i2c/mt9v032.c
1119
v4l2_ctrl_cluster(2, &mt9v032->test_pattern);
drivers/media/i2c/mt9v032.c
1121
mt9v032->pixel_rate =
drivers/media/i2c/mt9v032.c
1122
v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
drivers/media/i2c/mt9v032.c
1125
if (mt9v032->pdata.link_freqs) {
drivers/media/i2c/mt9v032.c
1126
const struct mt9v032_platform_data *pdata = &mt9v032->pdata;
drivers/media/i2c/mt9v032.c
1134
mt9v032->link_freq =
drivers/media/i2c/mt9v032.c
1135
v4l2_ctrl_new_int_menu(&mt9v032->ctrls,
drivers/media/i2c/mt9v032.c
1139
v4l2_ctrl_cluster(2, &mt9v032->link_freq);
drivers/media/i2c/mt9v032.c
1143
mt9v032->subdev.ctrl_handler = &mt9v032->ctrls;
drivers/media/i2c/mt9v032.c
1145
if (mt9v032->ctrls.error) {
drivers/media/i2c/mt9v032.c
1146
dev_err(mt9v032->dev, "control initialization error %d\n",
drivers/media/i2c/mt9v032.c
1147
mt9v032->ctrls.error);
drivers/media/i2c/mt9v032.c
1148
ret = mt9v032->ctrls.error;
drivers/media/i2c/mt9v032.c
1152
mt9v032->crop.left = MT9V032_COLUMN_START_DEF;
drivers/media/i2c/mt9v032.c
1153
mt9v032->crop.top = MT9V032_ROW_START_DEF;
drivers/media/i2c/mt9v032.c
1154
mt9v032->crop.width = MT9V032_WINDOW_WIDTH_DEF;
drivers/media/i2c/mt9v032.c
1155
mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF;
drivers/media/i2c/mt9v032.c
1157
if (mt9v032->model->color)
drivers/media/i2c/mt9v032.c
1158
mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
drivers/media/i2c/mt9v032.c
1160
mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10;
drivers/media/i2c/mt9v032.c
1162
mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF;
drivers/media/i2c/mt9v032.c
1163
mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF;
drivers/media/i2c/mt9v032.c
1164
mt9v032->format.field = V4L2_FIELD_NONE;
drivers/media/i2c/mt9v032.c
1165
mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB;
drivers/media/i2c/mt9v032.c
1167
mt9v032->hratio = 1;
drivers/media/i2c/mt9v032.c
1168
mt9v032->vratio = 1;
drivers/media/i2c/mt9v032.c
1170
mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE;
drivers/media/i2c/mt9v032.c
1171
mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF;
drivers/media/i2c/mt9v032.c
1172
mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF;
drivers/media/i2c/mt9v032.c
1174
v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops);
drivers/media/i2c/mt9v032.c
1175
mt9v032->subdev.internal_ops = &mt9v032_subdev_internal_ops;
drivers/media/i2c/mt9v032.c
1176
mt9v032->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
drivers/media/i2c/mt9v032.c
1178
mt9v032->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/mt9v032.c
1179
mt9v032->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/mt9v032.c
1180
ret = media_entity_pads_init(&mt9v032->subdev.entity, 1, &mt9v032->pad);
drivers/media/i2c/mt9v032.c
1184
mt9v032->subdev.dev = mt9v032->dev;
drivers/media/i2c/mt9v032.c
1185
ret = v4l2_async_register_subdev(&mt9v032->subdev);
drivers/media/i2c/mt9v032.c
1192
media_entity_cleanup(&mt9v032->subdev.entity);
drivers/media/i2c/mt9v032.c
1193
v4l2_ctrl_handler_free(&mt9v032->ctrls);
drivers/media/i2c/mt9v032.c
1200
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
1203
v4l2_ctrl_handler_free(&mt9v032->ctrls);
drivers/media/i2c/mt9v032.c
228
static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd)
drivers/media/i2c/mt9v032.c
230
return container_of(sd, struct mt9v032, subdev);
drivers/media/i2c/mt9v032.c
234
mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable)
drivers/media/i2c/mt9v032.c
236
struct regmap *map = mt9v032->regmap;
drivers/media/i2c/mt9v032.c
237
u16 value = mt9v032->aec_agc;
drivers/media/i2c/mt9v032.c
249
mt9v032->aec_agc = value;
drivers/media/i2c/mt9v032.c
254
mt9v032_update_hblank(struct mt9v032 *mt9v032)
drivers/media/i2c/mt9v032.c
256
struct v4l2_rect *crop = &mt9v032->crop;
drivers/media/i2c/mt9v032.c
257
unsigned int min_hblank = mt9v032->model->data->min_hblank;
drivers/media/i2c/mt9v032.c
260
if (mt9v032->version->version == MT9V034_CHIP_ID_REV1)
drivers/media/i2c/mt9v032.c
261
min_hblank += (mt9v032->hratio - 1) * 10;
drivers/media/i2c/mt9v032.c
262
min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width,
drivers/media/i2c/mt9v032.c
264
hblank = max_t(unsigned int, mt9v032->hblank, min_hblank);
drivers/media/i2c/mt9v032.c
266
return regmap_write(mt9v032->regmap, MT9V032_HORIZONTAL_BLANKING,
drivers/media/i2c/mt9v032.c
270
static int mt9v032_power_on(struct mt9v032 *mt9v032)
drivers/media/i2c/mt9v032.c
272
struct regmap *map = mt9v032->regmap;
drivers/media/i2c/mt9v032.c
275
gpiod_set_value_cansleep(mt9v032->reset_gpio, 1);
drivers/media/i2c/mt9v032.c
277
ret = clk_set_rate(mt9v032->clk, mt9v032->sysclk);
drivers/media/i2c/mt9v032.c
282
ret = clk_prepare_enable(mt9v032->clk);
drivers/media/i2c/mt9v032.c
288
if (mt9v032->reset_gpio) {
drivers/media/i2c/mt9v032.c
289
gpiod_set_value_cansleep(mt9v032->reset_gpio, 0);
drivers/media/i2c/mt9v032.c
316
clk_disable_unprepare(mt9v032->clk);
drivers/media/i2c/mt9v032.c
320
static void mt9v032_power_off(struct mt9v032 *mt9v032)
drivers/media/i2c/mt9v032.c
322
clk_disable_unprepare(mt9v032->clk);
drivers/media/i2c/mt9v032.c
325
static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on)
drivers/media/i2c/mt9v032.c
327
struct regmap *map = mt9v032->regmap;
drivers/media/i2c/mt9v032.c
331
mt9v032_power_off(mt9v032);
drivers/media/i2c/mt9v032.c
335
ret = mt9v032_power_on(mt9v032);
drivers/media/i2c/mt9v032.c
340
if (mt9v032->pdata.clk_pol) {
drivers/media/i2c/mt9v032.c
341
ret = regmap_write(map, mt9v032->model->data->pclk_reg,
drivers/media/i2c/mt9v032.c
352
return v4l2_ctrl_handler_setup(&mt9v032->ctrls);
drivers/media/i2c/mt9v032.c
360
__mt9v032_get_pad_format(struct mt9v032 *mt9v032,
drivers/media/i2c/mt9v032.c
368
return &mt9v032->format;
drivers/media/i2c/mt9v032.c
375
__mt9v032_get_pad_crop(struct mt9v032 *mt9v032,
drivers/media/i2c/mt9v032.c
383
return &mt9v032->crop;
drivers/media/i2c/mt9v032.c
393
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
394
struct v4l2_rect *crop = &mt9v032->crop;
drivers/media/i2c/mt9v032.c
395
struct regmap *map = mt9v032->regmap;
drivers/media/i2c/mt9v032.c
404
hbin = fls(mt9v032->hratio) - 1;
drivers/media/i2c/mt9v032.c
405
vbin = fls(mt9v032->vratio) - 1;
drivers/media/i2c/mt9v032.c
429
ret = mt9v032_update_hblank(mt9v032);
drivers/media/i2c/mt9v032.c
441
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
446
code->code = mt9v032->format.code;
drivers/media/i2c/mt9v032.c
454
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
458
if (mt9v032->format.code != fse->code)
drivers/media/i2c/mt9v032.c
473
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
475
format->format = *__mt9v032_get_pad_format(mt9v032, sd_state,
drivers/media/i2c/mt9v032.c
481
static void mt9v032_configure_pixel_rate(struct mt9v032 *mt9v032)
drivers/media/i2c/mt9v032.c
485
ret = v4l2_ctrl_s_ctrl_int64(mt9v032->pixel_rate,
drivers/media/i2c/mt9v032.c
486
mt9v032->sysclk / mt9v032->hratio);
drivers/media/i2c/mt9v032.c
488
dev_warn(mt9v032->dev, "failed to set pixel rate (%d)\n", ret);
drivers/media/i2c/mt9v032.c
508
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
516
__crop = __mt9v032_get_pad_crop(mt9v032, sd_state, format->pad,
drivers/media/i2c/mt9v032.c
532
__format = __mt9v032_get_pad_format(mt9v032, sd_state, format->pad,
drivers/media/i2c/mt9v032.c
538
mt9v032->hratio = hratio;
drivers/media/i2c/mt9v032.c
539
mt9v032->vratio = vratio;
drivers/media/i2c/mt9v032.c
540
mt9v032_configure_pixel_rate(mt9v032);
drivers/media/i2c/mt9v032.c
552
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
557
sel->r = *__mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad,
drivers/media/i2c/mt9v032.c
566
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
595
__crop = __mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad,
drivers/media/i2c/mt9v032.c
602
__format = __mt9v032_get_pad_format(mt9v032, sd_state,
drivers/media/i2c/mt9v032.c
608
mt9v032->hratio = 1;
drivers/media/i2c/mt9v032.c
609
mt9v032->vratio = 1;
drivers/media/i2c/mt9v032.c
610
mt9v032_configure_pixel_rate(mt9v032);
drivers/media/i2c/mt9v032.c
656
struct mt9v032 *mt9v032 =
drivers/media/i2c/mt9v032.c
657
container_of(ctrl->handler, struct mt9v032, ctrls);
drivers/media/i2c/mt9v032.c
658
struct regmap *map = mt9v032->regmap;
drivers/media/i2c/mt9v032.c
664
return mt9v032_update_aec_agc(mt9v032, MT9V032_AGC_ENABLE,
drivers/media/i2c/mt9v032.c
671
return mt9v032_update_aec_agc(mt9v032, MT9V032_AEC_ENABLE,
drivers/media/i2c/mt9v032.c
679
mt9v032->hblank = ctrl->val;
drivers/media/i2c/mt9v032.c
680
return mt9v032_update_hblank(mt9v032);
drivers/media/i2c/mt9v032.c
688
if (mt9v032->link_freq == NULL)
drivers/media/i2c/mt9v032.c
691
freq = mt9v032->pdata.link_freqs[mt9v032->link_freq->val];
drivers/media/i2c/mt9v032.c
692
*mt9v032->pixel_rate->p_new.p_s64 = freq;
drivers/media/i2c/mt9v032.c
693
mt9v032->sysclk = freq;
drivers/media/i2c/mt9v032.c
697
switch (mt9v032->test_pattern->val) {
drivers/media/i2c/mt9v032.c
714
data = (mt9v032->test_pattern_color->val <<
drivers/media/i2c/mt9v032.c
742
mt9v032->model->data->aec_max_shutter_reg,
drivers/media/i2c/mt9v032.c
857
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
860
mutex_lock(&mt9v032->power_lock);
drivers/media/i2c/mt9v032.c
865
if (mt9v032->power_count == !on) {
drivers/media/i2c/mt9v032.c
866
ret = __mt9v032_set_power(mt9v032, !!on);
drivers/media/i2c/mt9v032.c
872
mt9v032->power_count += on ? 1 : -1;
drivers/media/i2c/mt9v032.c
873
WARN_ON(mt9v032->power_count < 0);
drivers/media/i2c/mt9v032.c
876
mutex_unlock(&mt9v032->power_lock);
drivers/media/i2c/mt9v032.c
887
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
892
dev_info(mt9v032->dev, "Probing MT9V032 at address 0x%02x\n",
drivers/media/i2c/mt9v032.c
895
ret = mt9v032_power_on(mt9v032);
drivers/media/i2c/mt9v032.c
897
dev_err(mt9v032->dev, "MT9V032 power up failed\n");
drivers/media/i2c/mt9v032.c
902
ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version);
drivers/media/i2c/mt9v032.c
904
mt9v032_power_off(mt9v032);
drivers/media/i2c/mt9v032.c
907
dev_err(mt9v032->dev, "Failed reading chip version\n");
drivers/media/i2c/mt9v032.c
913
mt9v032->version = &mt9v032_versions[i];
drivers/media/i2c/mt9v032.c
918
if (mt9v032->version == NULL) {
drivers/media/i2c/mt9v032.c
919
dev_err(mt9v032->dev, "Unsupported chip version 0x%04x\n",
drivers/media/i2c/mt9v032.c
924
dev_info(mt9v032->dev, "%s detected at address 0x%02x\n",
drivers/media/i2c/mt9v032.c
925
mt9v032->version->name, client->addr);
drivers/media/i2c/mt9v032.c
927
mt9v032_configure_pixel_rate(mt9v032);
drivers/media/i2c/mt9v032.c
934
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
drivers/media/i2c/mt9v032.c
946
if (mt9v032->model->color)