soc_camera.c 38.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * camera image capture (abstract) bus driver
 *
 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
 *
 * This driver provides an interface between platform-specific camera
 * busses and camera devices. It should be used if the camera is
 * connected not over a "proper" bus like PCI or USB, but over a
 * special bus, like, for example, the Quick Capture interface on PXA270
 * SoCs. Later it should also be used for i.MX31 SoCs from Freescale.
 * It can handle multiple cameras and / or multiple busses, which can
 * be used, e.g., in stereo-vision applications.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/device.h>
#include <linux/err.h>
21 22 23
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/list.h>
24
#include <linux/mutex.h>
25
#include <linux/module.h>
26
#include <linux/platform_device.h>
27
#include <linux/regulator/consumer.h>
28
#include <linux/slab.h>
29
#include <linux/pm_runtime.h>
30 31
#include <linux/vmalloc.h>

32
#include <media/soc_camera.h>
33
#include <media/v4l2-common.h>
34
#include <media/v4l2-ioctl.h>
35
#include <media/v4l2-dev.h>
36
#include <media/videobuf-core.h>
37
#include <media/videobuf2-core.h>
38
#include <media/soc_mediabus.h>
39

40 41 42 43
/* Default to VGA resolution */
#define DEFAULT_WIDTH	640
#define DEFAULT_HEIGHT	480

44 45 46 47 48
#define is_streaming(ici, icd)				\
	(((ici)->ops->init_videobuf) ?			\
	 (icd)->vb_vidq.streaming :			\
	 vb2_is_streaming(&(icd)->vb2_vidq))

49 50
static LIST_HEAD(hosts);
static LIST_HEAD(devices);
51
static DEFINE_MUTEX(list_lock);		/* Protects the list of hosts */
52

53 54
static int soc_camera_power_on(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
55
{
56 57 58
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	int ret = regulator_bulk_enable(icl->num_regulators,
					icl->regulators);
59 60 61 62
	if (ret < 0) {
		dev_err(icd->pdev, "Cannot enable regulators\n");
		return ret;
	}
63

64 65
	if (icl->power) {
		ret = icl->power(icd->pdev, 1);
66
		if (ret < 0) {
67
			dev_err(icd->pdev,
68
				"Platform failed to power-on the camera.\n");
69
			goto elinkpwr;
70
		}
71 72
	}

73 74 75 76 77 78 79 80 81 82 83 84
	ret = v4l2_subdev_call(sd, core, s_power, 1);
	if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
		goto esdpwr;

	return 0;

esdpwr:
	if (icl->power)
		icl->power(icd->pdev, 0);
elinkpwr:
	regulator_bulk_disable(icl->num_regulators,
			       icl->regulators);
85 86 87 88 89 90
	return ret;
}

static int soc_camera_power_off(struct soc_camera_device *icd,
				struct soc_camera_link *icl)
{
91 92 93 94 95
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	int ret = v4l2_subdev_call(sd, core, s_power, 0);

	if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
		return ret;
96 97 98

	if (icl->power) {
		ret = icl->power(icd->pdev, 0);
99
		if (ret < 0) {
100
			dev_err(icd->pdev,
101 102 103 104 105
				"Platform failed to power-off the camera.\n");
			return ret;
		}
	}

106 107 108 109 110 111
	ret = regulator_bulk_disable(icl->num_regulators,
				     icl->regulators);
	if (ret < 0)
		dev_err(icd->pdev, "Cannot disable regulators\n");

	return ret;
112 113
}

114 115 116 117 118 119 120 121 122 123 124 125
const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc(
	struct soc_camera_device *icd, unsigned int fourcc)
{
	unsigned int i;

	for (i = 0; i < icd->num_user_formats; i++)
		if (icd->user_formats[i].host_fmt->fourcc == fourcc)
			return icd->user_formats + i;
	return NULL;
}
EXPORT_SYMBOL(soc_camera_xlate_by_fourcc);

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
/**
 * soc_camera_apply_board_flags() - apply platform SOCAM_SENSOR_INVERT_* flags
 * @icl:	camera platform parameters
 * @cfg:	media bus configuration
 * @return:	resulting flags
 */
unsigned long soc_camera_apply_board_flags(struct soc_camera_link *icl,
					   const struct v4l2_mbus_config *cfg)
{
	unsigned long f, flags = cfg->flags;

	/* If only one of the two polarities is supported, switch to the opposite */
	if (icl->flags & SOCAM_SENSOR_INVERT_HSYNC) {
		f = flags & (V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW);
		if (f == V4L2_MBUS_HSYNC_ACTIVE_HIGH || f == V4L2_MBUS_HSYNC_ACTIVE_LOW)
			flags ^= V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_HSYNC_ACTIVE_LOW;
	}

	if (icl->flags & SOCAM_SENSOR_INVERT_VSYNC) {
		f = flags & (V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW);
		if (f == V4L2_MBUS_VSYNC_ACTIVE_HIGH || f == V4L2_MBUS_VSYNC_ACTIVE_LOW)
			flags ^= V4L2_MBUS_VSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_LOW;
	}

	if (icl->flags & SOCAM_SENSOR_INVERT_PCLK) {
		f = flags & (V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING);
		if (f == V4L2_MBUS_PCLK_SAMPLE_RISING || f == V4L2_MBUS_PCLK_SAMPLE_FALLING)
			flags ^= V4L2_MBUS_PCLK_SAMPLE_RISING | V4L2_MBUS_PCLK_SAMPLE_FALLING;
	}

	return flags;
}
EXPORT_SYMBOL(soc_camera_apply_board_flags);

160 161 162 163 164 165
#define pixfmtstr(x) (x) & 0xff, ((x) >> 8) & 0xff, ((x) >> 16) & 0xff, \
	((x) >> 24) & 0xff

static int soc_camera_try_fmt(struct soc_camera_device *icd,
			      struct v4l2_format *f)
{
166
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
167 168 169
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

170
	dev_dbg(icd->pdev, "TRY_FMT(%c%c%c%c, %ux%u)\n",
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
		pixfmtstr(pix->pixelformat), pix->width, pix->height);

	pix->bytesperline = 0;
	pix->sizeimage = 0;

	ret = ici->ops->try_fmt(icd, f);
	if (ret < 0)
		return ret;

	if (!pix->sizeimage) {
		if (!pix->bytesperline) {
			const struct soc_camera_format_xlate *xlate;

			xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat);
			if (!xlate)
				return -EINVAL;

			ret = soc_mbus_bytes_per_line(pix->width,
						      xlate->host_fmt);
			if (ret > 0)
				pix->bytesperline = ret;
		}
		if (pix->bytesperline)
			pix->sizeimage = pix->bytesperline * pix->height;
	}

	return 0;
}

