soc_camera.c 33.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 28
#include <linux/vmalloc.h>

29
#include <media/soc_camera.h>
30
#include <media/v4l2-common.h>
31
#include <media/v4l2-ioctl.h>
32
#include <media/v4l2-dev.h>
33
#include <media/videobuf-core.h>
34

35 36 37 38
/* Default to VGA resolution */
#define DEFAULT_WIDTH	640
#define DEFAULT_HEIGHT	480

39 40
static LIST_HEAD(hosts);
static LIST_HEAD(devices);
41
static DEFINE_MUTEX(list_lock);		/* Protects the list of hosts */
42

43
const struct soc_camera_data_format *soc_camera_format_by_fourcc(
44
	struct soc_camera_device *icd, unsigned int fourcc)
45 46 47
{
	unsigned int i;

48 49 50
	for (i = 0; i < icd->num_formats; i++)
		if (icd->formats[i].fourcc == fourcc)
			return icd->formats + i;
51 52
	return NULL;
}
53
EXPORT_SYMBOL(soc_camera_format_by_fourcc);
54

55 56 57 58 59 60 61 62 63 64 65 66
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);

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 98 99 100
/**
 * 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);

101
static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv,
102
				      struct v4l2_format *f)
103 104 105
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
106
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
107 108 109

	WARN_ON(priv != file->private_data);

110
	/* limit format to hardware capabilities */
111
	return ici->ops->try_fmt(icd, f);
112 113 114 115 116
}

static int soc_camera_enum_input(struct file *file, void *priv,
				 struct v4l2_input *inp)
{
117 118 119 120
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int ret = 0;

121 122 123
	if (inp->index != 0)
		return -EINVAL;

124 125 126 127 128 129 130 131
	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");
	}
132

133
	return ret;
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
}

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)
{
153 154 155 156 157 158 159 160
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int ret = 0;

	if (icd->ops->set_std)
		ret = icd->ops->set_std(icd, a);

	return ret;
161 162 163 164 165 166 167 168
}

static int soc_camera_reqbufs(struct file *file, void *priv,
			      struct v4l2_requestbuffers *p)
{
	int ret;
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
169
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
170 171 172 173 174 175 176

	WARN_ON(priv != file->private_data);

	ret = videobuf_reqbufs(&icf->vb_vidq, p);
	if (ret < 0)
		return ret;

177
	return ici->ops->reqbufs(icf, p);
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
}

static int soc_camera_querybuf(struct file *file, void *priv,
			       struct v4l2_buffer *p)
{
	struct soc_camera_file *icf = file->private_data;

	WARN_ON(priv != file->private_data);

	return videobuf_querybuf(&icf->vb_vidq, p);
}

static int soc_camera_qbuf(struct file *file, void *priv,
			   struct v4l2_buffer *p)
{
	struct soc_camera_file *icf = file->private_data;

	WARN_ON(priv != file->private_data);

	return videobuf_qbuf(&icf->vb_vidq, p);
}

static int soc_camera_dqbuf(struct file *file, void *priv,
			    struct v4l2_buffer *p)
{
	struct soc_camera_file *icf = file->private_data;

	WARN_ON(priv != file->private_data);

	return videobuf_dqbuf(&icf->vb_vidq, p, file->f_flags & O_NONBLOCK);
}

210
/* Always entered with .video_lock held */
211 212 213
static int soc_camera_init_user_formats(struct soc_camera_device *icd)
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
214
	int i, fmts = 0, ret;
215 216 217 218 219 220 221 222 223 224 225 226

	if (!ici->ops->get_formats)
		/*
		 * Fallback mode - the host will have to serve all
		 * sensor-provided formats one-to-one to the user
		 */
		fmts = icd->num_formats;
	else
		/*
		 * First pass - only count formats this host-sensor
		 * configuration can provide
		 */
227 228 229 230 231 232
		for (i = 0; i < icd->num_formats; i++) {
			ret = ici->ops->get_formats(icd, i, NULL);
			if (ret < 0)
				return ret;
			fmts += ret;
		}
233 234 235 236 237 238 239 240 241 242 243 244 245 246

	if (!fmts)
		return -ENXIO;

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

	icd->num_user_formats = fmts;

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

	/* Second pass - actually fill data formats */
