soc_camera.c 40.2 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
static int soc_camera_power_set(struct soc_camera_device *icd,
				struct soc_camera_link *icl,
				int power_on)
{
	int ret;

	if (power_on) {
		ret = regulator_bulk_enable(icl->num_regulators,
					    icl->regulators);
		if (ret < 0) {
			dev_err(&icd->dev, "Cannot enable regulators\n");
			return ret;
		}

		if (icl->power)
			ret = icl->power(icd->pdev, power_on);
		if (ret < 0) {
			dev_err(&icd->dev,
				"Platform failed to power-on the camera.\n");

			regulator_bulk_disable(icl->num_regulators,
					       icl->regulators);
			return ret;
		}
	} else {
		ret = 0;
		if (icl->power)
			ret = icl->power(icd->pdev, 0);
		if (ret < 0) {
			dev_err(&icd->dev,
				"Platform failed to power-off the camera.\n");
			return ret;
		}

		ret = regulator_bulk_disable(icl->num_regulators,
					     icl->regulators);
		if (ret < 0) {
			dev_err(&icd->dev, "Cannot disable regulators\n");
			return ret;
		}
	}

	return 0;
}

98 99 100 101 102 103 104 105 106 107 108 109
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);

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
/**
 * soc_camera_apply_sensor_flags() - apply platform SOCAM_SENSOR_INVERT_* flags
 * @icl:	camera platform parameters
 * @flags:	flags to be inverted according to platform configuration
 * @return:	resulting flags
 */
unsigned long soc_camera_apply_sensor_flags(struct soc_camera_link *icl,
					    unsigned long flags)
{
	unsigned long f;

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

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

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

	return flags;
}
EXPORT_SYMBOL(soc_camera_apply_sensor_flags);

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
#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)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

	dev_dbg(&icd->dev, "TRY_FMT(%c%c%c%c, %ux%u)\n",
		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;
}

184
static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv,
185
				      struct v4l2_format *f)
186
{
187
	struct soc_camera_device *icd = file->private_data;
188 189 190

	WARN_ON(priv != file->private_data);

191 192 193 194
	/* Only single-plane capture is supported so far */
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

195
	/* limit format to hardware capabilities */
196
	return soc_camera_try_fmt(icd, f);
197 198 199 200 201
}

static int soc_camera_enum_input(struct file *file, void *priv,
				 struct v4l2_input *inp)
{
202
	struct soc_camera_device *icd = file->private_data;
203 204
	int ret = 0;

205 206 207
	if (inp->index != 0)
		return -EINVAL;

208 209 210 211 212 213 214 215
	if (icd->ops->enum_input)
		ret = icd->ops->enum_input(icd, inp);
	else {
		/* default is camera */
		inp->type = V4L2_INPUT_TYPE_CAMERA;
		inp->std  = V4L2_STD_UNKNOWN;
		strcpy(inp->name, "Camera");
	}
216

217
	return ret;
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
}

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)
{
237
	struct soc_camera_device *icd = file->private_data;
238
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
239

240
	return v4l2_subdev_call(sd, core, s_std, *a);
241 242
}

243 244 245 246 247 248 249 250 251
static int soc_camera_enum_fsizes(struct file *file, void *fh,
					 struct v4l2_frmsizeenum *fsize)
{
	struct soc_camera_device *icd = file->private_data;
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

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

252 253 254 255
static int soc_camera_reqbufs(struct file *file, void *priv,
			      struct v4l2_requestbuffers *p)
{
	int ret;
256
	struct soc_camera_device *icd = file->private_data;
257
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
258 259 260

	WARN_ON(priv != file->private_data);

261 262 263
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;

264 265 266 267 268 269 270 271 272
	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);
	}
273

274 275 276 277
	if (!ret && !icd->streamer)
		icd->streamer = file;

	return ret;
278 279 280 281 282
}

static int soc_camera_querybuf(struct file *file, void *priv,
			       struct v4l2_buffer *p)
{
283
	struct soc_camera_device *icd = file->private_data;
284
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
285 286 287

	WARN_ON(priv != file->private_data);

288 289 290 291
	if (ici->ops->init_videobuf)
		return videobuf_querybuf(&icd->vb_vidq, p);
	else
		return vb2_querybuf(&icd->vb2_vidq, p);
292 293 294 295 296
}

static int soc_camera_qbuf(struct file *file, void *priv,
			   struct v4l2_buffer *p)
{
297
	struct soc_camera_device *icd = file->private_data;
298
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
299 300 301