200
static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv,
201
				      struct v4l2_format *f)
202
{
203
	struct soc_camera_device *icd = file->private_data;
204 205 206

	WARN_ON(priv != file->private_data);

207 208 209 210
	/* Only single-plane capture is supported so far */
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

211
	/* limit format to hardware capabilities */
212
	return soc_camera_try_fmt(icd, f);
213 214 215 216 217 218 219 220
}

static int soc_camera_enum_input(struct file *file, void *priv,
				 struct v4l2_input *inp)
{
	if (inp->index != 0)
		return -EINVAL;

221 222 223 224
	/* default is camera */
	inp->type = V4L2_INPUT_TYPE_CAMERA;
	inp->std  = V4L2_STD_UNKNOWN;
	strcpy(inp->name, "Camera");
225

226
	return 0;
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
}

static int soc_camera_g_input(struct file *file, void *priv, unsigned int *i)
{
	*i = 0;

	return 0;
}

static int soc_camera_s_input(struct file *file, void *priv, unsigned int i)
{
	if (i > 0)
		return -EINVAL;

	return 0;
}

static int soc_camera_s_std(struct file *file, void *priv, v4l2_std_id *a)
{
246
	struct soc_camera_device *icd = file->private_data;
247
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
248

249
	return v4l2_subdev_call(sd, core, s_std, *a);
250 251
}

252 253 254 255 256 257 258 259
static int soc_camera_g_std(struct file *file, void *priv, v4l2_std_id *a)
{
	struct soc_camera_device *icd = file->private_data;
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);

	return v4l2_subdev_call(sd, core, g_std, a);
}

260 261 262 263
static int soc_camera_enum_fsizes(struct file *file, void *fh,
					 struct v4l2_frmsizeenum *fsize)
{
	struct soc_camera_device *icd = file->private_data;
264
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
265 266 267 268

	return ici->ops->enum_fsizes(icd, fsize);
}

269 270 271 272
static int soc_camera_reqbufs(struct file *file, void *priv,
			      struct v4l2_requestbuffers *p)
{
	int ret;
273
	struct soc_camera_device *icd = file->private_data;
274
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
275 276 277

	WARN_ON(priv != file->private_data);

278 279 280
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;

281 282 283 284 285 286 287 288 289
	if (ici->ops->init_videobuf) {
		ret = videobuf_reqbufs(&icd->vb_vidq, p);
		if (ret < 0)
			return ret;

		ret = ici->ops->reqbufs(icd, p);
	} else {
		ret = vb2_reqbufs(&icd->vb2_vidq, p);
	}
290

291 292 293 294
	if (!ret && !icd->streamer)
		icd->streamer = file;

	return ret;
295 296 297 298 299
}

static int soc_camera_querybuf(struct file *file, void *priv,
			       struct v4l2_buffer *p)
{
300
	struct soc_camera_device *icd = file->private_data;
301
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
302 303 304

	WARN_ON(priv != file->private_data);

305 306 307 308
	if (ici->ops->init_videobuf)
		return videobuf_querybuf(&icd->vb_vidq, p);
	else
		return vb2_querybuf(&icd->vb2_vidq, p);
309 310 311 312 313
}

static int soc_camera_qbuf(struct file *file, void *priv,
			   struct v4l2_buffer *p)
{
314
	struct soc_camera_device *icd = file->private_data;
315
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
316 317 318

	WARN_ON(priv != file->private_data);

319 320 321
	if (icd->streamer != file)
		return -EBUSY;

322 323 324 325
	if (ici->ops->init_videobuf)
		return videobuf_qbuf(&icd->vb_vidq, p);
	else
		return vb2_qbuf(&icd->vb2_vidq, p);
326 327 328 329 330
}

static int soc_camera_dqbuf(struct file *file, void *priv,
			    struct v4l2_buffer *p)
{
331
	struct soc_camera_device *icd = file->private_data;
332
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
333 334 335

	WARN_ON(priv != file->private_data);

336 337 338
	if (icd->streamer != file)
		return -EBUSY;

339 340 341 342
	if (ici->ops->init_videobuf)
		return videobuf_dqbuf(&icd->vb_vidq, p, file->f_flags & O_NONBLOCK);
	else
		return vb2_dqbuf(&icd->vb2_vidq, p, file->f_flags & O_NONBLOCK);
343 344
}

345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
static int soc_camera_create_bufs(struct file *file, void *priv,
			    struct v4l2_create_buffers *create)
{
	struct soc_camera_device *icd = file->private_data;
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);

	/* videobuf2 only */
	if (ici->ops->init_videobuf)
		return -EINVAL;
	else
		return vb2_create_bufs(&icd->vb2_vidq, create);
}

static int soc_camera_prepare_buf(struct file *file, void *priv,
				  struct v4l2_buffer *b)
{
	struct soc_camera_device *icd = file->private_data;
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);

	/* videobuf2 only */
	if (ici->ops->init_videobuf)
		return -EINVAL;
	else
		return vb2_prepare_buf(&icd->vb2_vidq, b);
}

