cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ov2680.c (26306B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Omnivision OV2680 CMOS Image Sensor driver
      4 *
      5 * Copyright (C) 2018 Linaro Ltd
      6 *
      7 * Based on OV5640 Sensor Driver
      8 * Copyright (C) 2011-2013 Freescale Semiconductor, Inc. All Rights Reserved.
      9 * Copyright (C) 2014-2017 Mentor Graphics Inc.
     10 *
     11 */
     12
     13#include <asm/unaligned.h>
     14#include <linux/clk.h>
     15#include <linux/delay.h>
     16#include <linux/err.h>
     17#include <linux/i2c.h>
     18#include <linux/init.h>
     19#include <linux/module.h>
     20#include <linux/of_device.h>
     21#include <linux/gpio/consumer.h>
     22#include <linux/regulator/consumer.h>
     23
     24#include <media/v4l2-common.h>
     25#include <media/v4l2-ctrls.h>
     26#include <media/v4l2-subdev.h>
     27
     28#define OV2680_XVCLK_VALUE	24000000
     29
     30#define OV2680_CHIP_ID		0x2680
     31
     32#define OV2680_REG_STREAM_CTRL		0x0100
     33#define OV2680_REG_SOFT_RESET		0x0103
     34
     35#define OV2680_REG_CHIP_ID_HIGH		0x300a
     36#define OV2680_REG_CHIP_ID_LOW		0x300b
     37
     38#define OV2680_REG_R_MANUAL		0x3503
     39#define OV2680_REG_GAIN_PK		0x350a
     40#define OV2680_REG_EXPOSURE_PK_HIGH	0x3500
     41#define OV2680_REG_TIMING_HTS		0x380c
     42#define OV2680_REG_TIMING_VTS		0x380e
     43#define OV2680_REG_FORMAT1		0x3820
     44#define OV2680_REG_FORMAT2		0x3821
     45
     46#define OV2680_REG_ISP_CTRL00		0x5080
     47
     48#define OV2680_FRAME_RATE		30
     49
     50#define OV2680_REG_VALUE_8BIT		1
     51#define OV2680_REG_VALUE_16BIT		2
     52#define OV2680_REG_VALUE_24BIT		3
     53
     54#define OV2680_WIDTH_MAX		1600
     55#define OV2680_HEIGHT_MAX		1200
     56
     57enum ov2680_mode_id {
     58	OV2680_MODE_QUXGA_800_600,
     59	OV2680_MODE_720P_1280_720,
     60	OV2680_MODE_UXGA_1600_1200,
     61	OV2680_MODE_MAX,
     62};
     63
     64struct reg_value {
     65	u16 reg_addr;
     66	u8 val;
     67};
     68
     69static const char * const ov2680_supply_name[] = {
     70	"DOVDD",
     71	"DVDD",
     72	"AVDD",
     73};
     74
     75#define OV2680_NUM_SUPPLIES ARRAY_SIZE(ov2680_supply_name)
     76
     77struct ov2680_mode_info {
     78	const char *name;
     79	enum ov2680_mode_id id;
     80	u32 width;
     81	u32 height;
     82	const struct reg_value *reg_data;
     83	u32 reg_data_size;
     84};
     85
     86struct ov2680_ctrls {
     87	struct v4l2_ctrl_handler handler;
     88	struct {
     89		struct v4l2_ctrl *auto_exp;
     90		struct v4l2_ctrl *exposure;
     91	};
     92	struct {
     93		struct v4l2_ctrl *auto_gain;
     94		struct v4l2_ctrl *gain;
     95	};
     96
     97	struct v4l2_ctrl *hflip;
     98	struct v4l2_ctrl *vflip;
     99	struct v4l2_ctrl *test_pattern;
    100};
    101
    102struct ov2680_dev {
    103	struct i2c_client		*i2c_client;
    104	struct v4l2_subdev		sd;
    105
    106	struct media_pad		pad;
    107	struct clk			*xvclk;
    108	u32				xvclk_freq;
    109	struct regulator_bulk_data	supplies[OV2680_NUM_SUPPLIES];
    110
    111	struct gpio_desc		*reset_gpio;
    112	struct mutex			lock; /* protect members */
    113
    114	bool				mode_pending_changes;
    115	bool				is_enabled;
    116	bool				is_streaming;
    117
    118	struct ov2680_ctrls		ctrls;
    119	struct v4l2_mbus_framefmt	fmt;
    120	struct v4l2_fract		frame_interval;
    121
    122	const struct ov2680_mode_info	*current_mode;
    123};
    124
    125static const char * const test_pattern_menu[] = {
    126	"Disabled",
    127	"Color Bars",
    128	"Random Data",
    129	"Square",
    130	"Black Image",
    131};
    132
    133static const int ov2680_hv_flip_bayer_order[] = {
    134	MEDIA_BUS_FMT_SBGGR10_1X10,
    135	MEDIA_BUS_FMT_SGRBG10_1X10,
    136	MEDIA_BUS_FMT_SGBRG10_1X10,
    137	MEDIA_BUS_FMT_SRGGB10_1X10,
    138};
    139
    140static const struct reg_value ov2680_setting_30fps_QUXGA_800_600[] = {
    141	{0x3086, 0x01}, {0x370a, 0x23}, {0x3808, 0x03}, {0x3809, 0x20},
    142	{0x380a, 0x02}, {0x380b, 0x58}, {0x380c, 0x06}, {0x380d, 0xac},
    143	{0x380e, 0x02}, {0x380f, 0x84}, {0x3811, 0x04}, {0x3813, 0x04},
    144	{0x3814, 0x31}, {0x3815, 0x31}, {0x3820, 0xc0}, {0x4008, 0x00},
    145	{0x4009, 0x03}, {0x4837, 0x1e}, {0x3501, 0x4e}, {0x3502, 0xe0},
    146};
    147
    148static const struct reg_value ov2680_setting_30fps_720P_1280_720[] = {
    149	{0x3086, 0x00}, {0x3808, 0x05}, {0x3809, 0x00}, {0x380a, 0x02},
    150	{0x380b, 0xd0}, {0x380c, 0x06}, {0x380d, 0xa8}, {0x380e, 0x05},
    151	{0x380f, 0x0e}, {0x3811, 0x08}, {0x3813, 0x06}, {0x3814, 0x11},
    152	{0x3815, 0x11}, {0x3820, 0xc0}, {0x4008, 0x00},
    153};
    154
    155static const struct reg_value ov2680_setting_30fps_UXGA_1600_1200[] = {
    156	{0x3086, 0x00}, {0x3501, 0x4e}, {0x3502, 0xe0}, {0x3808, 0x06},
    157	{0x3809, 0x40}, {0x380a, 0x04}, {0x380b, 0xb0}, {0x380c, 0x06},
    158	{0x380d, 0xa8}, {0x380e, 0x05}, {0x380f, 0x0e}, {0x3811, 0x00},
    159	{0x3813, 0x00}, {0x3814, 0x11}, {0x3815, 0x11}, {0x3820, 0xc0},
    160	{0x4008, 0x00}, {0x4837, 0x18}
    161};
    162
    163static const struct ov2680_mode_info ov2680_mode_init_data = {
    164	"mode_quxga_800_600", OV2680_MODE_QUXGA_800_600, 800, 600,
    165	ov2680_setting_30fps_QUXGA_800_600,
    166	ARRAY_SIZE(ov2680_setting_30fps_QUXGA_800_600),
    167};
    168
    169static const struct ov2680_mode_info ov2680_mode_data[OV2680_MODE_MAX] = {
    170	{"mode_quxga_800_600", OV2680_MODE_QUXGA_800_600,
    171	 800, 600, ov2680_setting_30fps_QUXGA_800_600,
    172	 ARRAY_SIZE(ov2680_setting_30fps_QUXGA_800_600)},
    173	{"mode_720p_1280_720", OV2680_MODE_720P_1280_720,
    174	 1280, 720, ov2680_setting_30fps_720P_1280_720,
    175	 ARRAY_SIZE(ov2680_setting_30fps_720P_1280_720)},
    176	{"mode_uxga_1600_1200", OV2680_MODE_UXGA_1600_1200,
    177	 1600, 1200, ov2680_setting_30fps_UXGA_1600_1200,
    178	 ARRAY_SIZE(ov2680_setting_30fps_UXGA_1600_1200)},
    179};
    180
    181static struct ov2680_dev *to_ov2680_dev(struct v4l2_subdev *sd)
    182{
    183	return container_of(sd, struct ov2680_dev, sd);
    184}
    185
    186static struct device *ov2680_to_dev(struct ov2680_dev *sensor)
    187{
    188	return &sensor->i2c_client->dev;
    189}
    190
    191static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
    192{
    193	return &container_of(ctrl->handler, struct ov2680_dev,
    194			     ctrls.handler)->sd;
    195}
    196
    197static int __ov2680_write_reg(struct ov2680_dev *sensor, u16 reg,
    198			      unsigned int len, u32 val)
    199{
    200	struct i2c_client *client = sensor->i2c_client;
    201	u8 buf[6];
    202	int ret;
    203
    204	if (len > 4)
    205		return -EINVAL;
    206
    207	put_unaligned_be16(reg, buf);
    208	put_unaligned_be32(val << (8 * (4 - len)), buf + 2);
    209	ret = i2c_master_send(client, buf, len + 2);
    210	if (ret != len + 2) {
    211		dev_err(&client->dev, "write error: reg=0x%4x: %d\n", reg, ret);
    212		return -EIO;
    213	}
    214
    215	return 0;
    216}
    217
    218#define ov2680_write_reg(s, r, v) \
    219	__ov2680_write_reg(s, r, OV2680_REG_VALUE_8BIT, v)
    220
    221#define ov2680_write_reg16(s, r, v) \
    222	__ov2680_write_reg(s, r, OV2680_REG_VALUE_16BIT, v)
    223
    224#define ov2680_write_reg24(s, r, v) \
    225	__ov2680_write_reg(s, r, OV2680_REG_VALUE_24BIT, v)
    226
    227static int __ov2680_read_reg(struct ov2680_dev *sensor, u16 reg,
    228			     unsigned int len, u32 *val)
    229{
    230	struct i2c_client *client = sensor->i2c_client;
    231	struct i2c_msg msgs[2];
    232	u8 addr_buf[2] = { reg >> 8, reg & 0xff };
    233	u8 data_buf[4] = { 0, };
    234	int ret;
    235
    236	if (len > 4)
    237		return -EINVAL;
    238
    239	msgs[0].addr = client->addr;
    240	msgs[0].flags = 0;
    241	msgs[0].len = ARRAY_SIZE(addr_buf);
    242	msgs[0].buf = addr_buf;
    243
    244	msgs[1].addr = client->addr;
    245	msgs[1].flags = I2C_M_RD;
    246	msgs[1].len = len;
    247	msgs[1].buf = &data_buf[4 - len];
    248
    249	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
    250	if (ret != ARRAY_SIZE(msgs)) {
    251		dev_err(&client->dev, "read error: reg=0x%4x: %d\n", reg, ret);
    252		return -EIO;
    253	}
    254
    255	*val = get_unaligned_be32(data_buf);
    256
    257	return 0;
    258}
    259
    260#define ov2680_read_reg(s, r, v) \
    261	__ov2680_read_reg(s, r, OV2680_REG_VALUE_8BIT, v)
    262
    263#define ov2680_read_reg16(s, r, v) \
    264	__ov2680_read_reg(s, r, OV2680_REG_VALUE_16BIT, v)
    265
    266#define ov2680_read_reg24(s, r, v) \
    267	__ov2680_read_reg(s, r, OV2680_REG_VALUE_24BIT, v)
    268
    269static int ov2680_mod_reg(struct ov2680_dev *sensor, u16 reg, u8 mask, u8 val)
    270{
    271	u32 readval;
    272	int ret;
    273
    274	ret = ov2680_read_reg(sensor, reg, &readval);
    275	if (ret < 0)
    276		return ret;
    277
    278	readval &= ~mask;
    279	val &= mask;
    280	val |= readval;
    281
    282	return ov2680_write_reg(sensor, reg, val);
    283}
    284
    285static int ov2680_load_regs(struct ov2680_dev *sensor,
    286			    const struct ov2680_mode_info *mode)
    287{
    288	const struct reg_value *regs = mode->reg_data;
    289	unsigned int i;
    290	int ret = 0;
    291	u16 reg_addr;
    292	u8 val;
    293
    294	for (i = 0; i < mode->reg_data_size; ++i, ++regs) {
    295		reg_addr = regs->reg_addr;
    296		val = regs->val;
    297
    298		ret = ov2680_write_reg(sensor, reg_addr, val);
    299		if (ret)
    300			break;
    301	}
    302
    303	return ret;
    304}
    305
    306static void ov2680_power_up(struct ov2680_dev *sensor)
    307{
    308	if (!sensor->reset_gpio)
    309		return;
    310
    311	gpiod_set_value(sensor->reset_gpio, 0);
    312	usleep_range(5000, 10000);
    313}
    314
    315static void ov2680_power_down(struct ov2680_dev *sensor)
    316{
    317	if (!sensor->reset_gpio)
    318		return;
    319
    320	gpiod_set_value(sensor->reset_gpio, 1);
    321	usleep_range(5000, 10000);
    322}
    323
    324static int ov2680_bayer_order(struct ov2680_dev *sensor)
    325{
    326	u32 format1;
    327	u32 format2;
    328	u32 hv_flip;
    329	int ret;
    330
    331	ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT1, &format1);
    332	if (ret < 0)
    333		return ret;
    334
    335	ret = ov2680_read_reg(sensor, OV2680_REG_FORMAT2, &format2);
    336	if (ret < 0)
    337		return ret;
    338
    339	hv_flip = (format2 & BIT(2)  << 1) | (format1 & BIT(2));
    340
    341	sensor->fmt.code = ov2680_hv_flip_bayer_order[hv_flip];
    342
    343	return 0;
    344}
    345
    346static int ov2680_vflip_enable(struct ov2680_dev *sensor)
    347{
    348	int ret;
    349
    350	ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(2));
    351	if (ret < 0)
    352		return ret;
    353
    354	return ov2680_bayer_order(sensor);
    355}
    356
    357static int ov2680_vflip_disable(struct ov2680_dev *sensor)
    358{
    359	int ret;
    360
    361	ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT1, BIT(2), BIT(0));
    362	if (ret < 0)
    363		return ret;
    364
    365	return ov2680_bayer_order(sensor);
    366}
    367
    368static int ov2680_hflip_enable(struct ov2680_dev *sensor)
    369{
    370	int ret;
    371
    372	ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(2));
    373	if (ret < 0)
    374		return ret;
    375
    376	return ov2680_bayer_order(sensor);
    377}
    378
    379static int ov2680_hflip_disable(struct ov2680_dev *sensor)
    380{
    381	int ret;
    382
    383	ret = ov2680_mod_reg(sensor, OV2680_REG_FORMAT2, BIT(2), BIT(0));
    384	if (ret < 0)
    385		return ret;
    386
    387	return ov2680_bayer_order(sensor);
    388}
    389
    390static int ov2680_test_pattern_set(struct ov2680_dev *sensor, int value)
    391{
    392	int ret;
    393
    394	if (!value)
    395		return ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), 0);
    396
    397	ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, 0x03, value - 1);
    398	if (ret < 0)
    399		return ret;
    400
    401	ret = ov2680_mod_reg(sensor, OV2680_REG_ISP_CTRL00, BIT(7), BIT(7));
    402	if (ret < 0)
    403		return ret;
    404
    405	return 0;
    406}
    407
    408static int ov2680_gain_set(struct ov2680_dev *sensor, bool auto_gain)
    409{
    410	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    411	u32 gain;
    412	int ret;
    413
    414	ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(1),
    415			     auto_gain ? 0 : BIT(1));
    416	if (ret < 0)
    417		return ret;
    418
    419	if (auto_gain || !ctrls->gain->is_new)
    420		return 0;
    421
    422	gain = ctrls->gain->val;
    423
    424	ret = ov2680_write_reg16(sensor, OV2680_REG_GAIN_PK, gain);
    425
    426	return 0;
    427}
    428
    429static int ov2680_gain_get(struct ov2680_dev *sensor)
    430{
    431	u32 gain;
    432	int ret;
    433
    434	ret = ov2680_read_reg16(sensor, OV2680_REG_GAIN_PK, &gain);
    435	if (ret)
    436		return ret;
    437
    438	return gain;
    439}
    440
    441static int ov2680_exposure_set(struct ov2680_dev *sensor, bool auto_exp)
    442{
    443	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    444	u32 exp;
    445	int ret;
    446
    447	ret = ov2680_mod_reg(sensor, OV2680_REG_R_MANUAL, BIT(0),
    448			     auto_exp ? 0 : BIT(0));
    449	if (ret < 0)
    450		return ret;
    451
    452	if (auto_exp || !ctrls->exposure->is_new)
    453		return 0;
    454
    455	exp = (u32)ctrls->exposure->val;
    456	exp <<= 4;
    457
    458	return ov2680_write_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, exp);
    459}
    460
    461static int ov2680_exposure_get(struct ov2680_dev *sensor)
    462{
    463	int ret;
    464	u32 exp;
    465
    466	ret = ov2680_read_reg24(sensor, OV2680_REG_EXPOSURE_PK_HIGH, &exp);
    467	if (ret)
    468		return ret;
    469
    470	return exp >> 4;
    471}
    472
    473static int ov2680_stream_enable(struct ov2680_dev *sensor)
    474{
    475	return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 1);
    476}
    477
    478static int ov2680_stream_disable(struct ov2680_dev *sensor)
    479{
    480	return ov2680_write_reg(sensor, OV2680_REG_STREAM_CTRL, 0);
    481}
    482
    483static int ov2680_mode_set(struct ov2680_dev *sensor)
    484{
    485	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    486	int ret;
    487
    488	ret = ov2680_gain_set(sensor, false);
    489	if (ret < 0)
    490		return ret;
    491
    492	ret = ov2680_exposure_set(sensor, false);
    493	if (ret < 0)
    494		return ret;
    495
    496	ret = ov2680_load_regs(sensor, sensor->current_mode);
    497	if (ret < 0)
    498		return ret;
    499
    500	if (ctrls->auto_gain->val) {
    501		ret = ov2680_gain_set(sensor, true);
    502		if (ret < 0)
    503			return ret;
    504	}
    505
    506	if (ctrls->auto_exp->val == V4L2_EXPOSURE_AUTO) {
    507		ret = ov2680_exposure_set(sensor, true);
    508		if (ret < 0)
    509			return ret;
    510	}
    511
    512	sensor->mode_pending_changes = false;
    513
    514	return 0;
    515}
    516
    517static int ov2680_mode_restore(struct ov2680_dev *sensor)
    518{
    519	int ret;
    520
    521	ret = ov2680_load_regs(sensor, &ov2680_mode_init_data);
    522	if (ret < 0)
    523		return ret;
    524
    525	return ov2680_mode_set(sensor);
    526}
    527
    528static int ov2680_power_off(struct ov2680_dev *sensor)
    529{
    530	if (!sensor->is_enabled)
    531		return 0;
    532
    533	clk_disable_unprepare(sensor->xvclk);
    534	ov2680_power_down(sensor);
    535	regulator_bulk_disable(OV2680_NUM_SUPPLIES, sensor->supplies);
    536	sensor->is_enabled = false;
    537
    538	return 0;
    539}
    540
    541static int ov2680_power_on(struct ov2680_dev *sensor)
    542{
    543	struct device *dev = ov2680_to_dev(sensor);
    544	int ret;
    545
    546	if (sensor->is_enabled)
    547		return 0;
    548
    549	ret = regulator_bulk_enable(OV2680_NUM_SUPPLIES, sensor->supplies);
    550	if (ret < 0) {
    551		dev_err(dev, "failed to enable regulators: %d\n", ret);
    552		return ret;
    553	}
    554
    555	if (!sensor->reset_gpio) {
    556		ret = ov2680_write_reg(sensor, OV2680_REG_SOFT_RESET, 0x01);
    557		if (ret != 0) {
    558			dev_err(dev, "sensor soft reset failed\n");
    559			return ret;
    560		}
    561		usleep_range(1000, 2000);
    562	} else {
    563		ov2680_power_down(sensor);
    564		ov2680_power_up(sensor);
    565	}
    566
    567	ret = clk_prepare_enable(sensor->xvclk);
    568	if (ret < 0)
    569		return ret;
    570
    571	sensor->is_enabled = true;
    572
    573	/* Set clock lane into LP-11 state */
    574	ov2680_stream_enable(sensor);
    575	usleep_range(1000, 2000);
    576	ov2680_stream_disable(sensor);
    577
    578	return 0;
    579}
    580
    581static int ov2680_s_power(struct v4l2_subdev *sd, int on)
    582{
    583	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    584	int ret = 0;
    585
    586	mutex_lock(&sensor->lock);
    587
    588	if (on)
    589		ret = ov2680_power_on(sensor);
    590	else
    591		ret = ov2680_power_off(sensor);
    592
    593	mutex_unlock(&sensor->lock);
    594
    595	if (on && ret == 0) {
    596		ret = v4l2_ctrl_handler_setup(&sensor->ctrls.handler);
    597		if (ret < 0)
    598			return ret;
    599
    600		ret = ov2680_mode_restore(sensor);
    601	}
    602
    603	return ret;
    604}
    605
    606static int ov2680_s_g_frame_interval(struct v4l2_subdev *sd,
    607				     struct v4l2_subdev_frame_interval *fi)
    608{
    609	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    610
    611	mutex_lock(&sensor->lock);
    612	fi->interval = sensor->frame_interval;
    613	mutex_unlock(&sensor->lock);
    614
    615	return 0;
    616}
    617
    618static int ov2680_s_stream(struct v4l2_subdev *sd, int enable)
    619{
    620	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    621	int ret = 0;
    622
    623	mutex_lock(&sensor->lock);
    624
    625	if (sensor->is_streaming == !!enable)
    626		goto unlock;
    627
    628	if (enable && sensor->mode_pending_changes) {
    629		ret = ov2680_mode_set(sensor);
    630		if (ret < 0)
    631			goto unlock;
    632	}
    633
    634	if (enable)
    635		ret = ov2680_stream_enable(sensor);
    636	else
    637		ret = ov2680_stream_disable(sensor);
    638
    639	sensor->is_streaming = !!enable;
    640
    641unlock:
    642	mutex_unlock(&sensor->lock);
    643
    644	return ret;
    645}
    646
    647static int ov2680_enum_mbus_code(struct v4l2_subdev *sd,
    648				 struct v4l2_subdev_state *sd_state,
    649				 struct v4l2_subdev_mbus_code_enum *code)
    650{
    651	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    652
    653	if (code->pad != 0 || code->index != 0)
    654		return -EINVAL;
    655
    656	code->code = sensor->fmt.code;
    657
    658	return 0;
    659}
    660
    661static int ov2680_get_fmt(struct v4l2_subdev *sd,
    662			  struct v4l2_subdev_state *sd_state,
    663			  struct v4l2_subdev_format *format)
    664{
    665	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    666	struct v4l2_mbus_framefmt *fmt = NULL;
    667	int ret = 0;
    668
    669	if (format->pad != 0)
    670		return -EINVAL;
    671
    672	mutex_lock(&sensor->lock);
    673
    674	if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
    675#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
    676		fmt = v4l2_subdev_get_try_format(&sensor->sd, sd_state,
    677						 format->pad);
    678#else
    679		ret = -EINVAL;
    680#endif
    681	} else {
    682		fmt = &sensor->fmt;
    683	}
    684
    685	if (fmt)
    686		format->format = *fmt;
    687
    688	mutex_unlock(&sensor->lock);
    689
    690	return ret;
    691}
    692
    693static int ov2680_set_fmt(struct v4l2_subdev *sd,
    694			  struct v4l2_subdev_state *sd_state,
    695			  struct v4l2_subdev_format *format)
    696{
    697	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    698	struct v4l2_mbus_framefmt *fmt = &format->format;
    699#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
    700	struct v4l2_mbus_framefmt *try_fmt;
    701#endif
    702	const struct ov2680_mode_info *mode;
    703	int ret = 0;
    704
    705	if (format->pad != 0)
    706		return -EINVAL;
    707
    708	mutex_lock(&sensor->lock);
    709
    710	if (sensor->is_streaming) {
    711		ret = -EBUSY;
    712		goto unlock;
    713	}
    714
    715	mode = v4l2_find_nearest_size(ov2680_mode_data,
    716				      ARRAY_SIZE(ov2680_mode_data), width,
    717				      height, fmt->width, fmt->height);
    718	if (!mode) {
    719		ret = -EINVAL;
    720		goto unlock;
    721	}
    722
    723	if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
    724#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
    725		try_fmt = v4l2_subdev_get_try_format(sd, sd_state, 0);
    726		format->format = *try_fmt;
    727#endif
    728		goto unlock;
    729	}
    730
    731	fmt->width = mode->width;
    732	fmt->height = mode->height;
    733	fmt->code = sensor->fmt.code;
    734	fmt->colorspace = sensor->fmt.colorspace;
    735
    736	sensor->current_mode = mode;
    737	sensor->fmt = format->format;
    738	sensor->mode_pending_changes = true;
    739
    740unlock:
    741	mutex_unlock(&sensor->lock);
    742
    743	return ret;
    744}
    745
    746static int ov2680_init_cfg(struct v4l2_subdev *sd,
    747			   struct v4l2_subdev_state *sd_state)
    748{
    749	struct v4l2_subdev_format fmt = {
    750		.which = sd_state ? V4L2_SUBDEV_FORMAT_TRY
    751		: V4L2_SUBDEV_FORMAT_ACTIVE,
    752		.format = {
    753			.width = 800,
    754			.height = 600,
    755		}
    756	};
    757
    758	return ov2680_set_fmt(sd, sd_state, &fmt);
    759}
    760
    761static int ov2680_enum_frame_size(struct v4l2_subdev *sd,
    762				  struct v4l2_subdev_state *sd_state,
    763				  struct v4l2_subdev_frame_size_enum *fse)
    764{
    765	int index = fse->index;
    766
    767	if (index >= OV2680_MODE_MAX || index < 0)
    768		return -EINVAL;
    769
    770	fse->min_width = ov2680_mode_data[index].width;
    771	fse->min_height = ov2680_mode_data[index].height;
    772	fse->max_width = ov2680_mode_data[index].width;
    773	fse->max_height = ov2680_mode_data[index].height;
    774
    775	return 0;
    776}
    777
    778static int ov2680_enum_frame_interval(struct v4l2_subdev *sd,
    779			      struct v4l2_subdev_state *sd_state,
    780			      struct v4l2_subdev_frame_interval_enum *fie)
    781{
    782	struct v4l2_fract tpf;
    783
    784	if (fie->index >= OV2680_MODE_MAX || fie->width > OV2680_WIDTH_MAX ||
    785	    fie->height > OV2680_HEIGHT_MAX ||
    786	    fie->which > V4L2_SUBDEV_FORMAT_ACTIVE)
    787		return -EINVAL;
    788
    789	tpf.denominator = OV2680_FRAME_RATE;
    790	tpf.numerator = 1;
    791
    792	fie->interval = tpf;
    793
    794	return 0;
    795}
    796
    797static int ov2680_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
    798{
    799	struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
    800	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    801	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    802	int val;
    803
    804	if (!sensor->is_enabled)
    805		return 0;
    806
    807	switch (ctrl->id) {
    808	case V4L2_CID_GAIN:
    809		val = ov2680_gain_get(sensor);
    810		if (val < 0)
    811			return val;
    812		ctrls->gain->val = val;
    813		break;
    814	case V4L2_CID_EXPOSURE:
    815		val = ov2680_exposure_get(sensor);
    816		if (val < 0)
    817			return val;
    818		ctrls->exposure->val = val;
    819		break;
    820	}
    821
    822	return 0;
    823}
    824
    825static int ov2680_s_ctrl(struct v4l2_ctrl *ctrl)
    826{
    827	struct v4l2_subdev *sd = ctrl_to_sd(ctrl);
    828	struct ov2680_dev *sensor = to_ov2680_dev(sd);
    829	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    830
    831	if (!sensor->is_enabled)
    832		return 0;
    833
    834	switch (ctrl->id) {
    835	case V4L2_CID_AUTOGAIN:
    836		return ov2680_gain_set(sensor, !!ctrl->val);
    837	case V4L2_CID_GAIN:
    838		return ov2680_gain_set(sensor, !!ctrls->auto_gain->val);
    839	case V4L2_CID_EXPOSURE_AUTO:
    840		return ov2680_exposure_set(sensor, !!ctrl->val);
    841	case V4L2_CID_EXPOSURE:
    842		return ov2680_exposure_set(sensor, !!ctrls->auto_exp->val);
    843	case V4L2_CID_VFLIP:
    844		if (sensor->is_streaming)
    845			return -EBUSY;
    846		if (ctrl->val)
    847			return ov2680_vflip_enable(sensor);
    848		else
    849			return ov2680_vflip_disable(sensor);
    850	case V4L2_CID_HFLIP:
    851		if (sensor->is_streaming)
    852			return -EBUSY;
    853		if (ctrl->val)
    854			return ov2680_hflip_enable(sensor);
    855		else
    856			return ov2680_hflip_disable(sensor);
    857	case V4L2_CID_TEST_PATTERN:
    858		return ov2680_test_pattern_set(sensor, ctrl->val);
    859	default:
    860		break;
    861	}
    862
    863	return -EINVAL;
    864}
    865
    866static const struct v4l2_ctrl_ops ov2680_ctrl_ops = {
    867	.g_volatile_ctrl = ov2680_g_volatile_ctrl,
    868	.s_ctrl = ov2680_s_ctrl,
    869};
    870
    871static const struct v4l2_subdev_core_ops ov2680_core_ops = {
    872	.s_power = ov2680_s_power,
    873};
    874
    875static const struct v4l2_subdev_video_ops ov2680_video_ops = {
    876	.g_frame_interval	= ov2680_s_g_frame_interval,
    877	.s_frame_interval	= ov2680_s_g_frame_interval,
    878	.s_stream		= ov2680_s_stream,
    879};
    880
    881static const struct v4l2_subdev_pad_ops ov2680_pad_ops = {
    882	.init_cfg		= ov2680_init_cfg,
    883	.enum_mbus_code		= ov2680_enum_mbus_code,
    884	.get_fmt		= ov2680_get_fmt,
    885	.set_fmt		= ov2680_set_fmt,
    886	.enum_frame_size	= ov2680_enum_frame_size,
    887	.enum_frame_interval	= ov2680_enum_frame_interval,
    888};
    889
    890static const struct v4l2_subdev_ops ov2680_subdev_ops = {
    891	.core	= &ov2680_core_ops,
    892	.video	= &ov2680_video_ops,
    893	.pad	= &ov2680_pad_ops,
    894};
    895
    896static int ov2680_mode_init(struct ov2680_dev *sensor)
    897{
    898	const struct ov2680_mode_info *init_mode;
    899
    900	/* set initial mode */
    901	sensor->fmt.code = MEDIA_BUS_FMT_SBGGR10_1X10;
    902	sensor->fmt.width = 800;
    903	sensor->fmt.height = 600;
    904	sensor->fmt.field = V4L2_FIELD_NONE;
    905	sensor->fmt.colorspace = V4L2_COLORSPACE_SRGB;
    906
    907	sensor->frame_interval.denominator = OV2680_FRAME_RATE;
    908	sensor->frame_interval.numerator = 1;
    909
    910	init_mode = &ov2680_mode_init_data;
    911
    912	sensor->current_mode = init_mode;
    913
    914	sensor->mode_pending_changes = true;
    915
    916	return 0;
    917}
    918
    919static int ov2680_v4l2_register(struct ov2680_dev *sensor)
    920{
    921	const struct v4l2_ctrl_ops *ops = &ov2680_ctrl_ops;
    922	struct ov2680_ctrls *ctrls = &sensor->ctrls;
    923	struct v4l2_ctrl_handler *hdl = &ctrls->handler;
    924	int ret = 0;
    925
    926	v4l2_i2c_subdev_init(&sensor->sd, sensor->i2c_client,
    927			     &ov2680_subdev_ops);
    928
    929#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
    930	sensor->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE;
    931#endif
    932	sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
    933	sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
    934
    935	ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
    936	if (ret < 0)
    937		return ret;
    938
    939	v4l2_ctrl_handler_init(hdl, 7);
    940
    941	hdl->lock = &sensor->lock;
    942
    943	ctrls->vflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
    944	ctrls->hflip = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
    945
    946	ctrls->test_pattern = v4l2_ctrl_new_std_menu_items(hdl,
    947					&ov2680_ctrl_ops, V4L2_CID_TEST_PATTERN,
    948					ARRAY_SIZE(test_pattern_menu) - 1,
    949					0, 0, test_pattern_menu);
    950
    951	ctrls->auto_exp = v4l2_ctrl_new_std_menu(hdl, ops,
    952						 V4L2_CID_EXPOSURE_AUTO,
    953						 V4L2_EXPOSURE_MANUAL, 0,
    954						 V4L2_EXPOSURE_AUTO);
    955
    956	ctrls->exposure = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_EXPOSURE,
    957					    0, 32767, 1, 0);
    958
    959	ctrls->auto_gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTOGAIN,
    960					     0, 1, 1, 1);
    961	ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN, 0, 2047, 1, 0);
    962
    963	if (hdl->error) {
    964		ret = hdl->error;
    965		goto cleanup_entity;
    966	}
    967
    968	ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
    969	ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
    970
    971	v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true);
    972	v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true);
    973
    974	sensor->sd.ctrl_handler = hdl;
    975
    976	ret = v4l2_async_register_subdev(&sensor->sd);
    977	if (ret < 0)
    978		goto cleanup_entity;
    979
    980	return 0;
    981
    982cleanup_entity:
    983	media_entity_cleanup(&sensor->sd.entity);
    984	v4l2_ctrl_handler_free(hdl);
    985
    986	return ret;
    987}
    988
    989static int ov2680_get_regulators(struct ov2680_dev *sensor)
    990{
    991	int i;
    992
    993	for (i = 0; i < OV2680_NUM_SUPPLIES; i++)
    994		sensor->supplies[i].supply = ov2680_supply_name[i];
    995
    996	return devm_regulator_bulk_get(&sensor->i2c_client->dev,
    997				       OV2680_NUM_SUPPLIES,
    998				       sensor->supplies);
    999}
   1000
   1001static int ov2680_check_id(struct ov2680_dev *sensor)
   1002{
   1003	struct device *dev = ov2680_to_dev(sensor);
   1004	u32 chip_id;
   1005	int ret;
   1006
   1007	ov2680_power_on(sensor);
   1008
   1009	ret = ov2680_read_reg16(sensor, OV2680_REG_CHIP_ID_HIGH, &chip_id);
   1010	if (ret < 0) {
   1011		dev_err(dev, "failed to read chip id high\n");
   1012		return -ENODEV;
   1013	}
   1014
   1015	if (chip_id != OV2680_CHIP_ID) {
   1016		dev_err(dev, "chip id: 0x%04x does not match expected 0x%04x\n",
   1017			chip_id, OV2680_CHIP_ID);
   1018		return -ENODEV;
   1019	}
   1020
   1021	return 0;
   1022}
   1023
   1024static int ov2680_parse_dt(struct ov2680_dev *sensor)
   1025{
   1026	struct device *dev = ov2680_to_dev(sensor);
   1027	int ret;
   1028
   1029	sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset",
   1030						     GPIOD_OUT_HIGH);
   1031	ret = PTR_ERR_OR_ZERO(sensor->reset_gpio);
   1032	if (ret < 0) {
   1033		dev_dbg(dev, "error while getting reset gpio: %d\n", ret);
   1034		return ret;
   1035	}
   1036
   1037	sensor->xvclk = devm_clk_get(dev, "xvclk");
   1038	if (IS_ERR(sensor->xvclk)) {
   1039		dev_err(dev, "xvclk clock missing or invalid\n");
   1040		return PTR_ERR(sensor->xvclk);
   1041	}
   1042
   1043	sensor->xvclk_freq = clk_get_rate(sensor->xvclk);
   1044	if (sensor->xvclk_freq != OV2680_XVCLK_VALUE) {
   1045		dev_err(dev, "wrong xvclk frequency %d HZ, expected: %d Hz\n",
   1046			sensor->xvclk_freq, OV2680_XVCLK_VALUE);
   1047		return -EINVAL;
   1048	}
   1049
   1050	return 0;
   1051}
   1052
   1053static int ov2680_probe(struct i2c_client *client)
   1054{
   1055	struct device *dev = &client->dev;
   1056	struct ov2680_dev *sensor;
   1057	int ret;
   1058
   1059	sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL);
   1060	if (!sensor)
   1061		return -ENOMEM;
   1062
   1063	sensor->i2c_client = client;
   1064
   1065	ret = ov2680_parse_dt(sensor);
   1066	if (ret < 0)
   1067		return -EINVAL;
   1068
   1069	ret = ov2680_mode_init(sensor);
   1070	if (ret < 0)
   1071		return ret;
   1072
   1073	ret = ov2680_get_regulators(sensor);
   1074	if (ret < 0) {
   1075		dev_err(dev, "failed to get regulators\n");
   1076		return ret;
   1077	}
   1078
   1079	mutex_init(&sensor->lock);
   1080
   1081	ret = ov2680_check_id(sensor);
   1082	if (ret < 0)
   1083		goto lock_destroy;
   1084
   1085	ret = ov2680_v4l2_register(sensor);
   1086	if (ret < 0)
   1087		goto lock_destroy;
   1088
   1089	dev_info(dev, "ov2680 init correctly\n");
   1090
   1091	return 0;
   1092
   1093lock_destroy:
   1094	dev_err(dev, "ov2680 init fail: %d\n", ret);
   1095	mutex_destroy(&sensor->lock);
   1096
   1097	return ret;
   1098}
   1099
   1100static int ov2680_remove(struct i2c_client *client)
   1101{
   1102	struct v4l2_subdev *sd = i2c_get_clientdata(client);
   1103	struct ov2680_dev *sensor = to_ov2680_dev(sd);
   1104
   1105	v4l2_async_unregister_subdev(&sensor->sd);
   1106	mutex_destroy(&sensor->lock);
   1107	media_entity_cleanup(&sensor->sd.entity);
   1108	v4l2_ctrl_handler_free(&sensor->ctrls.handler);
   1109
   1110	return 0;
   1111}
   1112
   1113static int __maybe_unused ov2680_suspend(struct device *dev)
   1114{
   1115	struct v4l2_subdev *sd = dev_get_drvdata(dev);
   1116	struct ov2680_dev *sensor = to_ov2680_dev(sd);
   1117
   1118	if (sensor->is_streaming)
   1119		ov2680_stream_disable(sensor);
   1120
   1121	return 0;
   1122}
   1123
   1124static int __maybe_unused ov2680_resume(struct device *dev)
   1125{
   1126	struct v4l2_subdev *sd = dev_get_drvdata(dev);
   1127	struct ov2680_dev *sensor = to_ov2680_dev(sd);
   1128	int ret;
   1129
   1130	if (sensor->is_streaming) {
   1131		ret = ov2680_stream_enable(sensor);
   1132		if (ret < 0)
   1133			goto stream_disable;
   1134	}
   1135
   1136	return 0;
   1137
   1138stream_disable:
   1139	ov2680_stream_disable(sensor);
   1140	sensor->is_streaming = false;
   1141
   1142	return ret;
   1143}
   1144
   1145static const struct dev_pm_ops ov2680_pm_ops = {
   1146	SET_SYSTEM_SLEEP_PM_OPS(ov2680_suspend, ov2680_resume)
   1147};
   1148
   1149static const struct of_device_id ov2680_dt_ids[] = {
   1150	{ .compatible = "ovti,ov2680" },
   1151	{ /* sentinel */ },
   1152};
   1153MODULE_DEVICE_TABLE(of, ov2680_dt_ids);
   1154
   1155static struct i2c_driver ov2680_i2c_driver = {
   1156	.driver = {
   1157		.name  = "ov2680",
   1158		.pm = &ov2680_pm_ops,
   1159		.of_match_table	= of_match_ptr(ov2680_dt_ids),
   1160	},
   1161	.probe_new	= ov2680_probe,
   1162	.remove		= ov2680_remove,
   1163};
   1164module_i2c_driver(ov2680_i2c_driver);
   1165
   1166MODULE_AUTHOR("Rui Miguel Silva <rui.silva@linaro.org>");
   1167MODULE_DESCRIPTION("OV2680 CMOS Image Sensor driver");
   1168MODULE_LICENSE("GPL v2");