	WARN_ON(priv != file->private_data);

302 303 304
	if (icd->streamer != file)
		return -EBUSY;

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

static int soc_camera_dqbuf(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->dev.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_dqbuf(&icd->vb_vidq, p, file->f_flags & O_NONBLOCK);
	else
		return vb2_dqbuf(&icd->vb2_vidq, p, file->f_flags & O_NONBLOCK);
326 327
}

328
/* Always entered with .video_lock held */
329 330
static int soc_camera_init_user_formats(struct soc_camera_device *icd)
{
331
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
332
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
333 334
	unsigned int i, fmts = 0, raw_fmts = 0;
	int ret;
335 336 337 338
	enum v4l2_mbus_pixelcode code;

	while (!v4l2_subdev_call(sd, video, enum_mbus_fmt, raw_fmts, &code))
		raw_fmts++;
339 340 341 342 343 344

	if (!ici->ops->get_formats)
		/*
		 * Fallback mode - the host will have to serve all
		 * sensor-provided formats one-to-one to the user
		 */
345
		fmts = raw_fmts;
346 347 348 349 350
	else
		/*
		 * First pass - only count formats this host-sensor
		 * configuration can provide
		 */
351
		for (i = 0; i < raw_fmts; i++) {
352 353 354 355 356
			ret = ici->ops->get_formats(icd, i, NULL);
			if (ret < 0)
				return ret;
			fmts += ret;
		}
357 358 359 360 361 362 363 364 365 366 367 368

	if (!fmts)
		return -ENXIO;

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

	dev_dbg(&icd->dev, "Found %d supported formats.\n", fmts);

	/* Second pass - actually fill data formats */
369
	fmts = 0;
370
	for (i = 0; i < raw_fmts; i++)
371
		if (!ici->ops->get_formats) {
372
			v4l2_subdev_call(sd, video, enum_mbus_fmt, i, &code);
373
			icd->user_formats[fmts].host_fmt =
374
				soc_mbus_get_fmtdesc(code);
375 376
			if (icd->user_formats[fmts].host_fmt)
				icd->user_formats[fmts++].code = code;
377
		} else {
378 379 380 381 382
			ret = ici->ops->get_formats(icd, i,
						    &icd->user_formats[fmts]);
			if (ret < 0)
				goto egfmt;
			fmts += ret;
383 384
		}

385
	icd->num_user_formats = fmts;
386
	icd->current_fmt = &icd->user_formats[0];
387 388

	return 0;
389 390 391 392

egfmt:
	vfree(icd->user_formats);
	return ret;
393 394
}

395
/* Always entered with .video_lock held */
396 397
static void soc_camera_free_user_formats(struct soc_camera_device *icd)
{
398 399 400 401
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	if (ici->ops->put_formats)
		ici->ops->put_formats(icd);
402
	icd->current_fmt = NULL;
403
	icd->num_user_formats = 0;
404
	vfree(icd->user_formats);
405
	icd->user_formats = NULL;
406 407
}

408
/* Called with .vb_lock held, or from the first open(2), see comment there */
409
static int soc_camera_set_fmt(struct soc_camera_device *icd,
410 411 412 413 414 415
			      struct v4l2_format *f)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

416 417 418
	dev_dbg(&icd->dev, "S_FMT(%c%c%c%c, %ux%u)\n",
		pixfmtstr(pix->pixelformat), pix->width, pix->height);

419
	/* We always call try_fmt() before set_fmt() or set_crop() */
420
	ret = soc_camera_try_fmt(icd, f);
421 422 423 424 425 426 427
	if (ret < 0)
		return ret;

	ret = ici->ops->set_fmt(icd, f);
	if (ret < 0) {
		return ret;
	} else if (!icd->current_fmt ||
428
		   icd->current_fmt->host_fmt->fourcc != pix->pixelformat) {
429
		dev_err(&icd->dev,
430 431 432 433
			"Host driver hasn't set up current format correctly!\n");
		return -EINVAL;
	}

434 435
	icd->user_width		= pix->width;
	icd->user_height	= pix->height;
436 437
	icd->bytesperline	= pix->bytesperline;
	icd->sizeimage		= pix->sizeimage;
438
	icd->colorspace		= pix->colorspace;
439 440 441
	icd->field		= pix->field;
	if (ici->ops->init_videobuf)
		icd->vb_vidq.field = pix->field;
442

443
	dev_dbg(&icd->dev, "set width: %d height: %d\n",
444
		icd->user_width, icd->user_height);
445 446 447 448 449

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

450
static int soc_camera_open(struct file *file)
451
{
452
	struct video_device *vdev = video_devdata(file);
453 454 455
	struct soc_camera_device *icd = container_of(vdev->parent,
						     struct soc_camera_device,
						     dev);
456
	struct soc_camera_link *icl = to_soc_camera_link(icd);
457
	struct soc_camera_host *ici;
458 459
	int ret;

460 461 462 463
	if (!icd->ops)
		/* No device driver attached */
		return -ENODEV;

464
	ici = to_soc_camera_host(icd->dev.parent);
465

466
	if (!try_module_get(ici->ops->owner)) {
467
		dev_err(&icd->dev, "Couldn't lock capture bus driver.\n");
468
		return -EINVAL;
469 470
	}

471 472
	icd->use_count++;

473 474
	/* Now we really have to activate the camera */
	if (icd->use_count == 1) {
475
		/* Restore parameters before the last close() per V4L2 API */
476 477 478
		struct v4l2_format f = {
			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix = {
479 480
				.width		= icd->user_width,
				.height		= icd->user_height,
481
				.field		= icd->field,
482 483 484
				.colorspace	= icd->colorspace,
				.pixelformat	=
					icd->current_fmt->host_fmt->fourcc,
485 486 487
			},
		};

488 489 490
		ret = soc_camera_power_set(icd, icl, 1);
		if (ret < 0)
			goto epower;
491 492 493 494 495

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

496
		ret = ici->ops->add(icd);
497 498 499 500
		if (ret < 0) {
			dev_err(&icd->dev, "Couldn't activate the camera: %d\n", ret);
			goto eiciadd;
		}
501

502 503 504 505 506
		pm_runtime_enable(&icd->vdev->dev);
		ret = pm_runtime_resume(&icd->vdev->dev);
		if (ret < 0 && ret != -ENOSYS)
			goto eresume;

507 508 509 510 511 512
		/*
		 * 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.
		 */
513
		ret = soc_camera_set_fmt(icd, &f);
514 515
		if (ret < 0)
			goto esfmt;
516

517 518 519 520 521 522 523
		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;
		}
524 525
	}

526
	file->private_data = icd;
527 528 529 530
	dev_dbg(&icd->dev, "camera device open\n");

