soc_camera.c 37.8 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
static int soc_camera_enum_fsizes(struct file *file, void *fh,
					 struct v4l2_frmsizeenum *fsize)
{
	struct soc_camera_device *icd = file->private_data;
256
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
257 258 259 260

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

261 262 263 264
static int soc_camera_reqbufs(struct file *file, void *priv,
			      struct v4l2_requestbuffers *p)
{
	int ret;
265
	struct soc_camera_device *icd = file->private_data;
266
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
267 268 269

	WARN_ON(priv != file->private_data);

270 271 272
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;

273 274 275 276 277 278 279 280 281
	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);
	}
282

283 284 285 286
	if (!ret && !icd->streamer)
		icd->streamer = file;

	return ret;
287 288 289 290 291
}

static int soc_camera_querybuf(struct file *file, void *priv,
			       struct v4l2_buffer *p)
{
292
	struct soc_camera_device *icd = file->private_data;
293
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
294 295 296

	WARN_ON(priv != file->private_data);

297 298 299 300
	if (ici->ops->init_videobuf)
		return videobuf_querybuf(&icd->vb_vidq, p);
	else
		return vb2_querybuf(&icd->vb2_vidq, p);
301 302 303 304 305
}

static int soc_camera_qbuf(struct file *file, void *priv,
			   struct v4l2_buffer *p)
{
306
	struct soc_camera_device *icd = file->private_data;
307
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
308 309 310

	WARN_ON(priv != file->private_data);

311 312 313
	if (icd->streamer != file)
		return -EBUSY;

314 315 316 317
	if (ici->ops->init_videobuf)
		return videobuf_qbuf(&icd->vb_vidq, p);
	else
		return vb2_qbuf(&icd->vb2_vidq, p);
318 319 320 321 322
}

static int soc_camera_dqbuf(struct file *file, void *priv,
			    struct v4l2_buffer *p)
{
323
	struct soc_camera_device *icd = file->private_data;
324
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
325 326 327

	WARN_ON(priv != file->private_data);

328 329 330
	if (icd->streamer != file)
		return -EBUSY;

331 332 333 334
	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);
335 336
}

337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
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);
}

363
/* Always entered with .video_lock held */
364 365
static int soc_camera_init_user_formats(struct soc_camera_device *icd)
{
366
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
367
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
368 369
	unsigned int i, fmts = 0, raw_fmts = 0;
	int ret;
370 371 372 373
	enum v4l2_mbus_pixelcode code;

	while (!v4l2_subdev_call(sd, video, enum_mbus_fmt, raw_fmts, &code))
		raw_fmts++;
374 375 376 377 378 379

	if (!ici->ops->get_formats)
		/*
		 * Fallback mode - the host will have to serve all
		 * sensor-provided formats one-to-one to the user
		 */
380
		fmts = raw_fmts;
381 382 383 384 385
	else
		/*
		 * First pass - only count formats this host-sensor
		 * configuration can provide
		 */
386
		for (i = 0; i < raw_fmts; i++) {
387 388 389 390 391
			ret = ici->ops->get_formats(icd, i, NULL);
			if (ret < 0)
				return ret;
			fmts += ret;
		}
392 393 394 395 396 397 398 399 400

	if (!fmts)
		return -ENXIO;

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

401
	dev_dbg(icd->pdev, "Found %d supported formats.\n", fmts);
402 403

	/* Second pass - actually fill data formats */
404
	fmts = 0;
405
	for (i = 0; i < raw_fmts; i++)
406
		if (!ici->ops->get_formats) {
407
			v4l2_subdev_call(sd, video, enum_mbus_fmt, i, &code);
408
			icd->user_formats[fmts].host_fmt =
409
				soc_mbus_get_fmtdesc(code);
410 411
			if (icd->user_formats[fmts].host_fmt)
				icd->user_formats[fmts++].code = code;
412
		} else {
413 414 415 416 417
			ret = ici->ops->get_formats(icd, i,
						    &icd->user_formats[fmts]);
			if (ret < 0)
				goto egfmt;
			fmts += ret;
418 419
		}

420
	icd->num_user_formats = fmts;
421
	icd->current_fmt = &icd->user_formats[0];
422 423

	return 0;
424 425 426 427

egfmt:
	vfree(icd->user_formats);
	return ret;
428 429
}

