Symbol: ov5670
drivers/media/i2c/ov5670.c
1891
#define to_ov5670(_sd) container_of(_sd, struct ov5670, sd)
drivers/media/i2c/ov5670.c
1894
static int ov5670_read_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
drivers/media/i2c/ov5670.c
1897
struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
drivers/media/i2c/ov5670.c
1930
static int ov5670_write_reg(struct ov5670 *ov5670, u16 reg, unsigned int len,
drivers/media/i2c/ov5670.c
1933
struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd);
drivers/media/i2c/ov5670.c
1961
static int ov5670_write_regs(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
1968
ret = ov5670_write_reg(ov5670, regs[i].address, 1, regs[i].val);
drivers/media/i2c/ov5670.c
1971
ov5670->dev,
drivers/media/i2c/ov5670.c
1982
static int ov5670_write_reg_list(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
1985
return ov5670_write_regs(ov5670, r_list->regs, r_list->num_of_regs);
drivers/media/i2c/ov5670.c
1988
static int ov5670_update_digital_gain(struct ov5670 *ov5670, u32 d_gain)
drivers/media/i2c/ov5670.c
1992
ret = ov5670_write_reg(ov5670, OV5670_REG_R_DGTL_GAIN,
drivers/media/i2c/ov5670.c
1997
ret = ov5670_write_reg(ov5670, OV5670_REG_G_DGTL_GAIN,
drivers/media/i2c/ov5670.c
2002
return ov5670_write_reg(ov5670, OV5670_REG_B_DGTL_GAIN,
drivers/media/i2c/ov5670.c
2006
static int ov5670_enable_test_pattern(struct ov5670 *ov5670, u32 pattern)
drivers/media/i2c/ov5670.c
2012
ret = ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN_CTRL,
drivers/media/i2c/ov5670.c
2017
ret = ov5670_read_reg(ov5670, OV5670_REG_TEST_PATTERN,
drivers/media/i2c/ov5670.c
2027
return ov5670_write_reg(ov5670, OV5670_REG_TEST_PATTERN,
drivers/media/i2c/ov5670.c
2034
struct ov5670 *ov5670 = container_of(ctrl->handler,
drivers/media/i2c/ov5670.c
2035
struct ov5670, ctrl_handler);
drivers/media/i2c/ov5670.c
2043
max = ov5670->cur_mode->height + ctrl->val - 8;
drivers/media/i2c/ov5670.c
2044
__v4l2_ctrl_modify_range(ov5670->exposure,
drivers/media/i2c/ov5670.c
2045
ov5670->exposure->minimum, max,
drivers/media/i2c/ov5670.c
2046
ov5670->exposure->step, max);
drivers/media/i2c/ov5670.c
2051
if (!pm_runtime_get_if_in_use(ov5670->dev))
drivers/media/i2c/ov5670.c
2056
ret = ov5670_write_reg(ov5670, OV5670_REG_ANALOG_GAIN,
drivers/media/i2c/ov5670.c
2060
ret = ov5670_update_digital_gain(ov5670, ctrl->val);
drivers/media/i2c/ov5670.c
2064
ret = ov5670_write_reg(ov5670, OV5670_REG_EXPOSURE,
drivers/media/i2c/ov5670.c
2069
ret = ov5670_write_reg(ov5670, OV5670_REG_VTS,
drivers/media/i2c/ov5670.c
2071
ov5670->cur_mode->height + ctrl->val);
drivers/media/i2c/ov5670.c
2074
ret = ov5670_enable_test_pattern(ov5670, ctrl->val);
drivers/media/i2c/ov5670.c
2083
dev_info(ov5670->dev, "%s Unhandled id:0x%x, val:0x%x\n",
drivers/media/i2c/ov5670.c
2088
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2098
static int ov5670_init_controls(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2101
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2112
ctrl_hdlr = &ov5670->ctrl_handler;
drivers/media/i2c/ov5670.c
2117
ctrl_hdlr->lock = &ov5670->mutex;
drivers/media/i2c/ov5670.c
2118
ov5670->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
drivers/media/i2c/ov5670.c
2122
if (ov5670->link_freq)
drivers/media/i2c/ov5670.c
2123
ov5670->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5670.c
2129
ov5670->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2136
vblank_max = OV5670_VTS_MAX - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2137
vblank_def = ov5670->cur_mode->vts_def - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2138
vblank_min = ov5670->cur_mode->vts_min - ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2139
ov5670->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2143
ov5670->hblank = v4l2_ctrl_new_std(
drivers/media/i2c/ov5670.c
2145
OV5670_FIXED_PPL - ov5670->cur_mode->width,
drivers/media/i2c/ov5670.c
2146
OV5670_FIXED_PPL - ov5670->cur_mode->width, 1,
drivers/media/i2c/ov5670.c
2147
OV5670_FIXED_PPL - ov5670->cur_mode->width);
drivers/media/i2c/ov5670.c
2148
if (ov5670->hblank)
drivers/media/i2c/ov5670.c
2149
ov5670->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
drivers/media/i2c/ov5670.c
2162
exposure_max = ov5670->cur_mode->vts_def - 8;
drivers/media/i2c/ov5670.c
2163
ov5670->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops,
drivers/media/i2c/ov5670.c
2179
ret = v4l2_fwnode_device_parse(ov5670->dev, &props);
drivers/media/i2c/ov5670.c
2188
ov5670->sd.ctrl_handler = ctrl_hdlr;
drivers/media/i2c/ov5670.c
2260
static int ov5670_do_get_pad_format(struct ov5670 *ov5670,
drivers/media/i2c/ov5670.c
2268
ov5670_update_pad_format(ov5670->cur_mode, fmt);
drivers/media/i2c/ov5670.c
2277
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2280
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2281
ret = ov5670_do_get_pad_format(ov5670, sd_state, fmt);
drivers/media/i2c/ov5670.c
2282
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2291
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2293
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2301
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2313
ov5670->cur_mode = mode;
drivers/media/i2c/ov5670.c
2314
__v4l2_ctrl_s_ctrl(ov5670->link_freq, mode->link_freq_index);
drivers/media/i2c/ov5670.c
2321
ov5670->pixel_rate,
drivers/media/i2c/ov5670.c
2324
vblank_def = ov5670->cur_mode->vts_def -
drivers/media/i2c/ov5670.c
2325
ov5670->cur_mode->height;
drivers/media/i2c/ov5670.c
2327
ov5670->vblank,
drivers/media/i2c/ov5670.c
2328
ov5670->cur_mode->vts_min - ov5670->cur_mode->height,
drivers/media/i2c/ov5670.c
2329
OV5670_VTS_MAX - ov5670->cur_mode->height, 1,
drivers/media/i2c/ov5670.c
2331
__v4l2_ctrl_s_ctrl(ov5670->vblank, vblank_def);
drivers/media/i2c/ov5670.c
2332
h_blank = OV5670_FIXED_PPL - ov5670->cur_mode->width;
drivers/media/i2c/ov5670.c
2333
__v4l2_ctrl_modify_range(ov5670->hblank, h_blank, h_blank, 1,
drivers/media/i2c/ov5670.c
2337
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2350
static int ov5670_identify_module(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2355
if (ov5670->identified)
drivers/media/i2c/ov5670.c
2358
ret = ov5670_read_reg(ov5670, OV5670_REG_CHIP_ID,
drivers/media/i2c/ov5670.c
2364
dev_err(ov5670->dev, "chip id mismatch: %x!=%x\n",
drivers/media/i2c/ov5670.c
2369
ov5670->identified = true;
drivers/media/i2c/ov5670.c
2374
static int ov5670_mipi_configure(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2377
&ov5670->endpoint.bus.mipi_csi2;
drivers/media/i2c/ov5670.c
2380
return ov5670_write_reg(ov5670, OV5670_MIPI_SC_CTRL0_REG,
drivers/media/i2c/ov5670.c
2388
static int ov5670_start_streaming(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2394
ret = ov5670_identify_module(ov5670);
drivers/media/i2c/ov5670.c
2399
ret = ov5670_write_reg(ov5670, OV5670_REG_SOFTWARE_RST,
drivers/media/i2c/ov5670.c
2402
dev_err(ov5670->dev, "%s failed to set powerup registers\n",
drivers/media/i2c/ov5670.c
2408
link_freq_index = ov5670->cur_mode->link_freq_index;
drivers/media/i2c/ov5670.c
2410
ret = ov5670_write_reg_list(ov5670, reg_list);
drivers/media/i2c/ov5670.c
2412
dev_err(ov5670->dev, "%s failed to set plls\n", __func__);
drivers/media/i2c/ov5670.c
2417
reg_list = &ov5670->cur_mode->reg_list;
drivers/media/i2c/ov5670.c
2418
ret = ov5670_write_reg_list(ov5670, reg_list);
drivers/media/i2c/ov5670.c
2420
dev_err(ov5670->dev, "%s failed to set mode\n", __func__);
drivers/media/i2c/ov5670.c
2424
ret = ov5670_mipi_configure(ov5670);
drivers/media/i2c/ov5670.c
2426
dev_err(ov5670->dev, "%s failed to configure MIPI\n", __func__);
drivers/media/i2c/ov5670.c
2430
ret = __v4l2_ctrl_handler_setup(ov5670->sd.ctrl_handler);
drivers/media/i2c/ov5670.c
2435
ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
drivers/media/i2c/ov5670.c
2438
dev_err(ov5670->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/ov5670.c
2445
static int ov5670_stop_streaming(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2449
ret = ov5670_write_reg(ov5670, OV5670_REG_MODE_SELECT,
drivers/media/i2c/ov5670.c
2452
dev_err(ov5670->dev, "%s failed to set stream\n", __func__);
drivers/media/i2c/ov5670.c
2462
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2465
mutex_lock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2468
ret = pm_runtime_resume_and_get(ov5670->dev);
drivers/media/i2c/ov5670.c
2472
ret = ov5670_start_streaming(ov5670);
drivers/media/i2c/ov5670.c
2476
ret = ov5670_stop_streaming(ov5670);
drivers/media/i2c/ov5670.c
2477
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2482
pm_runtime_put(ov5670->dev);
drivers/media/i2c/ov5670.c
2485
mutex_unlock(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2494
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2498
ret = clk_prepare_enable(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2502
ret = regulator_bulk_enable(OV5670_NUM_SUPPLIES, ov5670->supplies);
drivers/media/i2c/ov5670.c
2504
clk_disable_unprepare(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2508
gpiod_set_value_cansleep(ov5670->pwdn_gpio, 0);
drivers/media/i2c/ov5670.c
2509
gpiod_set_value_cansleep(ov5670->reset_gpio, 0);
drivers/media/i2c/ov5670.c
2523
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2525
gpiod_set_value_cansleep(ov5670->reset_gpio, 1);
drivers/media/i2c/ov5670.c
2526
gpiod_set_value_cansleep(ov5670->pwdn_gpio, 1);
drivers/media/i2c/ov5670.c
2527
regulator_bulk_disable(OV5670_NUM_SUPPLIES, ov5670->supplies);
drivers/media/i2c/ov5670.c
2528
clk_disable_unprepare(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2540
__ov5670_get_pad_crop(struct ov5670 *sensor, struct v4l2_subdev_state *state,
drivers/media/i2c/ov5670.c
2559
struct ov5670 *sensor = to_ov5670(subdev);
drivers/media/i2c/ov5670.c
2617
static int ov5670_regulators_probe(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2622
ov5670->supplies[i].supply = ov5670_supply_names[i];
drivers/media/i2c/ov5670.c
2624
return devm_regulator_bulk_get(ov5670->dev, OV5670_NUM_SUPPLIES,
drivers/media/i2c/ov5670.c
2625
ov5670->supplies);
drivers/media/i2c/ov5670.c
2628
static int ov5670_gpio_probe(struct ov5670 *ov5670)
drivers/media/i2c/ov5670.c
2630
ov5670->pwdn_gpio = devm_gpiod_get_optional(ov5670->dev, "powerdown",
drivers/media/i2c/ov5670.c
2632
if (IS_ERR(ov5670->pwdn_gpio))
drivers/media/i2c/ov5670.c
2633
return PTR_ERR(ov5670->pwdn_gpio);
drivers/media/i2c/ov5670.c
2635
ov5670->reset_gpio = devm_gpiod_get_optional(ov5670->dev, "reset",
drivers/media/i2c/ov5670.c
2637
if (IS_ERR(ov5670->reset_gpio))
drivers/media/i2c/ov5670.c
2638
return PTR_ERR(ov5670->reset_gpio);
drivers/media/i2c/ov5670.c
2646
struct ov5670 *ov5670;
drivers/media/i2c/ov5670.c
2651
ov5670 = devm_kzalloc(&client->dev, sizeof(*ov5670), GFP_KERNEL);
drivers/media/i2c/ov5670.c
2652
if (!ov5670)
drivers/media/i2c/ov5670.c
2655
ov5670->dev = &client->dev;
drivers/media/i2c/ov5670.c
2657
ov5670->xvclk = devm_v4l2_sensor_clk_get(ov5670->dev, NULL);
drivers/media/i2c/ov5670.c
2658
if (IS_ERR(ov5670->xvclk))
drivers/media/i2c/ov5670.c
2659
return dev_err_probe(ov5670->dev, PTR_ERR(ov5670->xvclk),
drivers/media/i2c/ov5670.c
2662
input_clk = clk_get_rate(ov5670->xvclk);
drivers/media/i2c/ov5670.c
2664
dev_err(ov5670->dev,
drivers/media/i2c/ov5670.c
2670
v4l2_i2c_subdev_init(&ov5670->sd, client, &ov5670_subdev_ops);
drivers/media/i2c/ov5670.c
2671
ov5670->sd.internal_ops = &ov5670_internal_ops;
drivers/media/i2c/ov5670.c
2673
ret = ov5670_regulators_probe(ov5670);
drivers/media/i2c/ov5670.c
2675
return dev_err_probe(ov5670->dev, ret, "Regulators probe failed\n");
drivers/media/i2c/ov5670.c
2677
ret = ov5670_gpio_probe(ov5670);
drivers/media/i2c/ov5670.c
2679
return dev_err_probe(ov5670->dev, ret, "GPIO probe failed\n");
drivers/media/i2c/ov5670.c
2686
handle = fwnode_graph_get_next_endpoint(dev_fwnode(ov5670->dev), NULL);
drivers/media/i2c/ov5670.c
2688
return dev_err_probe(ov5670->dev, -EPROBE_DEFER,
drivers/media/i2c/ov5670.c
2691
ov5670->endpoint.bus_type = V4L2_MBUS_CSI2_DPHY;
drivers/media/i2c/ov5670.c
2692
ov5670->endpoint.bus.mipi_csi2.num_data_lanes = 2;
drivers/media/i2c/ov5670.c
2694
ret = v4l2_fwnode_endpoint_alloc_parse(handle, &ov5670->endpoint);
drivers/media/i2c/ov5670.c
2697
return dev_err_probe(ov5670->dev, ret, "Endpoint parse failed\n");
drivers/media/i2c/ov5670.c
2699
full_power = acpi_dev_state_d0(ov5670->dev);
drivers/media/i2c/ov5670.c
2701
ret = ov5670_runtime_resume(ov5670->dev);
drivers/media/i2c/ov5670.c
2703
dev_err_probe(ov5670->dev, ret, "Power up failed\n");
drivers/media/i2c/ov5670.c
2708
ret = ov5670_identify_module(ov5670);
drivers/media/i2c/ov5670.c
2710
dev_err_probe(ov5670->dev, ret, "ov5670_identify_module() error\n");
drivers/media/i2c/ov5670.c
2715
mutex_init(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2718
ov5670->cur_mode = &supported_modes[0];
drivers/media/i2c/ov5670.c
2720
ret = ov5670_init_controls(ov5670);
drivers/media/i2c/ov5670.c
2722
dev_err_probe(ov5670->dev, ret, "ov5670_init_controls() error\n");
drivers/media/i2c/ov5670.c
2726
ov5670->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
drivers/media/i2c/ov5670.c
2728
ov5670->sd.entity.ops = &ov5670_subdev_entity_ops;
drivers/media/i2c/ov5670.c
2729
ov5670->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
drivers/media/i2c/ov5670.c
2732
ov5670->pad.flags = MEDIA_PAD_FL_SOURCE;
drivers/media/i2c/ov5670.c
2733
ret = media_entity_pads_init(&ov5670->sd.entity, 1, &ov5670->pad);
drivers/media/i2c/ov5670.c
2735
dev_err_probe(ov5670->dev, ret, "media_entity_pads_init() error\n");
drivers/media/i2c/ov5670.c
2741
pm_runtime_set_active(ov5670->dev);
drivers/media/i2c/ov5670.c
2742
pm_runtime_enable(ov5670->dev);
drivers/media/i2c/ov5670.c
2745
ret = v4l2_async_register_subdev_sensor(&ov5670->sd);
drivers/media/i2c/ov5670.c
2747
dev_err_probe(ov5670->dev, ret, "v4l2_async_register_subdev() error\n");
drivers/media/i2c/ov5670.c
2751
pm_runtime_idle(ov5670->dev);
drivers/media/i2c/ov5670.c
2756
pm_runtime_disable(ov5670->dev);
drivers/media/i2c/ov5670.c
2758
media_entity_cleanup(&ov5670->sd.entity);
drivers/media/i2c/ov5670.c
2761
v4l2_ctrl_handler_free(ov5670->sd.ctrl_handler);
drivers/media/i2c/ov5670.c
2764
mutex_destroy(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2768
ov5670_runtime_suspend(ov5670->dev);
drivers/media/i2c/ov5670.c
2771
v4l2_fwnode_endpoint_free(&ov5670->endpoint);
drivers/media/i2c/ov5670.c
2779
struct ov5670 *ov5670 = to_ov5670(sd);
drivers/media/i2c/ov5670.c
2784
mutex_destroy(&ov5670->mutex);
drivers/media/i2c/ov5670.c
2786
pm_runtime_disable(ov5670->dev);
drivers/media/i2c/ov5670.c
2787
ov5670_runtime_suspend(ov5670->dev);
drivers/media/i2c/ov5670.c
2789
v4l2_fwnode_endpoint_free(&ov5670->endpoint);