247
	fmts = 0;
248 249 250 251 252 253
	for (i = 0; i < icd->num_formats; i++)
		if (!ici->ops->get_formats) {
			icd->user_formats[i].host_fmt = icd->formats + i;
			icd->user_formats[i].cam_fmt = icd->formats + i;
			icd->user_formats[i].buswidth = icd->formats[i].depth;
		} else {
254 255 256 257 258
			ret = ici->ops->get_formats(icd, i,
						    &icd->user_formats[fmts]);
			if (ret < 0)
				goto egfmt;
			fmts += ret;
259 260 261 262 263
		}

	icd->current_fmt = icd->user_formats[0].host_fmt;

	return 0;
264 265 266 267 268

egfmt:
	icd->num_user_formats = 0;
	vfree(icd->user_formats);
	return ret;
269 270
}

271
/* Always entered with .video_lock held */
272 273
static void soc_camera_free_user_formats(struct soc_camera_device *icd)
{
274 275 276 277
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);

	if (ici->ops->put_formats)
		ici->ops->put_formats(icd);
278
	icd->current_fmt = NULL;
279
	icd->num_user_formats = 0;
280
	vfree(icd->user_formats);
281
	icd->user_formats = NULL;
282 283
}

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
/* Called with .vb_lock held */
static int soc_camera_set_fmt(struct soc_camera_file *icf,
			      struct v4l2_format *f)
{
	struct soc_camera_device *icd = icf->icd;
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct v4l2_pix_format *pix = &f->fmt.pix;
	int ret;

	/* We always call try_fmt() before set_fmt() or set_crop() */
	ret = ici->ops->try_fmt(icd, f);
	if (ret < 0)
		return ret;

	ret = ici->ops->set_fmt(icd, f);
	if (ret < 0) {
		return ret;
	} else if (!icd->current_fmt ||
		   icd->current_fmt->fourcc != pix->pixelformat) {
303
		dev_err(ici->v4l2_dev.dev,
304 305 306 307
			"Host driver hasn't set up current format correctly!\n");
		return -EINVAL;
	}

308 309 310 311
	icd->rect_current.width		= pix->width;
	icd->rect_current.height	= pix->height;
	icf->vb_vidq.field		=
		icd->field		= pix->field;
312

313 314 315 316 317
	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		dev_warn(&icd->dev, "Attention! Wrong buf-type %d\n",
			 f->type);