430
/* Always entered with .video_lock held */
431 432
static void soc_camera_free_user_formats(struct soc_camera_device *icd)
{
433
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
434 435 436

	if (ici->ops->put_formats)
		ici->ops->put_formats(icd);
437
	icd->current_fmt = NULL;
438
	icd->num_user_formats = 0;
439
	vfree(icd->user_formats);
440
	icd->user_formats = NULL;
441 442
}

443
/* Called with .vb_lock held, or from the first open(2), see comment there */
444
static int soc_camera_set_fmt(struct soc_camera_device *icd,
445 446
			      struct v4l2_format *f)
{
447
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
448 449 450
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

451
	dev_dbg(icd->pdev, "S_FMT(%c%c%c%c, %ux%u)\n",
452 453
		pixfmtstr(pix->pixelformat), pix->width, pix->height);

454
	/* We always call try_fmt() before set_fmt() or set_crop() */
455
	ret = soc_camera_try_fmt(icd, f);
456 457 458 459 460 461 462
	if (ret < 0)
		return ret;

	ret = ici->ops->set_fmt(icd, f);
	if (ret < 0) {
		return ret;
	} else if (!icd->current_fmt ||
463
		   icd->current_fmt->host_fmt->fourcc != pix->pixelformat) {
464
		dev_err(icd->pdev,
465 466 467 468
			"Host driver hasn't set up current format correctly!\n");
		return -EINVAL;
	}

469 470
	icd->user_width		= pix->width;
	icd->user_height	= pix->height;
471 472
	icd->bytesperline	= pix->bytesperline;
	icd->sizeimage		= pix->sizeimage;
473
	icd->colorspace		= pix->colorspace;
474 475 476
	icd->field		= pix->field;
	if (ici->ops->init_videobuf)
		icd->vb_vidq.field = pix->field;
477

478
	dev_dbg(icd->pdev, "set width: %d height: %d\n",
479
		icd->user_width, icd->user_height);
480 481 482 483 484

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

485
static int soc_camera_open(struct file *file)
486
{
487
	struct video_device *vdev = video_devdata(file);
488
	struct soc_camera_device *icd = dev_get_drvdata(vdev->parent);
489
	struct soc_camera_link *icl = to_soc_camera_link(icd);
490
	struct soc_camera_host *ici;
491 492
	int ret;

493
	if (!to_soc_camera_control(icd))
494 495 496
		/* No device driver attached */
		return -ENODEV;

497
	ici = to_soc_camera_host(icd->parent);
498

499
	if (!try_module_get(ici->ops->owner)) {
500
		dev_err(icd->pdev, "Couldn't lock capture bus driver.\n");
501
		return -EINVAL;
502 503
	}

504 505
	icd->use_count++;

506 507
	/* Now we really have to activate the camera */
	if (icd->use_count == 1) {
508
		/* Restore parameters before the last close() per V4L2 API */
509 510 511
		struct v4l2_format f = {
			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix = {
512 513
				.width		= icd->user_width,
				.height		= icd->user_height,
514
				.field		= icd->field,
515 516 517
				.colorspace	= icd->colorspace,
				.pixelformat	=
					icd->current_fmt->host_fmt->fourcc,
518 519 520
			},
		};

521
		ret = soc_camera_power_on(icd, icl);
522 523
		if (ret < 0)
			goto epower;
524 525 526 527 528

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

529
		ret = ici->ops->add(icd);
530
		if (ret < 0) {
531
			dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret);
532 533
			goto eiciadd;
		}
534

535 536 537 538 539
		pm_runtime_enable(&icd->vdev->dev);
		ret = pm_runtime_resume(&icd->vdev->dev);
		if (ret < 0 && ret != -ENOSYS)
			goto eresume;

540 541 542 543 544 545
		/*
		 * 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.
		 */
546
		ret = soc_camera_set_fmt(icd, &f);
547 548
		if (ret < 0)
			goto esfmt;
549

550 551 552 553 554 555 556
		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;
		}
557
		v4l2_ctrl_handler_setup(&icd->ctrl_handler);
558 559
	}

560
	file->private_data = icd;
561
	dev_dbg(icd->pdev, "camera device open\n");