	return 0;

531
	/*
532
	 * First four errors are entered with the .video_lock held
533 534
	 * and use_count == 1
	 */
535
einitvb:
536
esfmt:
537 538
	pm_runtime_disable(&icd->vdev->dev);
eresume:
539
	ici->ops->remove(icd);
540
eiciadd:
541
	soc_camera_power_set(icd, icl, 0);
542
epower:
543
	icd->use_count--;
544
	module_put(ici->ops->owner);
545

546 547 548
	return ret;
}

549
static int soc_camera_close(struct file *file)
550
{
551
	struct soc_camera_device *icd = file->private_data;
552 553
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

554
	icd->use_count--;
555
	if (!icd->use_count) {
556 557
		struct soc_camera_link *icl = to_soc_camera_link(icd);

558 559 560
		pm_runtime_suspend(&icd->vdev->dev);
		pm_runtime_disable(&icd->vdev->dev);

561
		ici->ops->remove(icd);
562 563
		if (ici->ops->init_videobuf2)
			vb2_queue_release(&icd->vb2_vidq);
564

565
		soc_camera_power_set(icd, icl, 0);
566
	}
567

568 569 570
	if (icd->streamer == file)
		icd->streamer = NULL;

571
	module_put(ici->ops->owner);
572

573
	dev_dbg(&icd->dev, "camera device close\n");
574 575 576 577

	return 0;
}

578
static ssize_t soc_camera_read(struct file *file, char __user *buf,
579
			       size_t count, loff_t *ppos)
580
{
581
	struct soc_camera_device *icd = file->private_data;
582 583
	int err = -EINVAL;

584
	dev_err(&icd->dev, "camera device read not implemented\n");
585 586 587 588 589 590

	return err;
}

static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
{
591
	struct soc_camera_device *icd = file->private_data;
592
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
593 594 595 596
	int err;

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

597 598 599
	if (icd->streamer != file)
		return -EBUSY;

600 601 602 603
	if (ici->ops->init_videobuf)
		err = videobuf_mmap_mapper(&icd->vb_vidq, vma);
	else
		err = vb2_mmap(&icd->vb2_vidq, vma);
604 605 606 607 608 609 610 611 612 613 614

	dev_dbg(&icd->dev, "vma start=0x%08lx, size=%ld, ret=%d\n",
		(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)
{
615
	struct soc_camera_device *icd = file->private_data;
616
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
617

618 619 620
	if (icd->streamer != file)
		return -EBUSY;

621
	if (ici->ops->init_videobuf && list_empty(&icd->vb_vidq.stream)) {
622 623 624 625
		dev_err(&icd->dev, "Trying to poll with no queued buffers!\n");
		return POLLERR;
	}

626
	return ici->ops->poll(file, pt);
627 628
}

629 630 631 632 633 634 635 636 637 638 639 640 641 642
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);

643
static struct v4l2_file_operations soc_camera_fops = {
644 645 646
	.owner		= THIS_MODULE,
	.open		= soc_camera_open,
	.release	= soc_camera_close,
647
	.unlocked_ioctl	= video_ioctl2,
648 649 650 651 652
	.read		= soc_camera_read,
	.mmap		= soc_camera_mmap,
	.poll		= soc_camera_poll,
};

653
static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
654
				    struct v4l2_format *f)
655
{
656
	struct soc_camera_device *icd = file->private_data;
657 658 659 660
	int ret;

	WARN_ON(priv != file->private_data);

661 662 663 664 665
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		dev_warn(&icd->dev, "Wrong buf-type %d\n", f->type);
		return -EINVAL;
	}

666 667
	if (icd->streamer && icd->streamer != file)
		return -EBUSY;
668

669
	if (is_streaming(to_soc_camera_host(icd->dev.parent), icd)) {
670
		dev_err(&icd->dev, "S_FMT denied: queue initialised\n");
671
		return -EBUSY;
672 673
	}

674 675 676 677
	ret = soc_camera_set_fmt(icd, f);

	if (!ret && !icd->streamer)
		icd->streamer = file;
678 679

	return ret;
680 681
}

682
static int soc_camera_enum_fmt_vid_cap(struct file *file, void  *priv,
683
				       struct v4l2_fmtdesc *f)