	dev_dbg(&icd->dev, "set width: %d height: %d\n",
318
		icd->rect_current.width, icd->rect_current.height);
319 320 321 322 323

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

324
static int soc_camera_open(struct file *file)
325
{
326 327 328
	struct video_device *vdev = video_devdata(file);
	struct soc_camera_device *icd = container_of(vdev->parent, struct soc_camera_device, dev);
	struct soc_camera_link *icl = to_soc_camera_link(icd);
329
	struct soc_camera_host *ici;
330 331 332
	struct soc_camera_file *icf;
	int ret;

333 334 335 336
	if (!icd->ops)
		/* No device driver attached */
		return -ENODEV;

337
	ici = to_soc_camera_host(icd->dev.parent);
338

339 340 341 342
	icf = vmalloc(sizeof(*icf));
	if (!icf)
		return -ENOMEM;

343
	if (!try_module_get(ici->ops->owner)) {
344 345 346 347 348
		dev_err(&icd->dev, "Couldn't lock capture bus driver.\n");
		ret = -EINVAL;
		goto emgi;
	}

349
	/* Protect against icd->ops->remove() until we module_get() both drivers. */
350 351
	mutex_lock(&icd->video_lock);

352
	icf->icd = icd;
353 354
	icd->use_count++;

355 356
	/* Now we really have to activate the camera */
	if (icd->use_count == 1) {
357
		/* Restore parameters before the last close() per V4L2 API */
358 359 360
		struct v4l2_format f = {
			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
			.fmt.pix = {
361 362
				.width		= icd->rect_current.width,
				.height		= icd->rect_current.height,
363
				.field		= icd->field,
364 365
				.pixelformat	= icd->current_fmt->fourcc,
				.colorspace	= icd->current_fmt->colorspace,
366 367 368
			},
		};

369 370 371 372 373 374 375 376 377 378
		if (icl->power) {
			ret = icl->power(icd->pdev, 1);
			if (ret < 0)
				goto epower;
		}

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

379
		ret = ici->ops->add(icd);
380 381 382 383
		if (ret < 0) {
			dev_err(&icd->dev, "Couldn't activate the camera: %d\n", ret);
			goto eiciadd;
		}
384

385 386 387 388 389 390
		if (icd->ops->init) {
			ret = icd->ops->init(icd);
			if (ret < 0)
				goto einit;
		}

391 392 393 394
		/* Try to configure with default parameters */
		ret = soc_camera_set_fmt(icf, &f);
		if (ret < 0)
			goto esfmt;
395 396
	}

397 398 399
	file->private_data = icf;
	dev_dbg(&icd->dev, "camera device open\n");

400
	ici->ops->init_videobuf(&icf->vb_vidq, icd);
401

402 403
	mutex_unlock(&icd->video_lock);

404 405
	return 0;

406
	/*
407
	 * First five errors are entered with the .video_lock held
408 409 410
	 * and use_count == 1
	 */
esfmt:
411 412 413
	if (icd->ops->release)
		icd->ops->release(icd);
einit:
414
	ici->ops->remove(icd);
415
eiciadd:
416 417 418
	if (icl->power)
		icl->power(icd->pdev, 0);
epower:
419
	icd->use_count--;
420
	mutex_unlock(&icd->video_lock);
421
	module_put(ici->ops->owner);
422 423 424 425 426
emgi:
	vfree(icf);
	return ret;
}

427
static int soc_camera_close(struct file *file)
428 429 430 431 432 433
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	struct video_device *vdev = icd->vdev;

434
	mutex_lock(&icd->video_lock);
435
	icd->use_count--;
436
	if (!icd->use_count) {
437 438 439 440
		struct soc_camera_link *icl = to_soc_camera_link(icd);

		if (icd->ops->release)
			icd->ops->release(icd);
441
		ici->ops->remove(icd);
442 443
		if (icl->power)
			icl->power(icd->pdev, 0);
444
	}
445

446 447
	mutex_unlock(&icd->video_lock);

448
	module_put(ici->ops->owner);
449

450
	vfree(icf);
451

452
	dev_dbg(vdev->parent, "camera device close\n");
453 454 455 456

	return 0;
}

457
static ssize_t soc_camera_read(struct file *file, char __user *buf,
458
			       size_t count, loff_t *ppos)
459 460 461 462 463 464
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	struct video_device *vdev = icd->vdev;
	int err = -EINVAL;

465
	dev_err(vdev->parent, "camera device read not implemented\n");
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491

	return err;
}

static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int err;

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

	err = videobuf_mmap_mapper(&icf->vb_vidq, vma);

	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)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
492
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
493 494 495 496 497 498

	if (list_empty(&icf->vb_vidq.stream)) {
		dev_err(&icd->dev, "Trying to poll with no queued buffers!\n");
		return POLLERR;
	}

499
	return ici->ops->poll(file, pt);
500 501
}

502
static struct v4l2_file_operations soc_camera_fops = {
503 504 505 506 507 508 509 510 511
	.owner		= THIS_MODULE,
	.open		= soc_camera_open,
	.release	= soc_camera_close,
	.ioctl		= video_ioctl2,
	.read		= soc_camera_read,
	.mmap		= soc_camera_mmap,
	.poll		= soc_camera_poll,
};

512
static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
513
				    struct v4l2_format *f)
514 515 516 517 518 519 520
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int ret;

	WARN_ON(priv != file->private_data);

521 522 523 524 525 526 527 528
	mutex_lock(&icf->vb_vidq.vb_lock);

	if (videobuf_queue_is_busy(&icf->vb_vidq)) {
		dev_err(&icd->dev, "S_FMT denied: queue busy\n");
		ret = -EBUSY;
		goto unlock;
	}

529
	ret = soc_camera_set_fmt(icf, f);
530 531 532 533 534

unlock:
	mutex_unlock(&icf->vb_vidq.vb_lock);

	return ret;
535 536
}