562 563 564

	return 0;

565
	/*
566
	 * First four errors are entered with the .video_lock held
567 568
	 * and use_count == 1
	 */
569
einitvb:
570
esfmt:
571 572
	pm_runtime_disable(&icd->vdev->dev);
eresume:
573
	ici->ops->remove(icd);
574
eiciadd:
575
	soc_camera_power_off(icd, icl);
576
epower:
577
	icd->use_count--;
578
	module_put(ici->ops->owner);
579

580 581 582
	return ret;
}

583
static int soc_camera_close(struct file *file)
584
{
585
	struct soc_camera_device *icd = file->private_data;
586
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
587

588
	icd->use_count--;
589
	if (!icd->use_count) {
590 591
		struct soc_camera_link *icl = to_soc_camera_link(icd);

592 593 594
		pm_runtime_suspend(&icd->vdev->dev);
		pm_runtime_disable(&icd->vdev->dev);

595
		ici->ops->remove(icd);
596 597
		if (ici->ops->init_videobuf2)
			vb2_queue_release(&icd->vb2_vidq);
598

599
		soc_camera_power_off(icd, icl);
600
	}
601

602 603 604
	if (icd->streamer == file)
		icd->streamer = NULL;

605
	module_put(ici->ops->owner);
606

607
	dev_dbg(icd->pdev, "camera device close\n");
608 609 610 611

	return 0;
}

612
static ssize_t soc_camera_read(struct file *file, char __user *buf,
613
			       size_t count, loff_t *ppos)
614
{
615
	struct soc_camera_device *icd = file->private_data;
616 617
	int err = -EINVAL;

618
	dev_err(icd->pdev, "camera device read not implemented\n");
619 620 621 622 623 624

	return err;
}

static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
{
625
	struct soc_camera_device *icd = file->private_data;
626
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
627 628
	int err;

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

631 632 633
	if (icd->streamer != file)
		return -EBUSY;

634 635 636 637
	if (ici->ops->init_videobuf)
		err = videobuf_mmap_mapper(&icd->vb_vidq, vma);
	else
		err = vb2_mmap(&icd->vb2_vidq, vma);
638

639
	dev_dbg(icd->pdev, "vma start=0x%08lx, size=%ld, ret=%d\n",
640 641 642 643 644 645 646 647 648
		(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)
{
649
	struct soc_camera_device *icd = file->private_data;
650
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
651

652 653 654
	if (icd->streamer != file)
		return -EBUSY;

655
	if (ici->ops->init_videobuf && list_empty(&icd->vb_vidq.stream)) {
656
		dev_err(icd->pdev, "Trying to poll with no queued buffers!\n");
657 658 659
		return POLLERR;
	}

660
	return ici->ops->poll(file, pt);
661 662
}

663 664 665 666 667 668 669 670 671 672 673 674 675 676
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);

677
static struct v4l2_file_operations soc_camera_fops = {
678 679 680
	.owner		= THIS_MODULE,
	.open		= soc_camera_open,
	.release	= soc_camera_close,
681
	.unlocked_ioctl	= video_ioctl2,
682 683 684 685 686
	.read		= soc_camera_read,
	.mmap		= soc_camera_mmap,
	.poll		= soc_camera_poll,
};

687
static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
688
				    struct v4l2_format *f)
689
{
690
	struct soc_camera_device *icd = file->private_data;
691 692 693 694
	int ret;

	WARN_ON(priv != file->private_data);

695
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
696
		dev_warn(icd->pdev, "Wrong buf-type %d\n", f->type);
697 698 699
		return -EINVAL;
	}

700 701
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;
702

703 704
	if (is_streaming(to_soc_camera_host(icd->parent), icd)) {
		dev_err(icd->pdev, "S_FMT denied: queue initialised\n");
705
		return -EBUSY;
706 707
	}

708 709 710 711
	ret = soc_camera_set_fmt(icd, f);

	if (!ret && !icd->streamer)
		icd->streamer = file;
712 713

	return ret;
714 715
}

716
static int soc_camera_enum_fmt_vid_cap(struct file *file, void  *priv,
717
				       struct v4l2_fmtdesc *f)