684
{
685
	struct soc_camera_device *icd = file->private_data;
686
	const struct soc_mbus_pixelfmt *format;
687 688 689

	WARN_ON(priv != file->private_data);

690
	if (f->index >= icd->num_user_formats)
691 692
		return -EINVAL;

693
	format = icd->user_formats[f->index].host_fmt;
694

695 696
	if (format->name)
		strlcpy(f->description, format->name, sizeof(f->description));
697 698 699 700
	f->pixelformat = format->fourcc;
	return 0;
}

701
static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
702
				    struct v4l2_format *f)
703
{
704
	struct soc_camera_device *icd = file->private_data;
705
	struct v4l2_pix_format *pix = &f->fmt.pix;
706 707 708

	WARN_ON(priv != file->private_data);

709 710 711
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

712 713
	pix->width		= icd->user_width;
	pix->height		= icd->user_height;
714 715
	pix->bytesperline	= icd->bytesperline;
	pix->sizeimage		= icd->sizeimage;
716
	pix->field		= icd->field;
717 718
	pix->pixelformat	= icd->current_fmt->host_fmt->fourcc;
	pix->colorspace		= icd->colorspace;
719
	dev_dbg(&icd->dev, "current_fmt->fourcc: 0x%08x\n",
720
		icd->current_fmt->host_fmt->fourcc);
721 722 723 724 725 726
	return 0;
}

static int soc_camera_querycap(struct file *file, void  *priv,
			       struct v4l2_capability *cap)
{
727
	struct soc_camera_device *icd = file->private_data;
728
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
729 730 731 732

	WARN_ON(priv != file->private_data);

	strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
733
	return ici->ops->querycap(ici, cap);
734 735 736 737 738
}

static int soc_camera_streamon(struct file *file, void *priv,
			       enum v4l2_buf_type i)
{
739
	struct soc_camera_device *icd = file->private_data;
740
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
741
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
742
	int ret;
743 744 745 746 747 748

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

749 750 751
	if (icd->streamer != file)
		return -EBUSY;

752
	/* This calls buf_queue from host driver's videobuf_queue_ops */
753 754 755 756 757
	if (ici->ops->init_videobuf)
		ret = videobuf_streamon(&icd->vb_vidq);
	else
		ret = vb2_streamon(&icd->vb2_vidq, i);

758 759
	if (!ret)
		v4l2_subdev_call(sd, video, s_stream, 1);
760 761

	return ret;
762 763 764 765 766
}

static int soc_camera_streamoff(struct file *file, void *priv,
				enum v4l2_buf_type i)
{
767
	struct soc_camera_device *icd = file->private_data;
768
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
769
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
770 771 772 773 774 775

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

776 777 778
	if (icd->streamer != file)
		return -EBUSY;

779 780 781 782
	/*
	 * This calls buf_release from host driver's videobuf_queue_ops for all
	 * remaining buffers. When the last buffer is freed, stop capture
	 */
783 784 785 786
	if (ici->ops->init_videobuf)
		videobuf_streamoff(&icd->vb_vidq);
	else
		vb2_streamoff(&icd->vb2_vidq, i);
787

788
	v4l2_subdev_call(sd, video, s_stream, 0);
789 790 791 792 793 794 795

	return 0;
}

static int soc_camera_queryctrl(struct file *file, void *priv,
				struct v4l2_queryctrl *qc)
{
796
	struct soc_camera_device *icd = file->private_data;
797
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
798 799 800 801 802 803 804
	int i;

	WARN_ON(priv != file->private_data);

	if (!qc->id)
		return -EINVAL;

805 806 807 808 809 810 811 812 813
	/* First check host controls */
	for (i = 0; i < ici->ops->num_controls; i++)
		if (qc->id == ici->ops->controls[i].id) {
			memcpy(qc, &(ici->ops->controls[i]),
				sizeof(*qc));
			return 0;
		}

	/* Then device controls */
814 815 816 817 818 819 820 821 822 823 824 825 826
	for (i = 0; i < icd->ops->num_controls; i++)
		if (qc->id == icd->ops->controls[i].id) {
			memcpy(qc, &(icd->ops->controls[i]),
				sizeof(*qc));
			return 0;
		}

	return -EINVAL;
}

static int soc_camera_g_ctrl(struct file *file, void *priv,
			     struct v4l2_control *ctrl)
{
827
	struct soc_camera_device *icd = file->private_data;
828
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
829
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
830
	int ret;
831 832 833

	WARN_ON(priv != file->private_data);

834 835 836 837 838 839
	if (ici->ops->get_ctrl) {
		ret = ici->ops->get_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

840
	return v4l2_subdev_call(sd, core, g_ctrl, ctrl);
841 842 843 844 845
}

static int soc_camera_s_ctrl(struct file *file, void *priv,
			     struct v4l2_control *ctrl)
{
846
	struct soc_camera_device *icd = file->private_data;
847
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
848
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
849
	int ret;
850 851 852

