1/*
2 * Samsung LSI S5C73M3 8M pixel camera driver
3 *
4 * Copyright (C) 2012, Samsung Electronics, Co., Ltd.
5 * Sylwester Nawrocki <s.nawrocki@samsung.com>
6 * Andrzej Hajda <a.hajda@samsung.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 */
17
18#include <linux/clk.h>
19#include <linux/delay.h>
20#include <linux/firmware.h>
21#include <linux/gpio.h>
22#include <linux/i2c.h>
23#include <linux/init.h>
24#include <linux/media.h>
25#include <linux/module.h>
26#include <linux/of_gpio.h>
27#include <linux/regulator/consumer.h>
28#include <linux/sizes.h>
29#include <linux/slab.h>
30#include <linux/spi/spi.h>
31#include <linux/videodev2.h>
32#include <media/media-entity.h>
33#include <media/v4l2-ctrls.h>
34#include <media/v4l2-device.h>
35#include <media/v4l2-subdev.h>
36#include <media/v4l2-mediabus.h>
37#include <media/s5c73m3.h>
38#include <media/v4l2-of.h>
39
40#include "s5c73m3.h"
41
42int s5c73m3_dbg;
43module_param_named(debug, s5c73m3_dbg, int, 0644);
44
45static int boot_from_rom = 1;
46module_param(boot_from_rom, int, 0644);
47
48static int update_fw;
49module_param(update_fw, int, 0644);
50
51#define S5C73M3_EMBEDDED_DATA_MAXLEN	SZ_4K
52#define S5C73M3_MIPI_DATA_LANES		4
53#define S5C73M3_CLK_NAME		"cis_extclk"
54
55static const char * const s5c73m3_supply_names[S5C73M3_MAX_SUPPLIES] = {
56	"vdd-int",	/* Digital Core supply (1.2V), CAM_ISP_CORE_1.2V */
57	"vdda",		/* Analog Core supply (1.2V), CAM_SENSOR_CORE_1.2V */
58	"vdd-reg",	/* Regulator input supply (2.8V), CAM_SENSOR_A2.8V */
59	"vddio-host",	/* Digital Host I/O power supply (1.8V...2.8V),
60			   CAM_ISP_SENSOR_1.8V */
61	"vddio-cis",	/* Digital CIS I/O power (1.2V...1.8V),
62			   CAM_ISP_MIPI_1.2V */
63	"vdd-af",	/* Lens, CAM_AF_2.8V */
64};
65
66static const struct s5c73m3_frame_size s5c73m3_isp_resolutions[] = {
67	{ 320,	240,	COMM_CHG_MODE_YUV_320_240 },
68	{ 352,	288,	COMM_CHG_MODE_YUV_352_288 },
69	{ 640,	480,	COMM_CHG_MODE_YUV_640_480 },
70	{ 880,	720,	COMM_CHG_MODE_YUV_880_720 },
71	{ 960,	720,	COMM_CHG_MODE_YUV_960_720 },
72	{ 1008,	672,	COMM_CHG_MODE_YUV_1008_672 },
73	{ 1184,	666,	COMM_CHG_MODE_YUV_1184_666 },
74	{ 1280,	720,	COMM_CHG_MODE_YUV_1280_720 },
75	{ 1536,	864,	COMM_CHG_MODE_YUV_1536_864 },
76	{ 1600,	1200,	COMM_CHG_MODE_YUV_1600_1200 },
77	{ 1632,	1224,	COMM_CHG_MODE_YUV_1632_1224 },
78	{ 1920,	1080,	COMM_CHG_MODE_YUV_1920_1080 },
79	{ 1920,	1440,	COMM_CHG_MODE_YUV_1920_1440 },
80	{ 2304,	1296,	COMM_CHG_MODE_YUV_2304_1296 },
81	{ 3264,	2448,	COMM_CHG_MODE_YUV_3264_2448 },
82};
83
84static const struct s5c73m3_frame_size s5c73m3_jpeg_resolutions[] = {
85	{ 640,	480,	COMM_CHG_MODE_JPEG_640_480 },
86	{ 800,	450,	COMM_CHG_MODE_JPEG_800_450 },
87	{ 800,	600,	COMM_CHG_MODE_JPEG_800_600 },
88	{ 1024,	768,	COMM_CHG_MODE_JPEG_1024_768 },
89	{ 1280,	720,	COMM_CHG_MODE_JPEG_1280_720 },
90	{ 1280,	960,	COMM_CHG_MODE_JPEG_1280_960 },
91	{ 1600,	900,	COMM_CHG_MODE_JPEG_1600_900 },
92	{ 1600,	1200,	COMM_CHG_MODE_JPEG_1600_1200 },
93	{ 2048,	1152,	COMM_CHG_MODE_JPEG_2048_1152 },
94	{ 2048,	1536,	COMM_CHG_MODE_JPEG_2048_1536 },
95	{ 2560,	1440,	COMM_CHG_MODE_JPEG_2560_1440 },
96	{ 2560,	1920,	COMM_CHG_MODE_JPEG_2560_1920 },
97	{ 3264,	1836,	COMM_CHG_MODE_JPEG_3264_1836 },
98	{ 3264,	2176,	COMM_CHG_MODE_JPEG_3264_2176 },
99	{ 3264,	2448,	COMM_CHG_MODE_JPEG_3264_2448 },
100};
101
102static const struct s5c73m3_frame_size * const s5c73m3_resolutions[] = {
103	[RES_ISP] = s5c73m3_isp_resolutions,
104	[RES_JPEG] = s5c73m3_jpeg_resolutions
105};
106
107static const int s5c73m3_resolutions_len[] = {
108	[RES_ISP] = ARRAY_SIZE(s5c73m3_isp_resolutions),
109	[RES_JPEG] = ARRAY_SIZE(s5c73m3_jpeg_resolutions)
110};
111
112static const struct s5c73m3_interval s5c73m3_intervals[] = {
113	{ COMM_FRAME_RATE_FIXED_7FPS, {142857, 1000000}, {3264, 2448} },
114	{ COMM_FRAME_RATE_FIXED_15FPS, {66667, 1000000}, {3264, 2448} },
115	{ COMM_FRAME_RATE_FIXED_20FPS, {50000, 1000000}, {2304, 1296} },
116	{ COMM_FRAME_RATE_FIXED_30FPS, {33333, 1000000}, {2304, 1296} },
117};
118
119#define S5C73M3_DEFAULT_FRAME_INTERVAL 3 /* 30 fps */
120
121static void s5c73m3_fill_mbus_fmt(struct v4l2_mbus_framefmt *mf,
122				  const struct s5c73m3_frame_size *fs,
123				  u32 code)
124{
125	mf->width = fs->width;
126	mf->height = fs->height;
127	mf->code = code;
128	mf->colorspace = V4L2_COLORSPACE_JPEG;
129	mf->field = V4L2_FIELD_NONE;
130}
131
132static int s5c73m3_i2c_write(struct i2c_client *client, u16 addr, u16 data)
133{
134	u8 buf[4] = { addr >> 8, addr & 0xff, data >> 8, data & 0xff };
135
136	int ret = i2c_master_send(client, buf, sizeof(buf));
137
138	v4l_dbg(4, s5c73m3_dbg, client, "%s: addr 0x%04x, data 0x%04x\n",
139		 __func__, addr, data);
140
141	if (ret == 4)
142		return 0;
143
144	return ret < 0 ? ret : -EREMOTEIO;
145}
146
147static int s5c73m3_i2c_read(struct i2c_client *client, u16 addr, u16 *data)
148{
149	int ret;
150	u8 rbuf[2], wbuf[2] = { addr >> 8, addr & 0xff };
151	struct i2c_msg msg[2] = {
152		{
153			.addr = client->addr,
154			.flags = 0,
155			.len = sizeof(wbuf),
156			.buf = wbuf
157		}, {
158			.addr = client->addr,
159			.flags = I2C_M_RD,
160			.len = sizeof(rbuf),
161			.buf = rbuf
162		}
163	};
164	/*
165	 * Issue repeated START after writing 2 address bytes and
166	 * just one STOP only after reading the data bytes.
167	 */
168	ret = i2c_transfer(client->adapter, msg, 2);
169	if (ret == 2) {
170		*data = be16_to_cpup((u16 *)rbuf);
171		v4l2_dbg(4, s5c73m3_dbg, client,
172			 "%s: addr: 0x%04x, data: 0x%04x\n",
173			 __func__, addr, *data);
174		return 0;
175	}
176
177	v4l2_err(client, "I2C read failed: addr: %04x, (%d)\n", addr, ret);
178
179	return ret >= 0 ? -EREMOTEIO : ret;
180}
181
182int s5c73m3_write(struct s5c73m3 *state, u32 addr, u16 data)
183{
184	struct i2c_client *client = state->i2c_client;
185	int ret;
186
187	if ((addr ^ state->i2c_write_address) & 0xffff0000) {
188		ret = s5c73m3_i2c_write(client, REG_CMDWR_ADDRH, addr >> 16);
189		if (ret < 0) {
190			state->i2c_write_address = 0;
191			return ret;
192		}
193	}
194
195	if ((addr ^ state->i2c_write_address) & 0xffff) {
196		ret = s5c73m3_i2c_write(client, REG_CMDWR_ADDRL, addr & 0xffff);
197		if (ret < 0) {
198			state->i2c_write_address = 0;
199			return ret;
200		}
201	}
202
203	state->i2c_write_address = addr;
204
205	ret = s5c73m3_i2c_write(client, REG_CMDBUF_ADDR, data);
206	if (ret < 0)
207		return ret;
208
209	state->i2c_write_address += 2;
210
211	return ret;
212}
213
214int s5c73m3_read(struct s5c73m3 *state, u32 addr, u16 *data)
215{
216	struct i2c_client *client = state->i2c_client;
217	int ret;
218
219	if ((addr ^ state->i2c_read_address) & 0xffff0000) {
220		ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRH, addr >> 16);
221		if (ret < 0) {
222			state->i2c_read_address = 0;
223			return ret;
224		}
225	}
226
227	if ((addr ^ state->i2c_read_address) & 0xffff) {
228		ret = s5c73m3_i2c_write(client, REG_CMDRD_ADDRL, addr & 0xffff);
229		if (ret < 0) {
230			state->i2c_read_address = 0;
231			return ret;
232		}
233	}
234
235	state->i2c_read_address = addr;
236
237	ret = s5c73m3_i2c_read(client, REG_CMDBUF_ADDR, data);
238	if (ret < 0)
239		return ret;
240
241	state->i2c_read_address += 2;
242
243	return ret;
244}
245
246static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value)
247{
248	unsigned long start = jiffies;
249	unsigned long end = start + msecs_to_jiffies(2000);
250	int ret = 0;
251	u16 status;
252	int count = 0;
253
254	while (time_is_after_jiffies(end)) {
255		ret = s5c73m3_read(state, REG_STATUS, &status);
256		if (ret < 0 || status == value)
257			break;
258		usleep_range(500, 1000);
259		++count;
260	}
261
262	if (count > 0)
263		v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
264			 "status check took %dms\n",
265			 jiffies_to_msecs(jiffies - start));
266
267	if (ret == 0 && status != value) {
268		u16 i2c_status = 0;
269		u16 i2c_seq_status = 0;
270
271		s5c73m3_read(state, REG_I2C_STATUS, &i2c_status);
272		s5c73m3_read(state, REG_I2C_SEQ_STATUS, &i2c_seq_status);
273
274		v4l2_err(&state->sensor_sd,
275			 "wrong status %#x, expected: %#x, i2c_status: %#x/%#x\n",
276			 status, value, i2c_status, i2c_seq_status);
277
278		return -ETIMEDOUT;
279	}
280
281	return ret;
282}
283
284int s5c73m3_isp_command(struct s5c73m3 *state, u16 command, u16 data)
285{
286	int ret;
287
288	ret = s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED);
289	if (ret < 0)
290		return ret;
291
292	ret = s5c73m3_write(state, 0x00095000, command);
293	if (ret < 0)
294		return ret;
295
296	ret = s5c73m3_write(state, 0x00095002, data);
297	if (ret < 0)
298		return ret;
299
300	return s5c73m3_write(state, REG_STATUS, 0x0001);
301}
302
303static int s5c73m3_isp_comm_result(struct s5c73m3 *state, u16 command,
304				   u16 *data)
305{
306	return s5c73m3_read(state, COMM_RESULT_OFFSET + command, data);
307}
308
309static int s5c73m3_set_af_softlanding(struct s5c73m3 *state)
310{
311	unsigned long start = jiffies;
312	u16 af_softlanding;
313	int count = 0;
314	int ret;
315	const char *msg;
316
317	ret = s5c73m3_isp_command(state, COMM_AF_SOFTLANDING,
318					COMM_AF_SOFTLANDING_ON);
319	if (ret < 0) {
320		v4l2_info(&state->sensor_sd, "AF soft-landing failed\n");
321		return ret;
322	}
323
324	for (;;) {
325		ret = s5c73m3_isp_comm_result(state, COMM_AF_SOFTLANDING,
326							&af_softlanding);
327		if (ret < 0) {
328			msg = "failed";
329			break;
330		}
331		if (af_softlanding == COMM_AF_SOFTLANDING_RES_COMPLETE) {
332			msg = "succeeded";
333			break;
334		}
335		if (++count > 100) {
336			ret = -ETIME;
337			msg = "timed out";
338			break;
339		}
340		msleep(25);
341	}
342
343	v4l2_info(&state->sensor_sd, "AF soft-landing %s after %dms\n",
344		  msg, jiffies_to_msecs(jiffies - start));
345
346	return ret;
347}
348
349static int s5c73m3_load_fw(struct v4l2_subdev *sd)
350{
351	struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd);
352	struct i2c_client *client = state->i2c_client;
353	const struct firmware *fw;
354	int ret;
355	char fw_name[20];
356
357	snprintf(fw_name, sizeof(fw_name), "SlimISP_%.2s.bin",
358							state->fw_file_version);
359	ret = request_firmware(&fw, fw_name, &client->dev);
360	if (ret < 0) {
361		v4l2_err(sd, "Firmware request failed (%s)\n", fw_name);
362		return -EINVAL;
363	}
364
365	v4l2_info(sd, "Loading firmware (%s, %zu B)\n", fw_name, fw->size);
366
367	ret = s5c73m3_spi_write(state, fw->data, fw->size, 64);
368
369	if (ret >= 0)
370		state->isp_ready = 1;
371	else
372		v4l2_err(sd, "SPI write failed\n");
373
374	release_firmware(fw);
375
376	return ret;
377}
378
379static int s5c73m3_set_frame_size(struct s5c73m3 *state)
380{
381	const struct s5c73m3_frame_size *prev_size =
382					state->sensor_pix_size[RES_ISP];
383	const struct s5c73m3_frame_size *cap_size =
384					state->sensor_pix_size[RES_JPEG];
385	unsigned int chg_mode;
386
387	v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
388		 "Preview size: %dx%d, reg_val: 0x%x\n",
389		 prev_size->width, prev_size->height, prev_size->reg_val);
390
391	chg_mode = prev_size->reg_val | COMM_CHG_MODE_NEW;
392
393	if (state->mbus_code == S5C73M3_JPEG_FMT) {
394		v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
395			 "Capture size: %dx%d, reg_val: 0x%x\n",
396			 cap_size->width, cap_size->height, cap_size->reg_val);
397		chg_mode |= cap_size->reg_val;
398	}
399
400	return s5c73m3_isp_command(state, COMM_CHG_MODE, chg_mode);
401}
402
403static int s5c73m3_set_frame_rate(struct s5c73m3 *state)
404{
405	int ret;
406
407	if (state->ctrls.stabilization->val)
408		return 0;
409
410	if (WARN_ON(state->fiv == NULL))
411		return -EINVAL;
412
413	ret = s5c73m3_isp_command(state, COMM_FRAME_RATE, state->fiv->fps_reg);
414	if (!ret)
415		state->apply_fiv = 0;
416
417	return ret;
418}
419
420static int __s5c73m3_s_stream(struct s5c73m3 *state, struct v4l2_subdev *sd,
421								int on)
422{
423	u16 mode;
424	int ret;
425
426	if (on && state->apply_fmt) {
427		if (state->mbus_code == S5C73M3_JPEG_FMT)
428			mode = COMM_IMG_OUTPUT_INTERLEAVED;
429		else
430			mode = COMM_IMG_OUTPUT_YUV;
431
432		ret = s5c73m3_isp_command(state, COMM_IMG_OUTPUT, mode);
433		if (!ret)
434			ret = s5c73m3_set_frame_size(state);
435		if (ret)
436			return ret;
437		state->apply_fmt = 0;
438	}
439
440	ret = s5c73m3_isp_command(state, COMM_SENSOR_STREAMING, !!on);
441	if (ret)
442		return ret;
443
444	state->streaming = !!on;
445
446	if (!on)
447		return ret;
448
449	if (state->apply_fiv) {
450		ret = s5c73m3_set_frame_rate(state);
451		if (ret < 0)
452			v4l2_err(sd, "Error setting frame rate(%d)\n", ret);
453	}
454
455	return s5c73m3_check_status(state, REG_STATUS_ISP_COMMAND_COMPLETED);
456}
457
458static int s5c73m3_oif_s_stream(struct v4l2_subdev *sd, int on)
459{
460	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
461	int ret;
462
463	mutex_lock(&state->lock);
464	ret = __s5c73m3_s_stream(state, sd, on);
465	mutex_unlock(&state->lock);
466
467	return ret;
468}
469
470static int s5c73m3_system_status_wait(struct s5c73m3 *state, u32 value,
471				      unsigned int delay, unsigned int steps)
472{
473	u16 reg = 0;
474
475	while (steps-- > 0) {
476		int ret = s5c73m3_read(state, 0x30100010, &reg);
477		if (ret < 0)
478			return ret;
479		if (reg == value)
480			return 0;
481		usleep_range(delay, delay + 25);
482	}
483	return -ETIMEDOUT;
484}
485
486static int s5c73m3_read_fw_version(struct s5c73m3 *state)
487{
488	struct v4l2_subdev *sd = &state->sensor_sd;
489	int i, ret;
490	u16 data[2];
491	int offset;
492
493	offset = state->isp_ready ? 0x60 : 0;
494
495	for (i = 0; i < S5C73M3_SENSOR_FW_LEN / 2; i++) {
496		ret = s5c73m3_read(state, offset + i * 2, data);
497		if (ret < 0)
498			return ret;
499		state->sensor_fw[i * 2] = (char)(*data & 0xff);
500		state->sensor_fw[i * 2 + 1] = (char)(*data >> 8);
501	}
502	state->sensor_fw[S5C73M3_SENSOR_FW_LEN] = '\0';
503
504
505	for (i = 0; i < S5C73M3_SENSOR_TYPE_LEN / 2; i++) {
506		ret = s5c73m3_read(state, offset + 6 + i * 2, data);
507		if (ret < 0)
508			return ret;
509		state->sensor_type[i * 2] = (char)(*data & 0xff);
510		state->sensor_type[i * 2 + 1] = (char)(*data >> 8);
511	}
512	state->sensor_type[S5C73M3_SENSOR_TYPE_LEN] = '\0';
513
514	ret = s5c73m3_read(state, offset + 0x14, data);
515	if (ret >= 0) {
516		ret = s5c73m3_read(state, offset + 0x16, data + 1);
517		if (ret >= 0)
518			state->fw_size = data[0] + (data[1] << 16);
519	}
520
521	v4l2_info(sd, "Sensor type: %s, FW version: %s\n",
522		  state->sensor_type, state->sensor_fw);
523	return ret;
524}
525
526static int s5c73m3_fw_update_from(struct s5c73m3 *state)
527{
528	struct v4l2_subdev *sd = &state->sensor_sd;
529	u16 status = COMM_FW_UPDATE_NOT_READY;
530	int ret;
531	int count = 0;
532
533	v4l2_warn(sd, "Updating F-ROM firmware.\n");
534	do {
535		if (status == COMM_FW_UPDATE_NOT_READY) {
536			ret = s5c73m3_isp_command(state, COMM_FW_UPDATE, 0);
537			if (ret < 0)
538				return ret;
539		}
540
541		ret = s5c73m3_read(state, 0x00095906, &status);
542		if (ret < 0)
543			return ret;
544		switch (status) {
545		case COMM_FW_UPDATE_FAIL:
546			v4l2_warn(sd, "Updating F-ROM firmware failed.\n");
547			return -EIO;
548		case COMM_FW_UPDATE_SUCCESS:
549			v4l2_warn(sd, "Updating F-ROM firmware finished.\n");
550			return 0;
551		}
552		++count;
553		msleep(20);
554	} while (count < 500);
555
556	v4l2_warn(sd, "Updating F-ROM firmware timed-out.\n");
557	return -ETIMEDOUT;
558}
559
560static int s5c73m3_spi_boot(struct s5c73m3 *state, bool load_fw)
561{
562	struct v4l2_subdev *sd = &state->sensor_sd;
563	int ret;
564
565	/* Run ARM MCU */
566	ret = s5c73m3_write(state, 0x30000004, 0xffff);
567	if (ret < 0)
568		return ret;
569
570	usleep_range(400, 500);
571
572	/* Check booting status */
573	ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3);
574	if (ret < 0) {
575		v4l2_err(sd, "booting failed: %d\n", ret);
576		return ret;
577	}
578
579	/* P,M,S and Boot Mode */
580	ret = s5c73m3_write(state, 0x30100014, 0x2146);
581	if (ret < 0)
582		return ret;
583
584	ret = s5c73m3_write(state, 0x30100010, 0x210c);
585	if (ret < 0)
586		return ret;
587
588	usleep_range(200, 250);
589
590	/* Check SPI status */
591	ret = s5c73m3_system_status_wait(state, 0x210d, 100, 300);
592	if (ret < 0)
593		v4l2_err(sd, "SPI not ready: %d\n", ret);
594
595	/* Firmware download over SPI */
596	if (load_fw)
597		s5c73m3_load_fw(sd);
598
599	/* MCU reset */
600	ret = s5c73m3_write(state, 0x30000004, 0xfffd);
601	if (ret < 0)
602		return ret;
603
604	/* Remap */
605	ret = s5c73m3_write(state, 0x301000a4, 0x0183);
606	if (ret < 0)
607		return ret;
608
609	/* MCU restart */
610	ret = s5c73m3_write(state, 0x30000004, 0xffff);
611	if (ret < 0 || !load_fw)
612		return ret;
613
614	ret = s5c73m3_read_fw_version(state);
615	if (ret < 0)
616		return ret;
617
618	if (load_fw && update_fw) {
619		ret = s5c73m3_fw_update_from(state);
620		update_fw = 0;
621	}
622
623	return ret;
624}
625
626static int s5c73m3_set_timing_register_for_vdd(struct s5c73m3 *state)
627{
628	static const u32 regs[][2] = {
629		{ 0x30100018, 0x0618 },
630		{ 0x3010001c, 0x10c1 },
631		{ 0x30100020, 0x249e }
632	};
633	int ret;
634	int i;
635
636	for (i = 0; i < ARRAY_SIZE(regs); i++) {
637		ret = s5c73m3_write(state, regs[i][0], regs[i][1]);
638		if (ret < 0)
639			return ret;
640	}
641
642	return 0;
643}
644
645static void s5c73m3_set_fw_file_version(struct s5c73m3 *state)
646{
647	switch (state->sensor_fw[0]) {
648	case 'G':
649	case 'O':
650		state->fw_file_version[0] = 'G';
651		break;
652	case 'S':
653	case 'Z':
654		state->fw_file_version[0] = 'Z';
655		break;
656	}
657
658	switch (state->sensor_fw[1]) {
659	case 'C'...'F':
660		state->fw_file_version[1] = state->sensor_fw[1];
661		break;
662	}
663}
664
665static int s5c73m3_get_fw_version(struct s5c73m3 *state)
666{
667	struct v4l2_subdev *sd = &state->sensor_sd;
668	int ret;
669
670	/* Run ARM MCU */
671	ret = s5c73m3_write(state, 0x30000004, 0xffff);
672	if (ret < 0)
673		return ret;
674	usleep_range(400, 500);
675
676	/* Check booting status */
677	ret = s5c73m3_system_status_wait(state, 0x0c, 100, 3);
678	if (ret < 0) {
679
680		v4l2_err(sd, "%s: booting failed: %d\n", __func__, ret);
681		return ret;
682	}
683
684	/* Change I/O Driver Current in order to read from F-ROM */
685	ret = s5c73m3_write(state, 0x30100120, 0x0820);
686	ret = s5c73m3_write(state, 0x30100124, 0x0820);
687
688	/* Offset Setting */
689	ret = s5c73m3_write(state, 0x00010418, 0x0008);
690
691	/* P,M,S and Boot Mode */
692	ret = s5c73m3_write(state, 0x30100014, 0x2146);
693	if (ret < 0)
694		return ret;
695	ret = s5c73m3_write(state, 0x30100010, 0x230c);
696	if (ret < 0)
697		return ret;
698
699	usleep_range(200, 250);
700
701	/* Check SPI status */
702	ret = s5c73m3_system_status_wait(state, 0x230e, 100, 300);
703	if (ret < 0)
704		v4l2_err(sd, "SPI not ready: %d\n", ret);
705
706	/* ARM reset */
707	ret = s5c73m3_write(state, 0x30000004, 0xfffd);
708	if (ret < 0)
709		return ret;
710
711	/* Remap */
712	ret = s5c73m3_write(state, 0x301000a4, 0x0183);
713	if (ret < 0)
714		return ret;
715
716	s5c73m3_set_timing_register_for_vdd(state);
717
718	ret = s5c73m3_read_fw_version(state);
719
720	s5c73m3_set_fw_file_version(state);
721
722	return ret;
723}
724
725static int s5c73m3_rom_boot(struct s5c73m3 *state, bool load_fw)
726{
727	static const u32 boot_regs[][2] = {
728		{ 0x3100010c, 0x0044 },
729		{ 0x31000108, 0x000d },
730		{ 0x31000304, 0x0001 },
731		{ 0x00010000, 0x5800 },
732		{ 0x00010002, 0x0002 },
733		{ 0x31000000, 0x0001 },
734		{ 0x30100014, 0x1b85 },
735		{ 0x30100010, 0x230c }
736	};
737	struct v4l2_subdev *sd = &state->sensor_sd;
738	int i, ret;
739
740	/* Run ARM MCU */
741	ret = s5c73m3_write(state, 0x30000004, 0xffff);
742	if (ret < 0)
743		return ret;
744	usleep_range(400, 450);
745
746	/* Check booting status */
747	ret = s5c73m3_system_status_wait(state, 0x0c, 100, 4);
748	if (ret < 0) {
749		v4l2_err(sd, "Booting failed: %d\n", ret);
750		return ret;
751	}
752
753	for (i = 0; i < ARRAY_SIZE(boot_regs); i++) {
754		ret = s5c73m3_write(state, boot_regs[i][0], boot_regs[i][1]);
755		if (ret < 0)
756			return ret;
757	}
758	msleep(200);
759
760	/* Check the binary read status */
761	ret = s5c73m3_system_status_wait(state, 0x230e, 1000, 150);
762	if (ret < 0) {
763		v4l2_err(sd, "Binary read failed: %d\n", ret);
764		return ret;
765	}
766
767	/* ARM reset */
768	ret = s5c73m3_write(state, 0x30000004, 0xfffd);
769	if (ret < 0)
770		return ret;
771	/* Remap */
772	ret = s5c73m3_write(state, 0x301000a4, 0x0183);
773	if (ret < 0)
774		return ret;
775	/* MCU re-start */
776	ret = s5c73m3_write(state, 0x30000004, 0xffff);
777	if (ret < 0)
778		return ret;
779
780	state->isp_ready = 1;
781
782	return s5c73m3_read_fw_version(state);
783}
784
785static int s5c73m3_isp_init(struct s5c73m3 *state)
786{
787	int ret;
788
789	state->i2c_read_address = 0;
790	state->i2c_write_address = 0;
791
792	ret = s5c73m3_i2c_write(state->i2c_client, AHB_MSB_ADDR_PTR, 0x3310);
793	if (ret < 0)
794		return ret;
795
796	if (boot_from_rom)
797		return s5c73m3_rom_boot(state, true);
798	else
799		return s5c73m3_spi_boot(state, true);
800}
801
802static const struct s5c73m3_frame_size *s5c73m3_find_frame_size(
803					struct v4l2_mbus_framefmt *fmt,
804					enum s5c73m3_resolution_types idx)
805{
806	const struct s5c73m3_frame_size *fs;
807	const struct s5c73m3_frame_size *best_fs;
808	int best_dist = INT_MAX;
809	int i;
810
811	fs = s5c73m3_resolutions[idx];
812	best_fs = NULL;
813	for (i = 0; i < s5c73m3_resolutions_len[idx]; ++i) {
814		int dist = abs(fs->width - fmt->width) +
815						abs(fs->height - fmt->height);
816		if (dist < best_dist) {
817			best_dist = dist;
818			best_fs = fs;
819		}
820		++fs;
821	}
822
823	return best_fs;
824}
825
826static void s5c73m3_oif_try_format(struct s5c73m3 *state,
827				   struct v4l2_subdev_fh *fh,
828				   struct v4l2_subdev_format *fmt,
829				   const struct s5c73m3_frame_size **fs)
830{
831	u32 code;
832
833	switch (fmt->pad) {
834	case OIF_ISP_PAD:
835		*fs = s5c73m3_find_frame_size(&fmt->format, RES_ISP);
836		code = S5C73M3_ISP_FMT;
837		break;
838	case OIF_JPEG_PAD:
839		*fs = s5c73m3_find_frame_size(&fmt->format, RES_JPEG);
840		code = S5C73M3_JPEG_FMT;
841		break;
842	case OIF_SOURCE_PAD:
843	default:
844		if (fmt->format.code == S5C73M3_JPEG_FMT)
845			code = S5C73M3_JPEG_FMT;
846		else
847			code = S5C73M3_ISP_FMT;
848
849		if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE)
850			*fs = state->oif_pix_size[RES_ISP];
851		else
852			*fs = s5c73m3_find_frame_size(
853						v4l2_subdev_get_try_format(fh,
854							OIF_ISP_PAD),
855						RES_ISP);
856		break;
857	}
858
859	s5c73m3_fill_mbus_fmt(&fmt->format, *fs, code);
860}
861
862static void s5c73m3_try_format(struct s5c73m3 *state,
863			      struct v4l2_subdev_fh *fh,
864			      struct v4l2_subdev_format *fmt,
865			      const struct s5c73m3_frame_size **fs)
866{
867	u32 code;
868
869	if (fmt->pad == S5C73M3_ISP_PAD) {
870		*fs = s5c73m3_find_frame_size(&fmt->format, RES_ISP);
871		code = S5C73M3_ISP_FMT;
872	} else {
873		*fs = s5c73m3_find_frame_size(&fmt->format, RES_JPEG);
874		code = S5C73M3_JPEG_FMT;
875	}
876
877	s5c73m3_fill_mbus_fmt(&fmt->format, *fs, code);
878}
879
880static int s5c73m3_oif_g_frame_interval(struct v4l2_subdev *sd,
881				   struct v4l2_subdev_frame_interval *fi)
882{
883	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
884
885	if (fi->pad != OIF_SOURCE_PAD)
886		return -EINVAL;
887
888	mutex_lock(&state->lock);
889	fi->interval = state->fiv->interval;
890	mutex_unlock(&state->lock);
891
892	return 0;
893}
894
895static int __s5c73m3_set_frame_interval(struct s5c73m3 *state,
896					struct v4l2_subdev_frame_interval *fi)
897{
898	const struct s5c73m3_frame_size *prev_size =
899						state->sensor_pix_size[RES_ISP];
900	const struct s5c73m3_interval *fiv = &s5c73m3_intervals[0];
901	unsigned int ret, min_err = UINT_MAX;
902	unsigned int i, fr_time;
903
904	if (fi->interval.denominator == 0)
905		return -EINVAL;
906
907	fr_time = fi->interval.numerator * 1000 / fi->interval.denominator;
908
909	for (i = 0; i < ARRAY_SIZE(s5c73m3_intervals); i++) {
910		const struct s5c73m3_interval *iv = &s5c73m3_intervals[i];
911
912		if (prev_size->width > iv->size.width ||
913		    prev_size->height > iv->size.height)
914			continue;
915
916		ret = abs(iv->interval.numerator / 1000 - fr_time);
917		if (ret < min_err) {
918			fiv = iv;
919			min_err = ret;
920		}
921	}
922	state->fiv = fiv;
923
924	v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
925		 "Changed frame interval to %u us\n", fiv->interval.numerator);
926	return 0;
927}
928
929static int s5c73m3_oif_s_frame_interval(struct v4l2_subdev *sd,
930				   struct v4l2_subdev_frame_interval *fi)
931{
932	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
933	int ret;
934
935	if (fi->pad != OIF_SOURCE_PAD)
936		return -EINVAL;
937
938	v4l2_dbg(1, s5c73m3_dbg, sd, "Setting %d/%d frame interval\n",
939		 fi->interval.numerator, fi->interval.denominator);
940
941	mutex_lock(&state->lock);
942
943	ret = __s5c73m3_set_frame_interval(state, fi);
944	if (!ret) {
945		if (state->streaming)
946			ret = s5c73m3_set_frame_rate(state);
947		else
948			state->apply_fiv = 1;
949	}
950	mutex_unlock(&state->lock);
951	return ret;
952}
953
954static int s5c73m3_oif_enum_frame_interval(struct v4l2_subdev *sd,
955			      struct v4l2_subdev_fh *fh,
956			      struct v4l2_subdev_frame_interval_enum *fie)
957{
958	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
959	const struct s5c73m3_interval *fi;
960	int ret = 0;
961
962	if (fie->pad != OIF_SOURCE_PAD)
963		return -EINVAL;
964	if (fie->index >= ARRAY_SIZE(s5c73m3_intervals))
965		return -EINVAL;
966
967	mutex_lock(&state->lock);
968	fi = &s5c73m3_intervals[fie->index];
969	if (fie->width > fi->size.width || fie->height > fi->size.height)
970		ret = -EINVAL;
971	else
972		fie->interval = fi->interval;
973	mutex_unlock(&state->lock);
974
975	return ret;
976}
977
978static int s5c73m3_oif_get_pad_code(int pad, int index)
979{
980	if (pad == OIF_SOURCE_PAD) {
981		if (index > 1)
982			return -EINVAL;
983		return (index == 0) ? S5C73M3_ISP_FMT : S5C73M3_JPEG_FMT;
984	}
985
986	if (index > 0)
987		return -EINVAL;
988
989	return (pad == OIF_ISP_PAD) ? S5C73M3_ISP_FMT : S5C73M3_JPEG_FMT;
990}
991
992static int s5c73m3_get_fmt(struct v4l2_subdev *sd,
993			   struct v4l2_subdev_fh *fh,
994			   struct v4l2_subdev_format *fmt)
995{
996	struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd);
997	const struct s5c73m3_frame_size *fs;
998	u32 code;
999
1000	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1001		fmt->format = *v4l2_subdev_get_try_format(fh, fmt->pad);
1002		return 0;
1003	}
1004
1005	mutex_lock(&state->lock);
1006
1007	switch (fmt->pad) {
1008	case S5C73M3_ISP_PAD:
1009		code = S5C73M3_ISP_FMT;
1010		fs = state->sensor_pix_size[RES_ISP];
1011		break;
1012	case S5C73M3_JPEG_PAD:
1013		code = S5C73M3_JPEG_FMT;
1014		fs = state->sensor_pix_size[RES_JPEG];
1015		break;
1016	default:
1017		mutex_unlock(&state->lock);
1018		return -EINVAL;
1019	}
1020	s5c73m3_fill_mbus_fmt(&fmt->format, fs, code);
1021
1022	mutex_unlock(&state->lock);
1023	return 0;
1024}
1025
1026static int s5c73m3_oif_get_fmt(struct v4l2_subdev *sd,
1027			   struct v4l2_subdev_fh *fh,
1028			   struct v4l2_subdev_format *fmt)
1029{
1030	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1031	const struct s5c73m3_frame_size *fs;
1032	u32 code;
1033
1034	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1035		fmt->format = *v4l2_subdev_get_try_format(fh, fmt->pad);
1036		return 0;
1037	}
1038
1039	mutex_lock(&state->lock);
1040
1041	switch (fmt->pad) {
1042	case OIF_ISP_PAD:
1043		code = S5C73M3_ISP_FMT;
1044		fs = state->oif_pix_size[RES_ISP];
1045		break;
1046	case OIF_JPEG_PAD:
1047		code = S5C73M3_JPEG_FMT;
1048		fs = state->oif_pix_size[RES_JPEG];
1049		break;
1050	case OIF_SOURCE_PAD:
1051		code = state->mbus_code;
1052		fs = state->oif_pix_size[RES_ISP];
1053		break;
1054	default:
1055		mutex_unlock(&state->lock);
1056		return -EINVAL;
1057	}
1058	s5c73m3_fill_mbus_fmt(&fmt->format, fs, code);
1059
1060	mutex_unlock(&state->lock);
1061	return 0;
1062}
1063
1064static int s5c73m3_set_fmt(struct v4l2_subdev *sd,
1065			   struct v4l2_subdev_fh *fh,
1066			   struct v4l2_subdev_format *fmt)
1067{
1068	const struct s5c73m3_frame_size *frame_size = NULL;
1069	struct s5c73m3 *state = sensor_sd_to_s5c73m3(sd);
1070	struct v4l2_mbus_framefmt *mf;
1071	int ret = 0;
1072
1073	mutex_lock(&state->lock);
1074
1075	s5c73m3_try_format(state, fh, fmt, &frame_size);
1076
1077	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1078		mf = v4l2_subdev_get_try_format(fh, fmt->pad);
1079		*mf = fmt->format;
1080	} else {
1081		switch (fmt->pad) {
1082		case S5C73M3_ISP_PAD:
1083			state->sensor_pix_size[RES_ISP] = frame_size;
1084			break;
1085		case S5C73M3_JPEG_PAD:
1086			state->sensor_pix_size[RES_JPEG] = frame_size;
1087			break;
1088		default:
1089			ret = -EBUSY;
1090		}
1091
1092		if (state->streaming)
1093			ret = -EBUSY;
1094		else
1095			state->apply_fmt = 1;
1096	}
1097
1098	mutex_unlock(&state->lock);
1099
1100	return ret;
1101}
1102
1103static int s5c73m3_oif_set_fmt(struct v4l2_subdev *sd,
1104			 struct v4l2_subdev_fh *fh,
1105			 struct v4l2_subdev_format *fmt)
1106{
1107	const struct s5c73m3_frame_size *frame_size = NULL;
1108	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1109	struct v4l2_mbus_framefmt *mf;
1110	int ret = 0;
1111
1112	mutex_lock(&state->lock);
1113
1114	s5c73m3_oif_try_format(state, fh, fmt, &frame_size);
1115
1116	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
1117		mf = v4l2_subdev_get_try_format(fh, fmt->pad);
1118		*mf = fmt->format;
1119		if (fmt->pad == OIF_ISP_PAD) {
1120			mf = v4l2_subdev_get_try_format(fh, OIF_SOURCE_PAD);
1121			mf->width = fmt->format.width;
1122			mf->height = fmt->format.height;
1123		}
1124	} else {
1125		switch (fmt->pad) {
1126		case OIF_ISP_PAD:
1127			state->oif_pix_size[RES_ISP] = frame_size;
1128			break;
1129		case OIF_JPEG_PAD:
1130			state->oif_pix_size[RES_JPEG] = frame_size;
1131			break;
1132		case OIF_SOURCE_PAD:
1133			state->mbus_code = fmt->format.code;
1134			break;
1135		default:
1136			ret = -EBUSY;
1137		}
1138
1139		if (state->streaming)
1140			ret = -EBUSY;
1141		else
1142			state->apply_fmt = 1;
1143	}
1144
1145	mutex_unlock(&state->lock);
1146
1147	return ret;
1148}
1149
1150static int s5c73m3_oif_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
1151				  struct v4l2_mbus_frame_desc *fd)
1152{
1153	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1154	int i;
1155
1156	if (pad != OIF_SOURCE_PAD || fd == NULL)
1157		return -EINVAL;
1158
1159	mutex_lock(&state->lock);
1160	fd->num_entries = 2;
1161	for (i = 0; i < fd->num_entries; i++)
1162		fd->entry[i] = state->frame_desc.entry[i];
1163	mutex_unlock(&state->lock);
1164
1165	return 0;
1166}
1167
1168static int s5c73m3_oif_set_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
1169				      struct v4l2_mbus_frame_desc *fd)
1170{
1171	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1172	struct v4l2_mbus_frame_desc *frame_desc = &state->frame_desc;
1173	int i;
1174
1175	if (pad != OIF_SOURCE_PAD || fd == NULL)
1176		return -EINVAL;
1177
1178	fd->entry[0].length = 10 * SZ_1M;
1179	fd->entry[1].length = max_t(u32, fd->entry[1].length,
1180				    S5C73M3_EMBEDDED_DATA_MAXLEN);
1181	fd->num_entries = 2;
1182
1183	mutex_lock(&state->lock);
1184	for (i = 0; i < fd->num_entries; i++)
1185		frame_desc->entry[i] = fd->entry[i];
1186	mutex_unlock(&state->lock);
1187
1188	return 0;
1189}
1190
1191static int s5c73m3_enum_mbus_code(struct v4l2_subdev *sd,
1192				  struct v4l2_subdev_fh *fh,
1193				  struct v4l2_subdev_mbus_code_enum *code)
1194{
1195	static const int codes[] = {
1196			[S5C73M3_ISP_PAD] = S5C73M3_ISP_FMT,
1197			[S5C73M3_JPEG_PAD] = S5C73M3_JPEG_FMT};
1198
1199	if (code->index > 0 || code->pad >= S5C73M3_NUM_PADS)
1200		return -EINVAL;
1201
1202	code->code = codes[code->pad];
1203
1204	return 0;
1205}
1206
1207static int s5c73m3_oif_enum_mbus_code(struct v4l2_subdev *sd,
1208				struct v4l2_subdev_fh *fh,
1209				struct v4l2_subdev_mbus_code_enum *code)
1210{
1211	int ret;
1212
1213	ret = s5c73m3_oif_get_pad_code(code->pad, code->index);
1214	if (ret < 0)
1215		return ret;
1216
1217	code->code = ret;
1218
1219	return 0;
1220}
1221
1222static int s5c73m3_enum_frame_size(struct v4l2_subdev *sd,
1223				   struct v4l2_subdev_fh *fh,
1224				   struct v4l2_subdev_frame_size_enum *fse)
1225{
1226	int idx;
1227
1228	if (fse->pad == S5C73M3_ISP_PAD) {
1229		if (fse->code != S5C73M3_ISP_FMT)
1230			return -EINVAL;
1231		idx = RES_ISP;
1232	} else{
1233		if (fse->code != S5C73M3_JPEG_FMT)
1234			return -EINVAL;
1235		idx = RES_JPEG;
1236	}
1237
1238	if (fse->index >= s5c73m3_resolutions_len[idx])
1239		return -EINVAL;
1240
1241	fse->min_width  = s5c73m3_resolutions[idx][fse->index].width;
1242	fse->max_width  = fse->min_width;
1243	fse->max_height = s5c73m3_resolutions[idx][fse->index].height;
1244	fse->min_height = fse->max_height;
1245
1246	return 0;
1247}
1248
1249static int s5c73m3_oif_enum_frame_size(struct v4l2_subdev *sd,
1250				   struct v4l2_subdev_fh *fh,
1251				   struct v4l2_subdev_frame_size_enum *fse)
1252{
1253	int idx;
1254
1255	if (fse->pad == OIF_SOURCE_PAD) {
1256		if (fse->index > 0)
1257			return -EINVAL;
1258
1259		switch (fse->code) {
1260		case S5C73M3_JPEG_FMT:
1261		case S5C73M3_ISP_FMT: {
1262			struct v4l2_mbus_framefmt *mf =
1263				v4l2_subdev_get_try_format(fh, OIF_ISP_PAD);
1264
1265			fse->max_width = fse->min_width = mf->width;
1266			fse->max_height = fse->min_height = mf->height;
1267			return 0;
1268		}
1269		default:
1270			return -EINVAL;
1271		}
1272	}
1273
1274	if (fse->code != s5c73m3_oif_get_pad_code(fse->pad, 0))
1275		return -EINVAL;
1276
1277	if (fse->pad == OIF_JPEG_PAD)
1278		idx = RES_JPEG;
1279	else
1280		idx = RES_ISP;
1281
1282	if (fse->index >= s5c73m3_resolutions_len[idx])
1283		return -EINVAL;
1284
1285	fse->min_width  = s5c73m3_resolutions[idx][fse->index].width;
1286	fse->max_width  = fse->min_width;
1287	fse->max_height = s5c73m3_resolutions[idx][fse->index].height;
1288	fse->min_height = fse->max_height;
1289
1290	return 0;
1291}
1292
1293static int s5c73m3_oif_log_status(struct v4l2_subdev *sd)
1294{
1295	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1296
1297	v4l2_ctrl_handler_log_status(sd->ctrl_handler, sd->name);
1298
1299	v4l2_info(sd, "power: %d, apply_fmt: %d\n", state->power,
1300							state->apply_fmt);
1301
1302	return 0;
1303}
1304
1305static int s5c73m3_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
1306{
1307	struct v4l2_mbus_framefmt *mf;
1308
1309	mf = v4l2_subdev_get_try_format(fh, S5C73M3_ISP_PAD);
1310	s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1],
1311						S5C73M3_ISP_FMT);
1312
1313	mf = v4l2_subdev_get_try_format(fh, S5C73M3_JPEG_PAD);
1314	s5c73m3_fill_mbus_fmt(mf, &s5c73m3_jpeg_resolutions[1],
1315					S5C73M3_JPEG_FMT);
1316
1317	return 0;
1318}
1319
1320static int s5c73m3_oif_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
1321{
1322	struct v4l2_mbus_framefmt *mf;
1323
1324	mf = v4l2_subdev_get_try_format(fh, OIF_ISP_PAD);
1325	s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1],
1326						S5C73M3_ISP_FMT);
1327
1328	mf = v4l2_subdev_get_try_format(fh, OIF_JPEG_PAD);
1329	s5c73m3_fill_mbus_fmt(mf, &s5c73m3_jpeg_resolutions[1],
1330					S5C73M3_JPEG_FMT);
1331
1332	mf = v4l2_subdev_get_try_format(fh, OIF_SOURCE_PAD);
1333	s5c73m3_fill_mbus_fmt(mf, &s5c73m3_isp_resolutions[1],
1334						S5C73M3_ISP_FMT);
1335	return 0;
1336}
1337
1338static int s5c73m3_gpio_set_value(struct s5c73m3 *priv, int id, u32 val)
1339{
1340	if (!gpio_is_valid(priv->gpio[id].gpio))
1341		return 0;
1342	gpio_set_value(priv->gpio[id].gpio, !!val);
1343	return 1;
1344}
1345
1346static int s5c73m3_gpio_assert(struct s5c73m3 *priv, int id)
1347{
1348	return s5c73m3_gpio_set_value(priv, id, priv->gpio[id].level);
1349}
1350
1351static int s5c73m3_gpio_deassert(struct s5c73m3 *priv, int id)
1352{
1353	return s5c73m3_gpio_set_value(priv, id, !priv->gpio[id].level);
1354}
1355
1356static int __s5c73m3_power_on(struct s5c73m3 *state)
1357{
1358	int i, ret;
1359
1360	for (i = 0; i < S5C73M3_MAX_SUPPLIES; i++) {
1361		ret = regulator_enable(state->supplies[i].consumer);
1362		if (ret)
1363			goto err_reg_dis;
1364	}
1365
1366	ret = clk_set_rate(state->clock, state->mclk_frequency);
1367	if (ret < 0)
1368		goto err_reg_dis;
1369
1370	ret = clk_prepare_enable(state->clock);
1371	if (ret < 0)
1372		goto err_reg_dis;
1373
1374	v4l2_dbg(1, s5c73m3_dbg, &state->oif_sd, "clock frequency: %ld\n",
1375					clk_get_rate(state->clock));
1376
1377	s5c73m3_gpio_deassert(state, STBY);
1378	usleep_range(100, 200);
1379
1380	s5c73m3_gpio_deassert(state, RST);
1381	usleep_range(50, 100);
1382
1383	return 0;
1384
1385err_reg_dis:
1386	for (--i; i >= 0; i--)
1387		regulator_disable(state->supplies[i].consumer);
1388	return ret;
1389}
1390
1391static int __s5c73m3_power_off(struct s5c73m3 *state)
1392{
1393	int i, ret;
1394
1395	if (s5c73m3_gpio_assert(state, RST))
1396		usleep_range(10, 50);
1397
1398	if (s5c73m3_gpio_assert(state, STBY))
1399		usleep_range(100, 200);
1400
1401	clk_disable_unprepare(state->clock);
1402
1403	state->streaming = 0;
1404	state->isp_ready = 0;
1405
1406	for (i = S5C73M3_MAX_SUPPLIES - 1; i >= 0; i--) {
1407		ret = regulator_disable(state->supplies[i].consumer);
1408		if (ret)
1409			goto err;
1410	}
1411
1412	return 0;
1413err:
1414	for (++i; i < S5C73M3_MAX_SUPPLIES; i++) {
1415		int r = regulator_enable(state->supplies[i].consumer);
1416		if (r < 0)
1417			v4l2_err(&state->oif_sd, "Failed to reenable %s: %d\n",
1418				 state->supplies[i].supply, r);
1419	}
1420
1421	clk_prepare_enable(state->clock);
1422	return ret;
1423}
1424
1425static int s5c73m3_oif_set_power(struct v4l2_subdev *sd, int on)
1426{
1427	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1428	int ret = 0;
1429
1430	mutex_lock(&state->lock);
1431
1432	if (on && !state->power) {
1433		ret = __s5c73m3_power_on(state);
1434		if (!ret)
1435			ret = s5c73m3_isp_init(state);
1436		if (!ret) {
1437			state->apply_fiv = 1;
1438			state->apply_fmt = 1;
1439		}
1440	} else if (!on == state->power) {
1441		ret = s5c73m3_set_af_softlanding(state);
1442		if (!ret)
1443			ret = __s5c73m3_power_off(state);
1444		else
1445			v4l2_err(sd, "Soft landing lens failed\n");
1446	}
1447	if (!ret)
1448		state->power += on ? 1 : -1;
1449
1450	v4l2_dbg(1, s5c73m3_dbg, sd, "%s: power: %d\n",
1451		 __func__, state->power);
1452
1453	mutex_unlock(&state->lock);
1454	return ret;
1455}
1456
1457static int s5c73m3_oif_registered(struct v4l2_subdev *sd)
1458{
1459	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1460	int ret;
1461
1462	ret = v4l2_device_register_subdev(sd->v4l2_dev, &state->sensor_sd);
1463	if (ret) {
1464		v4l2_err(sd->v4l2_dev, "Failed to register %s\n",
1465							state->oif_sd.name);
1466		return ret;
1467	}
1468
1469	ret = media_entity_create_link(&state->sensor_sd.entity,
1470			S5C73M3_ISP_PAD, &state->oif_sd.entity, OIF_ISP_PAD,
1471			MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
1472
1473	ret = media_entity_create_link(&state->sensor_sd.entity,
1474			S5C73M3_JPEG_PAD, &state->oif_sd.entity, OIF_JPEG_PAD,
1475			MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED);
1476
1477	return ret;
1478}
1479
1480static void s5c73m3_oif_unregistered(struct v4l2_subdev *sd)
1481{
1482	struct s5c73m3 *state = oif_sd_to_s5c73m3(sd);
1483	v4l2_device_unregister_subdev(&state->sensor_sd);
1484}
1485
1486static const struct v4l2_subdev_internal_ops s5c73m3_internal_ops = {
1487	.open		= s5c73m3_open,
1488};
1489
1490static const struct v4l2_subdev_pad_ops s5c73m3_pad_ops = {
1491	.enum_mbus_code		= s5c73m3_enum_mbus_code,
1492	.enum_frame_size	= s5c73m3_enum_frame_size,
1493	.get_fmt		= s5c73m3_get_fmt,
1494	.set_fmt		= s5c73m3_set_fmt,
1495};
1496
1497static const struct v4l2_subdev_ops s5c73m3_subdev_ops = {
1498	.pad	= &s5c73m3_pad_ops,
1499};
1500
1501static const struct v4l2_subdev_internal_ops oif_internal_ops = {
1502	.registered	= s5c73m3_oif_registered,
1503	.unregistered	= s5c73m3_oif_unregistered,
1504	.open		= s5c73m3_oif_open,
1505};
1506
1507static const struct v4l2_subdev_pad_ops s5c73m3_oif_pad_ops = {
1508	.enum_mbus_code		= s5c73m3_oif_enum_mbus_code,
1509	.enum_frame_size	= s5c73m3_oif_enum_frame_size,
1510	.enum_frame_interval	= s5c73m3_oif_enum_frame_interval,
1511	.get_fmt		= s5c73m3_oif_get_fmt,
1512	.set_fmt		= s5c73m3_oif_set_fmt,
1513	.get_frame_desc		= s5c73m3_oif_get_frame_desc,
1514	.set_frame_desc		= s5c73m3_oif_set_frame_desc,
1515};
1516
1517static const struct v4l2_subdev_core_ops s5c73m3_oif_core_ops = {
1518	.s_power	= s5c73m3_oif_set_power,
1519	.log_status	= s5c73m3_oif_log_status,
1520};
1521
1522static const struct v4l2_subdev_video_ops s5c73m3_oif_video_ops = {
1523	.s_stream		= s5c73m3_oif_s_stream,
1524	.g_frame_interval	= s5c73m3_oif_g_frame_interval,
1525	.s_frame_interval	= s5c73m3_oif_s_frame_interval,
1526};
1527
1528static const struct v4l2_subdev_ops oif_subdev_ops = {
1529	.core	= &s5c73m3_oif_core_ops,
1530	.pad	= &s5c73m3_oif_pad_ops,
1531	.video	= &s5c73m3_oif_video_ops,
1532};
1533
1534static int s5c73m3_configure_gpios(struct s5c73m3 *state)
1535{
1536	static const char * const gpio_names[] = {
1537		"S5C73M3_STBY", "S5C73M3_RST"
1538	};
1539	struct i2c_client *c = state->i2c_client;
1540	struct s5c73m3_gpio *g = state->gpio;
1541	int ret, i;
1542
1543	for (i = 0; i < GPIO_NUM; ++i) {
1544		unsigned int flags = GPIOF_DIR_OUT;
1545		if (g[i].level)
1546			flags |= GPIOF_INIT_HIGH;
1547		ret = devm_gpio_request_one(&c->dev, g[i].gpio, flags,
1548					    gpio_names[i]);
1549		if (ret) {
1550			v4l2_err(c, "failed to request gpio %s\n",
1551				 gpio_names[i]);
1552			return ret;
1553		}
1554	}
1555	return 0;
1556}
1557
1558static int s5c73m3_parse_gpios(struct s5c73m3 *state)
1559{
1560	static const char * const prop_names[] = {
1561		"standby-gpios", "xshutdown-gpios",
1562	};
1563	struct device *dev = &state->i2c_client->dev;
1564	struct device_node *node = dev->of_node;
1565	int ret, i;
1566
1567	for (i = 0; i < GPIO_NUM; ++i) {
1568		enum of_gpio_flags of_flags;
1569
1570		ret = of_get_named_gpio_flags(node, prop_names[i],
1571					      0, &of_flags);
1572		if (ret < 0) {
1573			dev_err(dev, "failed to parse %s DT property\n",
1574				prop_names[i]);
1575			return -EINVAL;
1576		}
1577		state->gpio[i].gpio = ret;
1578		state->gpio[i].level = !(of_flags & OF_GPIO_ACTIVE_LOW);
1579	}
1580	return 0;
1581}
1582
1583static int s5c73m3_get_platform_data(struct s5c73m3 *state)
1584{
1585	struct device *dev = &state->i2c_client->dev;
1586	const struct s5c73m3_platform_data *pdata = dev->platform_data;
1587	struct device_node *node = dev->of_node;
1588	struct device_node *node_ep;
1589	struct v4l2_of_endpoint ep;
1590	int ret;
1591
1592	if (!node) {
1593		if (!pdata) {
1594			dev_err(dev, "Platform data not specified\n");
1595			return -EINVAL;
1596		}
1597
1598		state->mclk_frequency = pdata->mclk_frequency;
1599		state->gpio[STBY] = pdata->gpio_stby;
1600		state->gpio[RST] = pdata->gpio_reset;
1601		return 0;
1602	}
1603
1604	state->clock = devm_clk_get(dev, S5C73M3_CLK_NAME);
1605	if (IS_ERR(state->clock))
1606		return PTR_ERR(state->clock);
1607
1608	if (of_property_read_u32(node, "clock-frequency",
1609				 &state->mclk_frequency)) {
1610		state->mclk_frequency = S5C73M3_DEFAULT_MCLK_FREQ;
1611		dev_info(dev, "using default %u Hz clock frequency\n",
1612					state->mclk_frequency);
1613	}
1614
1615	ret = s5c73m3_parse_gpios(state);
1616	if (ret < 0)
1617		return -EINVAL;
1618
1619	node_ep = of_graph_get_next_endpoint(node, NULL);
1620	if (!node_ep) {
1621		dev_warn(dev, "no endpoint defined for node: %s\n",
1622						node->full_name);
1623		return 0;
1624	}
1625
1626	v4l2_of_parse_endpoint(node_ep, &ep);
1627	of_node_put(node_ep);
1628
1629	if (ep.bus_type != V4L2_MBUS_CSI2) {
1630		dev_err(dev, "unsupported bus type\n");
1631		return -EINVAL;
1632	}
1633	/*
1634	 * Number of MIPI CSI-2 data lanes is currently not configurable,
1635	 * always a default value of 4 lanes is used.
1636	 */
1637	if (ep.bus.mipi_csi2.num_data_lanes != S5C73M3_MIPI_DATA_LANES)
1638		dev_info(dev, "falling back to 4 MIPI CSI-2 data lanes\n");
1639
1640	return 0;
1641}
1642
1643static int s5c73m3_probe(struct i2c_client *client,
1644				const struct i2c_device_id *id)
1645{
1646	struct device *dev = &client->dev;
1647	struct v4l2_subdev *sd;
1648	struct v4l2_subdev *oif_sd;
1649	struct s5c73m3 *state;
1650	int ret, i;
1651
1652	state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL);
1653	if (!state)
1654		return -ENOMEM;
1655
1656	state->i2c_client = client;
1657	ret = s5c73m3_get_platform_data(state);
1658	if (ret < 0)
1659		return ret;
1660
1661	mutex_init(&state->lock);
1662	sd = &state->sensor_sd;
1663	oif_sd = &state->oif_sd;
1664
1665	v4l2_subdev_init(sd, &s5c73m3_subdev_ops);
1666	sd->owner = client->dev.driver->owner;
1667	v4l2_set_subdevdata(sd, state);
1668	strlcpy(sd->name, "S5C73M3", sizeof(sd->name));
1669
1670	sd->internal_ops = &s5c73m3_internal_ops;
1671	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1672
1673	state->sensor_pads[S5C73M3_JPEG_PAD].flags = MEDIA_PAD_FL_SOURCE;
1674	state->sensor_pads[S5C73M3_ISP_PAD].flags = MEDIA_PAD_FL_SOURCE;
1675	sd->entity.type = MEDIA_ENT_T_V4L2_SUBDEV;
1676
1677	ret = media_entity_init(&sd->entity, S5C73M3_NUM_PADS,
1678							state->sensor_pads, 0);
1679	if (ret < 0)
1680		return ret;
1681
1682	v4l2_i2c_subdev_init(oif_sd, client, &oif_subdev_ops);
1683	strcpy(oif_sd->name, "S5C73M3-OIF");
1684
1685	oif_sd->internal_ops = &oif_internal_ops;
1686	oif_sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1687
1688	state->oif_pads[OIF_ISP_PAD].flags = MEDIA_PAD_FL_SINK;
1689	state->oif_pads[OIF_JPEG_PAD].flags = MEDIA_PAD_FL_SINK;
1690	state->oif_pads[OIF_SOURCE_PAD].flags = MEDIA_PAD_FL_SOURCE;
1691	oif_sd->entity.type = MEDIA_ENT_T_V4L2_SUBDEV;
1692
1693	ret = media_entity_init(&oif_sd->entity, OIF_NUM_PADS,
1694							state->oif_pads, 0);
1695	if (ret < 0)
1696		return ret;
1697
1698	ret = s5c73m3_configure_gpios(state);
1699	if (ret)
1700		goto out_err;
1701
1702	for (i = 0; i < S5C73M3_MAX_SUPPLIES; i++)
1703		state->supplies[i].supply = s5c73m3_supply_names[i];
1704
1705	ret = devm_regulator_bulk_get(dev, S5C73M3_MAX_SUPPLIES,
1706			       state->supplies);
1707	if (ret) {
1708		dev_err(dev, "failed to get regulators\n");
1709		goto out_err;
1710	}
1711
1712	ret = s5c73m3_init_controls(state);
1713	if (ret)
1714		goto out_err;
1715
1716	state->sensor_pix_size[RES_ISP] = &s5c73m3_isp_resolutions[1];
1717	state->sensor_pix_size[RES_JPEG] = &s5c73m3_jpeg_resolutions[1];
1718	state->oif_pix_size[RES_ISP] = state->sensor_pix_size[RES_ISP];
1719	state->oif_pix_size[RES_JPEG] = state->sensor_pix_size[RES_JPEG];
1720
1721	state->mbus_code = S5C73M3_ISP_FMT;
1722
1723	state->fiv = &s5c73m3_intervals[S5C73M3_DEFAULT_FRAME_INTERVAL];
1724
1725	state->fw_file_version[0] = 'G';
1726	state->fw_file_version[1] = 'C';
1727
1728	ret = s5c73m3_register_spi_driver(state);
1729	if (ret < 0)
1730		goto out_err;
1731
1732	oif_sd->dev = dev;
1733
1734	ret = __s5c73m3_power_on(state);
1735	if (ret < 0)
1736		goto out_err1;
1737
1738	ret = s5c73m3_get_fw_version(state);
1739	__s5c73m3_power_off(state);
1740
1741	if (ret < 0) {
1742		dev_err(dev, "Device detection failed: %d\n", ret);
1743		goto out_err1;
1744	}
1745
1746	ret = v4l2_async_register_subdev(oif_sd);
1747	if (ret < 0)
1748		goto out_err1;
1749
1750	v4l2_info(sd, "%s: completed successfully\n", __func__);
1751	return 0;
1752
1753out_err1:
1754	s5c73m3_unregister_spi_driver(state);
1755out_err:
1756	media_entity_cleanup(&sd->entity);
1757	return ret;
1758}
1759
1760static int s5c73m3_remove(struct i2c_client *client)
1761{
1762	struct v4l2_subdev *oif_sd = i2c_get_clientdata(client);
1763	struct s5c73m3 *state = oif_sd_to_s5c73m3(oif_sd);
1764	struct v4l2_subdev *sensor_sd = &state->sensor_sd;
1765
1766	v4l2_async_unregister_subdev(oif_sd);
1767
1768	v4l2_ctrl_handler_free(oif_sd->ctrl_handler);
1769	media_entity_cleanup(&oif_sd->entity);
1770
1771	v4l2_device_unregister_subdev(sensor_sd);
1772	media_entity_cleanup(&sensor_sd->entity);
1773
1774	s5c73m3_unregister_spi_driver(state);
1775
1776	return 0;
1777}
1778
1779static const struct i2c_device_id s5c73m3_id[] = {
1780	{ DRIVER_NAME, 0 },
1781	{ }
1782};
1783MODULE_DEVICE_TABLE(i2c, s5c73m3_id);
1784
1785#ifdef CONFIG_OF
1786static const struct of_device_id s5c73m3_of_match[] = {
1787	{ .compatible = "samsung,s5c73m3" },
1788	{ }
1789};
1790MODULE_DEVICE_TABLE(of, s5c73m3_of_match);
1791#endif
1792
1793static struct i2c_driver s5c73m3_i2c_driver = {
1794	.driver = {
1795		.of_match_table = of_match_ptr(s5c73m3_of_match),
1796		.name	= DRIVER_NAME,
1797	},
1798	.probe		= s5c73m3_probe,
1799	.remove		= s5c73m3_remove,
1800	.id_table	= s5c73m3_id,
1801};
1802
1803module_i2c_driver(s5c73m3_i2c_driver);
1804
1805MODULE_DESCRIPTION("Samsung S5C73M3 camera driver");
1806MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>");
1807MODULE_LICENSE("GPL");
1808