718
{
719
	struct soc_camera_device *icd = file->private_data;
720
	const struct soc_mbus_pixelfmt *format;
721 722 723

	WARN_ON(priv != file->private_data);

724
	if (f->index >= icd->num_user_formats)
725 726
		return -EINVAL;

727
	format = icd->user_formats[f->index].host_fmt;
728

729 730
	if (format->name)
		strlcpy(f->description, format->name, sizeof(f->description));
731 732 733 734
	f->pixelformat = format->fourcc;
	return 0;
}

735
static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
736
				    struct v4l2_format *f)
737
{
738
	struct soc_camera_device *icd = file->private_data;
739
	struct v4l2_pix_format *pix = &f->fmt.pix;
740 741 742

	WARN_ON(priv != file->private_data);

743 744 745
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

746 747
	pix->width		= icd->user_width;
	pix->height		= icd->user_height;
748 749
	pix->bytesperline	= icd->bytesperline;
	pix->sizeimage		= icd->sizeimage;
750
	pix->field		= icd->field;
751 752
	pix->pixelformat	= icd->current_fmt->host_fmt->fourcc;
	pix->colorspace		= icd->colorspace;
753
	dev_dbg(icd->pdev, "current_fmt->fourcc: 0x%08x\n",
754
		icd->current_fmt->host_fmt->fourcc);
755 756 757 758 759 760
	return 0;
}

static int soc_camera_querycap(struct file *file, void  *priv,
			       struct v4l2_capability *cap)
{
761
	struct soc_camera_device *icd = file->private_data;
762
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
763 764 765 766

	WARN_ON(priv != file->private_data);

	strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
767
	return ici->ops->querycap(ici, cap);
768 769 770 771 772
}

static int soc_camera_streamon(struct file *file, void *priv,
			       enum v4l2_buf_type i)
{
773
	struct soc_camera_device *icd = file->private_data;
774
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
775
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
776
	int ret;
777 778 779 780 781 782

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

783 784 785
	if (icd->streamer != file)
		return -EBUSY;

786
	/* This calls buf_queue from host driver's videobuf_queue_ops */
787 788 789 790 791
	if (ici->ops->init_videobuf)
		ret = videobuf_streamon(&icd->vb_vidq);
	else
		ret = vb2_streamon(&icd->vb2_vidq, i);

792 793
	if (!ret)
		v4l2_subdev_call(sd, video, s_stream, 1);
794 795

	return ret;
796 797 798 799 800
}

static int soc_camera_streamoff(struct file *file, void *priv,
				enum v4l2_buf_type i)
{
801
	struct soc_camera_device *icd = file->private_data;
802
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
803
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
804 805 806 807 808 809

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

810 811 812
	if (icd->streamer != file)
		return -EBUSY;

813 814 815 816
	/*
	 * This calls buf_release from host driver's videobuf_queue_ops for all
	 * remaining buffers. When the last buffer is freed, stop capture
	 */
817 818 819 820
	if (ici->ops->init_videobuf)
		videobuf_streamoff(&icd->vb_vidq);
	else
		vb2_streamoff(&icd->vb2_vidq, i);
821

822
	v4l2_subdev_call(sd, video, s_stream, 0);
823 824 825 826 827 828 829

	return 0;
}

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

833
	return ici->ops->cropcap(icd, a);
834 835 836 837 838
}

static int soc_camera_g_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
839
	struct soc_camera_device *icd = file->private_data;
840
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
841
	int ret;
842

843
	ret = ici->ops->get_crop(icd, a);
844

845
	return ret;
846 847
}

848 849 850
/*
 * 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
851
 * retrieve it.
852
 */
853 854 855
static int soc_camera_s_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
856
	struct soc_camera_device *icd = file->private_data;
857
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
858 859
	struct v4l2_rect *rect = &a->c;
	struct v4l2_crop current_crop;
860 861 862 863 864
	int ret;

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

865
	dev_dbg(icd->pdev, "S_CROP(%ux%u@%u:%u)\n",
866 867 868 869 870
		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);

871
	/* Prohibit window size change with initialised buffers */
872
	if (ret < 0) {
873
		dev_err(icd->pdev,
874
			"S_CROP denied: getting current crop failed\n");
875 876 877 878 879 880 881 882
	} 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 {
883
		dev_err(icd->pdev,
884 885 886 887
			"S_CROP denied: queue initialised and sizes differ\n");
		ret = -EBUSY;
	}