	WARN_ON(priv != file->private_data);

853 854 855 856 857 858
	if (ici->ops->set_ctrl) {
		ret = ici->ops->set_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

859
	return v4l2_subdev_call(sd, core, s_ctrl, ctrl);
860 861 862 863 864
}

static int soc_camera_cropcap(struct file *file, void *fh,
			      struct v4l2_cropcap *a)
{
865
	struct soc_camera_device *icd = file->private_data;
866
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
867

868
	return ici->ops->cropcap(icd, a);
869 870 871 872 873
}

static int soc_camera_g_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
874
	struct soc_camera_device *icd = file->private_data;
875 876
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret;
877

878
	ret = ici->ops->get_crop(icd, a);
879

880
	return ret;
881 882
}

883 884 885
/*
 * 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
886
 * retrieve it.
887
 */
888 889 890
static int soc_camera_s_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
891
	struct soc_camera_device *icd = file->private_data;
892
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
893 894
	struct v4l2_rect *rect = &a->c;
	struct v4l2_crop current_crop;
895 896 897 898 899
	int ret;

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

900 901 902 903 904 905
	dev_dbg(&icd->dev, "S_CROP(%ux%u@%u:%u)\n",
		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);

906
	/* Prohibit window size change with initialised buffers */
907 908 909
	if (ret < 0) {
		dev_err(&icd->dev,
			"S_CROP denied: getting current crop failed\n");
910 911 912 913 914 915 916 917
	} 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 {
918 919 920 921 922
		dev_err(&icd->dev,
			"S_CROP denied: queue initialised and sizes differ\n");
		ret = -EBUSY;
	}

923 924 925
	return ret;
}

926 927 928
static int soc_camera_g_parm(struct file *file, void *fh,
			     struct v4l2_streamparm *a)
{
929
	struct soc_camera_device *icd = file->private_data;
930 931 932 933 934 935 936 937 938 939 940
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	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)
{
941
	struct soc_camera_device *icd = file->private_data;
942 943 944 945 946 947 948 949
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

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

	return -ENOIOCTLCMD;
}

950
static int soc_camera_g_chip_ident(struct file *file, void *fh,
951
				   struct v4l2_dbg_chip_ident *id)
952
{
953
	struct soc_camera_device *icd = file->private_data;
954
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
955

956
	return v4l2_subdev_call(sd, core, g_chip_ident, id);
957 958 959 960
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
static int soc_camera_g_register(struct file *file, void *fh,
961
				 struct v4l2_dbg_register *reg)
962
{
963
	struct soc_camera_device *icd = file->private_data;
964
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
965

966
	return v4l2_subdev_call(sd, core, g_register, reg);
967 968 969
}

static int soc_camera_s_register(struct file *file, void *fh,
970
				 struct v4l2_dbg_register *reg)
971
{
972
	struct soc_camera_device *icd = file->private_data;
973
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
974

975
	return v4l2_subdev_call(sd, core, s_register, reg);
976 977 978 979 980 981 982 983 984 985 986 987
}
#endif

/* 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) {
988
			int ret;
989
			icd->dev.parent = ici->v4l2_dev.dev;
990 991 992 993 994 995 996 997
			dev_set_name(&icd->dev, "%u-%u", icd->iface,
				     icd->devnum);
			ret = device_register(&icd->dev);
			if (ret < 0) {
				icd->dev.parent = NULL;
				dev_err(&icd->dev,
					"Cannot register device: %d\n", ret);
			}
998 999 1000 1001 1002 1003
		}
	}

	mutex_unlock(&list_lock);
}

1004 1005 1006
#ifdef CONFIG_I2C_BOARDINFO
static int soc_camera_init_i2c(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
1007
{
1008
	struct i2c_client *client;
1009
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1010
	struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
1011
	struct v4l2_subdev *subdev;
1012

1013 1014 1015 1016 1017
	if (!adap) {
		dev_err(&icd->dev, "Cannot get I2C adapter #%d. No driver?\n",
			icl->i2c_adapter_id);
		goto ei2cga;
	}
1018

1019
	icl->board_info->platform_data = icd;
1020

1021
	subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
1022
				icl->board_info, NULL);
1023
	if (!subdev)
1024
		goto ei2cnd;
1025

1026
	client = v4l2_get_subdevdata(subdev);
1027

1028 1029
	/* Use to_i2c_client(dev) to recover the i2c client */
	dev_set_drvdata(&icd->dev, &client->dev);
1030

1031 1032 1033 1034
	return 0;
ei2cnd:
	i2c_put_adapter(adap);
ei2cga:
1035
	return -ENODEV;
1036 1037
}

1038 1039 1040 1041
static void soc_camera_free_i2c(struct soc_camera_device *icd)
{
	struct i2c_client *client =
		to_i2c_client(to_soc_camera_control(icd));
1042
	struct i2c_adapter *adap = client->adapter;
1043
	dev_set_drvdata(&icd->dev, NULL);
1044
	v4l2_device_unregister_subdev(i2c_get_clientdata(client));
1045
	i2c_unregister_device(client);
1046
	i2c_put_adapter(adap);
1047 1048 1049 1050 1051 1052
}
#else
#define soc_camera_init_i2c(icd, icl)	(-ENODEV)
#define soc_camera_free_i2c(icd)	do {} while (0)
#endif

