^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2011-2013 Freescale Semiconductor, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2014-2017 Mentor Graphics Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/clkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/regulator/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <media/v4l2-async.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <media/v4l2-event.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <media/v4l2-fwnode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <media/v4l2-subdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* min/typical/max system clock (xclk) frequencies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define OV5640_XCLK_MIN 6000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define OV5640_XCLK_MAX 54000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define OV5640_DEFAULT_SLAVE_ID 0x3c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define OV5640_REG_SYS_RESET02 0x3002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define OV5640_REG_SYS_CLOCK_ENABLE02 0x3006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define OV5640_REG_SYS_CTRL0 0x3008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define OV5640_REG_SYS_CTRL0_SW_PWDN 0x42
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define OV5640_REG_SYS_CTRL0_SW_PWUP 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define OV5640_REG_CHIP_ID 0x300a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define OV5640_REG_IO_MIPI_CTRL00 0x300e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define OV5640_REG_PAD_OUTPUT_ENABLE01 0x3017
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define OV5640_REG_PAD_OUTPUT_ENABLE02 0x3018
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define OV5640_REG_PAD_OUTPUT00 0x3019
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define OV5640_REG_SYSTEM_CONTROL1 0x302e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define OV5640_REG_SC_PLL_CTRL0 0x3034
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define OV5640_REG_SC_PLL_CTRL1 0x3035
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define OV5640_REG_SC_PLL_CTRL2 0x3036
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define OV5640_REG_SC_PLL_CTRL3 0x3037
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define OV5640_REG_SLAVE_ID 0x3100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define OV5640_REG_SCCB_SYS_CTRL1 0x3103
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define OV5640_REG_SYS_ROOT_DIVIDER 0x3108
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define OV5640_REG_AWB_R_GAIN 0x3400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define OV5640_REG_AWB_G_GAIN 0x3402
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define OV5640_REG_AWB_B_GAIN 0x3404
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define OV5640_REG_AWB_MANUAL_CTRL 0x3406
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define OV5640_REG_AEC_PK_EXPOSURE_HI 0x3500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define OV5640_REG_AEC_PK_EXPOSURE_MED 0x3501
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define OV5640_REG_AEC_PK_EXPOSURE_LO 0x3502
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define OV5640_REG_AEC_PK_MANUAL 0x3503
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define OV5640_REG_AEC_PK_REAL_GAIN 0x350a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define OV5640_REG_AEC_PK_VTS 0x350c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define OV5640_REG_TIMING_DVPHO 0x3808
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define OV5640_REG_TIMING_DVPVO 0x380a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define OV5640_REG_TIMING_HTS 0x380c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define OV5640_REG_TIMING_VTS 0x380e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define OV5640_REG_TIMING_TC_REG20 0x3820
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define OV5640_REG_TIMING_TC_REG21 0x3821
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define OV5640_REG_AEC_CTRL00 0x3a00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define OV5640_REG_AEC_B50_STEP 0x3a08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define OV5640_REG_AEC_B60_STEP 0x3a0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define OV5640_REG_AEC_CTRL0D 0x3a0d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define OV5640_REG_AEC_CTRL0E 0x3a0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define OV5640_REG_AEC_CTRL0F 0x3a0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define OV5640_REG_AEC_CTRL10 0x3a10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define OV5640_REG_AEC_CTRL11 0x3a11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define OV5640_REG_AEC_CTRL1B 0x3a1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define OV5640_REG_AEC_CTRL1E 0x3a1e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define OV5640_REG_AEC_CTRL1F 0x3a1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define OV5640_REG_HZ5060_CTRL00 0x3c00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define OV5640_REG_HZ5060_CTRL01 0x3c01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define OV5640_REG_SIGMADELTA_CTRL0C 0x3c0c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define OV5640_REG_FRAME_CTRL01 0x4202
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define OV5640_REG_FORMAT_CONTROL00 0x4300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define OV5640_REG_VFIFO_HSIZE 0x4602
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define OV5640_REG_VFIFO_VSIZE 0x4604
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define OV5640_REG_JPG_MODE_SELECT 0x4713
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define OV5640_REG_CCIR656_CTRL00 0x4730
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define OV5640_REG_POLARITY_CTRL00 0x4740
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define OV5640_REG_MIPI_CTRL00 0x4800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define OV5640_REG_DEBUG_MODE 0x4814
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define OV5640_REG_ISP_FORMAT_MUX_CTRL 0x501f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define OV5640_REG_PRE_ISP_TEST_SET1 0x503d
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define OV5640_REG_SDE_CTRL0 0x5580
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define OV5640_REG_SDE_CTRL1 0x5581
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define OV5640_REG_SDE_CTRL3 0x5583
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define OV5640_REG_SDE_CTRL4 0x5584
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define OV5640_REG_SDE_CTRL5 0x5585
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define OV5640_REG_AVG_READOUT 0x56a1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) enum ov5640_mode_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) OV5640_MODE_QCIF_176_144 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) OV5640_MODE_QVGA_320_240,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) OV5640_MODE_VGA_640_480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) OV5640_MODE_NTSC_720_480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) OV5640_MODE_PAL_720_576,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) OV5640_MODE_XGA_1024_768,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) OV5640_MODE_720P_1280_720,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) OV5640_MODE_1080P_1920_1080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) OV5640_MODE_QSXGA_2592_1944,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) OV5640_NUM_MODES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) enum ov5640_frame_rate {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) OV5640_15_FPS = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) OV5640_30_FPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) OV5640_60_FPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) OV5640_NUM_FRAMERATES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) enum ov5640_format_mux {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) OV5640_FMT_MUX_YUV422 = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) OV5640_FMT_MUX_RGB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) OV5640_FMT_MUX_DITHER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) OV5640_FMT_MUX_RAW_DPC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) OV5640_FMT_MUX_SNR_RAW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) OV5640_FMT_MUX_RAW_CIP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct ov5640_pixfmt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u32 code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 colorspace;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static const struct ov5640_pixfmt ov5640_formats[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { MEDIA_BUS_FMT_JPEG_1X8, V4L2_COLORSPACE_JPEG, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { MEDIA_BUS_FMT_SGBRG8_1X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { MEDIA_BUS_FMT_SGRBG8_1X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { MEDIA_BUS_FMT_SRGGB8_1X8, V4L2_COLORSPACE_SRGB, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * FIXME: remove this when a subdev API becomes available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * to set the MIPI CSI-2 virtual channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static unsigned int virtual_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) module_param(virtual_channel, uint, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) MODULE_PARM_DESC(virtual_channel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) "MIPI CSI-2 virtual channel (0..3), default 0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static const int ov5640_framerates[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) [OV5640_15_FPS] = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) [OV5640_30_FPS] = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) [OV5640_60_FPS] = 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /* regulator supplies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static const char * const ov5640_supply_name[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) "DOVDD", /* Digital I/O (1.8V) supply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) "AVDD", /* Analog (2.8V) supply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) "DVDD", /* Digital Core (1.5V) supply */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define OV5640_NUM_SUPPLIES ARRAY_SIZE(ov5640_supply_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * Image size under 1280 * 960 are SUBSAMPLING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * Image size upper 1280 * 960 are SCALING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) enum ov5640_downsize_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) struct reg_value {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u16 reg_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u8 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) u32 delay_ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct ov5640_mode_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) enum ov5640_mode_id id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) enum ov5640_downsize_mode dn_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u32 hact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) u32 htot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u32 vact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u32 vtot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) const struct reg_value *reg_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) u32 reg_data_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) u32 max_fps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct ov5640_ctrls {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) struct v4l2_ctrl_handler handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct v4l2_ctrl *pixel_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct v4l2_ctrl *auto_exp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) struct v4l2_ctrl *exposure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) struct v4l2_ctrl *auto_wb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) struct v4l2_ctrl *blue_balance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct v4l2_ctrl *red_balance;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct v4l2_ctrl *auto_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct v4l2_ctrl *gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct v4l2_ctrl *brightness;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct v4l2_ctrl *light_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct v4l2_ctrl *saturation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct v4l2_ctrl *contrast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct v4l2_ctrl *hue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct v4l2_ctrl *test_pattern;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct v4l2_ctrl *hflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct v4l2_ctrl *vflip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct ov5640_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct i2c_client *i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct v4l2_subdev sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) struct media_pad pad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct v4l2_fwnode_endpoint ep; /* the parsed DT endpoint info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct clk *xclk; /* system clock to OV5640 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u32 xclk_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct regulator_bulk_data supplies[OV5640_NUM_SUPPLIES];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct gpio_desc *reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct gpio_desc *pwdn_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) bool upside_down;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /* lock to protect all members below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct mutex lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) int power_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct v4l2_mbus_framefmt fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) bool pending_fmt_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) const struct ov5640_mode_info *current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) const struct ov5640_mode_info *last_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) enum ov5640_frame_rate current_fr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct v4l2_fract frame_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) struct ov5640_ctrls ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) u32 prev_sysclk, prev_hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) u32 ae_low, ae_high, ae_target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) bool pending_mode_change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) bool streaming;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static inline struct ov5640_dev *to_ov5640_dev(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return container_of(sd, struct ov5640_dev, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return &container_of(ctrl->handler, struct ov5640_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) ctrls.handler)->sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * FIXME: all of these register tables are likely filled with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * entries that set the register to their power-on default values,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * and which are otherwise not touched by this driver. Those entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * should be identified and removed to speed register load time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * over i2c.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /* YUV422 UYVY VGA@30fps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) static const struct reg_value ov5640_init_setting_30fps_VGA[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {0x3103, 0x03, 0, 0}, {0x3630, 0x36, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {0x3631, 0x0e, 0, 0}, {0x3632, 0xe2, 0, 0}, {0x3633, 0x12, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) {0x3621, 0xe0, 0, 0}, {0x3704, 0xa0, 0, 0}, {0x3703, 0x5a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) {0x3715, 0x78, 0, 0}, {0x3717, 0x01, 0, 0}, {0x370b, 0x60, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {0x3705, 0x1a, 0, 0}, {0x3905, 0x02, 0, 0}, {0x3906, 0x10, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {0x3901, 0x0a, 0, 0}, {0x3731, 0x12, 0, 0}, {0x3600, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {0x3601, 0x33, 0, 0}, {0x302d, 0x60, 0, 0}, {0x3620, 0x52, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {0x371b, 0x20, 0, 0}, {0x471c, 0x50, 0, 0}, {0x3a13, 0x43, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {0x3a18, 0x00, 0, 0}, {0x3a19, 0xf8, 0, 0}, {0x3635, 0x13, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {0x3636, 0x03, 0, 0}, {0x3634, 0x40, 0, 0}, {0x3622, 0x01, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) {0x3c01, 0xa4, 0, 0}, {0x3c04, 0x28, 0, 0}, {0x3c05, 0x98, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {0x3c06, 0x00, 0, 0}, {0x3c07, 0x08, 0, 0}, {0x3c08, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {0x3820, 0x41, 0, 0}, {0x3821, 0x07, 0, 0}, {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0}, {0x3000, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) {0x3002, 0x1c, 0, 0}, {0x3004, 0xff, 0, 0}, {0x3006, 0xc3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) {0x302e, 0x08, 0, 0}, {0x4300, 0x3f, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) {0x501f, 0x00, 0, 0}, {0x4407, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {0x440e, 0x00, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {0x4837, 0x0a, 0, 0}, {0x3824, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {0x5000, 0xa7, 0, 0}, {0x5001, 0xa3, 0, 0}, {0x5180, 0xff, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) {0x5181, 0xf2, 0, 0}, {0x5182, 0x00, 0, 0}, {0x5183, 0x14, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) {0x5184, 0x25, 0, 0}, {0x5185, 0x24, 0, 0}, {0x5186, 0x09, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {0x5187, 0x09, 0, 0}, {0x5188, 0x09, 0, 0}, {0x5189, 0x88, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {0x518a, 0x54, 0, 0}, {0x518b, 0xee, 0, 0}, {0x518c, 0xb2, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {0x518d, 0x50, 0, 0}, {0x518e, 0x34, 0, 0}, {0x518f, 0x6b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {0x5190, 0x46, 0, 0}, {0x5191, 0xf8, 0, 0}, {0x5192, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {0x5193, 0x70, 0, 0}, {0x5194, 0xf0, 0, 0}, {0x5195, 0xf0, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) {0x5196, 0x03, 0, 0}, {0x5197, 0x01, 0, 0}, {0x5198, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {0x5199, 0x6c, 0, 0}, {0x519a, 0x04, 0, 0}, {0x519b, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) {0x519c, 0x09, 0, 0}, {0x519d, 0x2b, 0, 0}, {0x519e, 0x38, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) {0x5381, 0x1e, 0, 0}, {0x5382, 0x5b, 0, 0}, {0x5383, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {0x5384, 0x0a, 0, 0}, {0x5385, 0x7e, 0, 0}, {0x5386, 0x88, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {0x5387, 0x7c, 0, 0}, {0x5388, 0x6c, 0, 0}, {0x5389, 0x10, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) {0x538a, 0x01, 0, 0}, {0x538b, 0x98, 0, 0}, {0x5300, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {0x5301, 0x30, 0, 0}, {0x5302, 0x10, 0, 0}, {0x5303, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {0x5304, 0x08, 0, 0}, {0x5305, 0x30, 0, 0}, {0x5306, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {0x5307, 0x16, 0, 0}, {0x5309, 0x08, 0, 0}, {0x530a, 0x30, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {0x530b, 0x04, 0, 0}, {0x530c, 0x06, 0, 0}, {0x5480, 0x01, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {0x5481, 0x08, 0, 0}, {0x5482, 0x14, 0, 0}, {0x5483, 0x28, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) {0x5484, 0x51, 0, 0}, {0x5485, 0x65, 0, 0}, {0x5486, 0x71, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) {0x5487, 0x7d, 0, 0}, {0x5488, 0x87, 0, 0}, {0x5489, 0x91, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {0x548a, 0x9a, 0, 0}, {0x548b, 0xaa, 0, 0}, {0x548c, 0xb8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {0x548d, 0xcd, 0, 0}, {0x548e, 0xdd, 0, 0}, {0x548f, 0xea, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {0x5490, 0x1d, 0, 0}, {0x5580, 0x02, 0, 0}, {0x5583, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {0x5584, 0x10, 0, 0}, {0x5589, 0x10, 0, 0}, {0x558a, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) {0x558b, 0xf8, 0, 0}, {0x5800, 0x23, 0, 0}, {0x5801, 0x14, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {0x5802, 0x0f, 0, 0}, {0x5803, 0x0f, 0, 0}, {0x5804, 0x12, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) {0x5805, 0x26, 0, 0}, {0x5806, 0x0c, 0, 0}, {0x5807, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {0x5808, 0x05, 0, 0}, {0x5809, 0x05, 0, 0}, {0x580a, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) {0x580b, 0x0d, 0, 0}, {0x580c, 0x08, 0, 0}, {0x580d, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {0x580e, 0x00, 0, 0}, {0x580f, 0x00, 0, 0}, {0x5810, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {0x5811, 0x09, 0, 0}, {0x5812, 0x07, 0, 0}, {0x5813, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {0x5814, 0x00, 0, 0}, {0x5815, 0x01, 0, 0}, {0x5816, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {0x5817, 0x08, 0, 0}, {0x5818, 0x0d, 0, 0}, {0x5819, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {0x581a, 0x05, 0, 0}, {0x581b, 0x06, 0, 0}, {0x581c, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {0x581d, 0x0e, 0, 0}, {0x581e, 0x29, 0, 0}, {0x581f, 0x17, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) {0x5820, 0x11, 0, 0}, {0x5821, 0x11, 0, 0}, {0x5822, 0x15, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) {0x5823, 0x28, 0, 0}, {0x5824, 0x46, 0, 0}, {0x5825, 0x26, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) {0x5826, 0x08, 0, 0}, {0x5827, 0x26, 0, 0}, {0x5828, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {0x5829, 0x26, 0, 0}, {0x582a, 0x24, 0, 0}, {0x582b, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {0x582c, 0x24, 0, 0}, {0x582d, 0x24, 0, 0}, {0x582e, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {0x582f, 0x22, 0, 0}, {0x5830, 0x40, 0, 0}, {0x5831, 0x42, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {0x5832, 0x24, 0, 0}, {0x5833, 0x26, 0, 0}, {0x5834, 0x24, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {0x5835, 0x22, 0, 0}, {0x5836, 0x22, 0, 0}, {0x5837, 0x26, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {0x5838, 0x44, 0, 0}, {0x5839, 0x24, 0, 0}, {0x583a, 0x26, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {0x583b, 0x28, 0, 0}, {0x583c, 0x42, 0, 0}, {0x583d, 0xce, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {0x5025, 0x00, 0, 0}, {0x3a0f, 0x30, 0, 0}, {0x3a10, 0x28, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) {0x3a1b, 0x30, 0, 0}, {0x3a1e, 0x26, 0, 0}, {0x3a11, 0x60, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) {0x3a1f, 0x14, 0, 0}, {0x3008, 0x02, 0, 0}, {0x3c00, 0x04, 0, 300},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) static const struct reg_value ov5640_setting_VGA_640_480[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static const struct reg_value ov5640_setting_XGA_1024_768[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) static const struct reg_value ov5640_setting_QVGA_320_240[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) static const struct reg_value ov5640_setting_QCIF_176_144[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) static const struct reg_value ov5640_setting_NTSC_720_480[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x3c, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) static const struct reg_value ov5640_setting_PAL_720_576[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {0x3802, 0x00, 0, 0}, {0x3803, 0x04, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9b, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {0x3811, 0x38, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) {0x3824, 0x02, 0, 0}, {0x5001, 0xa3, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) static const struct reg_value ov5640_setting_720P_1280_720[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) {0x3c07, 0x07, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) {0x3814, 0x31, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) {0x3815, 0x31, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {0x3802, 0x00, 0, 0}, {0x3803, 0xfa, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {0x3805, 0x3f, 0, 0}, {0x3806, 0x06, 0, 0}, {0x3807, 0xa9, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) {0x3618, 0x00, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {0x3709, 0x52, 0, 0}, {0x370c, 0x03, 0, 0}, {0x3a02, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {0x3a03, 0xe4, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0xbc, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) {0x3a0a, 0x01, 0, 0}, {0x3a0b, 0x72, 0, 0}, {0x3a0e, 0x01, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) {0x3a0d, 0x02, 0, 0}, {0x3a14, 0x02, 0, 0}, {0x3a15, 0xe4, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {0x4001, 0x02, 0, 0}, {0x4004, 0x02, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) {0x4407, 0x04, 0, 0}, {0x460b, 0x37, 0, 0}, {0x460c, 0x20, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) {0x3824, 0x04, 0, 0}, {0x5001, 0x83, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) static const struct reg_value ov5640_setting_1080P_1920_1080[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {0x3814, 0x11, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {0x3815, 0x11, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) {0x3802, 0x00, 0, 0}, {0x3803, 0x00, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9f, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) {0x3618, 0x04, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x21, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {0x3709, 0x12, 0, 0}, {0x370c, 0x00, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) {0x4001, 0x02, 0, 0}, {0x4004, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {0x3824, 0x02, 0, 0}, {0x5001, 0x83, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) {0x3c07, 0x07, 0, 0}, {0x3c08, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) {0x3800, 0x01, 0, 0}, {0x3801, 0x50, 0, 0}, {0x3802, 0x01, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {0x3803, 0xb2, 0, 0}, {0x3804, 0x08, 0, 0}, {0x3805, 0xef, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {0x3806, 0x05, 0, 0}, {0x3807, 0xf1, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) {0x3612, 0x2b, 0, 0}, {0x3708, 0x64, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {0x3a02, 0x04, 0, 0}, {0x3a03, 0x60, 0, 0}, {0x3a08, 0x01, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {0x3a09, 0x50, 0, 0}, {0x3a0a, 0x01, 0, 0}, {0x3a0b, 0x18, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) {0x3a0e, 0x03, 0, 0}, {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {0x3a15, 0x60, 0, 0}, {0x4407, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) {0x460b, 0x37, 0, 0}, {0x460c, 0x20, 0, 0}, {0x3824, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) {0x4005, 0x1a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) static const struct reg_value ov5640_setting_QSXGA_2592_1944[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {0x3c07, 0x08, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) {0x3814, 0x11, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) {0x3815, 0x11, 0, 0}, {0x3800, 0x00, 0, 0}, {0x3801, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {0x3802, 0x00, 0, 0}, {0x3803, 0x00, 0, 0}, {0x3804, 0x0a, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) {0x3805, 0x3f, 0, 0}, {0x3806, 0x07, 0, 0}, {0x3807, 0x9f, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) {0x3810, 0x00, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) {0x3811, 0x10, 0, 0}, {0x3812, 0x00, 0, 0}, {0x3813, 0x04, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {0x3618, 0x04, 0, 0}, {0x3612, 0x29, 0, 0}, {0x3708, 0x21, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) {0x3709, 0x12, 0, 0}, {0x370c, 0x00, 0, 0}, {0x3a02, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) {0x3a03, 0xd8, 0, 0}, {0x3a08, 0x01, 0, 0}, {0x3a09, 0x27, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) {0x3a0a, 0x00, 0, 0}, {0x3a0b, 0xf6, 0, 0}, {0x3a0e, 0x03, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x03, 0, 0}, {0x3a15, 0xd8, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {0x4001, 0x02, 0, 0}, {0x4004, 0x06, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) {0x4407, 0x04, 0, 0}, {0x460b, 0x35, 0, 0}, {0x460c, 0x22, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) {0x3824, 0x02, 0, 0}, {0x5001, 0x83, 0, 70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) /* power-on sensor init reg table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) static const struct ov5640_mode_info ov5640_mode_init_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 0, SUBSAMPLING, 640, 1896, 480, 984,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) ov5640_init_setting_30fps_VGA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) ARRAY_SIZE(ov5640_init_setting_30fps_VGA),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) OV5640_30_FPS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) static const struct ov5640_mode_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) ov5640_mode_data[OV5640_NUM_MODES] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {OV5640_MODE_QCIF_176_144, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 176, 1896, 144, 984,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) ov5640_setting_QCIF_176_144,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) ARRAY_SIZE(ov5640_setting_QCIF_176_144),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) {OV5640_MODE_QVGA_320_240, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 320, 1896, 240, 984,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) ov5640_setting_QVGA_320_240,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) ARRAY_SIZE(ov5640_setting_QVGA_320_240),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) {OV5640_MODE_VGA_640_480, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 640, 1896, 480, 1080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) ov5640_setting_VGA_640_480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) ARRAY_SIZE(ov5640_setting_VGA_640_480),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) OV5640_60_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {OV5640_MODE_NTSC_720_480, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 720, 1896, 480, 984,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) ov5640_setting_NTSC_720_480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) ARRAY_SIZE(ov5640_setting_NTSC_720_480),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {OV5640_MODE_PAL_720_576, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 720, 1896, 576, 984,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) ov5640_setting_PAL_720_576,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) ARRAY_SIZE(ov5640_setting_PAL_720_576),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {OV5640_MODE_XGA_1024_768, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 1024, 1896, 768, 1080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ov5640_setting_XGA_1024_768,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) ARRAY_SIZE(ov5640_setting_XGA_1024_768),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {OV5640_MODE_720P_1280_720, SUBSAMPLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 1280, 1892, 720, 740,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) ov5640_setting_720P_1280_720,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) ARRAY_SIZE(ov5640_setting_720P_1280_720),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) {OV5640_MODE_1080P_1920_1080, SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 1920, 2500, 1080, 1120,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) ov5640_setting_1080P_1920_1080,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) ARRAY_SIZE(ov5640_setting_1080P_1920_1080),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) OV5640_30_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) {OV5640_MODE_QSXGA_2592_1944, SCALING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 2592, 2844, 1944, 1968,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) ov5640_setting_QSXGA_2592_1944,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) ARRAY_SIZE(ov5640_setting_QSXGA_2592_1944),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) OV5640_15_FPS},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) static int ov5640_init_slave_id(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct i2c_msg msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) u8 buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (client->addr == OV5640_DEFAULT_SLAVE_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) buf[0] = OV5640_REG_SLAVE_ID >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) buf[1] = OV5640_REG_SLAVE_ID & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) buf[2] = client->addr << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) msg.addr = OV5640_DEFAULT_SLAVE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) msg.flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) msg.buf = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) msg.len = sizeof(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) ret = i2c_transfer(client->adapter, &msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) dev_err(&client->dev, "%s: failed with %d\n", __func__, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) static int ov5640_write_reg(struct ov5640_dev *sensor, u16 reg, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct i2c_msg msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) u8 buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) buf[0] = reg >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) buf[1] = reg & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) buf[2] = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) msg.addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) msg.flags = client->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) msg.buf = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) msg.len = sizeof(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) ret = i2c_transfer(client->adapter, &msg, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) dev_err(&client->dev, "%s: error: reg=%x, val=%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) __func__, reg, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) static int ov5640_read_reg(struct ov5640_dev *sensor, u16 reg, u8 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) struct i2c_msg msg[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) u8 buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) buf[0] = reg >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) buf[1] = reg & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) msg[0].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) msg[0].flags = client->flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) msg[0].buf = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) msg[0].len = sizeof(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) msg[1].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) msg[1].flags = client->flags | I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) msg[1].buf = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) msg[1].len = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) ret = i2c_transfer(client->adapter, msg, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) dev_err(&client->dev, "%s: error: reg=%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) __func__, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) *val = buf[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) static int ov5640_read_reg16(struct ov5640_dev *sensor, u16 reg, u16 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) u8 hi, lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) ret = ov5640_read_reg(sensor, reg, &hi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) ret = ov5640_read_reg(sensor, reg + 1, &lo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) *val = ((u16)hi << 8) | (u16)lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) static int ov5640_write_reg16(struct ov5640_dev *sensor, u16 reg, u16 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) ret = ov5640_write_reg(sensor, reg, val >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) return ov5640_write_reg(sensor, reg + 1, val & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static int ov5640_mod_reg(struct ov5640_dev *sensor, u16 reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) u8 mask, u8 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) u8 readval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) ret = ov5640_read_reg(sensor, reg, &readval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) readval &= ~mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) val &= mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) val |= readval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) return ov5640_write_reg(sensor, reg, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) * After trying the various combinations, reading various
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) * documentations spread around the net, and from the various
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * feedback, the clock tree is probably as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * +--------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * | Ext. Clock |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * +-+------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * | +----------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * +->| PLL1 | - reg 0x3036, for the multiplier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * +-+--------+ - reg 0x3037, bits 0-3 for the pre-divider
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * | +--------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * +->| System Clock | - reg 0x3035, bits 4-7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) * +-+------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * | +--------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) * +->| MIPI Divider | - reg 0x3035, bits 0-3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) * | +-+------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) * | +----------------> MIPI SCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) * | + +-----+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) * | +->| / 2 |-------> MIPI BIT CLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) * | +-----+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) * | +--------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * +->| PLL Root Div | - reg 0x3037, bit 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) * +-+------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) * | +---------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * +->| Bit Div | - reg 0x3034, bits 0-3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * +-+-------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * | +-------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * +->| SCLK Div | - reg 0x3108, bits 0-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * | +-+-----------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * | +---------------> SCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * | +-------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * +->| SCLK 2X Div | - reg 0x3108, bits 2-3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * | +-+-----------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * | +---------------> SCLK 2X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * | +-------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) * +->| PCLK Div | - reg 0x3108, bits 4-5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) * ++------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) * + +-----------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) * +->| P_DIV | - reg 0x3035, bits 0-3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) * +-----+-----+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) * +------------> PCLK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) * This is deviating from the datasheet at least for the register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) * 0x3108, since it's said here that the PCLK would be clocked from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) * the PLL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) * There seems to be also (unverified) constraints:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * - the PLL pre-divider output rate should be in the 4-27MHz range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) * - the PLL multiplier output rate should be in the 500-1000MHz range
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * - PCLK >= SCLK * 2 in YUV, >= SCLK in Raw or JPEG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) * In the two latter cases, these constraints are met since our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * factors are hardcoded. If we were to change that, we would need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) * take this into account. The only varying parts are the PLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) * multiplier and the system clock divider, which are shared between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) * all these clocks so won't cause any issue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) * This is supposed to be ranging from 1 to 8, but the value is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) * set to 3 in the vendor kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) #define OV5640_PLL_PREDIV 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) #define OV5640_PLL_MULT_MIN 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) #define OV5640_PLL_MULT_MAX 252
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) * This is supposed to be ranging from 1 to 16, but the value is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) * always set to either 1 or 2 in the vendor kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) #define OV5640_SYSDIV_MIN 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) #define OV5640_SYSDIV_MAX 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) * Hardcode these values for scaler and non-scaler modes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) * FIXME: to be re-calcualted for 1 data lanes setups
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) #define OV5640_MIPI_DIV_PCLK 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) #define OV5640_MIPI_DIV_SCLK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * This is supposed to be ranging from 1 to 2, but the value is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * set to 2 in the vendor kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) #define OV5640_PLL_ROOT_DIV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) #define OV5640_PLL_CTRL3_PLL_ROOT_DIV_2 BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) * We only supports 8-bit formats at the moment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) #define OV5640_BIT_DIV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) #define OV5640_PLL_CTRL0_MIPI_MODE_8BIT 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) * This is supposed to be ranging from 1 to 8, but the value is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) * set to 2 in the vendor kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) #define OV5640_SCLK_ROOT_DIV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * This is hardcoded so that the consistency is maintained between SCLK and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * SCLK 2x.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) #define OV5640_SCLK2X_ROOT_DIV (OV5640_SCLK_ROOT_DIV / 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) * This is supposed to be ranging from 1 to 8, but the value is always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) * set to 1 in the vendor kernels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) #define OV5640_PCLK_ROOT_DIV 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) #define OV5640_PLL_SYS_ROOT_DIVIDER_BYPASS 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) static unsigned long ov5640_compute_sys_clk(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) u8 pll_prediv, u8 pll_mult,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) u8 sysdiv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) unsigned long sysclk = sensor->xclk_freq / pll_prediv * pll_mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) /* PLL1 output cannot exceed 1GHz. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if (sysclk / 1000000 > 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return sysclk / sysdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) static unsigned long ov5640_calc_sys_clk(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) u8 *pll_prediv, u8 *pll_mult,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) u8 *sysdiv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) unsigned long best = ~0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) u8 best_sysdiv = 1, best_mult = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) u8 _sysdiv, _pll_mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) for (_sysdiv = OV5640_SYSDIV_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) _sysdiv <= OV5640_SYSDIV_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) _sysdiv++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) for (_pll_mult = OV5640_PLL_MULT_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) _pll_mult <= OV5640_PLL_MULT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) _pll_mult++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) unsigned long _rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) * The PLL multiplier cannot be odd if above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * 127.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) if (_pll_mult > 127 && (_pll_mult % 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) _rate = ov5640_compute_sys_clk(sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) OV5640_PLL_PREDIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) _pll_mult, _sysdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) * We have reached the maximum allowed PLL1 output,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) * increase sysdiv.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) if (!_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) * Prefer rates above the expected clock rate than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) * below, even if that means being less precise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) if (_rate < rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) if (abs(rate - _rate) < abs(rate - best)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) best = _rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) best_sysdiv = _sysdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) best_mult = _pll_mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (_rate == rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) *sysdiv = best_sysdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) *pll_prediv = OV5640_PLL_PREDIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) *pll_mult = best_mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) return best;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) * ov5640_set_mipi_pclk() - Calculate the clock tree configuration values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) * for the MIPI CSI-2 output.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) * @rate: The requested bandwidth per lane in bytes per second.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * 'Bandwidth Per Lane' is calculated as:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) * bpl = HTOT * VTOT * FPS * bpp / num_lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) * This function use the requested bandwidth to calculate:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * - sample_rate = bpl / (bpp / num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) * = bpl / (PLL_RDIV * BIT_DIV * PCLK_DIV * MIPI_DIV / num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) * - mipi_sclk = bpl / MIPI_DIV / 2; ( / 2 is for CSI-2 DDR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * with these fixed parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) * PLL_RDIV = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) * BIT_DIVIDER = 2; (MIPI_BIT_MODE == 8 ? 2 : 2,5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) * PCLK_DIV = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * The MIPI clock generation differs for modes that use the scaler and modes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) * that do not. In case the scaler is in use, the MIPI_SCLK generates the MIPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) * BIT CLk, and thus:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) * - mipi_sclk = bpl / MIPI_DIV / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) * MIPI_DIV = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) * For modes that do not go through the scaler, the MIPI BIT CLOCK is generated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) * from the pixel clock, and thus:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) * - sample_rate = bpl / (bpp / num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) * = bpl / (2 * 2 * 1 * MIPI_DIV / num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) * = bpl / (4 * MIPI_DIV / num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) * - MIPI_DIV = bpp / (4 * num_lanes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) * FIXME: this have been tested with 16bpp and 2 lanes setup only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) * MIPI_DIV is fixed to value 2, but it -might- be changed according to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) * above formula for setups with 1 lane or image formats with different bpp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) * FIXME: this deviates from the sensor manual documentation which is quite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) * thin on the MIPI clock tree generation part.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) static int ov5640_set_mipi_pclk(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) unsigned long rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) const struct ov5640_mode_info *mode = sensor->current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) u8 prediv, mult, sysdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) u8 mipi_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * 1280x720 is reported to use 'SUBSAMPLING' only,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) * but according to the sensor manual it goes through the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) * scaler before subsampling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) if (mode->dn_mode == SCALING ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) (mode->id == OV5640_MODE_720P_1280_720))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) mipi_div = OV5640_MIPI_DIV_SCLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) mipi_div = OV5640_MIPI_DIV_PCLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) ov5640_calc_sys_clk(sensor, rate, &prediv, &mult, &sysdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) 0x0f, OV5640_PLL_CTRL0_MIPI_MODE_8BIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) 0xff, sysdiv << 4 | mipi_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2, 0xff, mult);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) 0x1f, OV5640_PLL_CTRL3_PLL_ROOT_DIV_2 | prediv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) 0x30, OV5640_PLL_SYS_ROOT_DIVIDER_BYPASS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) static unsigned long ov5640_calc_pclk(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) u8 *pll_prediv, u8 *pll_mult, u8 *sysdiv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) u8 *pll_rdiv, u8 *bit_div, u8 *pclk_div)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) unsigned long _rate = rate * OV5640_PLL_ROOT_DIV * OV5640_BIT_DIV *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) OV5640_PCLK_ROOT_DIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) _rate = ov5640_calc_sys_clk(sensor, _rate, pll_prediv, pll_mult,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) sysdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) *pll_rdiv = OV5640_PLL_ROOT_DIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) *bit_div = OV5640_BIT_DIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) *pclk_div = OV5640_PCLK_ROOT_DIV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) return _rate / *pll_rdiv / *bit_div / *pclk_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) static int ov5640_set_dvp_pclk(struct ov5640_dev *sensor, unsigned long rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) u8 prediv, mult, sysdiv, pll_rdiv, bit_div, pclk_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) ov5640_calc_pclk(sensor, rate, &prediv, &mult, &sysdiv, &pll_rdiv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) &bit_div, &pclk_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) if (bit_div == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) bit_div = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 0x0f, bit_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) * We need to set sysdiv according to the clock, and to clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) * the MIPI divider.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 0xff, sysdiv << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 0xff, mult);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) ret = ov5640_mod_reg(sensor, OV5640_REG_SC_PLL_CTRL3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 0x1f, prediv | ((pll_rdiv - 1) << 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) return ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) (ilog2(pclk_div) << 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) /* set JPEG framing sizes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) static int ov5640_set_jpeg_timings(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) const struct ov5640_mode_info *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) * compression mode 3 timing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) * Data is transmitted with programmable width (VFIFO_HSIZE).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) * No padding done. Last line may have less data. Varying
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) * number of lines per frame, depending on amount of data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) ret = ov5640_mod_reg(sensor, OV5640_REG_JPG_MODE_SELECT, 0x7, 0x3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) ret = ov5640_write_reg16(sensor, OV5640_REG_VFIFO_HSIZE, mode->hact);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) return ov5640_write_reg16(sensor, OV5640_REG_VFIFO_VSIZE, mode->vact);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) /* download ov5640 settings to sensor through i2c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) static int ov5640_set_timings(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) const struct ov5640_mode_info *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) if (sensor->fmt.code == MEDIA_BUS_FMT_JPEG_1X8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) ret = ov5640_set_jpeg_timings(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPHO, mode->hact);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_DVPVO, mode->vact);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) ret = ov5640_write_reg16(sensor, OV5640_REG_TIMING_HTS, mode->htot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, mode->vtot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) static int ov5640_load_regs(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) const struct ov5640_mode_info *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) const struct reg_value *regs = mode->reg_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) u32 delay_ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) u16 reg_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) u8 mask, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) for (i = 0; i < mode->reg_data_size; ++i, ++regs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) delay_ms = regs->delay_ms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) reg_addr = regs->reg_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) val = regs->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) mask = regs->mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) /* remain in power down mode for DVP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) if (regs->reg_addr == OV5640_REG_SYS_CTRL0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) val == OV5640_REG_SYS_CTRL0_SW_PWUP &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) ret = ov5640_mod_reg(sensor, reg_addr, mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) ret = ov5640_write_reg(sensor, reg_addr, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (delay_ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) usleep_range(1000 * delay_ms, 1000 * delay_ms + 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) return ov5640_set_timings(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) static int ov5640_set_autoexposure(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) BIT(0), on ? 0 : BIT(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) /* read exposure, in number of line periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) static int ov5640_get_exposure(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) int exp, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) u8 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_HI, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) exp = ((int)temp & 0x0f) << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_MED, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) exp |= ((int)temp << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) ret = ov5640_read_reg(sensor, OV5640_REG_AEC_PK_EXPOSURE_LO, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) exp |= (int)temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) return exp >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) /* write exposure, given number of line periods */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) static int ov5640_set_exposure(struct ov5640_dev *sensor, u32 exposure)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) exposure <<= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) ret = ov5640_write_reg(sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) OV5640_REG_AEC_PK_EXPOSURE_LO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) exposure & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) ret = ov5640_write_reg(sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) OV5640_REG_AEC_PK_EXPOSURE_MED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) (exposure >> 8) & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) return ov5640_write_reg(sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) OV5640_REG_AEC_PK_EXPOSURE_HI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) (exposure >> 16) & 0x0f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) static int ov5640_get_gain(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) u16 gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN, &gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) return gain & 0x3ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) static int ov5640_set_gain(struct ov5640_dev *sensor, int gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) return ov5640_write_reg16(sensor, OV5640_REG_AEC_PK_REAL_GAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) (u16)gain & 0x3ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) static int ov5640_set_autogain(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return ov5640_mod_reg(sensor, OV5640_REG_AEC_PK_MANUAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) BIT(1), on ? 0 : BIT(1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) static int ov5640_set_stream_dvp(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) return ov5640_write_reg(sensor, OV5640_REG_SYS_CTRL0, on ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) OV5640_REG_SYS_CTRL0_SW_PWUP :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) OV5640_REG_SYS_CTRL0_SW_PWDN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) static int ov5640_set_stream_mipi(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * Enable/disable the MIPI interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * 0x300e = on ? 0x45 : 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) * FIXME: the sensor manual (version 2.03) reports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * [7:5] = 000 : 1 data lane mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * [7:5] = 001 : 2 data lanes mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) * But this settings do not work, while the following ones
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) * have been validated for 2 data lanes mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) * [7:5] = 010 : 2 data lanes mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) * [4] = 0 : Power up MIPI HS Tx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * [3] = 0 : Power up MIPI LS Rx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) * [2] = 1/0 : MIPI interface enable/disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) * [1:0] = 01/00: FIXME: 'debug'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) on ? 0x45 : 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) return ov5640_write_reg(sensor, OV5640_REG_FRAME_CTRL01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) on ? 0x00 : 0x0f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) static int ov5640_get_sysclk(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) /* calculate sysclk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) u32 xvclk = sensor->xclk_freq / 10000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) u32 multiplier, prediv, VCO, sysdiv, pll_rdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) u32 sclk_rdiv_map[] = {1, 2, 4, 8};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) u32 bit_div2x = 1, sclk_rdiv, sysclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) u8 temp1, temp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL0, &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) temp2 = temp1 & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) if (temp2 == 8 || temp2 == 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) bit_div2x = temp2 / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL1, &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) sysdiv = temp1 >> 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) if (sysdiv == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) sysdiv = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL2, &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) multiplier = temp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) ret = ov5640_read_reg(sensor, OV5640_REG_SC_PLL_CTRL3, &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) prediv = temp1 & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) pll_rdiv = ((temp1 >> 4) & 0x01) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) ret = ov5640_read_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) temp2 = temp1 & 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) sclk_rdiv = sclk_rdiv_map[temp2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) if (!prediv || !sysdiv || !pll_rdiv || !bit_div2x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) VCO = xvclk * multiplier / prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) sysclk = VCO / sysdiv / pll_rdiv * 2 / bit_div2x / sclk_rdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) return sysclk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) static int ov5640_set_night_mode(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /* read HTS from register settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) u8 mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) ret = ov5640_read_reg(sensor, OV5640_REG_AEC_CTRL00, &mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) mode &= 0xfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL00, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) static int ov5640_get_hts(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) /* read HTS from register settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) u16 hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_HTS, &hts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) return hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) static int ov5640_get_vts(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) u16 vts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) ret = ov5640_read_reg16(sensor, OV5640_REG_TIMING_VTS, &vts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) return vts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) static int ov5640_set_vts(struct ov5640_dev *sensor, int vts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) return ov5640_write_reg16(sensor, OV5640_REG_TIMING_VTS, vts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) static int ov5640_get_light_freq(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) /* get banding filter value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) int ret, light_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) u8 temp, temp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL01, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (temp & 0x80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) /* manual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) ret = ov5640_read_reg(sensor, OV5640_REG_HZ5060_CTRL00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) if (temp1 & 0x04) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) /* 50Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) light_freq = 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) /* 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) light_freq = 60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) /* auto */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) ret = ov5640_read_reg(sensor, OV5640_REG_SIGMADELTA_CTRL0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) &temp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) if (temp1 & 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) /* 50Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) light_freq = 50;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) /* 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) return light_freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) static int ov5640_set_bandingfilter(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) u32 band_step60, max_band60, band_step50, max_band50, prev_vts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /* read preview PCLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) ret = ov5640_get_sysclk(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) sensor->prev_sysclk = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) /* read preview HTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) ret = ov5640_get_hts(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) sensor->prev_hts = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) /* read preview VTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) ret = ov5640_get_vts(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) prev_vts = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) /* calculate banding filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) /* 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) band_step60 = sensor->prev_sysclk * 100 / sensor->prev_hts * 100 / 120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B60_STEP, band_step60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) if (!band_step60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) max_band60 = (int)((prev_vts - 4) / band_step60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0D, max_band60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) /* 50Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) band_step50 = sensor->prev_sysclk * 100 / sensor->prev_hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) ret = ov5640_write_reg16(sensor, OV5640_REG_AEC_B50_STEP, band_step50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) if (!band_step50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) max_band50 = (int)((prev_vts - 4) / band_step50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0E, max_band50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) static int ov5640_set_ae_target(struct ov5640_dev *sensor, int target)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) /* stable in high */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) u32 fast_high, fast_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) sensor->ae_low = target * 23 / 25; /* 0.92 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) sensor->ae_high = target * 27 / 25; /* 1.08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) fast_high = sensor->ae_high << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) if (fast_high > 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) fast_high = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) fast_low = sensor->ae_low >> 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL0F, sensor->ae_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL10, sensor->ae_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1B, sensor->ae_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1E, sensor->ae_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) ret = ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL11, fast_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) return ov5640_write_reg(sensor, OV5640_REG_AEC_CTRL1F, fast_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) static int ov5640_get_binning(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) u8 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) ret = ov5640_read_reg(sensor, OV5640_REG_TIMING_TC_REG21, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) return temp & BIT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) static int ov5640_set_binning(struct ov5640_dev *sensor, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) * TIMING TC REG21:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) * - [0]: Horizontal binning enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) BIT(0), enable ? BIT(0) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * TIMING TC REG20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) * - [0]: Undocumented, but hardcoded init sequences
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) * are always setting REG21/REG20 bit 0 to same value...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) BIT(0), enable ? BIT(0) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) static int ov5640_set_virtual_channel(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) u8 temp, channel = virtual_channel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) if (channel > 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) "%s: wrong virtual_channel parameter, expected (0..3), got %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) __func__, channel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) ret = ov5640_read_reg(sensor, OV5640_REG_DEBUG_MODE, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) temp &= ~(3 << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) temp |= (channel << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) return ov5640_write_reg(sensor, OV5640_REG_DEBUG_MODE, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) static const struct ov5640_mode_info *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) int width, int height, bool nearest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) const struct ov5640_mode_info *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) mode = v4l2_find_nearest_size(ov5640_mode_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) ARRAY_SIZE(ov5640_mode_data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) hact, vact,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) width, height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) if (!mode ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) (!nearest && (mode->hact != width || mode->vact != height)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) /* Check to see if the current mode exceeds the max frame rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) if (ov5640_framerates[fr] > ov5640_framerates[mode->max_fps])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) return mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) static u64 ov5640_calc_pixel_rate(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) u64 rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) rate = sensor->current_mode->vtot * sensor->current_mode->htot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) rate *= ov5640_framerates[sensor->current_fr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) * sensor changes between scaling and subsampling, go through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) * exposure calculation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) static int ov5640_set_mode_exposure_calc(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) const struct ov5640_mode_info *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) u32 prev_shutter, prev_gain16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) u32 cap_shutter, cap_gain16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) u32 cap_sysclk, cap_hts, cap_vts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) u32 light_freq, cap_bandfilt, cap_maxband;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) u32 cap_gain16_shutter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) u8 average;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) if (!mode->reg_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) /* read preview shutter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) ret = ov5640_get_exposure(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) prev_shutter = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) ret = ov5640_get_binning(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) if (ret && mode->id != OV5640_MODE_720P_1280_720 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) mode->id != OV5640_MODE_1080P_1920_1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) prev_shutter *= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) /* read preview gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) ret = ov5640_get_gain(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) prev_gain16 = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) /* get average */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) ret = ov5640_read_reg(sensor, OV5640_REG_AVG_READOUT, &average);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) /* turn off night mode for capture */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) ret = ov5640_set_night_mode(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) /* Write capture setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) ret = ov5640_load_regs(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) /* read capture VTS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) ret = ov5640_get_vts(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) cap_vts = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) ret = ov5640_get_hts(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) cap_hts = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) ret = ov5640_get_sysclk(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) cap_sysclk = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) /* calculate capture banding filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) ret = ov5640_get_light_freq(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) light_freq = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) if (light_freq == 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) /* 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) cap_bandfilt = cap_sysclk * 100 / cap_hts * 100 / 120;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) /* 50Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) cap_bandfilt = cap_sysclk * 100 / cap_hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (!sensor->prev_sysclk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) ret = ov5640_get_sysclk(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) sensor->prev_sysclk = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) if (!cap_bandfilt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) cap_maxband = (int)((cap_vts - 4) / cap_bandfilt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) /* calculate capture shutter/gain16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (average > sensor->ae_low && average < sensor->ae_high) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) /* in stable range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) cap_gain16_shutter =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) prev_gain16 * prev_shutter *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) cap_sysclk / sensor->prev_sysclk *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) sensor->prev_hts / cap_hts *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) sensor->ae_target / average;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) cap_gain16_shutter =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) prev_gain16 * prev_shutter *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) cap_sysclk / sensor->prev_sysclk *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) sensor->prev_hts / cap_hts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) /* gain to shutter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) if (cap_gain16_shutter < (cap_bandfilt * 16)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) /* shutter < 1/100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) cap_shutter = cap_gain16_shutter / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) if (cap_shutter < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) cap_shutter = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) cap_gain16 = cap_gain16_shutter / cap_shutter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (cap_gain16 < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) cap_gain16 = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) if (cap_gain16_shutter > (cap_bandfilt * cap_maxband * 16)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /* exposure reach max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) cap_shutter = cap_bandfilt * cap_maxband;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) if (!cap_shutter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) cap_gain16 = cap_gain16_shutter / cap_shutter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) /* 1/100 < (cap_shutter = n/100) =< max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) cap_shutter =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) ((int)(cap_gain16_shutter / 16 / cap_bandfilt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) * cap_bandfilt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (!cap_shutter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) cap_gain16 = cap_gain16_shutter / cap_shutter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) /* set capture gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) ret = ov5640_set_gain(sensor, cap_gain16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) /* write capture shutter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) if (cap_shutter > (cap_vts - 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) cap_vts = cap_shutter + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) ret = ov5640_set_vts(sensor, cap_vts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) /* set exposure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) return ov5640_set_exposure(sensor, cap_shutter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) * if sensor changes inside scaling or subsampling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) * change mode directly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) static int ov5640_set_mode_direct(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) const struct ov5640_mode_info *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) if (!mode->reg_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) /* Write capture setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) return ov5640_load_regs(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) static int ov5640_set_mode(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) const struct ov5640_mode_info *mode = sensor->current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) const struct ov5640_mode_info *orig_mode = sensor->last_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) enum ov5640_downsize_mode dn_mode, orig_dn_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) bool auto_gain = sensor->ctrls.auto_gain->val == 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) bool auto_exp = sensor->ctrls.auto_exp->val == V4L2_EXPOSURE_AUTO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) unsigned long rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) dn_mode = mode->dn_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) orig_dn_mode = orig_mode->dn_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) /* auto gain and exposure must be turned off when changing modes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) if (auto_gain) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) ret = ov5640_set_autogain(sensor, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) if (auto_exp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) ret = ov5640_set_autoexposure(sensor, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) goto restore_auto_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) * All the formats we support have 16 bits per pixel, seems to require
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) * the same rate than YUV, so we can just use 16 bpp all the time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) rate = ov5640_calc_pixel_rate(sensor) * 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) rate = rate / sensor->ep.bus.mipi_csi2.num_data_lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) ret = ov5640_set_mipi_pclk(sensor, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) rate = rate / sensor->ep.bus.parallel.bus_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) ret = ov5640_set_dvp_pclk(sensor, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) if ((dn_mode == SUBSAMPLING && orig_dn_mode == SCALING) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) (dn_mode == SCALING && orig_dn_mode == SUBSAMPLING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) * change between subsampling and scaling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) * go through exposure calculation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) ret = ov5640_set_mode_exposure_calc(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) * change inside subsampling or scaling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) * download firmware directly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) ret = ov5640_set_mode_direct(sensor, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) goto restore_auto_exp_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) /* restore auto gain and exposure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) if (auto_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) ov5640_set_autogain(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) if (auto_exp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) ov5640_set_autoexposure(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) ret = ov5640_set_binning(sensor, dn_mode != SCALING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) ret = ov5640_set_ae_target(sensor, sensor->ae_target);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) ret = ov5640_get_light_freq(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) ret = ov5640_set_bandingfilter(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) ret = ov5640_set_virtual_channel(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) sensor->pending_mode_change = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) sensor->last_mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) restore_auto_exp_gain:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) if (auto_exp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) ov5640_set_autoexposure(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) restore_auto_gain:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) if (auto_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) ov5640_set_autogain(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) static int ov5640_set_framefmt(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) struct v4l2_mbus_framefmt *format);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) /* restore the last set video mode after chip power-on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) static int ov5640_restore_mode(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) /* first load the initial register values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) ret = ov5640_load_regs(sensor, &ov5640_mode_init_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) sensor->last_mode = &ov5640_mode_init_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_ROOT_DIVIDER, 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) (ilog2(OV5640_SCLK2X_ROOT_DIV) << 2) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) ilog2(OV5640_SCLK_ROOT_DIV));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) /* now restore the last capture mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) ret = ov5640_set_mode(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) return ov5640_set_framefmt(sensor, &sensor->fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) static void ov5640_power(struct ov5640_dev *sensor, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) gpiod_set_value_cansleep(sensor->pwdn_gpio, enable ? 0 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) static void ov5640_reset(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) if (!sensor->reset_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) gpiod_set_value_cansleep(sensor->reset_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) /* camera power cycle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) ov5640_power(sensor, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) usleep_range(5000, 10000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) ov5640_power(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) usleep_range(5000, 10000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) gpiod_set_value_cansleep(sensor->reset_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) gpiod_set_value_cansleep(sensor->reset_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) usleep_range(20000, 25000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) static int ov5640_set_power_on(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) ret = clk_prepare_enable(sensor->xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) dev_err(&client->dev, "%s: failed to enable clock\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) ret = regulator_bulk_enable(OV5640_NUM_SUPPLIES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) sensor->supplies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) dev_err(&client->dev, "%s: failed to enable regulators\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) goto xclk_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) ov5640_reset(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) ov5640_power(sensor, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) ret = ov5640_init_slave_id(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) power_off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) ov5640_power(sensor, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) xclk_off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) clk_disable_unprepare(sensor->xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) static void ov5640_set_power_off(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) ov5640_power(sensor, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) regulator_bulk_disable(OV5640_NUM_SUPPLIES, sensor->supplies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) clk_disable_unprepare(sensor->xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) static int ov5640_set_power_mipi(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) if (!on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) /* Reset MIPI bus settings to their default values. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x04);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) * Power up MIPI HS Tx and LS Rx; 2 data lanes mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) * 0x300e = 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) * [7:5] = 010 : 2 data lanes mode (see FIXME note in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) * "ov5640_set_stream_mipi()")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) * [4] = 0 : Power up MIPI HS Tx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) * [3] = 0 : Power up MIPI LS Rx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) * [2] = 0 : MIPI interface disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) * Gate clock and set LP11 in 'no packets mode' (idle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) * 0x4800 = 0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) * [5] = 1 : Gate clock when 'no packets'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) * [2] = 1 : MIPI bus in LP11 when 'no packets'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) ret = ov5640_write_reg(sensor, OV5640_REG_MIPI_CTRL00, 0x24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) * Set data lanes and clock in LP11 when 'sleeping'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) * 0x3019 = 0x70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) * [6] = 1 : MIPI data lane 2 in LP11 when 'sleeping'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) * [5] = 1 : MIPI data lane 1 in LP11 when 'sleeping'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) * [4] = 1 : MIPI clock lane in LP11 when 'sleeping'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT00, 0x70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) /* Give lanes some time to coax into LP11 state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) usleep_range(500, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) static int ov5640_set_power_dvp(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) unsigned int flags = sensor->ep.bus.parallel.flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) bool bt656 = sensor->ep.bus_type == V4L2_MBUS_BT656;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) u8 polarities = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) if (!on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) /* Reset settings to their default values. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x58);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) * Note about parallel port configuration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * When configured in parallel mode, the OV5640 will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) * output 10 bits data on DVP data lines [9:0].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) * If only 8 bits data are wanted, the 8 bits data lines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) * of the camera interface must be physically connected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) * on the DVP data lines [9:2].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) * Control lines polarity can be configured through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) * devicetree endpoint control lines properties.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) * If no endpoint control lines properties are set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) * polarity will be as below:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) * - VSYNC: active high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) * - HREF: active low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) * - PCLK: active low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) * VSYNC & HREF are not configured if BT656 bus mode is selected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * BT656 embedded synchronization configuration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) * CCIR656 CTRL00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) * - [7]: SYNC code selection (0: auto generate sync code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) * 1: sync code from regs 0x4732-0x4735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) * - [6]: f value in CCIR656 SYNC code when fixed f value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) * - [5]: Fixed f value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) * - [4:3]: Blank toggle data options (00: data=1'h040/1'h200,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) * 01: data from regs 0x4736-0x4738, 10: always keep 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) * - [1]: Clip data disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) * - [0]: CCIR656 mode enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) * Default CCIR656 SAV/EAV mode with default codes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) * SAV=0xff000080 & EAV=0xff00009d is enabled here with settings:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) * - CCIR656 mode enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) * - auto generation of sync codes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) * - blank toggle data 1'h040/1'h200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) * - clip reserved data (0x00 & 0xff changed to 0x01 & 0xfe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) ret = ov5640_write_reg(sensor, OV5640_REG_CCIR656_CTRL00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) bt656 ? 0x01 : 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) * configure parallel port control lines polarity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) * POLARITY CTRL0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) * - [5]: PCLK polarity (0: active low, 1: active high)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) * - [1]: HREF polarity (0: active low, 1: active high)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) * - [0]: VSYNC polarity (mismatch here between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) * datasheet and hardware, 0 is active high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) * and 1 is active low...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) if (!bt656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) if (flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) polarities |= BIT(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) polarities |= BIT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) polarities |= BIT(5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) ret = ov5640_write_reg(sensor, OV5640_REG_POLARITY_CTRL00, polarities);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) * powerdown MIPI TX/RX PHY & enable DVP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) * MIPI CONTROL 00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) * [4] = 1 : Power down MIPI HS Tx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) * [3] = 1 : Power down MIPI LS Rx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) * [2] = 0 : DVP enable (MIPI disable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) ret = ov5640_write_reg(sensor, OV5640_REG_IO_MIPI_CTRL00, 0x18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) * enable VSYNC/HREF/PCLK DVP control lines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) * & D[9:6] DVP data lines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) * PAD OUTPUT ENABLE 01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * - 6: VSYNC output enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) * - 5: HREF output enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) * - 4: PCLK output enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) * - [3:0]: D[9:6] output enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) ret = ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) bt656 ? 0x1f : 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) * enable D[5:0] DVP data lines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) * PAD OUTPUT ENABLE 02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) * - [7:2]: D[5:0] output enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) return ov5640_write_reg(sensor, OV5640_REG_PAD_OUTPUT_ENABLE02, 0xfc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) static int ov5640_set_power(struct ov5640_dev *sensor, bool on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) if (on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) ret = ov5640_set_power_on(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) ret = ov5640_restore_mode(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) ret = ov5640_set_power_mipi(sensor, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) ret = ov5640_set_power_dvp(sensor, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) if (!on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) ov5640_set_power_off(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) power_off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) ov5640_set_power_off(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) /* --------------- Subdev Operations --------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) static int ov5640_s_power(struct v4l2_subdev *sd, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) * If the power count is modified from 0 to != 0 or from != 0 to 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) * update the power state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) if (sensor->power_count == !on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) ret = ov5640_set_power(sensor, !!on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) /* Update the power count. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) sensor->power_count += on ? 1 : -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) WARN_ON(sensor->power_count < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) if (on && !ret && sensor->power_count == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) /* restore controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) static int ov5640_try_frame_interval(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) struct v4l2_fract *fi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) u32 width, u32 height)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) const struct ov5640_mode_info *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) enum ov5640_frame_rate rate = OV5640_15_FPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) int minfps, maxfps, best_fps, fps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) minfps = ov5640_framerates[OV5640_15_FPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) maxfps = ov5640_framerates[OV5640_60_FPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) if (fi->numerator == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) fi->denominator = maxfps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) fi->numerator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) rate = OV5640_60_FPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) goto find_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) fps = clamp_val(DIV_ROUND_CLOSEST(fi->denominator, fi->numerator),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) minfps, maxfps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) best_fps = minfps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) for (i = 0; i < ARRAY_SIZE(ov5640_framerates); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) int curr_fps = ov5640_framerates[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) if (abs(curr_fps - fps) < abs(best_fps - fps)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) best_fps = curr_fps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) rate = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) fi->numerator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) fi->denominator = best_fps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) find_mode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) mode = ov5640_find_mode(sensor, rate, width, height, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) return mode ? rate : -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) static int ov5640_get_fmt(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) struct v4l2_subdev_format *format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) struct v4l2_mbus_framefmt *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) if (format->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) if (format->which == V4L2_SUBDEV_FORMAT_TRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) fmt = v4l2_subdev_get_try_format(&sensor->sd, cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) format->pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) fmt = &sensor->fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) format->format = *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) static int ov5640_try_fmt_internal(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) struct v4l2_mbus_framefmt *fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) enum ov5640_frame_rate fr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) const struct ov5640_mode_info **new_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) const struct ov5640_mode_info *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) mode = ov5640_find_mode(sensor, fr, fmt->width, fmt->height, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) if (!mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) fmt->width = mode->hact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) fmt->height = mode->vact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) if (new_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) *new_mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) for (i = 0; i < ARRAY_SIZE(ov5640_formats); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) if (ov5640_formats[i].code == fmt->code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) if (i >= ARRAY_SIZE(ov5640_formats))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) fmt->code = ov5640_formats[i].code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) fmt->colorspace = ov5640_formats[i].colorspace;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) static int ov5640_set_fmt(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) struct v4l2_subdev_format *format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) const struct ov5640_mode_info *new_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) struct v4l2_mbus_framefmt *mbus_fmt = &format->format;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) struct v4l2_mbus_framefmt *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) if (format->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) if (sensor->streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) ret = ov5640_try_fmt_internal(sd, mbus_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) sensor->current_fr, &new_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) if (format->which == V4L2_SUBDEV_FORMAT_TRY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) fmt = v4l2_subdev_get_try_format(sd, cfg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) fmt = &sensor->fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) *fmt = *mbus_fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) if (new_mode != sensor->current_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) sensor->current_mode = new_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) sensor->pending_mode_change = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) if (mbus_fmt->code != sensor->fmt.code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) sensor->pending_fmt_change = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) ov5640_calc_pixel_rate(sensor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) static int ov5640_set_framefmt(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) struct v4l2_mbus_framefmt *format)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) bool is_jpeg = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) u8 fmt, mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) switch (format->code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) case MEDIA_BUS_FMT_UYVY8_2X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) /* YUV422, UYVY */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) fmt = 0x3f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) mux = OV5640_FMT_MUX_YUV422;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) case MEDIA_BUS_FMT_YUYV8_2X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) /* YUV422, YUYV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) fmt = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) mux = OV5640_FMT_MUX_YUV422;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) case MEDIA_BUS_FMT_RGB565_2X8_LE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) /* RGB565 {g[2:0],b[4:0]},{r[4:0],g[5:3]} */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) fmt = 0x6F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) mux = OV5640_FMT_MUX_RGB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) case MEDIA_BUS_FMT_RGB565_2X8_BE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) /* RGB565 {r[4:0],g[5:3]},{g[2:0],b[4:0]} */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) fmt = 0x61;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) mux = OV5640_FMT_MUX_RGB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) case MEDIA_BUS_FMT_JPEG_1X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) /* YUV422, YUYV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) fmt = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) mux = OV5640_FMT_MUX_YUV422;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) is_jpeg = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) case MEDIA_BUS_FMT_SBGGR8_1X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) /* Raw, BGBG... / GRGR... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) fmt = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) mux = OV5640_FMT_MUX_RAW_DPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) case MEDIA_BUS_FMT_SGBRG8_1X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) /* Raw bayer, GBGB... / RGRG... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) fmt = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) mux = OV5640_FMT_MUX_RAW_DPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) case MEDIA_BUS_FMT_SGRBG8_1X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) /* Raw bayer, GRGR... / BGBG... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) fmt = 0x02;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) mux = OV5640_FMT_MUX_RAW_DPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) case MEDIA_BUS_FMT_SRGGB8_1X8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) /* Raw bayer, RGRG... / GBGB... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) fmt = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) mux = OV5640_FMT_MUX_RAW_DPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) /* FORMAT CONTROL00: YUV and RGB formatting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) ret = ov5640_write_reg(sensor, OV5640_REG_FORMAT_CONTROL00, fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) /* FORMAT MUX CONTROL: ISP YUV or RGB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) ret = ov5640_write_reg(sensor, OV5640_REG_ISP_FORMAT_MUX_CTRL, mux);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) * TIMING TC REG21:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) * - [5]: JPEG enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) ret = ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) BIT(5), is_jpeg ? BIT(5) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) * SYSTEM RESET02:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) * - [4]: Reset JFIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) * - [3]: Reset SFIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) * - [2]: Reset JPEG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_RESET02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) BIT(4) | BIT(3) | BIT(2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) is_jpeg ? 0 : (BIT(4) | BIT(3) | BIT(2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) * CLOCK ENABLE02:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) * - [5]: Enable JPEG 2x clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) * - [3]: Enable JPEG clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) return ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) BIT(5) | BIT(3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) is_jpeg ? (BIT(5) | BIT(3)) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) * Sensor Controls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) static int ov5640_set_ctrl_hue(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) BIT(0), BIT(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) ret = ov5640_write_reg16(sensor, OV5640_REG_SDE_CTRL1, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) static int ov5640_set_ctrl_contrast(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) BIT(2), BIT(2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) value & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) static int ov5640_set_ctrl_saturation(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) if (value) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) BIT(1), BIT(1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) value & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) ret = ov5640_write_reg(sensor, OV5640_REG_SDE_CTRL4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) value & 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) ret = ov5640_mod_reg(sensor, OV5640_REG_SDE_CTRL0, BIT(1), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) static int ov5640_set_ctrl_white_balance(struct ov5640_dev *sensor, int awb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) ret = ov5640_mod_reg(sensor, OV5640_REG_AWB_MANUAL_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) BIT(0), awb ? 0 : 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) if (!awb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) u16 red = (u16)sensor->ctrls.red_balance->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) u16 blue = (u16)sensor->ctrls.blue_balance->val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_R_GAIN, red);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) ret = ov5640_write_reg16(sensor, OV5640_REG_AWB_B_GAIN, blue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) enum v4l2_exposure_auto_type auto_exposure)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) struct ov5640_ctrls *ctrls = &sensor->ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) bool auto_exp = (auto_exposure == V4L2_EXPOSURE_AUTO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) if (ctrls->auto_exp->is_new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) ret = ov5640_set_autoexposure(sensor, auto_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) if (!auto_exp && ctrls->exposure->is_new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) u16 max_exp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) ret = ov5640_read_reg16(sensor, OV5640_REG_AEC_PK_VTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) &max_exp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) ret = ov5640_get_vts(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) max_exp += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) if (ctrls->exposure->val < max_exp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) ret = ov5640_set_exposure(sensor, ctrls->exposure->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) struct ov5640_ctrls *ctrls = &sensor->ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) if (ctrls->auto_gain->is_new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) ret = ov5640_set_autogain(sensor, auto_gain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) if (!auto_gain && ctrls->gain->is_new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) ret = ov5640_set_gain(sensor, ctrls->gain->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) static const char * const test_pattern_menu[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) "Disabled",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) "Color bars",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) "Color bars w/ rolling bar",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) "Color squares",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) "Color squares w/ rolling bar",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) #define OV5640_TEST_ENABLE BIT(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) #define OV5640_TEST_ROLLING BIT(6) /* rolling horizontal bar */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) #define OV5640_TEST_TRANSPARENT BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) #define OV5640_TEST_SQUARE_BW BIT(4) /* black & white squares */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) #define OV5640_TEST_BAR_STANDARD (0 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) #define OV5640_TEST_BAR_VERT_CHANGE_1 (1 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) #define OV5640_TEST_BAR_HOR_CHANGE (2 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) #define OV5640_TEST_BAR_VERT_CHANGE_2 (3 << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) #define OV5640_TEST_BAR (0 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) #define OV5640_TEST_RANDOM (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) #define OV5640_TEST_SQUARE (2 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) #define OV5640_TEST_BLACK (3 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) static const u8 test_pattern_val[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) OV5640_TEST_ENABLE | OV5640_TEST_BAR_VERT_CHANGE_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) OV5640_TEST_BAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) OV5640_TEST_ENABLE | OV5640_TEST_ROLLING |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) OV5640_TEST_BAR_VERT_CHANGE_1 | OV5640_TEST_BAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) OV5640_TEST_ENABLE | OV5640_TEST_SQUARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) OV5640_TEST_ENABLE | OV5640_TEST_ROLLING | OV5640_TEST_SQUARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) static int ov5640_set_ctrl_test_pattern(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) return ov5640_write_reg(sensor, OV5640_REG_PRE_ISP_TEST_SET1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) test_pattern_val[value]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) static int ov5640_set_ctrl_light_freq(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) ret = ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL01, BIT(7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) (value == V4L2_CID_POWER_LINE_FREQUENCY_AUTO) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) 0 : BIT(7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) return ov5640_mod_reg(sensor, OV5640_REG_HZ5060_CTRL00, BIT(2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) (value == V4L2_CID_POWER_LINE_FREQUENCY_50HZ) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) BIT(2) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) static int ov5640_set_ctrl_hflip(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) * If sensor is mounted upside down, mirror logic is inversed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) * Sensor is a BSI (Back Side Illuminated) one,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) * so image captured is physically mirrored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) * This is why mirror logic is inversed in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) * order to cancel this mirror effect.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) * TIMING TC REG21:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) * - [2]: ISP mirror
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) * - [1]: Sensor mirror
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) BIT(2) | BIT(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) (!(value ^ sensor->upside_down)) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) (BIT(2) | BIT(1)) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) /* If sensor is mounted upside down, flip logic is inversed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) * TIMING TC REG20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) * - [2]: ISP vflip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) * - [1]: Sensor vflip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) return ov5640_mod_reg(sensor, OV5640_REG_TIMING_TC_REG20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) BIT(2) | BIT(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) (value ^ sensor->upside_down) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) (BIT(2) | BIT(1)) : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) static int ov5640_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) /* v4l2_ctrl_lock() locks our own mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) case V4L2_CID_AUTOGAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) val = ov5640_get_gain(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) if (val < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) sensor->ctrls.gain->val = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) case V4L2_CID_EXPOSURE_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) val = ov5640_get_exposure(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) if (val < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) sensor->ctrls.exposure->val = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) static int ov5640_s_ctrl(struct v4l2_ctrl *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) /* v4l2_ctrl_lock() locks our own mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) * If the device is not powered up by the host driver do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) * not apply any controls to H/W at this time. Instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) * the controls will be restored right after power-up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) if (sensor->power_count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) switch (ctrl->id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) case V4L2_CID_AUTOGAIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) ret = ov5640_set_ctrl_gain(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) case V4L2_CID_EXPOSURE_AUTO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) ret = ov5640_set_ctrl_exposure(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) case V4L2_CID_AUTO_WHITE_BALANCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) case V4L2_CID_HUE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) ret = ov5640_set_ctrl_hue(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) case V4L2_CID_CONTRAST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) ret = ov5640_set_ctrl_contrast(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) case V4L2_CID_SATURATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) ret = ov5640_set_ctrl_saturation(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) case V4L2_CID_TEST_PATTERN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) ret = ov5640_set_ctrl_test_pattern(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) case V4L2_CID_POWER_LINE_FREQUENCY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) ret = ov5640_set_ctrl_light_freq(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) case V4L2_CID_HFLIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) ret = ov5640_set_ctrl_hflip(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) case V4L2_CID_VFLIP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) ret = ov5640_set_ctrl_vflip(sensor, ctrl->val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) static const struct v4l2_ctrl_ops ov5640_ctrl_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) .g_volatile_ctrl = ov5640_g_volatile_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) .s_ctrl = ov5640_s_ctrl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) static int ov5640_init_controls(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) const struct v4l2_ctrl_ops *ops = &ov5640_ctrl_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) struct ov5640_ctrls *ctrls = &sensor->ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) struct v4l2_ctrl_handler *hdl = &ctrls->handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) v4l2_ctrl_handler_init(hdl, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) /* we can use our own mutex for the ctrl lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) hdl->lock = &sensor->lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) /* Clock related controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) ctrls->pixel_rate = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_PIXEL_RATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 0, INT_MAX, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) ov5640_calc_pixel_rate(sensor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) /* Auto/manual white balance */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) V4L2_CID_AUTO_WHITE_BALANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 0, 1, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) ctrls->blue_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_BLUE_BALANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 0, 4095, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) ctrls->red_balance = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_RED_BALANCE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 0, 4095, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) /* Auto/manual exposure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) V4L2_CID_EXPOSURE_AUTO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) V4L2_EXPOSURE_MANUAL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) V4L2_EXPOSURE_AUTO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 0, 65535, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) /* Auto/manual gain */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 0, 1, 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) 0, 1023, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 0, 255, 1, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) ctrls->hue = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 0, 359, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) ctrls->contrast = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_CONTRAST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) 0, 255, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) ctrls->test_pattern =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) ARRAY_SIZE(test_pattern_menu) - 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) 0, 0, test_pattern_menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) ctrls->hflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) ctrls->vflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 0, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) ctrls->light_freq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) v4l2_ctrl_new_std_menu(hdl, ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) V4L2_CID_POWER_LINE_FREQUENCY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) V4L2_CID_POWER_LINE_FREQUENCY_AUTO, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) V4L2_CID_POWER_LINE_FREQUENCY_50HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) if (hdl->error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) ret = hdl->error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) goto free_ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) v4l2_ctrl_auto_cluster(3, &ctrls->auto_wb, 0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) sensor->sd.ctrl_handler = hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) free_ctrls:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) v4l2_ctrl_handler_free(hdl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) static int ov5640_enum_frame_size(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) struct v4l2_subdev_frame_size_enum *fse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) if (fse->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) if (fse->index >= OV5640_NUM_MODES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) fse->min_width =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) ov5640_mode_data[fse->index].hact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) fse->max_width = fse->min_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) fse->min_height =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) ov5640_mode_data[fse->index].vact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) fse->max_height = fse->min_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) static int ov5640_enum_frame_interval(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) struct v4l2_subdev_frame_interval_enum *fie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) struct v4l2_fract tpf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) if (fie->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) if (fie->index >= OV5640_NUM_FRAMERATES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) tpf.numerator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) tpf.denominator = ov5640_framerates[fie->index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) ret = ov5640_try_frame_interval(sensor, &tpf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) fie->width, fie->height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) fie->interval = tpf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) static int ov5640_g_frame_interval(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) struct v4l2_subdev_frame_interval *fi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) fi->interval = sensor->frame_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) struct v4l2_subdev_frame_interval *fi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) const struct ov5640_mode_info *mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) int frame_rate, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) if (fi->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) if (sensor->streaming) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) mode = sensor->current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) frame_rate = ov5640_try_frame_interval(sensor, &fi->interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) mode->hact, mode->vact);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) if (frame_rate < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) /* Always return a valid frame interval value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) fi->interval = sensor->frame_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) mode = ov5640_find_mode(sensor, frame_rate, mode->hact,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) mode->vact, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) if (!mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) if (mode != sensor->current_mode ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) frame_rate != sensor->current_fr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) sensor->current_fr = frame_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) sensor->frame_interval = fi->interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) sensor->current_mode = mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) sensor->pending_mode_change = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) __v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) ov5640_calc_pixel_rate(sensor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) static int ov5640_enum_mbus_code(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) struct v4l2_subdev_pad_config *cfg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) struct v4l2_subdev_mbus_code_enum *code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) if (code->pad != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) if (code->index >= ARRAY_SIZE(ov5640_formats))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) code->code = ov5640_formats[code->index].code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) static int ov5640_s_stream(struct v4l2_subdev *sd, int enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) mutex_lock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) if (sensor->streaming == !enable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) if (enable && sensor->pending_mode_change) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) ret = ov5640_set_mode(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) if (enable && sensor->pending_fmt_change) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) ret = ov5640_set_framefmt(sensor, &sensor->fmt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) sensor->pending_fmt_change = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) ret = ov5640_set_stream_mipi(sensor, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) ret = ov5640_set_stream_dvp(sensor, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) sensor->streaming = enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) mutex_unlock(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) static const struct v4l2_subdev_core_ops ov5640_core_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) .s_power = ov5640_s_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) .log_status = v4l2_ctrl_subdev_log_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) .unsubscribe_event = v4l2_event_subdev_unsubscribe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) static const struct v4l2_subdev_video_ops ov5640_video_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) .g_frame_interval = ov5640_g_frame_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) .s_frame_interval = ov5640_s_frame_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) .s_stream = ov5640_s_stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) static const struct v4l2_subdev_pad_ops ov5640_pad_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) .enum_mbus_code = ov5640_enum_mbus_code,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) .get_fmt = ov5640_get_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) .set_fmt = ov5640_set_fmt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) .enum_frame_size = ov5640_enum_frame_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) .enum_frame_interval = ov5640_enum_frame_interval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) static const struct v4l2_subdev_ops ov5640_subdev_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) .core = &ov5640_core_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) .video = &ov5640_video_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) .pad = &ov5640_pad_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) static int ov5640_get_regulators(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) for (i = 0; i < OV5640_NUM_SUPPLIES; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) sensor->supplies[i].supply = ov5640_supply_name[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) return devm_regulator_bulk_get(&sensor->i2c_client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) OV5640_NUM_SUPPLIES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) sensor->supplies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) static int ov5640_check_chip_id(struct ov5640_dev *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) struct i2c_client *client = sensor->i2c_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) u16 chip_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) ret = ov5640_set_power_on(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) ret = ov5640_read_reg16(sensor, OV5640_REG_CHIP_ID, &chip_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) dev_err(&client->dev, "%s: failed to read chip identifier\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) goto power_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) if (chip_id != 0x5640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) dev_err(&client->dev, "%s: wrong chip identifier, expected 0x5640, got 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) __func__, chip_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) power_off:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) ov5640_set_power_off(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) static int ov5640_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) struct device *dev = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) struct fwnode_handle *endpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) struct ov5640_dev *sensor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) struct v4l2_mbus_framefmt *fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) u32 rotation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) if (!sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) sensor->i2c_client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) * default init sequence initialize sensor to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) * YUV422 UYVY VGA@30fps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) fmt = &sensor->fmt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) fmt->colorspace = V4L2_COLORSPACE_SRGB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) fmt->width = 640;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) fmt->height = 480;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) fmt->field = V4L2_FIELD_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) sensor->frame_interval.numerator = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) sensor->frame_interval.denominator = ov5640_framerates[OV5640_30_FPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) sensor->current_fr = OV5640_30_FPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) sensor->current_mode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) &ov5640_mode_data[OV5640_MODE_VGA_640_480];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) sensor->last_mode = sensor->current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) sensor->ae_target = 52;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) /* optional indication of physical rotation of sensor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) ret = fwnode_property_read_u32(dev_fwnode(&client->dev), "rotation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) &rotation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) switch (rotation) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) case 180:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) sensor->upside_down = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) dev_warn(dev, "%u degrees rotation is not supported, ignoring...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) rotation);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(&client->dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) if (!endpoint) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) dev_err(dev, "endpoint node not found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) ret = v4l2_fwnode_endpoint_parse(endpoint, &sensor->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) fwnode_handle_put(endpoint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) dev_err(dev, "Could not parse endpoint\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) if (sensor->ep.bus_type != V4L2_MBUS_PARALLEL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) sensor->ep.bus_type != V4L2_MBUS_CSI2_DPHY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) sensor->ep.bus_type != V4L2_MBUS_BT656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) dev_err(dev, "Unsupported bus type %d\n", sensor->ep.bus_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) /* get system clock (xclk) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) sensor->xclk = devm_clk_get(dev, "xclk");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) if (IS_ERR(sensor->xclk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) dev_err(dev, "failed to get xclk\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) return PTR_ERR(sensor->xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) sensor->xclk_freq = clk_get_rate(sensor->xclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) if (sensor->xclk_freq < OV5640_XCLK_MIN ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) sensor->xclk_freq > OV5640_XCLK_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) dev_err(dev, "xclk frequency out of range: %d Hz\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) sensor->xclk_freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) /* request optional power down pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) sensor->pwdn_gpio = devm_gpiod_get_optional(dev, "powerdown",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) if (IS_ERR(sensor->pwdn_gpio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) return PTR_ERR(sensor->pwdn_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) /* request optional reset pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) GPIOD_OUT_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) if (IS_ERR(sensor->reset_gpio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) return PTR_ERR(sensor->reset_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) v4l2_i2c_subdev_init(&sensor->sd, client, &ov5640_subdev_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) V4L2_SUBDEV_FL_HAS_EVENTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) ret = ov5640_get_regulators(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) mutex_init(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) ret = ov5640_check_chip_id(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) goto entity_cleanup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) ret = ov5640_init_controls(sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) goto entity_cleanup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) ret = v4l2_async_register_subdev_sensor_common(&sensor->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) goto free_ctrls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) free_ctrls:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) v4l2_ctrl_handler_free(&sensor->ctrls.handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) entity_cleanup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) media_entity_cleanup(&sensor->sd.entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) mutex_destroy(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) static int ov5640_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) struct v4l2_subdev *sd = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) struct ov5640_dev *sensor = to_ov5640_dev(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) v4l2_async_unregister_subdev(&sensor->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) media_entity_cleanup(&sensor->sd.entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) v4l2_ctrl_handler_free(&sensor->ctrls.handler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) mutex_destroy(&sensor->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) static const struct i2c_device_id ov5640_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) {"ov5640", 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) {},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) MODULE_DEVICE_TABLE(i2c, ov5640_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) static const struct of_device_id ov5640_dt_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) { .compatible = "ovti,ov5640" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) { /* sentinel */ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) MODULE_DEVICE_TABLE(of, ov5640_dt_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) static struct i2c_driver ov5640_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) .name = "ov5640",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) .of_match_table = ov5640_dt_ids,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) .id_table = ov5640_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) .probe_new = ov5640_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) .remove = ov5640_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) module_i2c_driver(ov5640_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) MODULE_DESCRIPTION("OV5640 MIPI Camera Subdev Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) MODULE_LICENSE("GPL");