371
/* Always entered with .video_lock held */
372 373
static int soc_camera_init_user_formats(struct soc_camera_device *icd)
{
374
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
375
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
376 377
	unsigned int i, fmts = 0, raw_fmts = 0;
	int ret;
378 379 380 381
	enum v4l2_mbus_pixelcode code;

	while (!v4l2_subdev_call(sd, video, enum_mbus_fmt, raw_fmts, &code))
		raw_fmts++;
382 383 384 385 386 387

	if (!ici->ops->get_formats)
		/*
		 * Fallback mode - the host will have to serve all
		 * sensor-provided formats one-to-one to the user
		 */
388
		fmts = raw_fmts;
389 390 391 392 393
	else
		/*
		 * First pass - only count formats this host-sensor
		 * configuration can provide
		 */
394
		for (i = 0; i < raw_fmts; i++) {
395 396 397 398 399
			ret = ici->ops->get_formats(icd, i, NULL);
			if (ret < 0)
				return ret;
			fmts += ret;
		}
400 401 402 403 404 405 406 407 408

	if (!fmts)
		return -ENXIO;

	icd->user_formats =
		vmalloc(fmts * sizeof(struct soc_camera_format_xlate));
	if (!icd->user_formats)
		return -ENOMEM;

409
	dev_dbg(icd->pdev, "Found %d supported formats.\n", fmts);
410 411

	/* Second pass - actually fill data formats */
412
	fmts = 0;
413
	for (i = 0; i < raw_fmts; i++)
414
		if (!ici->ops->get_formats) {
415
			v4l2_subdev_call(sd, video, enum_mbus_fmt, i, &code);
416
			icd->user_formats[fmts].host_fmt =
417
				soc_mbus_get_fmtdesc(code);
418 419
			if (icd->user_formats[fmts].host_fmt)
				icd->user_formats[fmts++].code = code;
420
		} else {
421 422 423 424 425
			ret = ici->ops->get_formats(icd, i,
						    &icd->user_formats[fmts]);
			if (ret < 0)
				goto egfmt;
			fmts += ret;
426 427
		}

428
	icd->num_user_formats = fmts;
429
	icd->current_fmt = &icd->user_formats[0];
430 431

	return 0;
432 433 434 435

egfmt:
	vfree(icd->user_formats);
	return ret;
436 437
}

438
/* Always entered with .video_lock held */
439 440
static void soc_camera_free_user_formats(struct soc_camera_device *icd)
{
441
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
442 443 444

	if (ici->ops->put_formats)
		ici->ops->put_formats(icd);
445
	icd->current_fmt = NULL;
446
	icd->num_user_formats = 0;
447
	vfree(icd->user_formats);
448
	icd->user_formats = NULL;
449 450
}

451
/* Called with .vb_lock held, or from the first open(2), see comment there */
452
static int soc_camera_set_fmt(struct soc_camera_device *icd,
453 454
			      struct v4l2_format *f)
{
455
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
456 457 458
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

459
	dev_dbg(icd->pdev, "S_FMT(%c%c%c%c, %ux%u)\n",
460 461
		pixfmtstr(pix->pixelformat), pix->width, pix->height);

462
	/* We always call try_fmt() before set_fmt() or set_crop() */
463
	ret = soc_camera_try_fmt(icd, f);
464 465 466 467 468 469 470
	if (ret < 0)
		return ret;

	ret = ici->ops->set_fmt(icd, f);
	if (ret < 0) {
		return ret;
	} else if (!icd->current_fmt ||
471
		   icd->current_fmt->host_fmt->fourcc != pix->pixelformat) {
472
		dev_err(icd->pdev,
473 474 475 476
			"Host driver hasn't set up current format correctly!\n");
		return -EINVAL;
	}

477 478
	icd->user_width		= pix->width;
	icd->user_height	= pix->height;
479 480
	icd->bytesperline	= pix->bytesperline;
	icd->sizeimage		= pix->sizeimage;
481
	icd->colorspace		= pix->colorspace;
482 483 484
	icd->field		= pix->field;
	if (ici->ops->init_videobuf)
		icd->vb_vidq.field = pix->field;
485

486
	dev_dbg(icd->pdev, "set width: %d height: %d\n",
487
		icd->user_width, icd->user_height);
488 489 490 491 492

	/* set physical bus parameters */
	return ici->ops->set_bus_param(icd, pix->pixelformat);
}

493
static int soc_camera_open(struct file *file)
494
{
495
	struct video_device *vdev = video_devdata(file);
496
	struct soc_camera_device *icd = dev_get_drvdata(vdev->parent);
497
	struct soc_camera_link *icl = to_soc_camera_link(icd);
498
	struct soc_camera_host *ici;
499 500
	int ret;

501
	if (!to_soc_camera_control(icd))
502 503 504
		/* No device driver attached */
		return -ENODEV;

505
	ici = to_soc_camera_host(icd->parent);
506

507
	if (!try_module_get(ici->ops->owner)) {
508
		dev_err(icd->pdev, "Couldn't lock capture bus driver.\n");
509
		return -EINVAL;
510 511
	}

512 513
	icd->use_count++;

514 515
	/* Now we really have to activate the camera */
	if (icd->use_count == 1) {
516
		/* Restore parameters before the last close() per V4L2 API */
517 518 519
		struct v4l2_format f = {
			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix = {
520 521
				.width		= icd->user_width,
				.height		= icd->user_height,
522
				.field		= icd->field,
523 524 525
				.colorspace	= icd->colorspace,
				.pixelformat	=
					icd->current_fmt->host_fmt->fourcc,
526 527 528
			},
		};

529
		ret = soc_camera_power_on(icd, icl);
530 531
		if (ret < 0)
			goto epower;
532 533 534 535 536

		/* The camera could have been already on, try to reset */
		if (icl->reset)
			icl->reset(icd->pdev);

537
		ret = ici->ops->add(icd);
538
		if (ret < 0) {
539
			dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret);
540 541
			goto eiciadd;
		}
542

543 544 545 546 547
		pm_runtime_enable(&icd->vdev->dev);
		ret = pm_runtime_resume(&icd->vdev->dev);
		if (ret < 0 && ret != -ENOSYS)
			goto eresume;

548 549 550 551 552 553
		/*
		 * Try to configure with default parameters. Notice: this is the
		 * very first open, so, we cannot race against other calls,
		 * apart from someone else calling open() simultaneously, but
		 * .video_lock is protecting us against it.
		 */
554
		ret = soc_camera_set_fmt(icd, &f);
555 556
		if (ret < 0)
			goto esfmt;
557

558 559 560 561 562 563 564
		if (ici->ops->init_videobuf) {
			ici->ops->init_videobuf(&icd->vb_vidq, icd);
		} else {
			ret = ici->ops->init_videobuf2(&icd->vb2_vidq, icd);
			if (ret < 0)
				goto einitvb;
		}
565
		v4l2_ctrl_handler_setup(&icd->ctrl_handler);
566 567
	}

568
	file->private_data = icd;
569
	dev_dbg(icd->pdev, "camera device open\n");
570 571 572

	return 0;

573
	/*
574
	 * First four errors are entered with the .video_lock held
575 576
	 * and use_count == 1
	 */
577
einitvb:
578
esfmt:
579 580
	pm_runtime_disable(&icd->vdev->dev);
eresume:
581
	ici->ops->remove(icd);
582
eiciadd:
583
	soc_camera_power_off(icd, icl);