1053
static int soc_camera_video_start(struct soc_camera_device *icd);
1054 1055
static int video_dev_create(struct soc_camera_device *icd);
/* Called during host-driver probe */
1056 1057 1058
static int soc_camera_probe(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
1059
	struct soc_camera_host *ici = to_soc_camera_host(dev->parent);
1060
	struct soc_camera_link *icl = to_soc_camera_link(icd);
1061
	struct device *control = NULL;
1062
	struct v4l2_subdev *sd;
1063
	struct v4l2_mbus_framefmt mf;
1064 1065
	int ret;

1066
	dev_info(dev, "Probing %s\n", dev_name(dev));
1067

1068 1069 1070 1071 1072 1073 1074 1075
	ret = regulator_bulk_get(icd->pdev, icl->num_regulators,
				 icl->regulators);
	if (ret < 0)
		goto ereg;

	ret = soc_camera_power_set(icd, icl, 1);
	if (ret < 0)
		goto epower;
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085

	/* 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 */
1086 1087 1088
	ret = video_dev_create(icd);
	if (ret < 0)
		goto evdc;
1089

1090 1091 1092 1093 1094 1095
	/* 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) {
1096
		ret = -EINVAL;
1097 1098
		goto eadddev;
	} else {
1099 1100 1101
		if (icl->module_name)
			ret = request_module(icl->module_name);

1102 1103 1104
		ret = icl->add_device(icl, &icd->dev);
		if (ret < 0)
			goto eadddev;
1105

1106 1107 1108 1109
		/*
		 * FIXME: this is racy, have to use driver-binding notification,
		 * when it is available
		 */
1110
		control = to_soc_camera_control(icd);
1111
		if (!control || !control->driver || !dev_get_drvdata(control) ||
1112 1113 1114 1115
		    !try_module_get(control->driver->owner)) {
			icl->del_device(icl);
			goto enodrv;
		}
1116
	}
1117

1118 1119 1120
	sd = soc_camera_to_subdev(icd);
	sd->grp_id = (long)icd;

1121 1122 1123 1124 1125 1126 1127
	/* 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;

1128 1129 1130 1131 1132 1133 1134
	icd->vdev->lock = &icd->video_lock;

	/*
	 * ..._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.
	 */
1135 1136 1137 1138 1139 1140
	mutex_lock(&icd->video_lock);

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

1141
	/* Try to improve our guess of a reasonable window format */
1142 1143 1144 1145 1146
	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;
1147 1148
	}

1149
	/* Do we have to sysfs_remove_link() before device_unregister()? */
1150
	if (sysfs_create_link(&icd->dev.kobj, &to_soc_camera_control(icd)->kobj,
1151 1152
			      "control"))
		dev_warn(&icd->dev, "Failed creating the control symlink\n");
1153

1154 1155
	ici->ops->remove(icd);

1156
	soc_camera_power_set(icd, icl, 0);
1157 1158

	mutex_unlock(&icd->video_lock);
1159

1160
	return 0;
1161

1162 1163
evidstart:
	mutex_unlock(&icd->video_lock);
1164 1165
	soc_camera_free_user_formats(icd);
eiufmt:
1166
	if (icl->board_info) {
1167
		soc_camera_free_i2c(icd);
1168
	} else {
1169
		icl->del_device(icl);
1170 1171 1172
		module_put(control->driver->owner);
	}
enodrv:
1173 1174 1175
eadddev:
	video_device_release(icd->vdev);
evdc:
1176 1177
	ici->ops->remove(icd);
eadd:
1178
	soc_camera_power_set(icd, icl, 0);
1179
epower:
1180 1181
	regulator_bulk_free(icl->num_regulators, icl->regulators);
ereg:
1182 1183 1184
	return ret;
}

1185 1186 1187 1188
/*
 * This is called on device_unregister, which only means we have to disconnect
 * from the host, but not remove ourselves from the device list
 */
1189 1190 1191
static int soc_camera_remove(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
1192 1193
	struct soc_camera_link *icl = to_soc_camera_link(icd);
	struct video_device *vdev = icd->vdev;
1194

1195
	BUG_ON(!dev->parent);
1196

1197 1198 1199 1200 1201
	if (vdev) {
		video_unregister_device(vdev);
		icd->vdev = NULL;
	}

1202
	if (icl->board_info) {
1203
		soc_camera_free_i2c(icd);
1204 1205 1206 1207 1208 1209 1210 1211
	} else {
		struct device_driver *drv = to_soc_camera_control(icd) ?
			to_soc_camera_control(icd)->driver : NULL;
		if (drv) {
			icl->del_device(icl);
			module_put(drv->owner);
		}
	}
1212
	soc_camera_free_user_formats(icd);
1213

1214 1215
	regulator_bulk_free(icl->num_regulators, icl->regulators);

1216 1217 1218
	return 0;
}

1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
static int soc_camera_suspend(struct device *dev, pm_message_t state)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret = 0;

	if (ici->ops->suspend)
		ret = ici->ops->suspend(icd, state);

	return ret;
}

static int soc_camera_resume(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret = 0;

	if (ici->ops->resume)
		ret = ici->ops->resume(icd);

	return ret;
}

1243
struct bus_type soc_camera_bus_type = {
1244 1245 1246
	.name		= "soc-camera",
	.probe		= soc_camera_probe,
	.remove		= soc_camera_remove,
1247 1248
	.suspend	= soc_camera_suspend,
	.resume		= soc_camera_resume,
1249
};
1250
EXPORT_SYMBOL_GPL(soc_camera_bus_type);
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261

