mt9m001
static struct mt9m001 *to_mt9m001(const struct i2c_client *client)
return container_of(i2c_get_clientdata(client), struct mt9m001, subdev);
struct mt9m001 *mt9m001 = to_mt9m001(client);
{ MT9M001_COLUMN_START, mt9m001->rect.left },
{ MT9M001_ROW_START, mt9m001->rect.top },
{ MT9M001_WINDOW_WIDTH, mt9m001->rect.width - 1 },
mt9m001->rect.height + mt9m001->y_skip_top - 1 },
struct mt9m001 *mt9m001 = to_mt9m001(client);
mutex_lock(&mt9m001->mutex);
ret = __v4l2_ctrl_handler_setup(&mt9m001->hdl);
mutex_unlock(&mt9m001->mutex);
mutex_unlock(&mt9m001->mutex);
struct mt9m001 *mt9m001 = to_mt9m001(client);
if (mt9m001->fmts == mt9m001_colour_fmts)
mt9m001->total_h = rect.height + mt9m001->y_skip_top +
mt9m001->rect = rect;
struct mt9m001 *mt9m001 = to_mt9m001(client);
sel->r = mt9m001->rect;
struct mt9m001 *mt9m001 = to_mt9m001(client);
mf->width = mt9m001->rect.width;
mf->height = mt9m001->rect.height;
mf->code = mt9m001->fmt->code;
mf->colorspace = mt9m001->fmt->colorspace;
struct mt9m001 *mt9m001 = to_mt9m001(client);
.r.left = mt9m001->rect.left,
.r.top = mt9m001->rect.top,
mf->width = mt9m001->rect.width;
mf->height = mt9m001->rect.height;
mt9m001->fmt = fmt;
struct mt9m001 *mt9m001 = to_mt9m001(client);
&mf->height, MT9M001_MIN_HEIGHT + mt9m001->y_skip_top,
MT9M001_MAX_HEIGHT + mt9m001->y_skip_top, 0, 0);
if (mt9m001->fmts == mt9m001_colour_fmts)
fmt = mt9m001_find_datafmt(mf->code, mt9m001->fmts,
mt9m001->num_fmts);
fmt = mt9m001->fmt;
struct mt9m001 *mt9m001 = to_mt9m001(client);
ret = clk_prepare_enable(mt9m001->clk);
if (mt9m001->standby_gpio) {
gpiod_set_value_cansleep(mt9m001->standby_gpio, 0);
if (mt9m001->reset_gpio) {
gpiod_set_value_cansleep(mt9m001->reset_gpio, 1);
gpiod_set_value_cansleep(mt9m001->reset_gpio, 0);
struct mt9m001 *mt9m001 = to_mt9m001(client);
gpiod_set_value_cansleep(mt9m001->standby_gpio, 1);
clk_disable_unprepare(mt9m001->clk);
struct mt9m001 *mt9m001 = container_of(ctrl->handler,
struct mt9m001, hdl);
min = mt9m001->exposure->minimum;
max = mt9m001->exposure->maximum;
mt9m001->exposure->val =
(524 + (mt9m001->total_h - 1) * (max - min)) / 1048 + min;
struct mt9m001 *mt9m001 = container_of(ctrl->handler,
struct mt9m001, hdl);
struct v4l2_subdev *sd = &mt9m001->subdev;
struct v4l2_ctrl *exp = mt9m001->exposure;
mt9m001->total_h = mt9m001->rect.height +
mt9m001->y_skip_top + MT9M001_DEFAULT_VBLANK;
mt9m001->total_h);
struct mt9m001 *mt9m001 = to_mt9m001(client);
mt9m001->fmts = mt9m001_colour_fmts;
mt9m001->num_fmts = ARRAY_SIZE(mt9m001_colour_fmts);
mt9m001->fmts = mt9m001_monochrome_fmts;
mt9m001->num_fmts = ARRAY_SIZE(mt9m001_monochrome_fmts);
mt9m001->fmt = &mt9m001->fmts[0];
ret = v4l2_ctrl_handler_setup(&mt9m001->hdl);
struct mt9m001 *mt9m001 = to_mt9m001(client);
*lines = mt9m001->y_skip_top;
struct mt9m001 *mt9m001 = to_mt9m001(client);
try_fmt->code = mt9m001->fmts[0].code;
try_fmt->colorspace = mt9m001->fmts[0].colorspace;
struct mt9m001 *mt9m001 = to_mt9m001(client);
if (code->pad || code->index >= mt9m001->num_fmts)
code->code = mt9m001->fmts[code->index].code;
struct mt9m001 *mt9m001;
mt9m001 = devm_kzalloc(&client->dev, sizeof(*mt9m001), GFP_KERNEL);
if (!mt9m001)
mt9m001->clk = devm_v4l2_sensor_clk_get(&client->dev, NULL);
if (IS_ERR(mt9m001->clk))
return dev_err_probe(&client->dev, PTR_ERR(mt9m001->clk),
mt9m001->standby_gpio = devm_gpiod_get_optional(&client->dev, "standby",
if (IS_ERR(mt9m001->standby_gpio))
return PTR_ERR(mt9m001->standby_gpio);
mt9m001->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
if (IS_ERR(mt9m001->reset_gpio))
return PTR_ERR(mt9m001->reset_gpio);
v4l2_i2c_subdev_init(&mt9m001->subdev, client, &mt9m001_subdev_ops);
mt9m001->subdev.internal_ops = &mt9m001_internal_ops;
mt9m001->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
v4l2_ctrl_handler_init(&mt9m001->hdl, 4);
v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
mt9m001->exposure = v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
mt9m001->autoexposure = v4l2_ctrl_new_std_menu(&mt9m001->hdl,
mt9m001->subdev.ctrl_handler = &mt9m001->hdl;
if (mt9m001->hdl.error)
return mt9m001->hdl.error;
v4l2_ctrl_auto_cluster(2, &mt9m001->autoexposure,
mutex_init(&mt9m001->mutex);
mt9m001->hdl.lock = &mt9m001->mutex;
mt9m001->y_skip_top = 0;
mt9m001->rect.left = MT9M001_COLUMN_SKIP;
mt9m001->rect.top = MT9M001_ROW_SKIP;
mt9m001->rect.width = MT9M001_MAX_WIDTH;
mt9m001->rect.height = MT9M001_MAX_HEIGHT;
mt9m001->pad.flags = MEDIA_PAD_FL_SOURCE;
mt9m001->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
ret = media_entity_pads_init(&mt9m001->subdev.entity, 1, &mt9m001->pad);
ret = v4l2_async_register_subdev(&mt9m001->subdev);
media_entity_cleanup(&mt9m001->subdev.entity);
v4l2_ctrl_handler_free(&mt9m001->hdl);
mutex_destroy(&mt9m001->mutex);
struct mt9m001 *mt9m001 = to_mt9m001(client);
v4l2_async_unregister_subdev(&mt9m001->subdev);
media_entity_cleanup(&mt9m001->subdev.entity);
v4l2_ctrl_handler_free(&mt9m001->hdl);
mutex_destroy(&mt9m001->mutex);