584
epower:
585
	icd->use_count--;
586
	module_put(ici->ops->owner);
587

588 589 590
	return ret;
}

591
static int soc_camera_close(struct file *file)
592
{
593
	struct soc_camera_device *icd = file->private_data;
594
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
595

596
	icd->use_count--;
597
	if (!icd->use_count) {
598 599
		struct soc_camera_link *icl = to_soc_camera_link(icd);

600 601 602
		pm_runtime_suspend(&icd->vdev->dev);
		pm_runtime_disable(&icd->vdev->dev);

603
		ici->ops->remove(icd);
604 605
		if (ici->ops->init_videobuf2)
			vb2_queue_release(&icd->vb2_vidq);
606

607
		soc_camera_power_off(icd, icl);
608
	}
609

610 611 612
	if (icd->streamer == file)
		icd->streamer = NULL;

613
	module_put(ici->ops->owner);
614

615
	dev_dbg(icd->pdev, "camera device close\n");
616 617 618 619

	return 0;
}

620
static ssize_t soc_camera_read(struct file *file, char __user *buf,
621
			       size_t count, loff_t *ppos)
622
{
623
	struct soc_camera_device *icd = file->private_data;
624 625
	int err = -EINVAL;

626
	dev_err(icd->pdev, "camera device read not implemented\n");
627 628 629 630 631 632

	return err;
}

static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
{
633
	struct soc_camera_device *icd = file->private_data;
634
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
635 636
	int err;

637
	dev_dbg(icd->pdev, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
638

639 640 641
	if (icd->streamer != file)
		return -EBUSY;

642 643 644 645
	if (ici->ops->init_videobuf)
		err = videobuf_mmap_mapper(&icd->vb_vidq, vma);
	else
		err = vb2_mmap(&icd->vb2_vidq, vma);
646

647
	dev_dbg(icd->pdev, "vma start=0x%08lx, size=%ld, ret=%d\n",
648 649 650 651 652 653 654 655 656
		(unsigned long)vma->vm_start,
		(unsigned long)vma->vm_end - (unsigned long)vma->vm_start,
		err);

	return err;
}

static unsigned int soc_camera_poll(struct file *file, poll_table *pt)
{
657
	struct soc_camera_device *icd = file->private_data;
658
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
659

660 661 662
	if (icd->streamer != file)
		return -EBUSY;

663
	if (ici->ops->init_videobuf && list_empty(&icd->vb_vidq.stream)) {
664
		dev_err(icd->pdev, "Trying to poll with no queued buffers!\n");
665 666 667
		return POLLERR;
	}

668
	return ici->ops->poll(file, pt);
669 670
}

671 672 673 674 675 676 677 678 679 680 681 682 683 684
void soc_camera_lock(struct vb2_queue *vq)
{
	struct soc_camera_device *icd = vb2_get_drv_priv(vq);
	mutex_lock(&icd->video_lock);
}
EXPORT_SYMBOL(soc_camera_lock);

void soc_camera_unlock(struct vb2_queue *vq)
{
	struct soc_camera_device *icd = vb2_get_drv_priv(vq);
	mutex_unlock(&icd->video_lock);
}
EXPORT_SYMBOL(soc_camera_unlock);

685
static struct v4l2_file_operations soc_camera_fops = {
686 687 688
	.owner		= THIS_MODULE,
	.open		= soc_camera_open,
	.release	= soc_camera_close,
689
	.unlocked_ioctl	= video_ioctl2,
690 691 692 693 694
	.read		= soc_camera_read,
	.mmap		= soc_camera_mmap,
	.poll		= soc_camera_poll,
};

695
static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
696
				    struct v4l2_format *f)
697
{
698
	struct soc_camera_device *icd = file->private_data;
699 700 701 702
	int ret;

	WARN_ON(priv != file->private_data);

703
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
704
		dev_warn(icd->pdev, "Wrong buf-type %d\n", f->type);
705 706 707
		return -EINVAL;
	}

708 709
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;
710

711 712
	if (is_streaming(to_soc_camera_host(icd->parent), icd)) {
		dev_err(icd->pdev, "S_FMT denied: queue initialised\n");
713
		return -EBUSY;
714 715
	}

716 717 718 719
	ret = soc_camera_set_fmt(icd, f);

	if (!ret && !icd->streamer)
		icd->streamer = file;
720 721

	return ret;
722 723
}

724
static int soc_camera_enum_fmt_vid_cap(struct file *file, void  *priv,
725
				       struct v4l2_fmtdesc *f)
726
{
727
	struct soc_camera_device *icd = file->private_data;
728
	const struct soc_mbus_pixelfmt *format;
729 730 731

	WARN_ON(priv != file->private_data);

732
	if (f->index >= icd->num_user_formats)
733 734
		return -EINVAL;

735
	format = icd->user_formats[f->index].host_fmt;
736

737 738
	if (format->name)
		strlcpy(f->description, format->name, sizeof(f->description));
739 740 741 742
	f->pixelformat = format->fourcc;
	return 0;
}

743
static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
744
				    struct v4l2_format *f)
745
{
746
	struct soc_camera_device *icd = file->private_data;
747
	struct v4l2_pix_format *pix = &f->fmt.pix;
748 749 750

	WARN_ON(priv != file->private_data);

751 752 753
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

754 755
	pix->width		= icd->user_width;
	pix->height		= icd->user_height;
756 757
	pix->bytesperline	= icd->bytesperline;
	pix->sizeimage		= icd->sizeimage;
758
	pix->field		= icd->field;
759 760
	pix->pixelformat	= icd->current_fmt->host_fmt->fourcc;
	pix->colorspace		= icd->colorspace;
761
	dev_dbg(icd->pdev, "current_fmt->fourcc: 0x%08x\n",
762
		icd->current_fmt->host_fmt->fourcc);
763 764 765 766 767 768
	return 0;
}

static int soc_camera_querycap(struct file *file, void  *priv,
			       struct v4l2_capability *cap)
{
769
	struct soc_camera_device *icd = file->private_data;
770
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
771 772 773 774

	WARN_ON(priv != file->private_data);

	strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
775
	return ici->ops->querycap(ici, cap);
776 777 778 779 780
}

