Lines Matching defs:mt9p031
26 #include <media/i2c/mt9p031.h>
120 struct mt9p031 {
147 static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd)
149 return container_of(sd, struct mt9p031, subdev);
162 static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear,
165 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
166 u16 value = (mt9p031->output_control & ~clear) | set;
173 mt9p031->output_control = value;
177 static int mt9p031_set_mode2(struct mt9p031 *mt9p031, u16 clear, u16 set)
179 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
180 u16 value = (mt9p031->mode2 & ~clear) | set;
187 mt9p031->mode2 = value;
191 static int mt9p031_reset(struct mt9p031 *mt9p031)
193 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
205 MT9P031_PIXEL_CLOCK_DIVIDE(mt9p031->clk_div));
209 return mt9p031_set_output_control(mt9p031, MT9P031_OUTPUT_CONTROL_CEN,
213 static int mt9p031_clk_setup(struct mt9p031 *mt9p031)
231 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
232 struct mt9p031_platform_data *pdata = mt9p031->pdata;
236 mt9p031->clk = devm_clk_get(&client->dev, NULL);
237 if (IS_ERR(mt9p031->clk))
238 return PTR_ERR(mt9p031->clk);
240 ret = clk_set_rate(mt9p031->clk, pdata->ext_freq);
244 ext_freq = clk_get_rate(mt9p031->clk);
255 mt9p031->clk_div = min_t(unsigned int, div, 64);
256 mt9p031->use_pll = false;
261 mt9p031->pll.ext_clock = ext_freq;
262 mt9p031->pll.pix_clock = pdata->target_freq;
263 mt9p031->use_pll = true;
265 return aptina_pll_calculate(&client->dev, &limits, &mt9p031->pll);
268 static int mt9p031_pll_enable(struct mt9p031 *mt9p031)
270 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
273 if (!mt9p031->use_pll)
282 (mt9p031->pll.m << 8) | (mt9p031->pll.n - 1));
286 ret = mt9p031_write(client, MT9P031_PLL_CONFIG_2, mt9p031->pll.p1 - 1);
297 static inline int mt9p031_pll_disable(struct mt9p031 *mt9p031)
299 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
301 if (!mt9p031->use_pll)
308 static int mt9p031_power_on(struct mt9p031 *mt9p031)
314 if (mt9p031->reset) {
315 gpiod_set_value(mt9p031->reset, 1);
320 ret = regulator_bulk_enable(ARRAY_SIZE(mt9p031->regulators),
321 mt9p031->regulators);
326 if (mt9p031->clk) {
327 ret = clk_prepare_enable(mt9p031->clk);
329 regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
330 mt9p031->regulators);
336 if (mt9p031->reset) {
337 gpiod_set_value(mt9p031->reset, 0);
339 rate = clk_get_rate(mt9p031->clk);
349 static void mt9p031_power_off(struct mt9p031 *mt9p031)
351 if (mt9p031->reset) {
352 gpiod_set_value(mt9p031->reset, 1);
356 regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
357 mt9p031->regulators);
359 clk_disable_unprepare(mt9p031->clk);
362 static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
364 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
368 mt9p031_power_off(mt9p031);
372 ret = mt9p031_power_on(mt9p031);
376 ret = mt9p031_reset(mt9p031);
383 if (mt9p031->pdata && mt9p031->pdata->pixclk_pol) {
390 return v4l2_ctrl_handler_setup(&mt9p031->ctrls);
397 static int mt9p031_set_params(struct mt9p031 *mt9p031)
399 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
400 struct v4l2_mbus_framefmt *format = &mt9p031->format;
401 const struct v4l2_rect *crop = &mt9p031->crop;
464 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
483 ret = mt9p031_set_output_control(mt9p031,
488 return mt9p031_pll_disable(mt9p031);
491 ret = mt9p031_set_params(mt9p031);
496 ret = mt9p031_set_output_control(mt9p031, 0,
511 return mt9p031_pll_enable(mt9p031);
518 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
523 code->code = mt9p031->format.code;
531 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
533 if (fse->index >= 8 || fse->code != mt9p031->format.code)
546 __mt9p031_get_pad_format(struct mt9p031 *mt9p031,
552 return v4l2_subdev_get_try_format(&mt9p031->subdev, sd_state,
555 return &mt9p031->format;
562 __mt9p031_get_pad_crop(struct mt9p031 *mt9p031,
568 return v4l2_subdev_get_try_crop(&mt9p031->subdev, sd_state,
571 return &mt9p031->crop;
581 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
583 fmt->format = *__mt9p031_get_pad_format(mt9p031, sd_state, fmt->pad,
592 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
600 __crop = __mt9p031_get_pad_crop(mt9p031, sd_state, format->pad,
616 __format = __mt9p031_get_pad_format(mt9p031, sd_state, format->pad,
630 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
641 sel->r = *__mt9p031_get_pad_crop(mt9p031, sd_state,
654 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
681 __crop = __mt9p031_get_pad_crop(mt9p031, sd_state, sel->pad,
688 __format = __mt9p031_get_pad_format(mt9p031, sd_state,
704 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
710 crop = __mt9p031_get_pad_crop(mt9p031, sd_state, 0, which);
716 format = __mt9p031_get_pad_format(mt9p031, sd_state, 0, which);
718 if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
740 static int mt9p031_restore_blc(struct mt9p031 *mt9p031)
742 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
745 if (mt9p031->blc_auto->cur.val != 0) {
746 ret = mt9p031_set_mode2(mt9p031, 0,
752 if (mt9p031->blc_offset->cur.val != 0) {
754 mt9p031->blc_offset->cur.val);
764 struct mt9p031 *mt9p031 =
765 container_of(ctrl->handler, struct mt9p031, ctrls);
766 struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
812 return mt9p031_set_mode2(mt9p031,
815 return mt9p031_set_mode2(mt9p031,
820 return mt9p031_set_mode2(mt9p031,
823 return mt9p031_set_mode2(mt9p031,
832 v4l2_ctrl_activate(mt9p031->blc_auto, ctrl->val == 0);
833 v4l2_ctrl_activate(mt9p031->blc_offset, ctrl->val == 0);
837 ret = mt9p031_restore_blc(mt9p031);
855 ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC,
869 ret = mt9p031_set_mode2(mt9p031,
971 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
974 mutex_lock(&mt9p031->power_lock);
979 if (mt9p031->power_count == !on) {
980 ret = __mt9p031_set_power(mt9p031, !!on);
986 mt9p031->power_count += on ? 1 : -1;
987 WARN_ON(mt9p031->power_count < 0);
990 mutex_unlock(&mt9p031->power_lock);
1001 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1005 ret = mt9p031_power_on(mt9p031);
1013 mt9p031_power_off(mt9p031);
1110 struct mt9p031 *mt9p031;
1125 mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
1126 if (mt9p031 == NULL)
1129 mt9p031->pdata = pdata;
1130 mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF;
1131 mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
1132 mt9p031->model = did->driver_data;
1134 mt9p031->regulators[0].supply = "vdd";
1135 mt9p031->regulators[1].supply = "vdd_io";
1136 mt9p031->regulators[2].supply = "vaa";
1138 ret = devm_regulator_bulk_get(&client->dev, 3, mt9p031->regulators);
1144 mutex_init(&mt9p031->power_lock);
1146 v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
1148 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1152 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1155 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1157 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1159 v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1162 v4l2_ctrl_new_std_menu_items(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1168 v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL);
1170 mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;
1172 if (mt9p031->ctrls.error) {
1174 __func__, mt9p031->ctrls.error);
1175 ret = mt9p031->ctrls.error;
1179 mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO);
1180 mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls,
1183 v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);
1184 mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops;
1186 mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1187 mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1188 ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1192 mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1194 ret = mt9p031_init_cfg(&mt9p031->subdev, NULL);
1198 mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1201 ret = mt9p031_clk_setup(mt9p031);
1205 ret = v4l2_async_register_subdev(&mt9p031->subdev);
1209 v4l2_ctrl_handler_free(&mt9p031->ctrls);
1210 media_entity_cleanup(&mt9p031->subdev.entity);
1211 mutex_destroy(&mt9p031->power_lock);
1220 struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1222 v4l2_ctrl_handler_free(&mt9p031->ctrls);
1225 mutex_destroy(&mt9p031->power_lock);
1230 { "mt9p031", MT9P031_MODEL_COLOR },
1239 { .compatible = "aptina,mt9p031", },
1249 .name = "mt9p031",