888 889 890
	return ret;
}

891 892 893
static int soc_camera_g_parm(struct file *file, void *fh,
			     struct v4l2_streamparm *a)
{
894
	struct soc_camera_device *icd = file->private_data;
895
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
896 897 898 899 900 901 902 903 904 905

	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)
{
906
	struct soc_camera_device *icd = file->private_data;
907
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
908 909 910 911 912 913 914

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

	return -ENOIOCTLCMD;
}

915
static int soc_camera_g_chip_ident(struct file *file, void *fh,
916
				   struct v4l2_dbg_chip_ident *id)
917
{
918
	struct soc_camera_device *icd = file->private_data;
919
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
920

921
	return v4l2_subdev_call(sd, core, g_chip_ident, id);
922 923 924 925
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
static int soc_camera_g_register(struct file *file, void *fh,
926
				 struct v4l2_dbg_register *reg)
927
{
928
	struct soc_camera_device *icd = file->private_data;
929
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
930

931
	return v4l2_subdev_call(sd, core, g_register, reg);
932 933 934
}

static int soc_camera_s_register(struct file *file, void *fh,
935
				 struct v4l2_dbg_register *reg)
936
{
937
	struct soc_camera_device *icd = file->private_data;
938
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
939

940
	return v4l2_subdev_call(sd, core, s_register, reg);
941 942 943
}
#endif

944 945
static int soc_camera_probe(struct soc_camera_device *icd);

946 947 948 949 950 951 952 953 954
/* 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) {
955
			int ret;
956 957 958

			icd->parent = ici->v4l2_dev.dev;
			ret = soc_camera_probe(icd);
959 960 961 962 963 964
		}
	}

	mutex_unlock(&list_lock);
}

965 966 967
#ifdef CONFIG_I2C_BOARDINFO
static int soc_camera_init_i2c(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
968
{
969
	struct i2c_client *client;
970
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
971
	struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
972
	struct v4l2_subdev *subdev;
973

974
	if (!adap) {
975
		dev_err(icd->pdev, "Cannot get I2C adapter #%d. No driver?\n",
976 977 978
			icl->i2c_adapter_id);
		goto ei2cga;
	}
979

980
	icl->board_info->platform_data = icd;
981

982
	subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
983
				icl->board_info, NULL);
984
	if (!subdev)
985
		goto ei2cnd;
986

987
	client = v4l2_get_subdevdata(subdev);
988

989
	/* Use to_i2c_client(dev) to recover the i2c client */
990
	icd->control = &client->dev;
991

992 993 994 995
	return 0;
ei2cnd:
	i2c_put_adapter(adap);
ei2cga:
996
	return -ENODEV;
997 998
}

999 1000 1001 1002
static void soc_camera_free_i2c(struct soc_camera_device *icd)
{
	struct i2c_client *client =
		to_i2c_client(to_soc_camera_control(icd));
1003
	struct i2c_adapter *adap = client->adapter;
1004 1005

	icd->control = NULL;
1006
	v4l2_device_unregister_subdev(i2c_get_clientdata(client));
1007
	i2c_unregister_device(client);
1008
	i2c_put_adapter(adap);
1009 1010 1011 1012 1013 1014
}
#else
#define soc_camera_init_i2c(icd, icl)	(-ENODEV)
#define soc_camera_free_i2c(icd)	do {} while (0)
#endif

