Lines Matching defs:sensor

966 static int ov5648_read(struct ov5648_sensor *sensor, u16 address, u8 *value)
969 struct i2c_client *client = sensor->i2c_client;
989 static int ov5648_write(struct ov5648_sensor *sensor, u16 address, u8 value)
992 struct i2c_client *client = sensor->i2c_client;
1005 static int ov5648_write_sequence(struct ov5648_sensor *sensor,
1013 ret = ov5648_write(sensor, sequence[i].address,
1025 static int ov5648_update_bits(struct ov5648_sensor *sensor, u16 address,
1031 ret = ov5648_read(sensor, address, &value);
1038 ret = ov5648_write(sensor, address, value);
1047 static int ov5648_sw_reset(struct ov5648_sensor *sensor)
1049 return ov5648_write(sensor, OV5648_SW_RESET_REG, OV5648_SW_RESET_RESET);
1052 static int ov5648_sw_standby(struct ov5648_sensor *sensor, int standby)
1059 return ov5648_write(sensor, OV5648_SW_STANDBY_REG, value);
1062 static int ov5648_chip_id_check(struct ov5648_sensor *sensor)
1071 ret = ov5648_read(sensor, regs[i], &value);
1076 dev_err(sensor->dev,
1086 static int ov5648_avdd_internal_power(struct ov5648_sensor *sensor, int on)
1088 return ov5648_write(sensor, OV5648_A_PWC_PK_O0_REG,
1092 static int ov5648_pad_configure(struct ov5648_sensor *sensor)
1098 ret = ov5648_write(sensor, OV5648_PAD_OEN1_REG, 0);
1102 ret = ov5648_write(sensor, OV5648_PAD_OEN2_REG, 0);
1108 return ov5648_write(sensor, OV5648_PAD_PK_REG,
1113 static int ov5648_mipi_configure(struct ov5648_sensor *sensor)
1116 &sensor->endpoint.bus.mipi_csi2;
1120 ret = ov5648_write(sensor, OV5648_MIPI_CTRL0_REG,
1127 return ov5648_write(sensor, OV5648_MIPI_SC_CTRL0_REG,
1133 static int ov5648_black_level_configure(struct ov5648_sensor *sensor)
1139 ret = ov5648_write(sensor, OV5648_BLC_CTRL1_REG,
1144 ret = ov5648_write(sensor, OV5648_BLC_CTRL2_REG,
1150 ret = ov5648_write(sensor, OV5648_BLC_LINE_NUM_REG,
1155 return ov5648_update_bits(sensor, OV5648_BLC_CTRL5_REG,
1160 static int ov5648_isp_configure(struct ov5648_sensor *sensor)
1169 ret = ov5648_update_bits(sensor, OV5648_ISP_CTRL0_REG, bits, bits);
1174 ret = ov5648_write(sensor, OV5648_ISP_CTRL1_REG,
1180 ret = ov5648_write(sensor, OV5648_ISP_CTRL2_REG,
1187 ret = ov5648_write(sensor, OV5648_ISP_CTRL3_REG,
1193 ret = ov5648_write(sensor, OV5648_ISP_CTRL4_REG, 0);
1197 ret = ov5648_write(sensor, OV5648_ISP_CTRL1F_REG,
1203 ret = ov5648_write(sensor, OV5648_ISP_CTRL4B_REG,
1210 ret = ov5648_write(sensor, OV5648_AEC_CTRL0_REG,
1216 return ov5648_write(sensor, OV5648_MANUAL_CTRL_REG,
1220 static unsigned long ov5648_mode_pll1_rate(struct ov5648_sensor *sensor,
1226 xvclk_rate = clk_get_rate(sensor->xvclk);
1246 static int ov5648_mode_pll1_configure(struct ov5648_sensor *sensor,
1269 ret = ov5648_write(sensor, OV5648_PLL_CTRL0_REG, value);
1273 ret = ov5648_write(sensor, OV5648_PLL_DIV_REG,
1279 ret = ov5648_write(sensor, OV5648_PLL_MUL_REG,
1284 ret = ov5648_write(sensor, OV5648_PLL_CTRL1_REG,
1290 return ov5648_write(sensor, OV5648_SRB_CTRL_REG,
1295 static int ov5648_mode_pll2_configure(struct ov5648_sensor *sensor,
1301 ret = ov5648_write(sensor, OV5648_PLLS_DIV_REG,
1308 ret = ov5648_write(sensor, OV5648_PLLS_MUL_REG,
1313 return ov5648_write(sensor, OV5648_PLLS_CTRL_REG,
1318 static int ov5648_mode_configure(struct ov5648_sensor *sensor,
1325 ret = ov5648_write(sensor, OV5648_CROP_START_X_H_REG,
1330 ret = ov5648_write(sensor, OV5648_CROP_START_X_L_REG,
1337 ret = ov5648_write(sensor, OV5648_OFFSET_X_H_REG,
1342 ret = ov5648_write(sensor, OV5648_OFFSET_X_L_REG,
1349 ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_X_H_REG,
1354 ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_X_L_REG,
1361 ret = ov5648_write(sensor, OV5648_CROP_END_X_H_REG,
1366 ret = ov5648_write(sensor, OV5648_CROP_END_X_L_REG,
1373 ret = ov5648_write(sensor, OV5648_HTS_H_REG, OV5648_HTS_H(mode->hts));
1377 ret = ov5648_write(sensor, OV5648_HTS_L_REG, OV5648_HTS_L(mode->hts));
1383 ret = ov5648_write(sensor, OV5648_CROP_START_Y_H_REG,
1388 ret = ov5648_write(sensor, OV5648_CROP_START_Y_L_REG,
1395 ret = ov5648_write(sensor, OV5648_OFFSET_Y_H_REG,
1400 ret = ov5648_write(sensor, OV5648_OFFSET_Y_L_REG,
1407 ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_Y_H_REG,
1412 ret = ov5648_write(sensor, OV5648_OUTPUT_SIZE_Y_L_REG,
1419 ret = ov5648_write(sensor, OV5648_CROP_END_Y_H_REG,
1424 ret = ov5648_write(sensor, OV5648_CROP_END_Y_L_REG,
1431 ret = ov5648_write(sensor, OV5648_VTS_H_REG, OV5648_VTS_H(mode->vts));
1435 ret = ov5648_write(sensor, OV5648_VTS_L_REG, OV5648_VTS_L(mode->vts));
1445 ret = ov5648_update_bits(sensor, OV5648_TC20_REG,
1453 ret = ov5648_update_bits(sensor, OV5648_TC21_REG,
1460 ret = ov5648_write(sensor, OV5648_SUB_INC_X_REG,
1466 ret = ov5648_write(sensor, OV5648_SUB_INC_Y_REG,
1474 ret = ov5648_mode_pll1_configure(sensor, mode, mbus_code);
1478 ret = ov5648_mode_pll2_configure(sensor, mode);
1485 ret = ov5648_write_sequence(sensor, mode->register_values,
1494 static unsigned long ov5648_mode_mipi_clk_rate(struct ov5648_sensor *sensor,
1512 pll1_rate = ov5648_mode_pll1_rate(sensor, config);
1519 static int ov5648_exposure_auto_configure(struct ov5648_sensor *sensor,
1522 return ov5648_update_bits(sensor, OV5648_MANUAL_CTRL_REG,
1527 static int ov5648_exposure_configure(struct ov5648_sensor *sensor, u32 exposure)
1529 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1535 ret = ov5648_write(sensor, OV5648_EXPOSURE_CTRL_HH_REG,
1540 ret = ov5648_write(sensor, OV5648_EXPOSURE_CTRL_H_REG,
1545 return ov5648_write(sensor, OV5648_EXPOSURE_CTRL_L_REG,
1549 static int ov5648_exposure_value(struct ov5648_sensor *sensor,
1555 ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_HH_REG, &exposure_hh);
1559 ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_H_REG, &exposure_h);
1563 ret = ov5648_read(sensor, OV5648_EXPOSURE_CTRL_L_REG, &exposure_l);
1576 static int ov5648_gain_auto_configure(struct ov5648_sensor *sensor, bool enable)
1578 return ov5648_update_bits(sensor, OV5648_MANUAL_CTRL_REG,
1583 static int ov5648_gain_configure(struct ov5648_sensor *sensor, u32 gain)
1585 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1591 ret = ov5648_write(sensor, OV5648_GAIN_CTRL_H_REG,
1596 return ov5648_write(sensor, OV5648_GAIN_CTRL_L_REG,
1600 static int ov5648_gain_value(struct ov5648_sensor *sensor, u32 *gain)
1605 ret = ov5648_read(sensor, OV5648_GAIN_CTRL_H_REG, &gain_h);
1609 ret = ov5648_read(sensor, OV5648_GAIN_CTRL_L_REG, &gain_l);
1621 static int ov5648_white_balance_auto_configure(struct ov5648_sensor *sensor,
1624 return ov5648_write(sensor, OV5648_AWB_CTRL_REG,
1628 static int ov5648_white_balance_configure(struct ov5648_sensor *sensor,
1631 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1637 ret = ov5648_write(sensor, OV5648_GAIN_RED_MAN_H_REG,
1642 ret = ov5648_write(sensor, OV5648_GAIN_RED_MAN_L_REG,
1647 ret = ov5648_write(sensor, OV5648_GAIN_BLUE_MAN_H_REG,
1652 return ov5648_write(sensor, OV5648_GAIN_BLUE_MAN_L_REG,
1658 static int ov5648_flip_vert_configure(struct ov5648_sensor *sensor, bool enable)
1663 return ov5648_update_bits(sensor, OV5648_TC20_REG, bits,
1667 static int ov5648_flip_horz_configure(struct ov5648_sensor *sensor, bool enable)
1672 return ov5648_update_bits(sensor, OV5648_TC21_REG, bits,
1678 static int ov5648_test_pattern_configure(struct ov5648_sensor *sensor,
1684 return ov5648_write(sensor, OV5648_ISP_CTRL3D_REG,
1690 static int ov5648_state_mipi_configure(struct ov5648_sensor *sensor,
1694 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1696 &sensor->endpoint.bus.mipi_csi2;
1703 mipi_clk_rate = ov5648_mode_mipi_clk_rate(sensor, mode, mbus_code);
1714 for (j = 0; j < sensor->endpoint.nr_of_link_frequencies; j++) {
1715 u64 freq = sensor->endpoint.link_frequencies[j];
1722 dev_err(sensor->dev,
1725 } else if (j == sensor->endpoint.nr_of_link_frequencies) {
1726 dev_err(sensor->dev,
1752 static int ov5648_state_configure(struct ov5648_sensor *sensor,
1758 if (sensor->state.streaming)
1762 if (pm_runtime_enabled(sensor->dev) &&
1763 !pm_runtime_suspended(sensor->dev)) {
1764 ret = ov5648_mode_configure(sensor, mode, mbus_code);
1769 ret = ov5648_state_mipi_configure(sensor, mode, mbus_code);
1773 sensor->state.mode = mode;
1774 sensor->state.mbus_code = mbus_code;
1779 static int ov5648_state_init(struct ov5648_sensor *sensor)
1783 mutex_lock(&sensor->mutex);
1784 ret = ov5648_state_configure(sensor, &ov5648_modes[0],
1786 mutex_unlock(&sensor->mutex);
1793 static int ov5648_sensor_init(struct ov5648_sensor *sensor)
1797 ret = ov5648_sw_reset(sensor);
1799 dev_err(sensor->dev, "failed to perform sw reset\n");
1803 ret = ov5648_sw_standby(sensor, 1);
1805 dev_err(sensor->dev, "failed to set sensor standby\n");
1809 ret = ov5648_chip_id_check(sensor);
1811 dev_err(sensor->dev, "failed to check sensor chip id\n");
1815 ret = ov5648_avdd_internal_power(sensor, !sensor->avdd);
1817 dev_err(sensor->dev, "failed to set internal avdd power\n");
1821 ret = ov5648_write_sequence(sensor, ov5648_init_sequence,
1824 dev_err(sensor->dev, "failed to write init sequence\n");
1828 ret = ov5648_pad_configure(sensor);
1830 dev_err(sensor->dev, "failed to configure pad\n");
1834 ret = ov5648_mipi_configure(sensor);
1836 dev_err(sensor->dev, "failed to configure MIPI\n");
1840 ret = ov5648_isp_configure(sensor);
1842 dev_err(sensor->dev, "failed to configure ISP\n");
1846 ret = ov5648_black_level_configure(sensor);
1848 dev_err(sensor->dev, "failed to configure black level\n");
1853 ret = ov5648_state_configure(sensor, sensor->state.mode,
1854 sensor->state.mbus_code);
1856 dev_err(sensor->dev, "failed to configure state\n");
1863 static int ov5648_sensor_power(struct ov5648_sensor *sensor, bool on)
1878 gpiod_set_value_cansleep(sensor->reset, 1);
1879 gpiod_set_value_cansleep(sensor->powerdown, 1);
1881 ret = regulator_enable(sensor->dovdd);
1883 dev_err(sensor->dev,
1888 if (sensor->avdd) {
1889 ret = regulator_enable(sensor->avdd);
1891 dev_err(sensor->dev,
1897 ret = regulator_enable(sensor->dvdd);
1899 dev_err(sensor->dev,
1907 ret = clk_prepare_enable(sensor->xvclk);
1909 dev_err(sensor->dev, "failed to enable XVCLK clock\n");
1913 gpiod_set_value_cansleep(sensor->reset, 0);
1914 gpiod_set_value_cansleep(sensor->powerdown, 0);
1919 gpiod_set_value_cansleep(sensor->powerdown, 1);
1920 gpiod_set_value_cansleep(sensor->reset, 1);
1922 clk_disable_unprepare(sensor->xvclk);
1924 regulator_disable(sensor->dvdd);
1926 if (sensor->avdd)
1927 regulator_disable(sensor->avdd);
1929 regulator_disable(sensor->dovdd);
1940 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
1941 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1946 ret = ov5648_exposure_value(sensor, &ctrls->exposure->val);
1951 ret = ov5648_gain_value(sensor, &ctrls->gain->val);
1965 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
1966 struct ov5648_ctrls *ctrls = &sensor->ctrls;
1971 /* Wait for the sensor to be on before setting controls. */
1972 if (pm_runtime_suspended(sensor->dev))
1979 ret = ov5648_exposure_auto_configure(sensor, enable);
1984 ret = ov5648_exposure_configure(sensor,
1993 ret = ov5648_gain_auto_configure(sensor, enable);
1998 ret = ov5648_gain_configure(sensor, ctrls->gain->val);
2006 ret = ov5648_white_balance_auto_configure(sensor, enable);
2011 ret = ov5648_white_balance_configure(sensor,
2020 return ov5648_flip_horz_configure(sensor, enable);
2023 return ov5648_flip_vert_configure(sensor, enable);
2026 return ov5648_test_pattern_configure(sensor, index);
2039 static int ov5648_ctrls_init(struct ov5648_sensor *sensor)
2041 struct ov5648_ctrls *ctrls = &sensor->ctrls;
2049 handler->lock = &sensor->mutex;
2122 sensor->subdev.ctrl_handler = handler;
2136 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2137 struct ov5648_state *state = &sensor->state;
2141 ret = pm_runtime_resume_and_get(sensor->dev);
2146 mutex_lock(&sensor->mutex);
2147 ret = ov5648_sw_standby(sensor, !enable);
2148 mutex_unlock(&sensor->mutex);
2156 pm_runtime_put(sensor->dev);
2164 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2168 mutex_lock(&sensor->mutex);
2170 mode = sensor->state.mode;
2172 switch (sensor->state.mbus_code) {
2183 mutex_unlock(&sensor->mutex);
2229 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2232 mutex_lock(&sensor->mutex);
2238 ov5648_mbus_format_fill(mbus_format, sensor->state.mbus_code,
2239 sensor->state.mode);
2241 mutex_unlock(&sensor->mutex);
2250 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2257 mutex_lock(&sensor->mutex);
2259 if (sensor->state.streaming) {
2290 else if (sensor->state.mode != mode ||
2291 sensor->state.mbus_code != mbus_code)
2292 ret = ov5648_state_configure(sensor, mode, mbus_code);
2295 mutex_unlock(&sensor->mutex);
2379 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2380 struct ov5648_state *state = &sensor->state;
2383 mutex_lock(&sensor->mutex);
2386 ret = ov5648_sw_standby(sensor, true);
2391 ret = ov5648_sensor_power(sensor, false);
2393 ov5648_sw_standby(sensor, false);
2396 mutex_unlock(&sensor->mutex);
2405 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2406 struct ov5648_state *state = &sensor->state;
2409 mutex_lock(&sensor->mutex);
2411 ret = ov5648_sensor_power(sensor, true);
2415 ret = ov5648_sensor_init(sensor);
2419 ret = __v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
2424 ret = ov5648_sw_standby(sensor, false);
2432 ov5648_sensor_power(sensor, false);
2435 mutex_unlock(&sensor->mutex);
2444 struct ov5648_sensor *sensor;
2450 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
2451 if (!sensor)
2454 sensor->dev = dev;
2455 sensor->i2c_client = client;
2465 sensor->endpoint.bus_type = V4L2_MBUS_CSI2_DPHY;
2467 ret = v4l2_fwnode_endpoint_alloc_parse(handle, &sensor->endpoint);
2476 sensor->powerdown = devm_gpiod_get_optional(dev, "powerdown",
2478 if (IS_ERR(sensor->powerdown)) {
2479 ret = PTR_ERR(sensor->powerdown);
2483 sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
2484 if (IS_ERR(sensor->reset)) {
2485 ret = PTR_ERR(sensor->reset);
2492 sensor->dvdd = devm_regulator_get(dev, "dvdd");
2493 if (IS_ERR(sensor->dvdd)) {
2495 ret = PTR_ERR(sensor->dvdd);
2500 sensor->dovdd = devm_regulator_get(dev, "dovdd");
2501 if (IS_ERR(sensor->dovdd)) {
2503 ret = PTR_ERR(sensor->dovdd);
2508 sensor->avdd = devm_regulator_get_optional(dev, "avdd");
2509 if (IS_ERR(sensor->avdd)) {
2511 sensor->avdd = NULL;
2516 sensor->xvclk = devm_clk_get(dev, NULL);
2517 if (IS_ERR(sensor->xvclk)) {
2519 ret = PTR_ERR(sensor->xvclk);
2523 rate = clk_get_rate(sensor->xvclk);
2532 subdev = &sensor->subdev;
2538 pad = &sensor->pad;
2547 mutex_init(&sensor->mutex);
2551 ret = ov5648_ctrls_init(sensor);
2555 ret = ov5648_state_init(sensor);
2561 pm_runtime_enable(sensor->dev);
2562 pm_runtime_set_suspended(sensor->dev);
2573 pm_runtime_disable(sensor->dev);
2576 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
2579 mutex_destroy(&sensor->mutex);
2582 media_entity_cleanup(&sensor->subdev.entity);
2585 v4l2_fwnode_endpoint_free(&sensor->endpoint);
2593 struct ov5648_sensor *sensor = ov5648_subdev_sensor(subdev);
2596 pm_runtime_disable(sensor->dev);
2597 v4l2_ctrl_handler_free(&sensor->ctrls.handler);
2598 mutex_destroy(&sensor->mutex);
2600 v4l2_fwnode_endpoint_free(&sensor->endpoint);
2626 MODULE_DESCRIPTION("V4L2 driver for the OmniVision OV5648 image sensor");