Lines Matching refs:mt9m111
207 struct mt9m111 { struct
226 static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111, in mt9m111_find_datafmt() argument
234 return mt9m111->fmt; in mt9m111_find_datafmt()
237 static struct mt9m111 *to_mt9m111(const struct i2c_client *client) in to_mt9m111()
239 return container_of(i2c_get_clientdata(client), struct mt9m111, subdev); in to_mt9m111()
246 struct mt9m111 *mt9m111 = to_mt9m111(client); in reg_page_map_set() local
249 if (page == mt9m111->lastpage) in reg_page_map_set()
256 mt9m111->lastpage = page; in reg_page_map_set()
317 static int mt9m111_set_context(struct mt9m111 *mt9m111, in mt9m111_set_context() argument
320 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_context()
324 static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111, in mt9m111_setup_rect_ctx() argument
328 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_setup_rect_ctx()
339 static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect, in mt9m111_setup_geometry() argument
342 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_setup_geometry()
357 ret = mt9m111_setup_rect_ctx(mt9m111, &context_b, in mt9m111_setup_geometry()
360 ret = mt9m111_setup_rect_ctx(mt9m111, &context_a, in mt9m111_setup_geometry()
371 static int mt9m111_enable(struct mt9m111 *mt9m111) in mt9m111_enable() argument
373 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_enable()
377 static int mt9m111_reset(struct mt9m111 *mt9m111) in mt9m111_reset() argument
379 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_reset()
397 struct mt9m111 *mt9m111 = to_mt9m111(client); in mt9m111_set_selection() local
406 if (mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 || in mt9m111_set_selection()
407 mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) { in mt9m111_set_selection()
423 width = min(mt9m111->width, rect.width); in mt9m111_set_selection()
424 height = min(mt9m111->height, rect.height); in mt9m111_set_selection()
426 ret = mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code); in mt9m111_set_selection()
428 mt9m111->rect = rect; in mt9m111_set_selection()
429 mt9m111->width = width; in mt9m111_set_selection()
430 mt9m111->height = height; in mt9m111_set_selection()
441 struct mt9m111 *mt9m111 = to_mt9m111(client); in mt9m111_get_selection() local
455 sel->r = mt9m111->rect; in mt9m111_get_selection()
467 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); in mt9m111_get_fmt() local
472 mf->width = mt9m111->width; in mt9m111_get_fmt()
473 mf->height = mt9m111->height; in mt9m111_get_fmt()
474 mf->code = mt9m111->fmt->code; in mt9m111_get_fmt()
475 mf->colorspace = mt9m111->fmt->colorspace; in mt9m111_get_fmt()
481 static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111, in mt9m111_set_pixfmt() argument
484 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_pixfmt()
557 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); in mt9m111_set_fmt() local
559 struct v4l2_rect *rect = &mt9m111->rect; in mt9m111_set_fmt()
566 fmt = mt9m111_find_datafmt(mt9m111, mf->code); in mt9m111_set_fmt()
603 ret = mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code); in mt9m111_set_fmt()
605 ret = mt9m111_set_pixfmt(mt9m111, mf->code); in mt9m111_set_fmt()
607 mt9m111->width = mf->width; in mt9m111_set_fmt()
608 mt9m111->height = mf->height; in mt9m111_set_fmt()
609 mt9m111->fmt = fmt; in mt9m111_set_fmt()
650 static int mt9m111_set_flip(struct mt9m111 *mt9m111, int flip, int mask) in mt9m111_set_flip() argument
652 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_flip()
656 ret = mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask); in mt9m111_set_flip()
658 ret = mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask); in mt9m111_set_flip()
663 static int mt9m111_get_global_gain(struct mt9m111 *mt9m111) in mt9m111_get_global_gain() argument
665 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_get_global_gain()
675 static int mt9m111_set_global_gain(struct mt9m111 *mt9m111, int gain) in mt9m111_set_global_gain() argument
677 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_global_gain()
693 static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int val) in mt9m111_set_autoexposure() argument
695 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_autoexposure()
702 static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on) in mt9m111_set_autowhitebalance() argument
704 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_autowhitebalance()
722 static int mt9m111_set_test_pattern(struct mt9m111 *mt9m111, int val) in mt9m111_set_test_pattern() argument
724 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_set_test_pattern()
732 struct mt9m111 *mt9m111 = container_of(ctrl->handler, in mt9m111_s_ctrl() local
733 struct mt9m111, hdl); in mt9m111_s_ctrl()
737 return mt9m111_set_flip(mt9m111, ctrl->val, in mt9m111_s_ctrl()
740 return mt9m111_set_flip(mt9m111, ctrl->val, in mt9m111_s_ctrl()
743 return mt9m111_set_global_gain(mt9m111, ctrl->val); in mt9m111_s_ctrl()
745 return mt9m111_set_autoexposure(mt9m111, ctrl->val); in mt9m111_s_ctrl()
747 return mt9m111_set_autowhitebalance(mt9m111, ctrl->val); in mt9m111_s_ctrl()
749 return mt9m111_set_test_pattern(mt9m111, ctrl->val); in mt9m111_s_ctrl()
755 static int mt9m111_suspend(struct mt9m111 *mt9m111) in mt9m111_suspend() argument
757 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_suspend()
760 v4l2_ctrl_s_ctrl(mt9m111->gain, mt9m111_get_global_gain(mt9m111)); in mt9m111_suspend()
773 static void mt9m111_restore_state(struct mt9m111 *mt9m111) in mt9m111_restore_state() argument
775 mt9m111_set_context(mt9m111, mt9m111->ctx); in mt9m111_restore_state()
776 mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code); in mt9m111_restore_state()
777 mt9m111_setup_geometry(mt9m111, &mt9m111->rect, in mt9m111_restore_state()
778 mt9m111->width, mt9m111->height, mt9m111->fmt->code); in mt9m111_restore_state()
779 v4l2_ctrl_handler_setup(&mt9m111->hdl); in mt9m111_restore_state()
782 static int mt9m111_resume(struct mt9m111 *mt9m111) in mt9m111_resume() argument
784 int ret = mt9m111_enable(mt9m111); in mt9m111_resume()
786 ret = mt9m111_reset(mt9m111); in mt9m111_resume()
788 mt9m111_restore_state(mt9m111); in mt9m111_resume()
793 static int mt9m111_init(struct mt9m111 *mt9m111) in mt9m111_init() argument
795 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_init()
798 ret = mt9m111_enable(mt9m111); in mt9m111_init()
800 ret = mt9m111_reset(mt9m111); in mt9m111_init()
802 ret = mt9m111_set_context(mt9m111, mt9m111->ctx); in mt9m111_init()
808 static int mt9m111_power_on(struct mt9m111 *mt9m111) in mt9m111_power_on() argument
810 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); in mt9m111_power_on()
813 ret = v4l2_clk_enable(mt9m111->clk); in mt9m111_power_on()
817 ret = mt9m111_resume(mt9m111); in mt9m111_power_on()
820 v4l2_clk_disable(mt9m111->clk); in mt9m111_power_on()
826 static void mt9m111_power_off(struct mt9m111 *mt9m111) in mt9m111_power_off() argument
828 mt9m111_suspend(mt9m111); in mt9m111_power_off()
829 v4l2_clk_disable(mt9m111->clk); in mt9m111_power_off()
834 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); in mt9m111_s_power() local
837 mutex_lock(&mt9m111->power_lock); in mt9m111_s_power()
843 if (mt9m111->power_count == !on) { in mt9m111_s_power()
845 ret = mt9m111_power_on(mt9m111); in mt9m111_s_power()
847 mt9m111_power_off(mt9m111); in mt9m111_s_power()
852 mt9m111->power_count += on ? 1 : -1; in mt9m111_s_power()
853 WARN_ON(mt9m111->power_count < 0); in mt9m111_s_power()
856 mutex_unlock(&mt9m111->power_lock); in mt9m111_s_power()
918 struct mt9m111 *mt9m111 = to_mt9m111(client); in mt9m111_video_probe() local
922 ret = mt9m111_s_power(&mt9m111->subdev, 1); in mt9m111_video_probe()
944 ret = mt9m111_init(mt9m111); in mt9m111_video_probe()
948 ret = v4l2_ctrl_handler_setup(&mt9m111->hdl); in mt9m111_video_probe()
951 mt9m111_s_power(&mt9m111->subdev, 0); in mt9m111_video_probe()
958 struct mt9m111 *mt9m111; in mt9m111_probe() local
968 mt9m111 = devm_kzalloc(&client->dev, sizeof(struct mt9m111), GFP_KERNEL); in mt9m111_probe()
969 if (!mt9m111) in mt9m111_probe()
972 mt9m111->clk = v4l2_clk_get(&client->dev, "mclk"); in mt9m111_probe()
973 if (IS_ERR(mt9m111->clk)) in mt9m111_probe()
974 return PTR_ERR(mt9m111->clk); in mt9m111_probe()
977 mt9m111->ctx = &context_b; in mt9m111_probe()
979 v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops); in mt9m111_probe()
980 mt9m111->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in mt9m111_probe()
982 v4l2_ctrl_handler_init(&mt9m111->hdl, 5); in mt9m111_probe()
983 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, in mt9m111_probe()
985 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, in mt9m111_probe()
987 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, in mt9m111_probe()
989 mt9m111->gain = v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, in mt9m111_probe()
991 v4l2_ctrl_new_std_menu(&mt9m111->hdl, in mt9m111_probe()
994 v4l2_ctrl_new_std_menu_items(&mt9m111->hdl, in mt9m111_probe()
998 mt9m111->subdev.ctrl_handler = &mt9m111->hdl; in mt9m111_probe()
999 if (mt9m111->hdl.error) { in mt9m111_probe()
1000 ret = mt9m111->hdl.error; in mt9m111_probe()
1005 mt9m111->pad.flags = MEDIA_PAD_FL_SOURCE; in mt9m111_probe()
1006 mt9m111->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; in mt9m111_probe()
1007 ret = media_entity_pads_init(&mt9m111->subdev.entity, 1, &mt9m111->pad); in mt9m111_probe()
1013 mt9m111->rect.left = MT9M111_MIN_DARK_COLS; in mt9m111_probe()
1014 mt9m111->rect.top = MT9M111_MIN_DARK_ROWS; in mt9m111_probe()
1015 mt9m111->rect.width = MT9M111_MAX_WIDTH; in mt9m111_probe()
1016 mt9m111->rect.height = MT9M111_MAX_HEIGHT; in mt9m111_probe()
1017 mt9m111->fmt = &mt9m111_colour_fmts[0]; in mt9m111_probe()
1018 mt9m111->lastpage = -1; in mt9m111_probe()
1019 mutex_init(&mt9m111->power_lock); in mt9m111_probe()
1025 mt9m111->subdev.dev = &client->dev; in mt9m111_probe()
1026 ret = v4l2_async_register_subdev(&mt9m111->subdev); in mt9m111_probe()
1034 media_entity_cleanup(&mt9m111->subdev.entity); in mt9m111_probe()
1037 v4l2_ctrl_handler_free(&mt9m111->hdl); in mt9m111_probe()
1039 v4l2_clk_put(mt9m111->clk); in mt9m111_probe()
1046 struct mt9m111 *mt9m111 = to_mt9m111(client); in mt9m111_remove() local
1048 v4l2_async_unregister_subdev(&mt9m111->subdev); in mt9m111_remove()
1049 media_entity_cleanup(&mt9m111->subdev.entity); in mt9m111_remove()
1050 v4l2_clk_put(mt9m111->clk); in mt9m111_remove()
1051 v4l2_ctrl_handler_free(&mt9m111->hdl); in mt9m111_remove()