Lines Matching defs:sensor
1348 static int ov8865_read(struct ov8865_sensor *sensor, u16 address, u8 *value)
1351 struct i2c_client *client = sensor->i2c_client;
1371 static int ov8865_write(struct ov8865_sensor *sensor, u16 address, u8 value)
1374 struct i2c_client *client = sensor->i2c_client;
1387 static int ov8865_write_sequence(struct ov8865_sensor *sensor,
1395 ret = ov8865_write(sensor, sequence[i].address,
1407 static int ov8865_update_bits(struct ov8865_sensor *sensor, u16 address,
1413 ret = ov8865_read(sensor, address, &value);
1420 return ov8865_write(sensor, address, value);
1425 static int ov8865_sw_reset(struct ov8865_sensor *sensor)
1427 return ov8865_write(sensor, OV8865_SW_RESET_REG, OV8865_SW_RESET_RESET);
1430 static int ov8865_sw_standby(struct ov8865_sensor *sensor, int standby)
1437 return ov8865_write(sensor, OV8865_SW_STANDBY_REG, value);
1440 static int ov8865_chip_id_check(struct ov8865_sensor *sensor)
1451 ret = ov8865_read(sensor, regs[i], &value);
1456 dev_err(sensor->dev,
1466 static int ov8865_charge_pump_configure(struct ov8865_sensor *sensor)
1468 return ov8865_write(sensor, OV8865_PUMP_CLK_DIV_REG,
1472 static int ov8865_mipi_configure(struct ov8865_sensor *sensor)
1475 &sensor->endpoint.bus.mipi_csi2;
1479 ret = ov8865_write(sensor, OV8865_MIPI_SC_CTRL0_REG,
1486 ret = ov8865_write(sensor, OV8865_MIPI_SC_CTRL2_REG,
1492 ret = ov8865_write(sensor, OV8865_MIPI_LANE_SEL01_REG,
1500 ret = ov8865_write(sensor, OV8865_MIPI_LANE_SEL23_REG,
1507 ret = ov8865_update_bits(sensor, OV8865_CLK_SEL1_REG,
1518 return ov8865_write(sensor, OV8865_MIPI_PCLK_PERIOD_REG, 0x16);
1521 static int ov8865_black_level_configure(struct ov8865_sensor *sensor)
1526 ret = ov8865_write(sensor, OV8865_BLC_CTRL0_REG,
1536 ret = ov8865_write(sensor, OV8865_BLC_CTRLD_REG,
1541 ret = ov8865_write(sensor, OV8865_BLC_CTRL1F_REG, 0);
1546 return ov8865_write(sensor, OV8865_BLC_OFFSET_LIMIT_REG,
1550 static int ov8865_isp_configure(struct ov8865_sensor *sensor)
1555 ret = ov8865_write(sensor, OV8865_ISP_CTRL0_REG,
1562 return ov8865_write(sensor, OV8865_ISP_CTRL1_REG,
1566 static unsigned long ov8865_mode_pll1_rate(struct ov8865_sensor *sensor,
1572 config = sensor->pll_configs->pll1_config;
1573 pll1_rate = sensor->extclk_rate * config->pll_mul / config->pll_pre_div_half;
1603 static int ov8865_mode_pll1_configure(struct ov8865_sensor *sensor,
1611 config = sensor->pll_configs->pll1_config;
1621 ret = ov8865_write(sensor, OV8865_MIPI_BIT_SEL_REG, value);
1625 ret = ov8865_write(sensor, OV8865_PLL_CTRLA_REG,
1630 ret = ov8865_write(sensor, OV8865_PLL_CTRL0_REG,
1635 ret = ov8865_write(sensor, OV8865_PLL_CTRL1_REG,
1640 ret = ov8865_write(sensor, OV8865_PLL_CTRL2_REG,
1645 ret = ov8865_write(sensor, OV8865_PLL_CTRL3_REG,
1650 ret = ov8865_write(sensor, OV8865_PLL_CTRL4_REG,
1655 ret = ov8865_update_bits(sensor, OV8865_PCLK_SEL_REG,
1661 ret = ov8865_write(sensor, OV8865_PLL_CTRL5_REG,
1666 ret = ov8865_write(sensor, OV8865_PLL_CTRL6_REG,
1671 return ov8865_update_bits(sensor, OV8865_PLL_CTRL1E_REG,
1676 static int ov8865_mode_pll2_configure(struct ov8865_sensor *sensor,
1682 config = mode->pll2_binning ? sensor->pll_configs->pll2_config_binning :
1683 sensor->pll_configs->pll2_config_native;
1685 ret = ov8865_write(sensor, OV8865_PLL_CTRL12_REG,
1691 ret = ov8865_write(sensor, OV8865_PLL_CTRLB_REG,
1696 ret = ov8865_write(sensor, OV8865_PLL_CTRLC_REG,
1701 ret = ov8865_write(sensor, OV8865_PLL_CTRLD_REG,
1706 ret = ov8865_write(sensor, OV8865_PLL_CTRLF_REG,
1711 return ov8865_write(sensor, OV8865_PLL_CTRLE_REG,
1715 static int ov8865_mode_sclk_configure(struct ov8865_sensor *sensor,
1721 ret = ov8865_write(sensor, OV8865_CLK_SEL0_REG,
1726 ret = ov8865_update_bits(sensor, OV8865_CLK_SEL1_REG,
1732 return ov8865_write(sensor, OV8865_SCLK_CTRL_REG,
1738 static int ov8865_mode_binning_configure(struct ov8865_sensor *sensor,
1745 ret = ov8865_write(sensor, OV8865_FORMAT1_REG, 0);
1763 ret = ov8865_write(sensor, OV8865_FORMAT2_REG, value);
1767 ret = ov8865_update_bits(sensor, OV8865_ISP_CTRL2_REG,
1783 ret = ov8865_write(sensor, OV8865_VAP_CTRL1_REG,
1789 ret = ov8865_write(sensor, OV8865_INC_X_ODD_REG,
1794 ret = ov8865_write(sensor, OV8865_INC_X_EVEN_REG,
1799 ret = ov8865_write(sensor, OV8865_INC_Y_ODD_REG,
1804 return ov8865_write(sensor, OV8865_INC_Y_EVEN_REG,
1808 static int ov8865_mode_black_level_configure(struct ov8865_sensor *sensor,
1814 ret = ov8865_write(sensor, OV8865_BLC_CTRL1_REG,
1822 ret = ov8865_write(sensor, OV8865_BLC_TOP_ZLINE_START_REG,
1827 ret = ov8865_write(sensor, OV8865_BLC_TOP_ZLINE_NUM_REG,
1834 ret = ov8865_write(sensor, OV8865_BLC_TOP_BLKLINE_START_REG,
1839 ret = ov8865_write(sensor, OV8865_BLC_TOP_BLKLINE_NUM_REG,
1846 ret = ov8865_write(sensor, OV8865_BLC_BOT_ZLINE_START_REG,
1851 ret = ov8865_write(sensor, OV8865_BLC_BOT_ZLINE_NUM_REG,
1858 ret = ov8865_write(sensor, OV8865_BLC_BOT_BLKLINE_START_REG,
1863 ret = ov8865_write(sensor, OV8865_BLC_BOT_BLKLINE_NUM_REG,
1870 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_LEFT_START_H_REG,
1875 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_LEFT_START_L_REG,
1880 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_LEFT_END_H_REG,
1885 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_LEFT_END_L_REG,
1890 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_RIGHT_START_H_REG,
1895 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_RIGHT_START_L_REG,
1900 ret = ov8865_write(sensor, OV8865_BLC_ANCHOR_RIGHT_END_H_REG,
1905 return ov8865_write(sensor, OV8865_BLC_ANCHOR_RIGHT_END_L_REG,
1909 static int ov8865_mode_configure(struct ov8865_sensor *sensor,
1916 ret = ov8865_write(sensor, OV8865_OUTPUT_SIZE_X_H_REG,
1921 ret = ov8865_write(sensor, OV8865_OUTPUT_SIZE_X_L_REG,
1928 ret = ov8865_write(sensor, OV8865_HTS_H_REG, OV8865_HTS_H(mode->hts));
1932 ret = ov8865_write(sensor, OV8865_HTS_L_REG, OV8865_HTS_L(mode->hts));
1938 ret = ov8865_write(sensor, OV8865_OUTPUT_SIZE_Y_H_REG,
1943 ret = ov8865_write(sensor, OV8865_OUTPUT_SIZE_Y_L_REG,
1950 ret = ov8865_write(sensor, OV8865_VTS_H_REG, OV8865_VTS_H(mode->vts));
1954 ret = ov8865_write(sensor, OV8865_VTS_L_REG, OV8865_VTS_L(mode->vts));
1961 ret = ov8865_write(sensor, OV8865_AUTO_SIZE_CTRL_REG,
1971 ret = ov8865_write(sensor, OV8865_AUTO_SIZE_BOUNDARIES_REG,
1979 ret = ov8865_write(sensor, OV8865_CROP_START_X_H_REG,
1984 ret = ov8865_write(sensor, OV8865_CROP_START_X_L_REG,
1991 ret = ov8865_write(sensor, OV8865_OFFSET_X_H_REG,
1996 ret = ov8865_write(sensor, OV8865_OFFSET_X_L_REG,
2003 ret = ov8865_write(sensor, OV8865_CROP_END_X_H_REG,
2008 ret = ov8865_write(sensor, OV8865_CROP_END_X_L_REG,
2015 ret = ov8865_write(sensor, OV8865_CROP_START_Y_H_REG,
2020 ret = ov8865_write(sensor, OV8865_CROP_START_Y_L_REG,
2027 ret = ov8865_write(sensor, OV8865_OFFSET_Y_H_REG,
2032 ret = ov8865_write(sensor, OV8865_OFFSET_Y_L_REG,
2039 ret = ov8865_write(sensor, OV8865_CROP_END_Y_H_REG,
2044 ret = ov8865_write(sensor, OV8865_CROP_END_Y_L_REG,
2052 ret = ov8865_write(sensor, OV8865_VFIFO_READ_START_H_REG,
2057 ret = ov8865_write(sensor, OV8865_VFIFO_READ_START_L_REG,
2062 ret = ov8865_write(sensor, OV8865_ABLC_NUM_REG,
2067 ret = ov8865_write(sensor, OV8865_ZLINE_NUM_REG,
2074 ret = ov8865_mode_binning_configure(sensor, mode);
2080 ret = ov8865_mode_black_level_configure(sensor, mode);
2086 ret = ov8865_mode_pll1_configure(sensor, mode, mbus_code);
2090 ret = ov8865_mode_pll2_configure(sensor, mode);
2094 ret = ov8865_mode_sclk_configure(sensor, mode);
2101 ret = ov8865_write_sequence(sensor, mode->register_values,
2110 static unsigned long ov8865_mode_mipi_clk_rate(struct ov8865_sensor *sensor,
2116 config = sensor->pll_configs->pll1_config;
2118 pll1_rate = ov8865_mode_pll1_rate(sensor, mode);
2125 static int ov8865_exposure_configure(struct ov8865_sensor *sensor, u32 exposure)
2129 /* The sensor stores exposure in units of 1/16th of a line */
2132 ret = ov8865_write(sensor, OV8865_EXPOSURE_CTRL_HH_REG,
2137 ret = ov8865_write(sensor, OV8865_EXPOSURE_CTRL_H_REG,
2142 return ov8865_write(sensor, OV8865_EXPOSURE_CTRL_L_REG,
2148 static int ov8865_analog_gain_configure(struct ov8865_sensor *sensor, u32 gain)
2152 ret = ov8865_write(sensor, OV8865_GAIN_CTRL_H_REG,
2157 return ov8865_write(sensor, OV8865_GAIN_CTRL_L_REG,
2163 static int ov8865_red_balance_configure(struct ov8865_sensor *sensor,
2168 ret = ov8865_write(sensor, OV8865_ISP_GAIN_RED_H_REG,
2173 return ov8865_write(sensor, OV8865_ISP_GAIN_RED_L_REG,
2177 static int ov8865_blue_balance_configure(struct ov8865_sensor *sensor,
2182 ret = ov8865_write(sensor, OV8865_ISP_GAIN_BLUE_H_REG,
2187 return ov8865_write(sensor, OV8865_ISP_GAIN_BLUE_L_REG,
2193 static int ov8865_flip_vert_configure(struct ov8865_sensor *sensor, bool enable)
2198 return ov8865_update_bits(sensor, OV8865_FORMAT1_REG, bits,
2202 static int ov8865_flip_horz_configure(struct ov8865_sensor *sensor, bool enable)
2207 return ov8865_update_bits(sensor, OV8865_FORMAT2_REG, bits,
2213 static int ov8865_test_pattern_configure(struct ov8865_sensor *sensor,
2219 return ov8865_write(sensor, OV8865_PRE_CTRL0_REG,
2225 static int ov8865_vts_configure(struct ov8865_sensor *sensor, u32 vblank)
2227 u16 vts = sensor->state.mode->output_size_y + vblank;
2230 ret = ov8865_write(sensor, OV8865_VTS_H_REG, OV8865_VTS_H(vts));
2234 return ov8865_write(sensor, OV8865_VTS_L_REG, OV8865_VTS_L(vts));
2239 static int ov8865_state_mipi_configure(struct ov8865_sensor *sensor,
2243 struct ov8865_ctrls *ctrls = &sensor->ctrls;
2245 &sensor->endpoint.bus.mipi_csi2;
2252 mipi_clk_rate = ov8865_mode_mipi_clk_rate(sensor, mode);
2263 for (j = 0; j < sensor->endpoint.nr_of_link_frequencies; j++) {
2264 u64 freq = sensor->endpoint.link_frequencies[j];
2271 dev_err(sensor->dev,
2274 } else if (j == sensor->endpoint.nr_of_link_frequencies) {
2275 dev_err(sensor->dev,
2298 static int ov8865_state_configure(struct ov8865_sensor *sensor,
2304 if (sensor->state.streaming)
2308 if (pm_runtime_enabled(sensor->dev) &&
2309 !pm_runtime_suspended(sensor->dev)) {
2310 ret = ov8865_mode_configure(sensor, mode, mbus_code);
2315 ret = ov8865_state_mipi_configure(sensor, mode, mbus_code);
2319 sensor->state.mode = mode;
2320 sensor->state.mbus_code = mbus_code;
2325 static int ov8865_state_init(struct ov8865_sensor *sensor)
2327 return ov8865_state_configure(sensor, &ov8865_modes[0],
2333 static int ov8865_sensor_init(struct ov8865_sensor *sensor)
2337 ret = ov8865_sw_reset(sensor);
2339 dev_err(sensor->dev, "failed to perform sw reset\n");
2343 ret = ov8865_sw_standby(sensor, 1);
2345 dev_err(sensor->dev, "failed to set sensor standby\n");
2349 ret = ov8865_chip_id_check(sensor);
2351 dev_err(sensor->dev, "failed to check sensor chip id\n");
2355 ret = ov8865_write_sequence(sensor, ov8865_init_sequence,
2358 dev_err(sensor->dev, "failed to write init sequence\n");
2362 ret = ov8865_charge_pump_configure(sensor);
2364 dev_err(sensor->dev, "failed to configure pad\n");
2368 ret = ov8865_mipi_configure(sensor);
2370 dev_err(sensor->dev, "failed to configure MIPI\n");
2374 ret = ov8865_isp_configure(sensor);
2376 dev_err(sensor->dev, "failed to configure ISP\n");
2380 ret = ov8865_black_level_configure(sensor);
2382 dev_err(sensor->dev, "failed to configure black level\n");
2387 ret = ov8865_state_configure(sensor, sensor->state.mode,
2388 sensor->state.mbus_code);
2390 dev_err(sensor->dev, "failed to configure state\n");
2397 static int ov8865_sensor_power(struct ov8865_sensor *sensor, bool on)
2403 gpiod_set_value_cansleep(sensor->reset, 1);
2404 gpiod_set_value_cansleep(sensor->powerdown, 1);
2406 ret = regulator_enable(sensor->dovdd);
2408 dev_err(sensor->dev,
2413 ret = regulator_enable(sensor->avdd);
2415 dev_err(sensor->dev,
2420 ret = regulator_enable(sensor->dvdd);
2422 dev_err(sensor->dev,
2427 ret = clk_prepare_enable(sensor->extclk);
2429 dev_err(sensor->dev, "failed to enable EXTCLK clock\n");
2433 gpiod_set_value_cansleep(sensor->reset, 0);
2434 gpiod_set_value_cansleep(sensor->powerdown, 0);
2439 gpiod_set_value_cansleep(sensor->powerdown, 1);
2440 gpiod_set_value_cansleep(sensor->reset, 1);
2442 clk_disable_unprepare(sensor->extclk);
2445 regulator_disable(sensor->dvdd);
2447 regulator_disable(sensor->avdd);
2449 regulator_disable(sensor->dovdd);
2460 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2468 exposure_max = sensor->state.mode->output_size_y + ctrl->val -
2470 __v4l2_ctrl_modify_range(sensor->ctrls.exposure,
2471 sensor->ctrls.exposure->minimum,
2473 sensor->ctrls.exposure->step,
2474 min(sensor->ctrls.exposure->val,
2478 /* Wait for the sensor to be on before setting controls. */
2479 if (pm_runtime_suspended(sensor->dev))
2484 ret = ov8865_exposure_configure(sensor, ctrl->val);
2489 ret = ov8865_analog_gain_configure(sensor, ctrl->val);
2494 return ov8865_red_balance_configure(sensor, ctrl->val);
2496 return ov8865_blue_balance_configure(sensor, ctrl->val);
2498 return ov8865_flip_horz_configure(sensor, !!ctrl->val);
2500 return ov8865_flip_vert_configure(sensor, !!ctrl->val);
2503 return ov8865_test_pattern_configure(sensor, index);
2505 return ov8865_vts_configure(sensor, ctrl->val);
2517 static int ov8865_ctrls_init(struct ov8865_sensor *sensor)
2519 struct ov8865_ctrls *ctrls = &sensor->ctrls;
2531 handler->lock = &sensor->mutex;
2588 ret = v4l2_fwnode_device_parse(sensor->dev, &props);
2604 sensor->subdev.ctrl_handler = handler;
2618 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2619 struct ov8865_state *state = &sensor->state;
2623 ret = pm_runtime_resume_and_get(sensor->dev);
2628 mutex_lock(&sensor->mutex);
2629 ret = ov8865_sw_standby(sensor, !enable);
2630 mutex_unlock(&sensor->mutex);
2638 pm_runtime_put(sensor->dev);
2646 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2651 mutex_lock(&sensor->mutex);
2653 mode = sensor->state.mode;
2655 sensor->ctrls.vblank->val);
2656 fps = DIV_ROUND_CLOSEST(sensor->ctrls.pixel_rate->val, framesize);
2661 mutex_unlock(&sensor->mutex);
2707 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2710 mutex_lock(&sensor->mutex);
2716 ov8865_mbus_format_fill(mbus_format, sensor->state.mbus_code,
2717 sensor->state.mode);
2719 mutex_unlock(&sensor->mutex);
2728 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2737 mutex_lock(&sensor->mutex);
2739 if (sensor->state.streaming) {
2770 else if (sensor->state.mode != mode ||
2771 sensor->state.mbus_code != mbus_code)
2772 ret = ov8865_state_configure(sensor, mode, mbus_code);
2774 __v4l2_ctrl_modify_range(sensor->ctrls.vblank, OV8865_TIMING_MIN_VTS,
2779 __v4l2_ctrl_modify_range(sensor->ctrls.hblank, hblank, hblank, 1,
2783 __v4l2_ctrl_modify_range(sensor->ctrls.exposure,
2784 sensor->ctrls.exposure->minimum, exposure_max,
2785 sensor->ctrls.exposure->step,
2786 min(sensor->ctrls.exposure->val,
2790 mutex_unlock(&sensor->mutex);
2813 __ov8865_get_pad_crop(struct ov8865_sensor *sensor,
2817 const struct ov8865_mode *mode = sensor->state.mode;
2821 *r = *v4l2_subdev_get_try_crop(&sensor->subdev, state, pad);
2836 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2840 mutex_lock(&sensor->mutex);
2841 __ov8865_get_pad_crop(sensor, state, sel->pad,
2843 mutex_unlock(&sensor->mutex);
2883 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2884 struct ov8865_state *state = &sensor->state;
2887 mutex_lock(&sensor->mutex);
2890 ret = ov8865_sw_standby(sensor, true);
2895 ret = ov8865_sensor_power(sensor, false);
2897 ov8865_sw_standby(sensor, false);
2900 mutex_unlock(&sensor->mutex);
2909 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
2910 struct ov8865_state *state = &sensor->state;
2913 mutex_lock(&sensor->mutex);
2915 ret = ov8865_sensor_power(sensor, true);
2919 ret = ov8865_sensor_init(sensor);
2923 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
2928 ret = ov8865_sw_standby(sensor, false);
2936 ov8865_sensor_power(sensor, false);
2939 mutex_unlock(&sensor->mutex);
2948 struct ov8865_sensor *sensor;
2955 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
2956 if (!sensor)
2959 sensor->dev = dev;
2960 sensor->i2c_client = client;
2965 sensor->dvdd = devm_regulator_get(dev, "dvdd");
2966 if (IS_ERR(sensor->dvdd))
2967 return dev_err_probe(dev, PTR_ERR(sensor->dvdd),
2971 sensor->dovdd = devm_regulator_get(dev, "dovdd");
2972 if (IS_ERR(sensor->dovdd))
2973 return dev_err_probe(dev, PTR_ERR(sensor->dovdd),
2977 sensor->avdd = devm_regulator_get(dev, "avdd");
2978 if (IS_ERR(sensor->avdd))
2979 return dev_err_probe(dev, PTR_ERR(sensor->avdd),
2988 sensor->endpoint.bus_type = V4L2_MBUS_CSI2_DPHY;
2990 ret = v4l2_fwnode_endpoint_alloc_parse(handle, &sensor->endpoint);
2999 sensor->powerdown = devm_gpiod_get_optional(dev, "powerdown",
3001 if (IS_ERR(sensor->powerdown)) {
3002 ret = PTR_ERR(sensor->powerdown);
3006 sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
3007 if (IS_ERR(sensor->reset)) {
3008 ret = PTR_ERR(sensor->reset);
3014 sensor->extclk = devm_clk_get(dev, NULL);
3015 if (PTR_ERR(sensor->extclk) == -ENOENT) {
3017 sensor->extclk = NULL;
3018 } else if (IS_ERR(sensor->extclk)) {
3020 ret = PTR_ERR(sensor->extclk);
3035 if (!ret && sensor->extclk) {
3036 ret = clk_set_rate(sensor->extclk, rate);
3041 } else if (ret && !sensor->extclk) {
3046 sensor->extclk_rate = rate ? rate : clk_get_rate(sensor->extclk);
3049 if (sensor->extclk_rate == supported_extclk_rates[i])
3055 sensor->extclk_rate);
3060 sensor->pll_configs = ov8865_pll_configs[i];
3064 subdev = &sensor->subdev;
3070 pad = &sensor->pad;
3079 mutex_init(&sensor->mutex);
3083 ret = ov8865_ctrls_init(sensor);
3087 mutex_lock(&sensor->mutex);
3088 ret = ov8865_state_init(sensor);
3089 mutex_unlock(&sensor->mutex);
3095 pm_runtime_set_suspended(sensor->dev);
3096 pm_runtime_enable(sensor->dev);
3107 pm_runtime_disable(sensor->dev);
3110 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3113 mutex_destroy(&sensor->mutex);
3116 media_entity_cleanup(&sensor->subdev.entity);
3119 v4l2_fwnode_endpoint_free(&sensor->endpoint);
3127 struct ov8865_sensor *sensor = ov8865_subdev_sensor(subdev);
3130 pm_runtime_disable(sensor->dev);
3131 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
3132 mutex_destroy(&sensor->mutex);
3135 v4l2_fwnode_endpoint_free(&sensor->endpoint);
3168 MODULE_DESCRIPTION("V4L2 driver for the OmniVision OV8865 image sensor");