1015
static int soc_camera_video_start(struct soc_camera_device *icd);
1016 1017
static int video_dev_create(struct soc_camera_device *icd);
/* Called during host-driver probe */
1018
static int soc_camera_probe(struct soc_camera_device *icd)
1019
{
1020
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1021
	struct soc_camera_link *icl = to_soc_camera_link(icd);
1022
	struct device *control = NULL;
1023
	struct v4l2_subdev *sd;
1024
	struct v4l2_mbus_framefmt mf;
1025 1026
	int ret;

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

1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
	/*
	 * 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;

1040 1041 1042 1043 1044
	ret = regulator_bulk_get(icd->pdev, icl->num_regulators,
				 icl->regulators);
	if (ret < 0)
		goto ereg;

1045 1046 1047 1048 1049 1050
	/*
	 * 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.
	 */
1051
	ret = soc_camera_power_on(icd, icl);
1052 1053
	if (ret < 0)
		goto epower;
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063

	/* 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 */
1064 1065 1066
	ret = video_dev_create(icd);
	if (ret < 0)
		goto evdc;
1067

1068 1069 1070 1071 1072 1073
	/* 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) {
1074
		ret = -EINVAL;
1075 1076
		goto eadddev;
	} else {
1077 1078 1079
		if (icl->module_name)
			ret = request_module(icl->module_name);

1080
		ret = icl->add_device(icd);
1081 1082
		if (ret < 0)
			goto eadddev;
1083

1084 1085 1086 1087
		/*
		 * FIXME: this is racy, have to use driver-binding notification,
		 * when it is available
		 */
1088
		control = to_soc_camera_control(icd);
1089
		if (!control || !control->driver || !dev_get_drvdata(control) ||
1090
		    !try_module_get(control->driver->owner)) {
1091
			icl->del_device(icd);
1092
			ret = -ENODEV;
1093 1094
			goto enodrv;
		}
1095
	}
1096

1097 1098 1099
	sd = soc_camera_to_subdev(icd);
	sd->grp_id = (long)icd;

1100 1101 1102
	if (v4l2_ctrl_add_handler(&icd->ctrl_handler, sd->ctrl_handler))
		goto ectrl;

1103 1104 1105 1106 1107 1108 1109
	/* 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;

1110 1111 1112 1113 1114
	/*
	 * ..._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.
	 */
1115 1116 1117 1118 1119 1120
	mutex_lock(&icd->video_lock);

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

1121 1122 1123 1124
	ret = v4l2_subdev_call(sd, core, s_power, 1);
	if (ret < 0 && ret != -ENOIOCTLCMD)
		goto esdpwr;

1125
	/* Try to improve our guess of a reasonable window format */
1126 1127 1128 1129 1130
	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;
1131 1132
	}

1133 1134
	ici->ops->remove(icd);

1135
	soc_camera_power_off(icd, icl);
1136 1137

	mutex_unlock(&icd->video_lock);
1138

1139
	return 0;
1140

1141 1142
esdpwr:
	video_unregister_device(icd->vdev);
1143 1144
evidstart:
	mutex_unlock(&icd->video_lock);
1145 1146
	soc_camera_free_user_formats(icd);
eiufmt:
1147
ectrl:
1148
	if (icl->board_info) {
1149
		soc_camera_free_i2c(icd);
1150
	} else {
1151
		icl->del_device(icd);
1152 1153 1154
		module_put(control->driver->owner);
	}
enodrv:
1155 1156
eadddev:
	video_device_release(icd->vdev);
1157
	icd->vdev = NULL;
1158
evdc:
1159 1160
	ici->ops->remove(icd);
eadd:
1161
	soc_camera_power_off(icd, icl);
1162
epower:
1163 1164
	regulator_bulk_free(icl->num_regulators, icl->regulators);
ereg:
1165
	v4l2_ctrl_handler_free(&icd->ctrl_handler);
1166 1167 1168
	return ret;
}

1169 1170 1171 1172
/*
 * This is called on device_unregister, which only means we have to disconnect
 * from the host, but not remove ourselves from the device list
 */
1173
static int soc_camera_remove(struct soc_camera_device *icd)
1174
{
1175 1176
	struct soc_camera_link *icl = to_soc_camera_link(icd);
	struct video_device *vdev = icd->vdev;
1177

1178
	BUG_ON(!icd->parent);
1179

1180
	v4l2_ctrl_handler_free(&icd->ctrl_handler);
1181 1182 1183 1184 1185
	if (vdev) {
		video_unregister_device(vdev);
		icd->vdev = NULL;
	}

1186
	if (icl->board_info) {
1187
		soc_camera_free_i2c(icd);
1188
	} else {
1189
		struct device_driver *drv = to_soc_camera_control(icd)->driver;
1190
		if (drv) {
1191
			icl->del_device(icd);
1192 1193 1194
			module_put(drv->owner);
		}
	}
1195
	soc_camera_free_user_formats(icd);
1196

1197 1198
	regulator_bulk_free(icl->num_regulators, icl->regulators);

1199 1200 1201
	return 0;
}