static struct device_driver ic_drv = {
	.name	= "camera",
	.bus	= &soc_camera_bus_type,
	.owner	= THIS_MODULE,
};

static void dummy_release(struct device *dev)
{
}

1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
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);
}

1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294
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);
}

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319
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;
}

1320 1321 1322 1323 1324 1325 1326
static void soc_camera_device_init(struct device *dev, void *pdata)
{
	dev->platform_data	= pdata;
	dev->bus		= &soc_camera_bus_type;
	dev->release		= dummy_release;
}

1327
int soc_camera_host_register(struct soc_camera_host *ici)
1328 1329
{
	struct soc_camera_host *ix;
1330
	int ret;
1331

1332 1333 1334 1335 1336
	if (!ici || !ici->ops ||
	    !ici->ops->try_fmt ||
	    !ici->ops->set_fmt ||
	    !ici->ops->set_bus_param ||
	    !ici->ops->querycap ||
1337 1338 1339
	    ((!ici->ops->init_videobuf ||
	      !ici->ops->reqbufs) &&
	     !ici->ops->init_videobuf2) ||
1340 1341
	    !ici->ops->add ||
	    !ici->ops->remove ||
1342
	    !ici->ops->poll ||
1343
	    !ici->v4l2_dev.dev)
1344 1345
		return -EINVAL;

1346 1347 1348 1349 1350 1351
	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;
1352 1353 1354 1355
	if (!ici->ops->set_parm)
		ici->ops->set_parm = default_s_parm;
	if (!ici->ops->get_parm)
		ici->ops->get_parm = default_g_parm;
1356 1357
	if (!ici->ops->enum_fsizes)
		ici->ops->enum_fsizes = default_enum_fsizes;
1358

1359 1360 1361
	mutex_lock(&list_lock);
	list_for_each_entry(ix, &hosts, list) {
		if (ix->nr == ici->nr) {
1362 1363
			ret = -EBUSY;
			goto edevreg;
1364 1365 1366
		}
	}

1367 1368 1369
	ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
	if (ret < 0)
		goto edevreg;
1370

1371 1372 1373 1374 1375 1376
	list_add_tail(&ici->list, &hosts);
	mutex_unlock(&list_lock);

	scan_add_host(ici);

	return 0;
1377 1378 1379 1380

edevreg:
	mutex_unlock(&list_lock);
	return ret;
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393
}
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);

	list_for_each_entry(icd, &devices, list) {
1394
		if (icd->iface == ici->nr) {
1395
			void *pdata = icd->dev.platform_data;
1396
			/* The bus->remove will be called */
1397
			device_unregister(&icd->dev);
1398 1399 1400 1401 1402 1403 1404 1405 1406
			/*
			 * Not before device_unregister(), .remove
			 * needs parent to call ici->ops->remove().
			 * If the host module is loaded again, device_register()
			 * would complain "already initialised," since 2.6.32
			 * this is also needed to prevent use-after-free of the
			 * device private data.
			 */
			memset(&icd->dev, 0, sizeof(icd->dev));
1407
			soc_camera_device_init(&icd->dev, pdata);
1408 1409 1410 1411 1412
		}
	}

	mutex_unlock(&list_lock);

1413
	v4l2_device_unregister(&ici->v4l2_dev);
1414 1415 1416 1417
}
EXPORT_SYMBOL(soc_camera_host_unregister);

/* Image capture device */
1418
static int soc_camera_device_register(struct soc_camera_device *icd)
1419 1420 1421 1422 1423 1424
{
	struct soc_camera_device *ix;
	int num = -1, i;

	for (i = 0; i < 256 && num < 0; i++) {
		num = i;
1425
		/* Check if this index is available on this interface */
1426 1427 1428 1429 1430 1431 1432 1433 1434
		list_for_each_entry(ix, &devices, list) {
			if (ix->iface == icd->iface && ix->devnum == i) {
				num = -1;
				break;
			}
		}
	}

	if (num < 0)
1435 1436 1437 1438
		/*
		 * ok, we have 256 cameras on this host...
		 * man, stay reasonable...
		 */
1439 1440
		return -ENOMEM;

1441
	icd->devnum		= num;
1442 1443
	icd->use_count		= 0;
	icd->host_priv		= NULL;
1444
	mutex_init(&icd->video_lock);
1445

1446 1447 1448
	list_add_tail(&icd->list, &devices);

	return 0;
1449 1450
}

1451
static void soc_camera_device_unregister(struct soc_camera_device *icd)
1452 1453 1454 1455
{
	list_del(&icd->list);
}

1456 1457 1458 1459 1460 1461 1462 1463 1464
static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
	.vidioc_querycap	 = soc_camera_querycap,
	.vidioc_g_fmt_vid_cap    = soc_camera_g_fmt_vid_cap,
	.vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap    = soc_camera_s_fmt_vid_cap,
	.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,
1465
	.vidioc_enum_framesizes  = soc_camera_enum_fsizes,