static int soc_camera_streamon(struct file *file, void *priv,
			       enum v4l2_buf_type i)
{
781
	struct soc_camera_device *icd = file->private_data;
782
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
783
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
784
	int ret;
785 786 787 788 789 790

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

791 792 793
	if (icd->streamer != file)
		return -EBUSY;

794
	/* This calls buf_queue from host driver's videobuf_queue_ops */
795 796 797 798 799
	if (ici->ops->init_videobuf)
		ret = videobuf_streamon(&icd->vb_vidq);
	else
		ret = vb2_streamon(&icd->vb2_vidq, i);

800 801
	if (!ret)
		v4l2_subdev_call(sd, video, s_stream, 1);
802 803

	return ret;
804 805 806 807 808
}

static int soc_camera_streamoff(struct file *file, void *priv,
				enum v4l2_buf_type i)
{
809
	struct soc_camera_device *icd = file->private_data;
810
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
811
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
812 813 814 815 816 817

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

818 819 820
	if (icd->streamer != file)
		return -EBUSY;

821 822 823 824
	/*
	 * This calls buf_release from host driver's videobuf_queue_ops for all
	 * remaining buffers. When the last buffer is freed, stop capture
	 */
825 826 827 828
	if (ici->ops->init_videobuf)
		videobuf_streamoff(&icd->vb_vidq);
	else
		vb2_streamoff(&icd->vb2_vidq, i);
829

830
	v4l2_subdev_call(sd, video, s_stream, 0);
831 832 833 834 835 836 837

	return 0;
}

static int soc_camera_cropcap(struct file *file, void *fh,
			      struct v4l2_cropcap *a)
{
838
	struct soc_camera_device *icd = file->private_data;
839
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
840

841
	return ici->ops->cropcap(icd, a);
842 843 844 845 846
}

static int soc_camera_g_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
847
	struct soc_camera_device *icd = file->private_data;
848
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
849
	int ret;
850

851
	ret = ici->ops->get_crop(icd, a);
852

853
	return ret;
854 855
}

856 857 858
/*
 * According to the V4L2 API, drivers shall not update the struct v4l2_crop
 * argument with the actual geometry, instead, the user shall use G_CROP to
859
 * retrieve it.
860
 */
861 862 863
static int soc_camera_s_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
864
	struct soc_camera_device *icd = file->private_data;
865
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
866 867
	struct v4l2_rect *rect = &a->c;
	struct v4l2_crop current_crop;
868 869 870 871 872
	int ret;

	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

873
	dev_dbg(icd->pdev, "S_CROP(%ux%u@%u:%u)\n",
874 875 876 877 878
		rect->width, rect->height, rect->left, rect->top);

	/* If get_crop fails, we'll let host and / or client drivers decide */
	ret = ici->ops->get_crop(icd, &current_crop);

879
	/* Prohibit window size change with initialised buffers */
880
	if (ret < 0) {
881
		dev_err(icd->pdev,
882
			"S_CROP denied: getting current crop failed\n");
883 884 885 886 887 888 889 890
	} else if ((a->c.width == current_crop.c.width &&
		    a->c.height == current_crop.c.height) ||
		   !is_streaming(ici, icd)) {
		/* same size or not streaming - use .set_crop() */
		ret = ici->ops->set_crop(icd, a);
	} else if (ici->ops->set_livecrop) {
		ret = ici->ops->set_livecrop(icd, a);
	} else {
891
		dev_err(icd->pdev,
892 893 894 895
			"S_CROP denied: queue initialised and sizes differ\n");
		ret = -EBUSY;
	}

896 897 898
	return ret;
}

899 900 901
static int soc_camera_g_parm(struct file *file, void *fh,
			     struct v4l2_streamparm *a)
{
902
	struct soc_camera_device *icd = file->private_data;
903
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
904 905 906 907 908 909 910 911 912 913

	if (ici->ops->get_parm)
		return ici->ops->get_parm(icd, a);

	return -ENOIOCTLCMD;
}

static int soc_camera_s_parm(struct file *file, void *fh,
			     struct v4l2_streamparm *a)
{
914
	struct soc_camera_device *icd = file->private_data;
915
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
916 917 918 919 920 921 922

	if (ici->ops->set_parm)
		return ici->ops->set_parm(icd, a);

	return -ENOIOCTLCMD;
}

923
static int soc_camera_g_chip_ident(struct file *file, void *fh,
924
				   struct v4l2_dbg_chip_ident *id)
