drivers/media/i2c/ov5670.c
1892
#define to_ov5670(_sd) container_of(_sd, struct ov5670, sd)
drivers/media/i2c/ov5670.c
1895
static int ov5670_read_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
drivers/media/i2c/ov5670.c
1898
struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
drivers/media/i2c/ov5670.c
1931
static int ov5670_write_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
drivers/media/i2c/ov5670.c
1934
struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
drivers/media/i2c/ov5670.c
1962
static int ov5670_write_regs(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
1969
ret = ov5670_write_reg(ov5670, regs[i].address, 1, regs[i].val);
drivers/media/i2c/ov5670.c
1972
ov5670->dev,
drivers/media/i2c/ov5670.c
1983
static int ov5670_write_reg_list(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
1986
return ov5670_write_regs(ov5670, r_list->regs, r_list->num_of_regs);
drivers/media/i2c/ov5670.c
1989
static int ov5670_update_digital_gain(struct ov5670 *ov5670, u32 d_gain)
drivers/media/i2c/ov5670.c
1993
ret = ov5670_write_reg(ov5670, OV5670_REG_R_DGTL_GAIN,
drivers/media/i2c/ov5670.c
1998
ret = ov5670_write_reg(ov5670, OV5670_REG_G_DGTL_GAIN,
drivers/media/i2c/ov5670.c
2003
return ov5670_write_reg(ov5670, OV5670_REG_B_DGTL_GAIN,
drivers/media/i2c/ov5670.c
2007
static int ov5670_enable_test_pattern(struct ov5670 *ov5670, u32 pattern)
drivers/media/i2c/ov5670.c
2013
ret = ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN_CTRL,
drivers/media/i2c/ov5670.c
2018
ret = ov5670_read_reg(ov5670, OV5670_REG_TEST_PATTERN,
drivers/media/i2c/ov5670.c
2028
return ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN,
drivers/media/i2c/ov5670.c
2035
struct ov5670 *ov5670 = container_of(ctrl->handler,
drivers/media/i2c/ov5670.c
2036
struct ov5670, ctrl_handler);
drivers/media/i2c/ov5670.c
2044
max = ov5670->cur_mode->height + ctrl->val - 8;
drivers/media/i2c/ov5670.c
2045
__v4l2_ctrl_modify_range(ov5670->exposure,
drivers/media/i2c/ov5670.c
2046
ov5670->exposure->minimum, max,
drivers/media/i2c/ov5670.c
2047
ov5670->exposure->step, max);
drivers/media/i2c/ov5670.c
2052
if (!pm_runtime_get_if_in_use(ov5670->dev))
drivers/media/i2c/ov5670.c
2057
ret = ov5670_write_reg(ov5670, OV5670_REG_ANALOG_GAIN,
drivers/media/i2c/ov5670.c
2061
ret = ov5670_update_digital_gain(ov5670, ctrl->val);
drivers/media/i2c/ov5670.c
2065
ret = ov5670_write_reg(ov5670, OV5670_REG_EXPOSURE,
drivers/media/i2c/ov5670.c
2070
ret = ov5670_write_reg(ov5670, OV5670_REG_VTS,
drivers/media/i2c/ov5670.c
2072
ov5670->cur_mode->height + ctrl->val);
drivers/media/i2c/ov5670.c
2075
ret = ov5670_enable_test_pattern(ov5670, ctrl->val);
drivers/media/i2c/ov5670.c
2084
dev_info(ov5670->dev, "%s Unhandled id:0x%x, val:0x%x\n",
drivers/media/i2c/ov5670.c
2089
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2099
static int ov5670_init_controls(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2102
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2113
ctrl_hdlr = &ov5670->ctrl_handler;
drivers/media/i2c/ov5670.c
2118
ctrl_hdlr->lock = &ov5670->mutex;
drivers/media/i2c/ov5670.c
2119
ov5670->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov5670.c
2123
if (ov5670->link_freq)
drivers/media/i2c/ov5670.c
2124
ov5670->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5670.c
2130
ov5670->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2137
vblank_max = OV5670_VTS_MAX - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2138
vblank_def = ov5670->cur_mode->vts_def - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2139
vblank_min = ov5670->cur_mode->vts_min - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2140
ov5670->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2144
ov5670->hblank = v4l2_ctrl_new_std(
drivers/media/i2c/ov5670.c
2146
OV5670_FIXED_PPL - ov5670->cur_mode->width,
drivers/media/i2c/ov5670.c
2147
OV5670_FIXED_PPL - ov5670->cur_mode->width, 1,
drivers/media/i2c/ov5670.c
2148
OV5670_FIXED_PPL - ov5670->cur_mode->width);
drivers/media/i2c/ov5670.c
2149
if (ov5670->hblank)
drivers/media/i2c/ov5670.c
2150
ov5670->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5670.c
2163
exposure_max = ov5670->cur_mode->vts_def - 8;
drivers/media/i2c/ov5670.c
2164
ov5670->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2180
ret = v4l2_fwnode_device_parse(ov5670->dev, &props);
drivers/media/i2c/ov5670.c
2189
ov5670->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov5670.c
2261
static int ov5670_do_get_pad_format(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
2269
ov5670_update_pad_format(ov5670->cur_mode, fmt);
drivers/media/i2c/ov5670.c
2278
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2281
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2282
ret = ov5670_do_get_pad_format(ov5670, sd_state, fmt);
drivers/media/i2c/ov5670.c
2283
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2292
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2294
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2302
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2314
ov5670->cur_mode = mode;
drivers/media/i2c/ov5670.c
2315
__v4l2_ctrl_s_ctrl(ov5670->link_freq, mode->link_freq_index);
drivers/media/i2c/ov5670.c
2322
ov5670->pixel_rate,
drivers/media/i2c/ov5670.c
2325
vblank_def = ov5670->cur_mode->vts_def -
drivers/media/i2c/ov5670.c
2326
ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2328
ov5670->vblank,
drivers/media/i2c/ov5670.c
2329
ov5670->cur_mode->vts_min - ov5670->cur_mode->height,
drivers/media/i2c/ov5670.c
2330
OV5670_VTS_MAX - ov5670->cur_mode->height, 1,
drivers/media/i2c/ov5670.c
2332
__v4l2_ctrl_s_ctrl(ov5670->vblank, vblank_def);
drivers/media/i2c/ov5670.c
2333
h_blank = OV5670_FIXED_PPL - ov5670->cur_mode->width;
drivers/media/i2c/ov5670.c
2334
__v4l2_ctrl_modify_range(ov5670->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov5670.c
2338
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2351
static int ov5670_identify_module(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2356
if (ov5670->identified)
drivers/media/i2c/ov5670.c
2359
ret = ov5670_read_reg(ov5670, OV5670_REG_CHIP_ID,
drivers/media/i2c/ov5670.c
2365
dev_err(ov5670->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/ov5670.c
2370
ov5670->identified = true;
drivers/media/i2c/ov5670.c
2375
static int ov5670_mipi_configure(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2378
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2381
return ov5670_write_reg(ov5670, OV5670_MIPI_SC_CTRL0_REG,
drivers/media/i2c/ov5670.c
2389
static int ov5670_start_streaming(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2395
ret = ov5670_identify_module(ov5670);
drivers/media/i2c/ov5670.c
2400
ret = ov5670_write_reg(ov5670, OV5670_REG_SOFTWARE_RST,
drivers/media/i2c/ov5670.c
2403
dev_err(ov5670->dev, "%s failed to set powerup registers\n",
drivers/media/i2c/ov5670.c
2409
link_freq_index = ov5670->cur_mode->link_freq_index;
drivers/media/i2c/ov5670.c
2411
ret = ov5670_write_reg_list(ov5670, reg_list);
drivers/media/i2c/ov5670.c
2413
dev_err(ov5670->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/ov5670.c
2418
reg_list = &ov5670->cur_mode->reg_list;
drivers/media/i2c/ov5670.c
2419
ret = ov5670_write_reg_list(ov5670, reg_list);
drivers/media/i2c/ov5670.c
2421
dev_err(ov5670->dev, "%s failed to set mode\n", __func__);
drivers/media/i2c/ov5670.c
2425
ret = ov5670_mipi_configure(ov5670);
drivers/media/i2c/ov5670.c
2427
dev_err(ov5670->dev, "%s failed to configure MIPI\n", __func__);
drivers/media/i2c/ov5670.c
2431
ret = __v4l2_ctrl_handler_setup(ov5670->sd.ctrl_handler);
drivers/media/i2c/ov5670.c
2436
ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
drivers/media/i2c/ov5670.c
2439
dev_err(ov5670->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/ov5670.c
2446
static int ov5670_stop_streaming(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2450
ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
drivers/media/i2c/ov5670.c
2453
dev_err(ov5670->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/ov5670.c
2463
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2466
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2469
ret = pm_runtime_resume_and_get(ov5670->dev);
drivers/media/i2c/ov5670.c
2473
ret = ov5670_start_streaming(ov5670);
drivers/media/i2c/ov5670.c
2477
ret = ov5670_stop_streaming(ov5670);
drivers/media/i2c/ov5670.c
2478
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2483
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2486
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2495
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2499
ret = clk_prepare_enable(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2503
ret = regulator_bulk_enable(OV5670_NUM_SUPPLIES, ov5670->supplies);
drivers/media/i2c/ov5670.c
2505
clk_disable_unprepare(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2509
gpiod_set_value_cansleep(ov5670->pwdn_gpio, 0);
drivers/media/i2c/ov5670.c
2510
gpiod_set_value_cansleep(ov5670->reset_gpio, 0);
drivers/media/i2c/ov5670.c
2524
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2526
gpiod_set_value_cansleep(ov5670->reset_gpio, 1);
drivers/media/i2c/ov5670.c
2527
gpiod_set_value_cansleep(ov5670->pwdn_gpio, 1);
drivers/media/i2c/ov5670.c
2528
regulator_bulk_disable(OV5670_NUM_SUPPLIES, ov5670->supplies);
drivers/media/i2c/ov5670.c
2529
clk_disable_unprepare(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2541
__ov5670_get_pad_crop(struct ov5670 *sensor, struct v4l2_subdev_state *state,
drivers/media/i2c/ov5670.c
2560
struct ov5670 *sensor = to_ov5670(subdev);
drivers/media/i2c/ov5670.c
2618
static int ov5670_regulators_probe(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2623
ov5670->supplies[i].supply = ov5670_supply_names[i];
drivers/media/i2c/ov5670.c
2625
return devm_regulator_bulk_get(ov5670->dev, OV5670_NUM_SUPPLIES,
drivers/media/i2c/ov5670.c
2626
ov5670->supplies);
drivers/media/i2c/ov5670.c
2629
static int ov5670_gpio_probe(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2631
ov5670->pwdn_gpio = devm_gpiod_get_optional(ov5670->dev, "powerdown",
drivers/media/i2c/ov5670.c
2633
if (IS_ERR(ov5670->pwdn_gpio))
drivers/media/i2c/ov5670.c
2634
return PTR_ERR(ov5670->pwdn_gpio);
drivers/media/i2c/ov5670.c
2636
ov5670->reset_gpio = devm_gpiod_get_optional(ov5670->dev, "reset",
drivers/media/i2c/ov5670.c
2638
if (IS_ERR(ov5670->reset_gpio))
drivers/media/i2c/ov5670.c
2639
return PTR_ERR(ov5670->reset_gpio);
drivers/media/i2c/ov5670.c
2647
struct ov5670 *ov5670;
drivers/media/i2c/ov5670.c
2652
ov5670 = devm_kzalloc(&client->dev, sizeof(*ov5670), GFP_KERNEL);
drivers/media/i2c/ov5670.c
2653
if (!ov5670)
drivers/media/i2c/ov5670.c
2656
ov5670->dev = &client->dev;
drivers/media/i2c/ov5670.c
2658
ov5670->xvclk = devm_v4l2_sensor_clk_get(ov5670->dev, NULL);
drivers/media/i2c/ov5670.c
2659
if (IS_ERR(ov5670->xvclk))
drivers/media/i2c/ov5670.c
2660
return dev_err_probe(ov5670->dev, PTR_ERR(ov5670->xvclk),
drivers/media/i2c/ov5670.c
2663
input_clk = clk_get_rate(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2665
dev_err(ov5670->dev,
drivers/media/i2c/ov5670.c
2671
v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
drivers/media/i2c/ov5670.c
2672
ov5670->sd.internal_ops = &ov5670_internal_ops;
drivers/media/i2c/ov5670.c
2674
ret = ov5670_regulators_probe(ov5670);
drivers/media/i2c/ov5670.c
2676
return dev_err_probe(ov5670->dev, ret, "Regulators probe failed\n");
drivers/media/i2c/ov5670.c
2678
ret = ov5670_gpio_probe(ov5670);
drivers/media/i2c/ov5670.c
2680
return dev_err_probe(ov5670->dev, ret, "GPIO probe failed\n");
drivers/media/i2c/ov5670.c
2687
handle = fwnode_graph_get_next_endpoint(dev_fwnode(ov5670->dev), NULL);
drivers/media/i2c/ov5670.c
2689
return dev_err_probe(ov5670->dev, -EPROBE_DEFER,
drivers/media/i2c/ov5670.c
2692
ov5670->endpoint.bus_type = V4L2_MBUS_CSI2_DPHY;
drivers/media/i2c/ov5670.c
2693
ov5670->endpoint.bus.mipi_csi2.num_data_lanes = 2;
drivers/media/i2c/ov5670.c
2695
ret = v4l2_fwnode_endpoint_alloc_parse(handle, &ov5670->endpoint);
drivers/media/i2c/ov5670.c
2698
return dev_err_probe(ov5670->dev, ret, "Endpoint parse failed\n");
drivers/media/i2c/ov5670.c
2700
full_power = acpi_dev_state_d0(ov5670->dev);
drivers/media/i2c/ov5670.c
2702
ret = ov5670_runtime_resume(ov5670->dev);
drivers/media/i2c/ov5670.c
2704
dev_err_probe(ov5670->dev, ret, "Power up failed\n");
drivers/media/i2c/ov5670.c
2709
ret = ov5670_identify_module(ov5670);
drivers/media/i2c/ov5670.c
2711
dev_err_probe(ov5670->dev, ret, "ov5670_identify_module() error\n");
drivers/media/i2c/ov5670.c
2716
mutex_init(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2719
ov5670->cur_mode = &supported_modes[0];
drivers/media/i2c/ov5670.c
2721
ret = ov5670_init_controls(ov5670);
drivers/media/i2c/ov5670.c
2723
dev_err_probe(ov5670->dev, ret, "ov5670_init_controls() error\n");
drivers/media/i2c/ov5670.c
2727
ov5670->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/ov5670.c
2729
ov5670->sd.entity.ops = &ov5670_subdev_entity_ops;
drivers/media/i2c/ov5670.c
2730
ov5670->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov5670.c
2733
ov5670->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov5670.c
2734
ret = media_entity_pads_init(&ov5670->sd.entity, 1, &ov5670->pad);
drivers/media/i2c/ov5670.c
2736
dev_err_probe(ov5670->dev, ret, "media_entity_pads_init() error\n");
drivers/media/i2c/ov5670.c
2742
pm_runtime_set_active(ov5670->dev);
drivers/media/i2c/ov5670.c
2743
pm_runtime_enable(ov5670->dev);
drivers/media/i2c/ov5670.c
2746
ret = v4l2_async_register_subdev_sensor(&ov5670->sd);
drivers/media/i2c/ov5670.c
2748
dev_err_probe(ov5670->dev, ret, "v4l2_async_register_subdev() error\n");
drivers/media/i2c/ov5670.c
2752
pm_runtime_idle(ov5670->dev);
drivers/media/i2c/ov5670.c
2757
pm_runtime_disable(ov5670->dev);
drivers/media/i2c/ov5670.c
2759
media_entity_cleanup(&ov5670->sd.entity);
drivers/media/i2c/ov5670.c
2762
v4l2_ctrl_handler_free(ov5670->sd.ctrl_handler);
drivers/media/i2c/ov5670.c
2765
mutex_destroy(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2769
ov5670_runtime_suspend(ov5670->dev);
drivers/media/i2c/ov5670.c
2772
v4l2_fwnode_endpoint_free(&ov5670->endpoint);
drivers/media/i2c/ov5670.c
2780
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2785
mutex_destroy(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2787
pm_runtime_disable(ov5670->dev);
drivers/media/i2c/ov5670.c
2788
ov5670_runtime_suspend(ov5670->dev);
drivers/media/i2c/ov5670.c
2790
v4l2_fwnode_endpoint_free(&ov5670->endpoint);