537
static int soc_camera_enum_fmt_vid_cap(struct file *file, void  *priv,
538
				       struct v4l2_fmtdesc *f)
539 540 541 542 543 544 545
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	const struct soc_camera_data_format *format;

	WARN_ON(priv != file->private_data);

546
	if (f->index >= icd->num_user_formats)
547 548
		return -EINVAL;

549
	format = icd->user_formats[f->index].host_fmt;
550 551 552 553 554 555

	strlcpy(f->description, format->name, sizeof(f->description));
	f->pixelformat = format->fourcc;
	return 0;
}

556
static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
557
				    struct v4l2_format *f)
558 559 560
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
561
	struct v4l2_pix_format *pix = &f->fmt.pix;
562 563 564

	WARN_ON(priv != file->private_data);

565 566
	pix->width		= icd->rect_current.width;
	pix->height		= icd->rect_current.height;
567 568 569
	pix->field		= icf->vb_vidq.field;
	pix->pixelformat	= icd->current_fmt->fourcc;
	pix->bytesperline	= pix->width *
570
		DIV_ROUND_UP(icd->current_fmt->depth, 8);
571
	pix->sizeimage		= pix->height * pix->bytesperline;
572 573 574 575 576 577 578 579 580 581
	dev_dbg(&icd->dev, "current_fmt->fourcc: 0x%08x\n",
		icd->current_fmt->fourcc);
	return 0;
}

static int soc_camera_querycap(struct file *file, void  *priv,
			       struct v4l2_capability *cap)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
582
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
583 584 585 586

	WARN_ON(priv != file->private_data);

	strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
587
	return ici->ops->querycap(ici, cap);
588 589 590 591 592 593 594
}

static int soc_camera_streamon(struct file *file, void *priv,
			       enum v4l2_buf_type i)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
595
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
596
	int ret;
597 598 599 600 601 602

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

603 604
	mutex_lock(&icd->video_lock);

605
	v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, video, s_stream, 1);
606 607

	/* This calls buf_queue from host driver's videobuf_queue_ops */
608 609 610 611 612
	ret = videobuf_streamon(&icf->vb_vidq);

	mutex_unlock(&icd->video_lock);

	return ret;
613 614 615 616 617 618 619
}

static int soc_camera_streamoff(struct file *file, void *priv,
				enum v4l2_buf_type i)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
620
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
621 622 623 624 625 626

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

627 628
	mutex_lock(&icd->video_lock);

629 630 631 632
	/* This calls buf_release from host driver's videobuf_queue_ops for all
	 * remaining buffers. When the last buffer is freed, stop capture */
	videobuf_streamoff(&icf->vb_vidq);

633
	v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, video, s_stream, 0);
634

635 636
	mutex_unlock(&icd->video_lock);

637 638 639 640 641 642 643 644
	return 0;
}

static int soc_camera_queryctrl(struct file *file, void *priv,
				struct v4l2_queryctrl *qc)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
645
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
646 647 648 649 650 651 652
	int i;

	WARN_ON(priv != file->private_data);

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

653 654 655 656 657 658 659 660 661
	/* 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 */
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
	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)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
677
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
678
	int ret;
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694

	WARN_ON(priv != file->private_data);

	switch (ctrl->id) {
	case V4L2_CID_GAIN:
		if (icd->gain == (unsigned short)~0)
			return -EINVAL;
		ctrl->value = icd->gain;
		return 0;
	case V4L2_CID_EXPOSURE:
		if (icd->exposure == (unsigned short)~0)
			return -EINVAL;
		ctrl->value = icd->exposure;
		return 0;
	}

695 696 697 698 699 700
	if (ici->ops->get_ctrl) {
		ret = ici->ops->get_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

701
	return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, g_ctrl, ctrl);
702 703 704 705 706 707 708
}

static int soc_camera_s_ctrl(struct file *file, void *priv,
			     struct v4l2_control *ctrl)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
709
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
710
	int ret;
711 712 713

	WARN_ON(priv != file->private_data);

714 715 716 717 718 719
	if (ici->ops->set_ctrl) {
		ret = ici->ops->set_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

720
	return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, s_ctrl, ctrl);
721 722 723 724 725 726 727 728 729
}