925
{
926
	struct soc_camera_device *icd = file->private_data;
927
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
928

929
	return v4l2_subdev_call(sd, core, g_chip_ident, id);
930 931 932 933
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
static int soc_camera_g_register(struct file *file, void *fh,
934
				 struct v4l2_dbg_register *reg)
935
{
936
	struct soc_camera_device *icd = file->private_data;
937
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
938

939
	return v4l2_subdev_call(sd, core, g_register, reg);
940 941 942
}

static int soc_camera_s_register(struct file *file, void *fh,
943
				 struct v4l2_dbg_register *reg)
944
{
945
	struct soc_camera_device *icd = file->private_data;
946
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
947

948
	return v4l2_subdev_call(sd, core, s_register, reg);
949 950 951
}
#endif

952 953
static int soc_camera_probe(struct soc_camera_device *icd);

954 955 956 957 958 959 960 961 962
/* So far this function cannot fail */
static void scan_add_host(struct soc_camera_host *ici)
{
	struct soc_camera_device *icd;

	mutex_lock(&list_lock);

	list_for_each_entry(icd, &devices, list) {
		if (icd->iface == ici->nr) {
963
			int ret;
964 965 966

			icd->parent = ici->v4l2_dev.dev;
			ret = soc_camera_probe(icd);
967 968 969 970 971 972
		}
	}

	mutex_unlock(&list_lock);
}

973 974 975
#ifdef CONFIG_I2C_BOARDINFO
static int soc_camera_init_i2c(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
976
{
977
	struct i2c_client *client;
978
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
979
	struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
980
	struct v4l2_subdev *subdev;
981

982
	if (!adap) {
983
		dev_err(icd->pdev, "Cannot get I2C adapter #%d. No driver?\n",
984 985 986
			icl->i2c_adapter_id);
		goto ei2cga;
	}
987

988
	icl->board_info->platform_data = icl;
989

990
	subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
991
				icl->board_info, NULL);
992
	if (!subdev)
993
		goto ei2cnd;
994

995
	client = v4l2_get_subdevdata(subdev);
996

997
	/* Use to_i2c_client(dev) to recover the i2c client */
998
	icd->control = &client->dev;
999

1000 1001 1002 1003
	return 0;
ei2cnd:
	i2c_put_adapter(adap);
ei2cga:
1004
	return -ENODEV;
1005 1006
}

1007 1008 1009 1010
static void soc_camera_free_i2c(struct soc_camera_device *icd)
{
	struct i2c_client *client =
		to_i2c_client(to_soc_camera_control(icd));
1011
	struct i2c_adapter *adap = client->adapter;
1012 1013

	icd->control = NULL;
1014
	v4l2_device_unregister_subdev(i2c_get_clientdata(client));
1015
	i2c_unregister_device(client);
1016
	i2c_put_adapter(adap);
1017 1018 1019 1020 1021 1022
}
#else
#define soc_camera_init_i2c(icd, icl)	(-ENODEV)
#define soc_camera_free_i2c(icd)	do {} while (0)
#endif

1023
static int soc_camera_video_start(struct soc_camera_device *icd);
1024 1025
static int video_dev_create(struct soc_camera_device *icd);
/* Called during host-driver probe */
1026
static int soc_camera_probe(struct soc_camera_device *icd)
1027
{
1028
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1029
	struct soc_camera_link *icl = to_soc_camera_link(icd);
1030
	struct device *control = NULL;
1031
	struct v4l2_subdev *sd;
1032
	struct v4l2_mbus_framefmt mf;
1033 1034
	int ret;

1035
	dev_info(icd->pdev, "Probing %s\n", dev_name(icd->pdev));
1036

1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
	/*
	 * Currently the subdev with the largest number of controls (13) is
	 * ov6550. So let's pick 16 as a hint for the control handler. Note
	 * that this is a hint only: too large and you waste some memory, too
	 * small and there is a (very) small performance hit when looking up
	 * controls in the internal hash.
	 */
	ret = v4l2_ctrl_handler_init(&icd->ctrl_handler, 16);
	if (ret < 0)
		return ret;

1048 1049 1050 1051 1052
	ret = regulator_bulk_get(icd->pdev, icl->num_regulators,
				 icl->regulators);
	if (ret < 0)
		goto ereg;

1053 1054 1055 1056 1057 1058
	/*
	 * This will not yet call v4l2_subdev_core_ops::s_power(1), because the
	 * subdevice has not been initialised yet. We'll have to call it once
	 * again after initialisation, even though it shouldn't be needed, we
	 * don't do any IO here.
	 */
1059
	ret = soc_camera_power_on(icd, icl);
1060 1061
	if (ret < 0)
		goto epower;
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071

	/* The camera could have been already on, try to reset */
	if (icl->reset)
		icl->reset(icd->pdev);

	ret = ici->ops->add(icd);
	if (ret < 0)
		goto eadd;

	/* Must have icd->vdev before registering the device */
1072 1073 1074
	ret = video_dev_create(icd);
	if (ret < 0)
		goto evdc;
1075

1076 1077 1078 1079 1080 1081
	/* Non-i2c cameras, e.g., soc_camera_platform, have no board_info */
	if (icl->board_info) {
		ret = soc_camera_init_i2c(icd, icl);
		if (ret < 0)
			goto eadddev;
	} else if (!icl->add_device || !icl->del_device) {
1082
		ret = -EINVAL;
1083 1084
		goto eadddev;
	} else {
1085 1086 1087
		if (icl->module_name)
			ret = request_module(icl->module_name);

1088
		ret = icl->add_device(icd);
1089 1090
		if (ret < 0)
			goto eadddev;
1091

1092 1093 1094 1095
		/*
		 * FIXME: this is racy, have to use driver-binding notification,
		 * when it is available
		 */
1096
		control = to_soc_camera_control(icd);
1097
		if (!control || !control->driver || !dev_get_drvdata(control) ||
1098
		    !try_module_get(control->driver->owner)) {
1099
			icl->del_device(icd);
1100
			ret = -ENODEV;
1101 1102
			goto enodrv;
		}
1103
	}
1104

1105
	sd = soc_camera_to_subdev(icd);
1106 1107
	sd->grp_id = soc_camera_grp_id(icd);
	v4l2_set_subdev_hostdata(sd, icd);
1108

1109 1110 1111
	if (v4l2_ctrl_add_handler(&icd->ctrl_handler, sd->ctrl_handler))
		goto ectrl;

1112 1113 1114 1115 1116 1117 1118
	/* At this point client .probe() should have run already */
	ret = soc_camera_init_user_formats(icd);
	if (ret < 0)
		goto eiufmt;

	icd->field = V4L2_FIELD_ANY;

1119 1120 1121 1122 1123
	/*
	 * ..._video_start() will create a device node, video_register_device()
	 * itself is protected against concurrent open() calls, but we also have
	 * to protect our data.
	 */
1124 1125 1126 1127 1128 1129
	mutex_lock(&icd->video_lock);

	ret = soc_camera_video_start(icd);
	if (ret < 0)
		goto evidstart;

1130 1131 1132 1133
	ret = v4l2_subdev_call(sd, core, s_power, 1);
	if (ret < 0 && ret != -ENOIOCTLCMD)
		goto esdpwr;

1134
	/* Try to improve our guess of a reasonable window format */
1135 1136 1137 1138 1139
	if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) {
		icd->user_width		= mf.width;
		icd->user_height	= mf.height;
		icd->colorspace		= mf.colorspace;
		icd->field		= mf.field;
1140 1141
	}

1142 1143
	ici->ops->remove(icd);

1144
	soc_camera_power_off(icd, icl);
1145 1146

	mutex_unlock(&icd->video_lock);
1147

1148
	return 0;
1149

1150 1151
esdpwr:
	video_unregister_device(icd->vdev);
1152 1153
evidstart:
	mutex_unlock(&icd->video_lock);
1154 1155
	soc_camera_free_user_formats(icd);
eiufmt:
1156
ectrl:
1157
	if (icl->board_info) {
1158
		soc_camera_free_i2c(icd);
1159
	} else {
1160
		icl->del_device(icd);
1161 1162 1163
		module_put(control->driver->owner);
	}
enodrv:
1164 1165
eadddev:
	video_device_release(icd->vdev);
1166
	icd->vdev = NULL;
1167
evdc:
1168 1169
	ici->ops->remove(icd);
eadd:
1170
	soc_camera_power_off(icd, icl);
1171
epower:
1172 1173
	regulator_bulk_free(icl->num_regulators, icl->regulators);
ereg:
1174
	v4l2_ctrl_handler_free(&icd->ctrl_handler);
1175 1176 1177
	return ret;
}