1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
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);
}

1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
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);
}

1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
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;
}

1260
int soc_camera_host_register(struct soc_camera_host *ici)
1261 1262
{
	struct soc_camera_host *ix;
1263
	int ret;
1264

1265 1266 1267 1268 1269
	if (!ici || !ici->ops ||
	    !ici->ops->try_fmt ||
	    !ici->ops->set_fmt ||
	    !ici->ops->set_bus_param ||
	    !ici->ops->querycap ||
1270 1271 1272
	    ((!ici->ops->init_videobuf ||
	      !ici->ops->reqbufs) &&
	     !ici->ops->init_videobuf2) ||
1273 1274
	    !ici->ops->add ||
	    !ici->ops->remove ||
1275
	    !ici->ops->poll ||
1276
	    !ici->v4l2_dev.dev)
1277 1278
		return -EINVAL;

1279 1280 1281 1282 1283 1284
	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;
1285 1286 1287 1288
	if (!ici->ops->set_parm)
		ici->ops->set_parm = default_s_parm;
	if (!ici->ops->get_parm)
		ici->ops->get_parm = default_g_parm;
1289 1290
	if (!ici->ops->enum_fsizes)
		ici->ops->enum_fsizes = default_enum_fsizes;
1291

1292 1293 1294
	mutex_lock(&list_lock);
	list_for_each_entry(ix, &hosts, list) {
		if (ix->nr == ici->nr) {
1295 1296
			ret = -EBUSY;
			goto edevreg;
1297 1298 1299
		}
	}

1300 1301 1302
	ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
	if (ret < 0)
		goto edevreg;
1303

1304 1305 1306 1307 1308 1309
	list_add_tail(&ici->list, &hosts);
	mutex_unlock(&list_lock);

	scan_add_host(ici);

	return 0;
1310 1311 1312 1313

edevreg:
	mutex_unlock(&list_lock);
	return ret;
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324
}
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);
1325 1326 1327
	list_for_each_entry(icd, &devices, list)
		if (icd->iface == ici->nr && to_soc_camera_control(icd))
			soc_camera_remove(icd);
1328 1329 1330

	mutex_unlock(&list_lock);

1331
	v4l2_device_unregister(&ici->v4l2_dev);
1332 1333 1334 1335
}
EXPORT_SYMBOL(soc_camera_host_unregister);

/* Image capture device */
1336
static int soc_camera_device_register(struct soc_camera_device *icd)
1337 1338 1339 1340 1341 1342
{
	struct soc_camera_device *ix;
	int num = -1, i;

	for (i = 0; i < 256 && num < 0; i++) {
		num = i;
1343
		/* Check if this index is available on this interface */
1344 1345 1346 1347 1348 1349 1350 1351 1352
		list_for_each_entry(ix, &devices, list) {
			if (ix->iface == icd->iface && ix->devnum == i) {
				num = -1;
				break;
			}
		}
	}

	if (num < 0)
1353 1354 1355 1356
		/*
		 * ok, we have 256 cameras on this host...
		 * man, stay reasonable...
		 */
1357 1358
		return -ENOMEM;

1359
	icd->devnum		= num;
1360 1361
	icd->use_count		= 0;
	icd->host_priv		= NULL;
1362
	mutex_init(&icd->video_lock);
1363

1364 1365 1366
	list_add_tail(&icd->list, &devices);

	return 0;
1367 1368
}

1369 1370
static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
	.vidioc_querycap	 = soc_camera_querycap,
1371
	.vidioc_try_fmt_vid_cap  = soc_camera_try_fmt_vid_cap,
1372 1373
	.vidioc_g_fmt_vid_cap    = soc_camera_g_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap    = soc_camera_s_fmt_vid_cap,
1374
	.vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
1375 1376 1377 1378
	.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,
1379
	.vidioc_enum_framesizes  = soc_camera_enum_fsizes,
1380 1381 1382 1383
	.vidioc_reqbufs		 = soc_camera_reqbufs,
	.vidioc_querybuf	 = soc_camera_querybuf,
	.vidioc_qbuf		 = soc_camera_qbuf,
	.vidioc_dqbuf		 = soc_camera_dqbuf,