static int soc_camera_cropcap(struct file *file, void *fh,
			      struct v4l2_cropcap *a)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;

	a->type				= V4L2_BUF_TYPE_VIDEO_CAPTURE;
730 731 732
	a->bounds			= icd->rect_max;
	a->defrect.left			= icd->rect_max.left;
	a->defrect.top			= icd->rect_max.top;
733 734
	a->defrect.width		= DEFAULT_WIDTH;
	a->defrect.height		= DEFAULT_HEIGHT;
735 736 737 738 739 740 741 742 743 744 745 746
	a->pixelaspect.numerator	= 1;
	a->pixelaspect.denominator	= 1;

	return 0;
}

static int soc_camera_g_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;

747 748
	a->type	= V4L2_BUF_TYPE_VIDEO_CAPTURE;
	a->c	= icd->rect_current;
749 750 751 752 753 754 755 756 757

	return 0;
}

static int soc_camera_s_crop(struct file *file, void *fh,
			     struct v4l2_crop *a)
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
758
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
759 760 761 762 763
	int ret;

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

764 765 766
	/* Cropping is allowed during a running capture, guard consistency */
	mutex_lock(&icf->vb_vidq.vb_lock);

767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
	if (a->c.width > icd->rect_max.width)
		a->c.width = icd->rect_max.width;

	if (a->c.width < icd->width_min)
		a->c.width = icd->width_min;

	if (a->c.height > icd->rect_max.height)
		a->c.height = icd->rect_max.height;

	if (a->c.height < icd->height_min)
		a->c.height = icd->height_min;

	if (a->c.width + a->c.left > icd->rect_max.width + icd->rect_max.left)
		a->c.left = icd->rect_max.width + icd->rect_max.left -
			a->c.width;

	if (a->c.height + a->c.top > icd->rect_max.height + icd->rect_max.top)
		a->c.top = icd->rect_max.height + icd->rect_max.top -
			a->c.height;

787
	ret = ici->ops->set_crop(icd, &a->c);
788 789
	if (!ret)
		icd->rect_current = a->c;
790

791 792
	mutex_unlock(&icf->vb_vidq.vb_lock);

793 794 795 796
	return ret;
}

static int soc_camera_g_chip_ident(struct file *file, void *fh,
797
				   struct v4l2_dbg_chip_ident *id)
798 799 800
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
801
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
802

803
	return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, g_chip_ident, id);
804 805 806 807
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
static int soc_camera_g_register(struct file *file, void *fh,
808
				 struct v4l2_dbg_register *reg)
809 810 811
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
812
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
813

814
	return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, g_register, reg);
815 816 817
}

static int soc_camera_s_register(struct file *file, void *fh,
818
				 struct v4l2_dbg_register *reg)
819 820 821
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
822
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
823

824
	return v4l2_device_call_until_err(&ici->v4l2_dev, (__u32)icd, core, s_register, reg);
825 826 827 828 829 830 831 832 833 834 835 836
}
#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) {
837
			int ret;
838
			icd->dev.parent = ici->v4l2_dev.dev;
839 840 841 842 843 844 845 846
			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);
			}
847 848 849 850 851 852
		}
	}

	mutex_unlock(&list_lock);
}

853 854 855
#ifdef CONFIG_I2C_BOARDINFO
static int soc_camera_init_i2c(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
856
{
857
	struct i2c_client *client;
858
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
859
	struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
860
	struct v4l2_subdev *subdev;
861
	int ret;
862

863 864 865 866 867 868
	if (!adap) {
		ret = -ENODEV;
		dev_err(&icd->dev, "Cannot get I2C adapter #%d. No driver?\n",
			icl->i2c_adapter_id);
		goto ei2cga;
	}
869

870
	icl->board_info->platform_data = icd;
871

872 873 874
	subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
				icl->module_name, icl->board_info, NULL);
	if (!subdev) {
875 876
		ret = -ENOMEM;
		goto ei2cnd;
877 878
	}

879 880 881
	subdev->grp_id = (__u32)icd;
	client = subdev->priv;

882 883
	/* Use to_i2c_client(dev) to recover the i2c client */
	dev_set_drvdata(&icd->dev, &client->dev);
884

885 886 887 888
	return 0;
ei2cnd:
	i2c_put_adapter(adap);
ei2cga:
889 890 891
	return ret;
}