1178 1179 1180 1181
/*
 * This is called on device_unregister, which only means we have to disconnect
 * from the host, but not remove ourselves from the device list
 */
1182
static int soc_camera_remove(struct soc_camera_device *icd)
1183
{
1184 1185
	struct soc_camera_link *icl = to_soc_camera_link(icd);
	struct video_device *vdev = icd->vdev;
1186

1187
	BUG_ON(!icd->parent);
1188

1189
	v4l2_ctrl_handler_free(&icd->ctrl_handler);
1190 1191 1192 1193 1194
	if (vdev) {
		video_unregister_device(vdev);
		icd->vdev = NULL;
	}

1195
	if (icl->board_info) {
1196
		soc_camera_free_i2c(icd);
1197
	} else {
1198
		struct device_driver *drv = to_soc_camera_control(icd)->driver;
1199
		if (drv) {
1200
			icl->del_device(icd);
1201 1202 1203
			module_put(drv->owner);
		}
	}
1204
	soc_camera_free_user_formats(icd);
1205

1206 1207
	regulator_bulk_free(icl->num_regulators, icl->regulators);

1208 1209 1210
	return 0;
}

1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
static int default_cropcap(struct soc_camera_device *icd,
			   struct v4l2_cropcap *a)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	return v4l2_subdev_call(sd, video, cropcap, a);
}

static int default_g_crop(struct soc_camera_device *icd, struct v4l2_crop *a)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	return v4l2_subdev_call(sd, video, g_crop, a);
}

static int default_s_crop(struct soc_camera_device *icd, struct v4l2_crop *a)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	return v4l2_subdev_call(sd, video, s_crop, a);
}

1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
static int default_g_parm(struct soc_camera_device *icd,
			  struct v4l2_streamparm *parm)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	return v4l2_subdev_call(sd, video, g_parm, parm);
}

static int default_s_parm(struct soc_camera_device *icd,
			  struct v4l2_streamparm *parm)
{
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	return v4l2_subdev_call(sd, video, s_parm, parm);
}

1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268
static int default_enum_fsizes(struct soc_camera_device *icd,
			  struct v4l2_frmsizeenum *fsize)
{
	int ret;
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
	const struct soc_camera_format_xlate *xlate;
	__u32 pixfmt = fsize->pixel_format;
	struct v4l2_frmsizeenum fsize_mbus = *fsize;

	xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
	if (!xlate)
		return -EINVAL;
	/* map xlate-code to pixel_format, sensor only handle xlate-code*/
	fsize_mbus.pixel_format = xlate->code;

	ret = v4l2_subdev_call(sd, video, enum_mbus_fsizes, &fsize_mbus);
	if (ret < 0)
		return ret;

	*fsize = fsize_mbus;
	fsize->pixel_format = pixfmt;

	return 0;
}

1269
int soc_camera_host_register(struct soc_camera_host *ici)
1270 1271
{
	struct soc_camera_host *ix;
1272
	int ret;
1273

1274 1275 1276 1277 1278
	if (!ici || !ici->ops ||
	    !ici->ops->try_fmt ||
	    !ici->ops->set_fmt ||
	    !ici->ops->set_bus_param ||
	    !ici->ops->querycap ||
1279 1280 1281
	    ((!ici->ops->init_videobuf ||
	      !ici->ops->reqbufs) &&
	     !ici->ops->init_videobuf2) ||
1282 1283
	    !ici->ops->add ||
	    !ici->ops->remove ||
1284
	    !ici->ops->poll ||
1285
	    !ici->v4l2_dev.dev)
1286 1287
		return -EINVAL;

1288 1289 1290 1291 1292 1293
	if (!ici->ops->set_crop)
		ici->ops->set_crop = default_s_crop;
	if (!ici->ops->get_crop)
		ici->ops->get_crop = default_g_crop;
	if (!ici->ops->cropcap)
		ici->ops->cropcap = default_cropcap;
1294 1295 1296 1297
	if (!ici->ops->set_parm)
		ici->ops->set_parm = default_s_parm;
	if (!ici->ops->get_parm)
		ici->ops->get_parm = default_g_parm;
1298 1299
	if (!ici->ops->enum_fsizes)
		ici->ops->enum_fsizes = default_enum_fsizes;
1300

1301 1302 1303
	mutex_lock(&list_lock);
	list_for_each_entry(ix, &hosts, list) {
		if (ix->nr == ici->nr) {
1304 1305
			ret = -EBUSY;
			goto edevreg;
1306 1307 1308
		}
	}

1309 1310 1311
	ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
	if (ret < 0)
		goto edevreg;
1312

1313 1314 1315 1316 1317 1318
	list_add_tail(&ici->list, &hosts);
	mutex_unlock(&list_lock);

	scan_add_host(ici);

	return 0;
1319 1320 1321 1322

edevreg:
	mutex_unlock(&list_lock);
	return ret;
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333
}
EXPORT_SYMBOL(soc_camera_host_register);

/* Unregister all clients! */
void soc_camera_host_unregister(struct soc_camera_host *ici)
{
	struct soc_camera_device *icd;

	mutex_lock(&list_lock);

	list_del(&ici->list);
1334 1335 1336
	list_for_each_entry(icd, &devices, list)
		if (icd->iface == ici->nr && to_soc_camera_control(icd))
			soc_camera_remove(icd);
1337 1338 1339

	mutex_unlock(&list_lock);

1340
	v4l2_device_unregister(&ici->v4l2_dev);
1341 1342 1343 1344
}
EXPORT_SYMBOL(soc_camera_host_unregister);

/* Image capture device */
1345
static int soc_camera_device_register(struct soc_camera_device *icd)
1346 1347 1348 1349 1350 1351
{
	struct soc_camera_device *ix;
	int num = -1, i;

	for (i = 0; i < 256 && num < 0; i++) {
		num = i;
1352
		/* Check if this index is available on this interface */
1353 1354 1355 1356 1357 1358 1359 1360 1361
		list_for_each_entry(ix, &devices, list) {
			if (ix->iface == icd->iface && ix->devnum == i) {
				num = -1;
				break;
			}
		}
	}

	if (num < 0)
1362 1363 1364 1365
		/*
		 * ok, we have 256 cameras on this host...
		 * man, stay reasonable...
		 */
1366 1367
		return -ENOMEM;

1368
	icd->devnum		= num;
1369 1370
	icd->use_count		= 0;
	icd->host_priv		= NULL;
1371
	mutex_init(&icd->video_lock);
1372

1373 1374 1375
	list_add_tail(&icd->list, &devices);

	return 0;
1376 1377
}