1384 1385
	.vidioc_create_bufs	 = soc_camera_create_bufs,
	.vidioc_prepare_buf	 = soc_camera_prepare_buf,
1386 1387 1388 1389 1390
	.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,
1391 1392
	.vidioc_g_parm		 = soc_camera_g_parm,
	.vidioc_s_parm		 = soc_camera_s_parm,
1393 1394 1395 1396 1397 1398 1399
	.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
};

1400
static int video_dev_create(struct soc_camera_device *icd)
1401
{
1402
	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1403
	struct video_device *vdev = video_device_alloc();
1404 1405

	if (!vdev)
1406
		return -ENOMEM;
1407 1408

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

1410
	vdev->parent		= icd->pdev;
1411 1412
	vdev->current_norm	= V4L2_STD_UNKNOWN;
	vdev->fops		= &soc_camera_fops;
1413
	vdev->ioctl_ops		= &soc_camera_ioctl_ops;
1414
	vdev->release		= video_device_release;
1415
	vdev->tvnorms		= V4L2_STD_UNKNOWN;
1416
	vdev->ctrl_handler	= &icd->ctrl_handler;
1417
	vdev->lock		= &icd->video_lock;
1418 1419 1420 1421

	icd->vdev = vdev;

	return 0;
1422
}
1423

1424
/*
1425
 * Called from soc_camera_probe() above (with .video_lock held???)
1426
 */
1427
static int soc_camera_video_start(struct soc_camera_device *icd)
1428
{
1429
	const struct device_type *type = icd->vdev->dev.type;
1430
	int ret;
1431

1432
	if (!icd->parent)
1433 1434
		return -ENODEV;

1435
	ret = video_register_device(icd->vdev, VFL_TYPE_GRABBER, -1);
1436
	if (ret < 0) {
1437
		dev_err(icd->pdev, "video_register_device failed: %d\n", ret);
1438 1439
		return ret;
	}
1440

1441 1442 1443
	/* Restore device type, possibly set by the subdevice driver */
	icd->vdev->dev.type = type;

1444
	return 0;
1445 1446
}

1447
static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1448
{
1449 1450
	struct soc_camera_link *icl = pdev->dev.platform_data;
	struct soc_camera_device *icd;
1451
	int ret;
1452

1453 1454
	if (!icl)
		return -EINVAL;
1455

1456 1457 1458
	icd = kzalloc(sizeof(*icd), GFP_KERNEL);
	if (!icd)
		return -ENOMEM;
1459

1460
	icd->iface = icl->bus_id;
1461
	icd->link = icl;
1462
	icd->pdev = &pdev->dev;
1463
	platform_set_drvdata(pdev, icd);
1464

1465 1466 1467
	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;
1468

1469 1470 1471
	icd->user_width		= DEFAULT_WIDTH;
	icd->user_height	= DEFAULT_HEIGHT;

1472
	return 0;
1473

1474 1475
escdevreg:
	kfree(icd);
1476

1477
	return ret;
1478
}
1479

1480 1481
/*
 * Only called on rmmod for each platform device, since they are not
1482
 * hot-pluggable. Now we know, that all our users - hosts and devices have
1483 1484
 * been unloaded already
 */
1485
static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
1486
{
1487
	struct soc_camera_device *icd = platform_get_drvdata(pdev);
1488

1489
	if (!icd)
1490 1491
		return -EINVAL;

1492
	list_del(&icd->list);
1493

1494
	kfree(icd);
1495

1496 1497 1498 1499
	return 0;
}

static struct platform_driver __refdata soc_camera_pdrv = {
1500 1501 1502 1503
	.remove  = __devexit_p(soc_camera_pdrv_remove),
	.driver  = {
		.name	= "soc-camera-pdrv",
		.owner	= THIS_MODULE,
1504 1505 1506
	},
};

1507 1508
static int __init soc_camera_init(void)
{
1509
	return platform_driver_probe(&soc_camera_pdrv, soc_camera_pdrv_probe);
1510 1511 1512 1513
}

static void __exit soc_camera_exit(void)
{
1514
	platform_driver_unregister(&soc_camera_pdrv);
1515 1516 1517 1518 1519 1520 1521 1522
}

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");
1523
MODULE_ALIAS("platform:soc-camera-pdrv");