892 893 894 895 896
static void soc_camera_free_i2c(struct soc_camera_device *icd)
{
	struct i2c_client *client =
		to_i2c_client(to_soc_camera_control(icd));
	dev_set_drvdata(&icd->dev, NULL);
897
	v4l2_device_unregister_subdev(i2c_get_clientdata(client));
898 899 900 901 902 903 904 905
	i2c_unregister_device(client);
	i2c_put_adapter(client->adapter);
}
#else
#define soc_camera_init_i2c(icd, icl)	(-ENODEV)
#define soc_camera_free_i2c(icd)	do {} while (0)
#endif

906
static int soc_camera_video_start(struct soc_camera_device *icd);
907 908
static int video_dev_create(struct soc_camera_device *icd);
/* Called during host-driver probe */
909 910 911
static int soc_camera_probe(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
912
	struct soc_camera_host *ici = to_soc_camera_host(dev->parent);
913
	struct soc_camera_link *icl = to_soc_camera_link(icd);
914
	struct device *control = NULL;
915 916
	int ret;

917
	dev_info(dev, "Probing %s\n", dev_name(dev));
918

919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
	if (icl->power) {
		ret = icl->power(icd->pdev, 1);
		if (ret < 0) {
			dev_err(dev,
				"Platform failed to power-on the camera.\n");
			goto epower;
		}
	}

	/* 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 */
937 938 939
	ret = video_dev_create(icd);
	if (ret < 0)
		goto evdc;
940

941 942 943 944 945 946
	/* 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) {
947
		ret = -EINVAL;
948 949
		goto eadddev;
	} else {
950 951 952
		if (icl->module_name)
			ret = request_module(icl->module_name);

953 954 955
		ret = icl->add_device(icl, &icd->dev);
		if (ret < 0)
			goto eadddev;
956

957 958 959 960 961 962 963
		/* FIXME: this is racy, have to use driver-binding notification */
		control = to_soc_camera_control(icd);
		if (!control || !control->driver ||
		    !try_module_get(control->driver->owner)) {
			icl->del_device(icl);
			goto enodrv;
		}
964
	}
965

966 967 968 969 970 971 972 973
	/* At this point client .probe() should have run already */
	ret = soc_camera_init_user_formats(icd);
	if (ret < 0)
		goto eiufmt;

	icd->rect_current = icd->rect_max;
	icd->field = V4L2_FIELD_ANY;

974 975 976 977 978 979 980
	/* ..._video_start() will create a device node, so we have to protect */
	mutex_lock(&icd->video_lock);

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

981 982 983 984 985
	/* Do we have to sysfs_remove_link() before device_unregister()? */
	if (to_soc_camera_control(icd) &&
	    sysfs_create_link(&icd->dev.kobj, &to_soc_camera_control(icd)->kobj,
			      "control"))
		dev_warn(&icd->dev, "Failed creating the control symlink\n");
986

987 988 989 990 991 992
	ici->ops->remove(icd);

	if (icl->power)
		icl->power(icd->pdev, 0);

	mutex_unlock(&icd->video_lock);
993

994
	return 0;
995

996 997
evidstart:
	mutex_unlock(&icd->video_lock);
998 999
	soc_camera_free_user_formats(icd);
eiufmt:
1000
	if (icl->board_info) {
1001
		soc_camera_free_i2c(icd);
1002
	} else {
1003
		icl->del_device(icl);
1004 1005 1006
		module_put(control->driver->owner);
	}
enodrv:
1007 1008 1009
eadddev:
	video_device_release(icd->vdev);
evdc:
1010 1011 1012 1013 1014
	ici->ops->remove(icd);
eadd:
	if (icl->power)
		icl->power(icd->pdev, 0);
epower:
1015 1016 1017 1018 1019 1020 1021 1022
	return ret;
}

/* This is called on device_unregister, which only means we have to disconnect
 * from the host, but not remove ourselves from the device list */