1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478
	.vidioc_reqbufs		 = soc_camera_reqbufs,
	.vidioc_try_fmt_vid_cap  = soc_camera_try_fmt_vid_cap,
	.vidioc_querybuf	 = soc_camera_querybuf,
	.vidioc_qbuf		 = soc_camera_qbuf,
	.vidioc_dqbuf		 = soc_camera_dqbuf,
	.vidioc_streamon	 = soc_camera_streamon,
	.vidioc_streamoff	 = soc_camera_streamoff,
	.vidioc_queryctrl	 = soc_camera_queryctrl,
	.vidioc_g_ctrl		 = soc_camera_g_ctrl,
	.vidioc_s_ctrl		 = soc_camera_s_ctrl,
	.vidioc_cropcap		 = soc_camera_cropcap,
	.vidioc_g_crop		 = soc_camera_g_crop,
	.vidioc_s_crop		 = soc_camera_s_crop,
1479 1480
	.vidioc_g_parm		 = soc_camera_g_parm,
	.vidioc_s_parm		 = soc_camera_s_parm,
1481 1482 1483 1484 1485 1486 1487
	.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
};

1488
static int video_dev_create(struct soc_camera_device *icd)
1489 1490
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1491
	struct video_device *vdev = video_device_alloc();
1492 1493

	if (!vdev)
1494
		return -ENOMEM;
1495 1496

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

1498
	vdev->parent		= &icd->dev;
1499 1500
	vdev->current_norm	= V4L2_STD_UNKNOWN;
	vdev->fops		= &soc_camera_fops;
1501
	vdev->ioctl_ops		= &soc_camera_ioctl_ops;
1502
	vdev->release		= video_device_release;
1503
	vdev->tvnorms		= V4L2_STD_UNKNOWN;
1504 1505 1506 1507

	icd->vdev = vdev;

	return 0;
1508
}
1509

1510
/*
1511
 * Called from soc_camera_probe() above (with .video_lock held???)
1512
 */
1513
static int soc_camera_video_start(struct soc_camera_device *icd)
1514
{
1515
	const struct device_type *type = icd->vdev->dev.type;
1516
	int ret;
1517 1518 1519 1520 1521 1522 1523 1524 1525

	if (!icd->dev.parent)
		return -ENODEV;

	if (!icd->ops ||
	    !icd->ops->query_bus_param ||
	    !icd->ops->set_bus_param)
		return -EINVAL;

1526
	ret = video_register_device(icd->vdev, VFL_TYPE_GRABBER, -1);
1527 1528 1529 1530
	if (ret < 0) {
		dev_err(&icd->dev, "video_register_device failed: %d\n", ret);
		return ret;
	}
1531

1532 1533 1534
	/* Restore device type, possibly set by the subdevice driver */
	icd->vdev->dev.type = type;

1535
	return 0;
1536 1537
}

1538
static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1539
{
1540 1541
	struct soc_camera_link *icl = pdev->dev.platform_data;
	struct soc_camera_device *icd;
1542
	int ret;
1543

1544 1545
	if (!icl)
		return -EINVAL;
1546

1547 1548 1549
	icd = kzalloc(sizeof(*icd), GFP_KERNEL);
	if (!icd)
		return -ENOMEM;
1550

1551
	icd->iface = icl->bus_id;
1552
	icd->pdev = &pdev->dev;
1553
	platform_set_drvdata(pdev, icd);
1554

1555 1556 1557
	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;
1558

1559 1560
	soc_camera_device_init(&icd->dev, icl);

1561 1562 1563
	icd->user_width		= DEFAULT_WIDTH;
	icd->user_height	= DEFAULT_HEIGHT;

1564
	return 0;
1565

1566 1567
escdevreg:
	kfree(icd);
1568

1569
	return ret;
1570
}
1571

1572 1573
/*
 * Only called on rmmod for each platform device, since they are not
1574
 * hot-pluggable. Now we know, that all our users - hosts and devices have
1575 1576
 * been unloaded already
 */
1577
static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
1578
{
1579
	struct soc_camera_device *icd = platform_get_drvdata(pdev);
1580

1581
	if (!icd)
1582 1583
		return -EINVAL;

1584
	soc_camera_device_unregister(icd);
1585

1586
	kfree(icd);
1587

1588 1589 1590 1591
	return 0;
}

static struct platform_driver __refdata soc_camera_pdrv = {
1592 1593 1594 1595
	.remove  = __devexit_p(soc_camera_pdrv_remove),
	.driver  = {
		.name	= "soc-camera-pdrv",
		.owner	= THIS_MODULE,
1596 1597 1598
	},
};

1599 1600 1601 1602 1603 1604 1605 1606 1607
static int __init soc_camera_init(void)
{
	int ret = bus_register(&soc_camera_bus_type);
	if (ret)
		return ret;
	ret = driver_register(&ic_drv);
	if (ret)
		goto edrvr;

1608
	ret = platform_driver_probe(&soc_camera_pdrv, soc_camera_pdrv_probe);
1609 1610 1611
	if (ret)
		goto epdr;

1612 1613
	return 0;

1614 1615
epdr:
	driver_unregister(&ic_drv);
1616 1617 1618 1619 1620 1621 1622
edrvr:
	bus_unregister(&soc_camera_bus_type);
	return ret;
}

static void __exit soc_camera_exit(void)
{
1623
	platform_driver_unregister(&soc_camera_pdrv);
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633
	driver_unregister(&ic_drv);
	bus_unregister(&soc_camera_bus_type);
}

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