H A D | mt9m111.c | 204 struct mt9m111 { struct 220 static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111, mt9m111_find_datafmt() argument 228 return mt9m111->fmt; mt9m111_find_datafmt() 231 static struct mt9m111 *to_mt9m111(const struct i2c_client *client) to_mt9m111() 233 return container_of(i2c_get_clientdata(client), struct mt9m111, subdev); to_mt9m111() 240 struct mt9m111 *mt9m111 = to_mt9m111(client); reg_page_map_set() local 243 if (page == mt9m111->lastpage) reg_page_map_set() 250 mt9m111->lastpage = page; reg_page_map_set() 311 static int mt9m111_set_context(struct mt9m111 *mt9m111, mt9m111_set_context() argument 314 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_context() 318 static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111, mt9m111_setup_rect_ctx() argument 322 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_setup_rect_ctx() 333 static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect, mt9m111_setup_geometry() argument 336 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_setup_geometry() 351 ret = mt9m111_setup_rect_ctx(mt9m111, &context_b, mt9m111_setup_geometry() 354 ret = mt9m111_setup_rect_ctx(mt9m111, &context_a, mt9m111_setup_geometry() 365 static int mt9m111_enable(struct mt9m111 *mt9m111) mt9m111_enable() argument 367 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_enable() 371 static int mt9m111_reset(struct mt9m111 *mt9m111) mt9m111_reset() argument 373 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_reset() 389 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); mt9m111_s_crop() local 396 if (mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 || mt9m111_s_crop() 397 mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) { mt9m111_s_crop() 411 width = min(mt9m111->width, rect.width); mt9m111_s_crop() 412 height = min(mt9m111->height, rect.height); mt9m111_s_crop() 414 ret = mt9m111_setup_geometry(mt9m111, &rect, width, height, mt9m111->fmt->code); mt9m111_s_crop() 416 mt9m111->rect = rect; mt9m111_s_crop() 417 mt9m111->width = width; mt9m111_s_crop() 418 mt9m111->height = height; mt9m111_s_crop() 426 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); mt9m111_g_crop() local 428 a->c = mt9m111->rect; mt9m111_g_crop() 455 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); mt9m111_get_fmt() local 460 mf->width = mt9m111->width; mt9m111_get_fmt() 461 mf->height = mt9m111->height; mt9m111_get_fmt() 462 mf->code = mt9m111->fmt->code; mt9m111_get_fmt() 463 mf->colorspace = mt9m111->fmt->colorspace; mt9m111_get_fmt() 469 static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111, mt9m111_set_pixfmt() argument 472 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_pixfmt() 545 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); mt9m111_set_fmt() local 547 struct v4l2_rect *rect = &mt9m111->rect; mt9m111_set_fmt() 554 fmt = mt9m111_find_datafmt(mt9m111, mf->code); mt9m111_set_fmt() 591 ret = mt9m111_setup_geometry(mt9m111, rect, mf->width, mf->height, mf->code); mt9m111_set_fmt() 593 ret = mt9m111_set_pixfmt(mt9m111, mf->code); mt9m111_set_fmt() 595 mt9m111->width = mf->width; mt9m111_set_fmt() 596 mt9m111->height = mf->height; mt9m111_set_fmt() 597 mt9m111->fmt = fmt; mt9m111_set_fmt() 638 static int mt9m111_set_flip(struct mt9m111 *mt9m111, int flip, int mask) mt9m111_set_flip() argument 640 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_flip() 644 ret = mt9m111_reg_set(client, mt9m111->ctx->read_mode, mask); mt9m111_set_flip() 646 ret = mt9m111_reg_clear(client, mt9m111->ctx->read_mode, mask); mt9m111_set_flip() 651 static int mt9m111_get_global_gain(struct mt9m111 *mt9m111) mt9m111_get_global_gain() argument 653 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_get_global_gain() 663 static int mt9m111_set_global_gain(struct mt9m111 *mt9m111, int gain) mt9m111_set_global_gain() argument 665 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_global_gain() 681 static int mt9m111_set_autoexposure(struct mt9m111 *mt9m111, int val) mt9m111_set_autoexposure() argument 683 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_autoexposure() 690 static int mt9m111_set_autowhitebalance(struct mt9m111 *mt9m111, int on) mt9m111_set_autowhitebalance() argument 692 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_set_autowhitebalance() 701 struct mt9m111 *mt9m111 = container_of(ctrl->handler, mt9m111_s_ctrl() local 702 struct mt9m111, hdl); mt9m111_s_ctrl() 706 return mt9m111_set_flip(mt9m111, ctrl->val, mt9m111_s_ctrl() 709 return mt9m111_set_flip(mt9m111, ctrl->val, mt9m111_s_ctrl() 712 return mt9m111_set_global_gain(mt9m111, ctrl->val); mt9m111_s_ctrl() 714 return mt9m111_set_autoexposure(mt9m111, ctrl->val); mt9m111_s_ctrl() 716 return mt9m111_set_autowhitebalance(mt9m111, ctrl->val); mt9m111_s_ctrl() 722 static int mt9m111_suspend(struct mt9m111 *mt9m111) mt9m111_suspend() argument 724 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_suspend() 727 v4l2_ctrl_s_ctrl(mt9m111->gain, mt9m111_get_global_gain(mt9m111)); mt9m111_suspend() 740 static void mt9m111_restore_state(struct mt9m111 *mt9m111) mt9m111_restore_state() argument 742 mt9m111_set_context(mt9m111, mt9m111->ctx); mt9m111_restore_state() 743 mt9m111_set_pixfmt(mt9m111, mt9m111->fmt->code); mt9m111_restore_state() 744 mt9m111_setup_geometry(mt9m111, &mt9m111->rect, mt9m111_restore_state() 745 mt9m111->width, mt9m111->height, mt9m111->fmt->code); mt9m111_restore_state() 746 v4l2_ctrl_handler_setup(&mt9m111->hdl); mt9m111_restore_state() 749 static int mt9m111_resume(struct mt9m111 *mt9m111) mt9m111_resume() argument 751 int ret = mt9m111_enable(mt9m111); mt9m111_resume() 753 ret = mt9m111_reset(mt9m111); mt9m111_resume() 755 mt9m111_restore_state(mt9m111); mt9m111_resume() 760 static int mt9m111_init(struct mt9m111 *mt9m111) mt9m111_init() argument 762 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_init() 765 ret = mt9m111_enable(mt9m111); mt9m111_init() 767 ret = mt9m111_reset(mt9m111); mt9m111_init() 769 ret = mt9m111_set_context(mt9m111, mt9m111->ctx); mt9m111_init() 771 dev_err(&client->dev, "mt9m111 init failed: %d\n", ret); mt9m111_init() 775 static int mt9m111_power_on(struct mt9m111 *mt9m111) mt9m111_power_on() argument 777 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_power_on() 781 ret = soc_camera_power_on(&client->dev, ssdd, mt9m111->clk); mt9m111_power_on() 785 ret = mt9m111_resume(mt9m111); mt9m111_power_on() 788 soc_camera_power_off(&client->dev, ssdd, mt9m111->clk); mt9m111_power_on() 794 static void mt9m111_power_off(struct mt9m111 *mt9m111) mt9m111_power_off() argument 796 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); mt9m111_power_off() 799 mt9m111_suspend(mt9m111); mt9m111_power_off() 800 soc_camera_power_off(&client->dev, ssdd, mt9m111->clk); mt9m111_power_off() 805 struct mt9m111 *mt9m111 = container_of(sd, struct mt9m111, subdev); mt9m111_s_power() local 808 mutex_lock(&mt9m111->power_lock); mt9m111_s_power() 814 if (mt9m111->power_count == !on) { mt9m111_s_power() 816 ret = mt9m111_power_on(mt9m111); mt9m111_s_power() 818 mt9m111_power_off(mt9m111); mt9m111_s_power() 823 mt9m111->power_count += on ? 1 : -1; mt9m111_s_power() 824 WARN_ON(mt9m111->power_count < 0); mt9m111_s_power() 827 mutex_unlock(&mt9m111->power_lock); mt9m111_s_power() 894 struct mt9m111 *mt9m111 = to_mt9m111(client); mt9m111_video_probe() local 898 ret = mt9m111_s_power(&mt9m111->subdev, 1); mt9m111_video_probe() 920 ret = mt9m111_init(mt9m111); mt9m111_video_probe() 924 ret = v4l2_ctrl_handler_setup(&mt9m111->hdl); mt9m111_video_probe() 927 mt9m111_s_power(&mt9m111->subdev, 0); mt9m111_video_probe() 934 struct mt9m111 *mt9m111; mt9m111_probe() local 946 dev_err(&client->dev, "mt9m111: driver needs platform data\n"); mt9m111_probe() 956 mt9m111 = devm_kzalloc(&client->dev, sizeof(struct mt9m111), GFP_KERNEL); mt9m111_probe() 957 if (!mt9m111) mt9m111_probe() 960 mt9m111->clk = v4l2_clk_get(&client->dev, "mclk"); mt9m111_probe() 961 if (IS_ERR(mt9m111->clk)) mt9m111_probe() 965 mt9m111->ctx = &context_b; mt9m111_probe() 967 v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops); mt9m111_probe() 968 v4l2_ctrl_handler_init(&mt9m111->hdl, 5); mt9m111_probe() 969 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, mt9m111_probe() 971 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, mt9m111_probe() 973 v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, mt9m111_probe() 975 mt9m111->gain = v4l2_ctrl_new_std(&mt9m111->hdl, &mt9m111_ctrl_ops, mt9m111_probe() 977 v4l2_ctrl_new_std_menu(&mt9m111->hdl, mt9m111_probe() 980 mt9m111->subdev.ctrl_handler = &mt9m111->hdl; mt9m111_probe() 981 if (mt9m111->hdl.error) { mt9m111_probe() 982 ret = mt9m111->hdl.error; mt9m111_probe() 987 mt9m111->rect.left = MT9M111_MIN_DARK_COLS; mt9m111_probe() 988 mt9m111->rect.top = MT9M111_MIN_DARK_ROWS; mt9m111_probe() 989 mt9m111->rect.width = MT9M111_MAX_WIDTH; mt9m111_probe() 990 mt9m111->rect.height = MT9M111_MAX_HEIGHT; mt9m111_probe() 991 mt9m111->fmt = &mt9m111_colour_fmts[0]; mt9m111_probe() 992 mt9m111->lastpage = -1; mt9m111_probe() 993 mutex_init(&mt9m111->power_lock); mt9m111_probe() 1003 mt9m111->subdev.dev = &client->dev; mt9m111_probe() 1004 ret = v4l2_async_register_subdev(&mt9m111->subdev); mt9m111_probe() 1011 v4l2_ctrl_handler_free(&mt9m111->hdl); mt9m111_probe() 1013 v4l2_clk_put(mt9m111->clk); mt9m111_probe() 1020 struct mt9m111 *mt9m111 = to_mt9m111(client); mt9m111_remove() local 1022 v4l2_async_unregister_subdev(&mt9m111->subdev); mt9m111_remove() 1023 v4l2_clk_put(mt9m111->clk); mt9m111_remove() 1024 v4l2_ctrl_handler_free(&mt9m111->hdl); mt9m111_remove() 1029 { .compatible = "micron,mt9m111", }, 1035 { "mt9m111", 0 }, 1042 .name = "mt9m111",
|