static int soc_camera_remove(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
1023 1024
	struct soc_camera_link *icl = to_soc_camera_link(icd);
	struct video_device *vdev = icd->vdev;
1025

1026
	BUG_ON(!dev->parent);
1027

1028 1029 1030 1031 1032 1033 1034
	if (vdev) {
		mutex_lock(&icd->video_lock);
		video_unregister_device(vdev);
		icd->vdev = NULL;
		mutex_unlock(&icd->video_lock);
	}

1035
	if (icl->board_info) {
1036
		soc_camera_free_i2c(icd);
1037 1038 1039 1040 1041 1042 1043 1044
	} 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);
		}
	}
1045
	soc_camera_free_user_formats(icd);
1046

1047 1048 1049
	return 0;
}

1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
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;
}

1074 1075 1076 1077
static struct bus_type soc_camera_bus_type = {
	.name		= "soc-camera",
	.probe		= soc_camera_probe,
	.remove		= soc_camera_remove,
1078 1079
	.suspend	= soc_camera_suspend,
	.resume		= soc_camera_resume,
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091
};

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

static void dummy_release(struct device *dev)
{
}

1092
int soc_camera_host_register(struct soc_camera_host *ici)
1093 1094
{
	struct soc_camera_host *ix;
1095
	int ret;
1096

1097 1098 1099
	if (!ici || !ici->ops ||
	    !ici->ops->try_fmt ||
	    !ici->ops->set_fmt ||
1100
	    !ici->ops->set_crop ||
1101 1102 1103 1104 1105 1106
	    !ici->ops->set_bus_param ||
	    !ici->ops->querycap ||
	    !ici->ops->init_videobuf ||
	    !ici->ops->reqbufs ||
	    !ici->ops->add ||
	    !ici->ops->remove ||
1107
	    !ici->ops->poll ||
1108
	    !ici->v4l2_dev.dev)
1109 1110 1111 1112 1113
		return -EINVAL;

	mutex_lock(&list_lock);
	list_for_each_entry(ix, &hosts, list) {
		if (ix->nr == ici->nr) {
1114 1115
			ret = -EBUSY;
			goto edevreg;
1116 1117 1118
		}
	}

1119 1120 1121
	ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
	if (ret < 0)
		goto edevreg;
1122

1123 1124 1125 1126 1127 1128
	list_add_tail(&ici->list, &hosts);
	mutex_unlock(&list_lock);

	scan_add_host(ici);

	return 0;
1129 1130 1131 1132

edevreg:
	mutex_unlock(&list_lock);
	return ret;
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
}
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) {
1146
		if (icd->iface == ici->nr) {
1147
			/* The bus->remove will be called */
1148 1149
			device_unregister(&icd->dev);
			/* Not before device_unregister(), .remove
1150
			 * needs parent to call ici->ops->remove() */
1151
			icd->dev.parent = NULL;
1152 1153 1154

			/* If the host module is loaded again, device_register()
			 * would complain "already initialised" */
1155 1156 1157 1158 1159 1160
			memset(&icd->dev.kobj, 0, sizeof(icd->dev.kobj));
		}
	}

	mutex_unlock(&list_lock);

1161
	v4l2_device_unregister(&ici->v4l2_dev);
1162 1163 1164 1165
}
EXPORT_SYMBOL(soc_camera_host_unregister);

/* Image capture device */
1166
static int soc_camera_device_register(struct soc_camera_device *icd)
1167 1168 1169 1170 1171 1172
{
	struct soc_camera_device *ix;
	int num = -1, i;

	for (i = 0; i < 256 && num < 0; i++) {
		num = i;
1173
		/* Check if this index is available on this interface */
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
		list_for_each_entry(ix, &devices, list) {
			if (ix->iface == icd->iface && ix->devnum == i) {
				num = -1;
				break;
			}
		}
	}

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

	icd->devnum = num;
	icd->dev.bus = &soc_camera_bus_type;

1190 1191 1192
	icd->dev.release	= dummy_release;
	icd->use_count		= 0;
	icd->host_priv		= NULL;
1193
	mutex_init(&icd->video_lock);
1194

1195 1196 1197
	list_add_tail(&icd->list, &devices);

	return 0;
1198 1199
}

1200
static void soc_camera_device_unregister(struct soc_camera_device *icd)
1201 1202 1203 1204
{
	list_del(&icd->list);
}