1378 1379
static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
	.vidioc_querycap	 = soc_camera_querycap,
1380
	.vidioc_try_fmt_vid_cap  = soc_camera_try_fmt_vid_cap,
1381 1382
	.vidioc_g_fmt_vid_cap    = soc_camera_g_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap    = soc_camera_s_fmt_vid_cap,
1383
	.vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
1384 1385 1386 1387
	.vidioc_enum_input	 = soc_camera_enum_input,
	.vidioc_g_input		 = soc_camera_g_input,
	.vidioc_s_input		 = soc_camera_s_input,
	.vidioc_s_std		 = soc_camera_s_std,
1388
	.vidioc_g_std		 = soc_camera_g_std,
1389
	.vidioc_enum_framesizes  = soc_camera_enum_fsizes,
1390 1391 1392 1393
	.vidioc_reqbufs		 = soc_camera_reqbufs,
	.vidioc_querybuf	 = soc_camera_querybuf,
	.vidioc_qbuf		 = soc_camera_qbuf,
	.vidioc_dqbuf		 = soc_camera_dqbuf,
1394 1395
	.vidioc_create_bufs	 = soc_camera_create_bufs,
	.vidioc_prepare_buf	 = soc_camera_prepare_buf,
1396 1397 1398 1399 1400
	.vidioc_streamon	 = soc_camera_streamon,
	.vidioc_streamoff	 = soc_camera_streamoff,
	.vidioc_cropcap		 = soc_camera_cropcap,
	.vidioc_g_crop		 = soc_camera_g_crop,
	.vidioc_s_crop		 = soc_camera_s_crop,
1401 1402
	.vidioc_g_parm		 = soc_camera_g_parm,
	.vidioc_s_parm		 = soc_camera_s_parm,
1403 1404 1405 1406 1407 1408 1409
	.vidioc_g_chip_ident     = soc_camera_g_chip_ident,
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.vidioc_g_register	 = soc_camera_g_register,
	.vidioc_s_register	 = soc_camera_s_register,
#endif
};

1410
static int video_dev_create(struct soc_camera_device *icd)
1411
{
1412
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1413
	struct video_device *vdev = video_device_alloc();
1414 1415

	if (!vdev)
1416
		return -ENOMEM;
1417 1418

	strlcpy(vdev->name, ici->drv_name, sizeof(vdev->name));
1419

1420
	vdev->parent		= icd->pdev;
1421 1422
	vdev->current_norm	= V4L2_STD_UNKNOWN;
	vdev->fops		= &soc_camera_fops;
1423
	vdev->ioctl_ops		= &soc_camera_ioctl_ops;
1424
	vdev->release		= video_device_release;
1425
	vdev->tvnorms		= V4L2_STD_UNKNOWN;
1426
	vdev->ctrl_handler	= &icd->ctrl_handler;
1427
	vdev->lock		= &icd->video_lock;
1428 1429 1430 1431

	icd->vdev = vdev;

	return 0;
1432
}
1433

1434
/*
1435
 * Called from soc_camera_probe() above (with .video_lock held???)
1436
 */
1437
static int soc_camera_video_start(struct soc_camera_device *icd)
1438
{
1439
	const struct device_type *type = icd->vdev->dev.type;
1440
	int ret;
1441

1442
	if (!icd->parent)
1443 1444
		return -ENODEV;

1445
	ret = video_register_device(icd->vdev, VFL_TYPE_GRABBER, -1);
1446
	if (ret < 0) {
1447
		dev_err(icd->pdev, "video_register_device failed: %d\n", ret);
1448 1449
		return ret;
	}
1450

1451 1452 1453
	/* Restore device type, possibly set by the subdevice driver */
	icd->vdev->dev.type = type;

1454
	return 0;
1455 1456
}

1457
static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1458
{
1459 1460
	struct soc_camera_link *icl = pdev->dev.platform_data;
	struct soc_camera_device *icd;
1461
	int ret;
1462

1463 1464
	if (!icl)
		return -EINVAL;
1465

1466 1467 1468
	icd = kzalloc(sizeof(*icd), GFP_KERNEL);
	if (!icd)
		return -ENOMEM;
1469

1470
	icd->iface = icl->bus_id;
1471
	icd->link = icl;
1472
	icd->pdev = &pdev->dev;
1473
	platform_set_drvdata(pdev, icd);
1474

1475 1476 1477
	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;
1478

1479 1480 1481
	icd->user_width		= DEFAULT_WIDTH;
	icd->user_height	= DEFAULT_HEIGHT;

1482
	return 0;
1483

1484 1485
escdevreg:
	kfree(icd);
1486

1487
	return ret;
1488
}
1489

1490 1491
/*
 * Only called on rmmod for each platform device, since they are not
1492
 * hot-pluggable. Now we know, that all our users - hosts and devices have
1493 1494
 * been unloaded already
 */
1495
static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
1496
{
1497
	struct soc_camera_device *icd = platform_get_drvdata(pdev);
1498

1499
	if (!icd)
1500 1501
		return -EINVAL;

1502
	list_del(&icd->list);
1503

1504
	kfree(icd);
1505

1506 1507 1508 1509
	return 0;
}

static struct platform_driver __refdata soc_camera_pdrv = {
1510 1511 1512 1513
	.remove  = __devexit_p(soc_camera_pdrv_remove),
	.driver  = {
		.name	= "soc-camera-pdrv",
		.owner	= THIS_MODULE,
1514 1515 1516
	},
};

1517 1518
static int __init soc_camera_init(void)
{
1519
	return platform_driver_probe(&soc_camera_pdrv, soc_camera_pdrv_probe);
1520 1521 1522 1523
}

static void __exit soc_camera_exit(void)
{
1524
	platform_driver_unregister(&soc_camera_pdrv);
1525 1526 1527 1528 1529 1530 1531 1532
}

module_init(soc_camera_init);
module_exit(soc_camera_exit);

MODULE_DESCRIPTION("Image capture bus driver");
MODULE_AUTHOR("Guennadi Liakhovetski <kernel@pengutronix.de>");
MODULE_LICENSE("GPL");
1533
MODULE_ALIAS("platform:soc-camera-pdrv");