1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
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,
	.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,
	.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
};

1234
static int video_dev_create(struct soc_camera_device *icd)
1235 1236
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1237
	struct video_device *vdev = video_device_alloc();
1238 1239

	if (!vdev)
1240
		return -ENOMEM;
1241 1242

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

1244
	vdev->parent		= &icd->dev;
1245 1246
	vdev->current_norm	= V4L2_STD_UNKNOWN;
	vdev->fops		= &soc_camera_fops;
1247
	vdev->ioctl_ops		= &soc_camera_ioctl_ops;
1248 1249
	vdev->release		= video_device_release;
	vdev->minor		= -1;
1250
	vdev->tvnorms		= V4L2_STD_UNKNOWN;
1251 1252 1253 1254

	icd->vdev = vdev;

	return 0;
1255
}
1256

1257
/*
1258
 * Called from soc_camera_probe() above (with .video_lock held???)
1259
 */
1260
static int soc_camera_video_start(struct soc_camera_device *icd)
1261 1262
{
	const struct v4l2_queryctrl *qctrl;
1263
	int ret;
1264 1265 1266 1267 1268 1269 1270 1271 1272

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

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

1273 1274 1275 1276 1277 1278
	ret = video_register_device(icd->vdev, VFL_TYPE_GRABBER,
				    icd->vdev->minor);
	if (ret < 0) {
		dev_err(&icd->dev, "video_register_device failed: %d\n", ret);
		return ret;
	}
1279 1280 1281 1282 1283 1284

	qctrl = soc_camera_find_qctrl(icd->ops, V4L2_CID_GAIN);
	icd->gain = qctrl ? qctrl->default_value : (unsigned short)~0;
	qctrl = soc_camera_find_qctrl(icd->ops, V4L2_CID_EXPOSURE);
	icd->exposure = qctrl ? qctrl->default_value : (unsigned short)~0;

1285
	return 0;
1286 1287
}

1288
static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1289
{
1290 1291
	struct soc_camera_link *icl = pdev->dev.platform_data;
	struct soc_camera_device *icd;
1292
	int ret;
1293

1294 1295
	if (!icl)
		return -EINVAL;
1296

1297 1298 1299
	icd = kzalloc(sizeof(*icd), GFP_KERNEL);
	if (!icd)
		return -ENOMEM;
1300

1301
	icd->iface = icl->bus_id;
1302
	icd->pdev = &pdev->dev;
1303 1304
	platform_set_drvdata(pdev, icd);
	icd->dev.platform_data = icl;
1305

1306 1307 1308
	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;
1309

1310
	return 0;
1311

1312 1313
escdevreg:
	kfree(icd);
1314

1315
	return ret;
1316
}
1317

1318 1319 1320 1321
/* Only called on rmmod for each platform device, since they are not
 * hot-pluggable. Now we know, that all our users - hosts and devices have
 * been unloaded already */
static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
1322
{
1323
	struct soc_camera_device *icd = platform_get_drvdata(pdev);
1324

1325
	if (!icd)
1326 1327
		return -EINVAL;

1328
	soc_camera_device_unregister(icd);
1329

1330
	kfree(icd);
1331

1332 1333 1334 1335
	return 0;
}

static struct platform_driver __refdata soc_camera_pdrv = {
1336 1337 1338 1339
	.remove  = __devexit_p(soc_camera_pdrv_remove),
	.driver  = {
		.name	= "soc-camera-pdrv",
		.owner	= THIS_MODULE,
1340 1341 1342
	},
};

1343 1344 1345 1346 1347 1348 1349 1350 1351
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;

1352
	ret = platform_driver_probe(&soc_camera_pdrv, soc_camera_pdrv_probe);
1353 1354 1355
	if (ret)
		goto epdr;

1356 1357
	return 0;

1358 1359
epdr:
	driver_unregister(&ic_drv);
1360 1361 1362 1363 1364 1365 1366
edrvr:
	bus_unregister(&soc_camera_bus_type);
	return ret;
}

static void __exit soc_camera_exit(void)
{
1367
	platform_driver_unregister(&soc_camera_pdrv);
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377
	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");
1378
MODULE_ALIAS("platform:soc-camera-pdrv");