soc_camera.c 34.7 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
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
155
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
156

157
	return v4l2_subdev_call(sd, core, s_std, *a);
158 159 160 161 162 163 164 165
}

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;
166
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
167 168 169 170 171 172 173

	WARN_ON(priv != file->private_data);

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

174
	return ici->ops->reqbufs(icf, p);
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 200 201 202 203 204 205 206
}

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);
}

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

	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
		 */
224 225 226 227 228 229
		for (i = 0; i < icd->num_formats; i++) {
			ret = ici->ops->get_formats(icd, i, NULL);
			if (ret < 0)
				return ret;
			fmts += ret;
		}
230 231 232 233 234 235 236 237 238 239 240 241 242 243

	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 */
244
	fmts = 0;
245 246 247 248 249 250
	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 {
251 252 253 254 255
			ret = ici->ops->get_formats(icd, i,
						    &icd->user_formats[fmts]);
			if (ret < 0)
				goto egfmt;
			fmts += ret;
256 257 258 259 260
		}

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

	return 0;
261 262 263 264 265

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

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

	if (ici->ops->put_formats)
		ici->ops->put_formats(icd);
275
	icd->current_fmt = NULL;
276
	icd->num_user_formats = 0;
277
	vfree(icd->user_formats);
278
	icd->user_formats = NULL;
279 280
}

281 282 283
#define pixfmtstr(x) (x) & 0xff, ((x) >> 8) & 0xff, ((x) >> 16) & 0xff, \
	((x) >> 24) & 0xff

284 285 286 287 288 289 290 291 292
/* 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;

293 294 295
	dev_dbg(&icd->dev, "S_FMT(%c%c%c%c, %ux%u)\n",
		pixfmtstr(pix->pixelformat), pix->width, pix->height);

296 297 298 299 300 301 302 303 304 305
	/* 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) {
306
		dev_err(&icd->dev,
307 308 309 310
			"Host driver hasn't set up current format correctly!\n");
		return -EINVAL;
	}

311 312 313 314
	icd->user_width		= pix->width;
	icd->user_height	= pix->height;
	icf->vb_vidq.field	=
		icd->field	= pix->field;
315

316 317 318 319 320
	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",
321
		icd->user_width, icd->user_height);
322 323 324 325 326

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

327
static int soc_camera_open(struct file *file)
328
{
329 330 331
	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);
332
	struct soc_camera_host *ici;
333 334 335
	struct soc_camera_file *icf;
	int ret;

336 337 338 339
	if (!icd->ops)
		/* No device driver attached */
		return -ENODEV;

340
	ici = to_soc_camera_host(icd->dev.parent);
341

342 343 344 345
	icf = vmalloc(sizeof(*icf));
	if (!icf)
		return -ENOMEM;

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

352
	/* Protect against icd->ops->remove() until we module_get() both drivers. */
353 354
	mutex_lock(&icd->video_lock);

355
	icf->icd = icd;
356 357
	icd->use_count++;

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

372 373 374 375 376 377 378 379 380 381
		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);

382
		ret = ici->ops->add(icd);
383 384 385 386
		if (ret < 0) {
			dev_err(&icd->dev, "Couldn't activate the camera: %d\n", ret);
			goto eiciadd;
		}
387 388 389 390 391

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

394 395 396
	file->private_data = icf;
	dev_dbg(&icd->dev, "camera device open\n");

397
	ici->ops->init_videobuf(&icf->vb_vidq, icd);
398

399 400
	mutex_unlock(&icd->video_lock);

401 402
	return 0;

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

421
static int soc_camera_close(struct file *file)
422 423 424 425 426
{
	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);

427
	mutex_lock(&icd->video_lock);
428
	icd->use_count--;
429
	if (!icd->use_count) {
430 431
		struct soc_camera_link *icl = to_soc_camera_link(icd);

432
		ici->ops->remove(icd);
433 434
		if (icl->power)
			icl->power(icd->pdev, 0);
435
	}
436

437 438
	mutex_unlock(&icd->video_lock);

439
	module_put(ici->ops->owner);
440

441
	vfree(icf);
442

443
	dev_dbg(&icd->dev, "camera device close\n");
444 445 446 447

	return 0;
}

448
static ssize_t soc_camera_read(struct file *file, char __user *buf,
449
			       size_t count, loff_t *ppos)
450 451 452 453 454
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int err = -EINVAL;

455
	dev_err(&icd->dev, "camera device read not implemented\n");
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481

	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;
482
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
483 484 485 486 487 488

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

489
	return ici->ops->poll(file, pt);
490 491
}

492
static struct v4l2_file_operations soc_camera_fops = {
493 494 495 496 497 498 499 500 501
	.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,
};

502
static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
503
				    struct v4l2_format *f)
504 505 506 507 508 509 510
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
	int ret;

	WARN_ON(priv != file->private_data);

511 512
	mutex_lock(&icf->vb_vidq.vb_lock);

513 514
	if (icf->vb_vidq.bufs[0]) {
		dev_err(&icd->dev, "S_FMT denied: queue initialised\n");
515 516 517 518
		ret = -EBUSY;
		goto unlock;
	}

519
	ret = soc_camera_set_fmt(icf, f);
520 521 522 523 524

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

	return ret;
525 526
}

527
static int soc_camera_enum_fmt_vid_cap(struct file *file, void  *priv,
528
				       struct v4l2_fmtdesc *f)
529 530 531 532 533 534 535
{
	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);

536
	if (f->index >= icd->num_user_formats)
537 538
		return -EINVAL;

539
	format = icd->user_formats[f->index].host_fmt;
540 541 542 543 544 545

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

546
static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
547
				    struct v4l2_format *f)
548 549 550
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
551
	struct v4l2_pix_format *pix = &f->fmt.pix;
552 553 554

	WARN_ON(priv != file->private_data);

555 556
	pix->width		= icd->user_width;
	pix->height		= icd->user_height;
557 558 559
	pix->field		= icf->vb_vidq.field;
	pix->pixelformat	= icd->current_fmt->fourcc;
	pix->bytesperline	= pix->width *
560
		DIV_ROUND_UP(icd->current_fmt->depth, 8);
561
	pix->sizeimage		= pix->height * pix->bytesperline;
562 563 564 565 566 567 568 569 570 571
	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;
572
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
573 574 575 576

	WARN_ON(priv != file->private_data);

	strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
577
	return ici->ops->querycap(ici, cap);
578 579 580 581 582 583 584
}

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;
585
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
586
	int ret;
587 588 589 590 591 592

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

593 594
	mutex_lock(&icd->video_lock);

595
	v4l2_subdev_call(sd, video, s_stream, 1);
596 597

	/* This calls buf_queue from host driver's videobuf_queue_ops */
598 599 600 601 602
	ret = videobuf_streamon(&icf->vb_vidq);

	mutex_unlock(&icd->video_lock);

	return ret;
603 604 605 606 607 608 609
}

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;
610
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
611 612 613 614 615 616

	WARN_ON(priv != file->private_data);

	if (i != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

617 618
	mutex_lock(&icd->video_lock);

619 620 621 622
	/* 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);

623
	v4l2_subdev_call(sd, video, s_stream, 0);
624

625 626
	mutex_unlock(&icd->video_lock);

627 628 629 630 631 632 633 634
	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;
635
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
636 637 638 639 640 641 642
	int i;

	WARN_ON(priv != file->private_data);

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

643 644 645 646 647 648 649 650 651
	/* 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 */
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
	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;
667
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
668
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
669
	int ret;
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685

	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;
	}

686 687 688 689 690 691
	if (ici->ops->get_ctrl) {
		ret = ici->ops->get_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

692
	return v4l2_subdev_call(sd, core, g_ctrl, ctrl);
693 694 695 696 697 698 699
}

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;
700
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
701
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
702
	int ret;
703 704 705

	WARN_ON(priv != file->private_data);

706 707 708 709 710 711
	if (ici->ops->set_ctrl) {
		ret = ici->ops->set_ctrl(icd, ctrl);
		if (ret != -ENOIOCTLCMD)
			return ret;
	}

712
	return v4l2_subdev_call(sd, core, s_ctrl, ctrl);
713 714 715 716 717 718 719
}

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;
720
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
721

722
	return ici->ops->cropcap(icd, a);
723 724 725 726 727 728 729
}

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;
730 731
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
	int ret;
732

733 734 735
	mutex_lock(&icf->vb_vidq.vb_lock);
	ret = ici->ops->get_crop(icd, a);
	mutex_unlock(&icf->vb_vidq.vb_lock);
736

737
	return ret;
738 739
}

740 741 742 743 744 745
/*
 * 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
 * retrieve it. However, we expect camera host and client drivers to update
 * the argument, which we then use internally, but do not return to the user.
 */
746 747 748 749 750
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;
751
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
752 753
	struct v4l2_rect *rect = &a->c;
	struct v4l2_crop current_crop;
754 755 756 757 758
	int ret;

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

759 760 761
	dev_dbg(&icd->dev, "S_CROP(%ux%u@%u:%u)\n",
		rect->width, rect->height, rect->left, rect->top);

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

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

768
	/* Prohibit window size change with initialised buffers */
769 770 771
	if (icf->vb_vidq.bufs[0] && !ret &&
	    (a->c.width != current_crop.c.width ||
	     a->c.height != current_crop.c.height)) {
772 773 774
		dev_err(&icd->dev,
			"S_CROP denied: queue initialised and sizes differ\n");
		ret = -EBUSY;
775 776
	} else {
		ret = ici->ops->set_crop(icd, a);
777 778
	}

779 780
	mutex_unlock(&icf->vb_vidq.vb_lock);

781 782 783 784
	return ret;
}

static int soc_camera_g_chip_ident(struct file *file, void *fh,
785
				   struct v4l2_dbg_chip_ident *id)
786 787 788
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
789
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
790

791
	return v4l2_subdev_call(sd, core, g_chip_ident, id);
792 793 794 795
}

#ifdef CONFIG_VIDEO_ADV_DEBUG
static int soc_camera_g_register(struct file *file, void *fh,
796
				 struct v4l2_dbg_register *reg)
797 798 799
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
800
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
801

802
	return v4l2_subdev_call(sd, core, g_register, reg);
803 804 805
}

static int soc_camera_s_register(struct file *file, void *fh,
806
				 struct v4l2_dbg_register *reg)
807 808 809
{
	struct soc_camera_file *icf = file->private_data;
	struct soc_camera_device *icd = icf->icd;
810
	struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
811

812
	return v4l2_subdev_call(sd, core, s_register, reg);
813 814 815 816 817 818 819 820 821 822 823 824
}
#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) {
825
			int ret;
826
			icd->dev.parent = ici->v4l2_dev.dev;
827 828 829 830 831 832 833 834
			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);
			}
835 836 837 838 839 840
		}
	}

	mutex_unlock(&list_lock);
}

841 842 843
#ifdef CONFIG_I2C_BOARDINFO
static int soc_camera_init_i2c(struct soc_camera_device *icd,
			       struct soc_camera_link *icl)
844
{
845
	struct i2c_client *client;
846
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
847
	struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
848
	struct v4l2_subdev *subdev;
849
	int ret;
850

851 852 853 854 855 856
	if (!adap) {
		ret = -ENODEV;
		dev_err(&icd->dev, "Cannot get I2C adapter #%d. No driver?\n",
			icl->i2c_adapter_id);
		goto ei2cga;
	}
857

858
	icl->board_info->platform_data = icd;
859

860 861 862
	subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
				icl->module_name, icl->board_info, NULL);
	if (!subdev) {
863 864
		ret = -ENOMEM;
		goto ei2cnd;
865 866
	}

867 868 869
	subdev->grp_id = (__u32)icd;
	client = subdev->priv;

870 871
	/* Use to_i2c_client(dev) to recover the i2c client */
	dev_set_drvdata(&icd->dev, &client->dev);
872

873 874 875 876
	return 0;
ei2cnd:
	i2c_put_adapter(adap);
ei2cga:
877 878 879
	return ret;
}

880 881 882 883 884
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);
885
	v4l2_device_unregister_subdev(i2c_get_clientdata(client));
886 887 888 889 890 891 892 893
	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

894
static int soc_camera_video_start(struct soc_camera_device *icd);
895 896
static int video_dev_create(struct soc_camera_device *icd);
/* Called during host-driver probe */
897 898 899
static int soc_camera_probe(struct device *dev)
{
	struct soc_camera_device *icd = to_soc_camera_dev(dev);
900
	struct soc_camera_host *ici = to_soc_camera_host(dev->parent);
901
	struct soc_camera_link *icl = to_soc_camera_link(icd);
902
	struct device *control = NULL;
903 904
	struct v4l2_subdev *sd;
	struct v4l2_format f = {.type = V4L2_BUF_TYPE_VIDEO_CAPTURE};
905 906
	int ret;

907
	dev_info(dev, "Probing %s\n", dev_name(dev));
908

909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
	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 */
927 928 929
	ret = video_dev_create(icd);
	if (ret < 0)
		goto evdc;
930

931 932 933 934 935 936
	/* 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) {
937
		ret = -EINVAL;
938 939
		goto eadddev;
	} else {
940 941 942
		if (icl->module_name)
			ret = request_module(icl->module_name);

943 944 945
		ret = icl->add_device(icl, &icd->dev);
		if (ret < 0)
			goto eadddev;
946

947 948
		/* FIXME: this is racy, have to use driver-binding notification */
		control = to_soc_camera_control(icd);
949
		if (!control || !control->driver || !dev_get_drvdata(control) ||
950 951 952 953
		    !try_module_get(control->driver->owner)) {
			icl->del_device(icl);
			goto enodrv;
		}
954
	}
955

956 957 958 959 960 961 962
	/* 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;

963 964 965 966 967 968 969
	/* ..._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;

970 971 972 973 974 975 976
	/* Try to improve our guess of a reasonable window format */
	sd = soc_camera_to_subdev(icd);
	if (!v4l2_subdev_call(sd, video, g_fmt, &f)) {
		icd->user_width		= f.fmt.pix.width;
		icd->user_height	= f.fmt.pix.height;
	}

977
	/* Do we have to sysfs_remove_link() before device_unregister()? */
978
	if (sysfs_create_link(&icd->dev.kobj, &to_soc_camera_control(icd)->kobj,
979 980
			      "control"))
		dev_warn(&icd->dev, "Failed creating the control symlink\n");
981

982 983 984 985 986 987
	ici->ops->remove(icd);

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

	mutex_unlock(&icd->video_lock);
988

989
	return 0;
990

991 992
evidstart:
	mutex_unlock(&icd->video_lock);
993 994
	soc_camera_free_user_formats(icd);
eiufmt:
995
	if (icl->board_info) {
996
		soc_camera_free_i2c(icd);
997
	} else {
998
		icl->del_device(icl);
999 1000 1001
		module_put(control->driver->owner);
	}
enodrv:
1002 1003 1004
eadddev:
	video_device_release(icd->vdev);
evdc:
1005 1006 1007 1008 1009
	ici->ops->remove(icd);
eadd:
	if (icl->power)
		icl->power(icd->pdev, 0);
epower:
1010 1011 1012 1013 1014 1015 1016 1017
	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);
1018 1019
	struct soc_camera_link *icl = to_soc_camera_link(icd);
	struct video_device *vdev = icd->vdev;
1020

1021
	BUG_ON(!dev->parent);
1022

1023 1024 1025 1026 1027 1028 1029
	if (vdev) {
		mutex_lock(&icd->video_lock);
		video_unregister_device(vdev);
		icd->vdev = NULL;
		mutex_unlock(&icd->video_lock);
	}

1030
	if (icl->board_info) {
1031
		soc_camera_free_i2c(icd);
1032 1033 1034 1035 1036 1037 1038 1039
	} 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);
		}
	}
1040
	soc_camera_free_user_formats(icd);
1041

1042 1043 1044
	return 0;
}

1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068
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;
}

1069 1070 1071 1072
static struct bus_type soc_camera_bus_type = {
	.name		= "soc-camera",
	.probe		= soc_camera_probe,
	.remove		= soc_camera_remove,
1073 1074
	.suspend	= soc_camera_suspend,
	.resume		= soc_camera_resume,
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
};

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

static void dummy_release(struct device *dev)
{
}

1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
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);
}

1106
int soc_camera_host_register(struct soc_camera_host *ici)
1107 1108
{
	struct soc_camera_host *ix;
1109
	int ret;
1110

1111 1112 1113 1114 1115 1116 1117 1118 1119
	if (!ici || !ici->ops ||
	    !ici->ops->try_fmt ||
	    !ici->ops->set_fmt ||
	    !ici->ops->set_bus_param ||
	    !ici->ops->querycap ||
	    !ici->ops->init_videobuf ||
	    !ici->ops->reqbufs ||
	    !ici->ops->add ||
	    !ici->ops->remove ||
1120
	    !ici->ops->poll ||
1121
	    !ici->v4l2_dev.dev)
1122 1123
		return -EINVAL;

1124 1125 1126 1127 1128 1129 1130
	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;

1131 1132 1133
	mutex_lock(&list_lock);
	list_for_each_entry(ix, &hosts, list) {
		if (ix->nr == ici->nr) {
1134 1135
			ret = -EBUSY;
			goto edevreg;
1136 1137 1138
		}
	}

1139 1140 1141
	ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
	if (ret < 0)
		goto edevreg;
1142

1143 1144 1145 1146 1147 1148
	list_add_tail(&ici->list, &hosts);
	mutex_unlock(&list_lock);

	scan_add_host(ici);

	return 0;
1149 1150 1151 1152

edevreg:
	mutex_unlock(&list_lock);
	return ret;
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
}
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) {
1166
		if (icd->iface == ici->nr) {
1167
			/* The bus->remove will be called */
1168 1169
			device_unregister(&icd->dev);
			/* Not before device_unregister(), .remove
1170
			 * needs parent to call ici->ops->remove() */
1171
			icd->dev.parent = NULL;
1172 1173 1174

			/* If the host module is loaded again, device_register()
			 * would complain "already initialised" */
1175 1176 1177 1178 1179 1180
			memset(&icd->dev.kobj, 0, sizeof(icd->dev.kobj));
		}
	}

	mutex_unlock(&list_lock);

1181
	v4l2_device_unregister(&ici->v4l2_dev);
1182 1183 1184 1185
}
EXPORT_SYMBOL(soc_camera_host_unregister);

/* Image capture device */
1186
static int soc_camera_device_register(struct soc_camera_device *icd)
1187 1188 1189 1190 1191 1192
{
	struct soc_camera_device *ix;
	int num = -1, i;

	for (i = 0; i < 256 && num < 0; i++) {
		num = i;
1193
		/* Check if this index is available on this interface */
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
		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;

1210 1211 1212
	icd->dev.release	= dummy_release;
	icd->use_count		= 0;
	icd->host_priv		= NULL;
1213
	mutex_init(&icd->video_lock);
1214

1215 1216 1217
	list_add_tail(&icd->list, &devices);

	return 0;
1218 1219
}

1220
static void soc_camera_device_unregister(struct soc_camera_device *icd)
1221 1222 1223 1224
{
	list_del(&icd->list);
}

1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
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
};

1254
static int video_dev_create(struct soc_camera_device *icd)
1255 1256
{
	struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
1257
	struct video_device *vdev = video_device_alloc();
1258 1259

	if (!vdev)
1260
		return -ENOMEM;
1261 1262

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

1264
	vdev->parent		= &icd->dev;
1265 1266
	vdev->current_norm	= V4L2_STD_UNKNOWN;
	vdev->fops		= &soc_camera_fops;
1267
	vdev->ioctl_ops		= &soc_camera_ioctl_ops;
1268 1269
	vdev->release		= video_device_release;
	vdev->minor		= -1;
1270
	vdev->tvnorms		= V4L2_STD_UNKNOWN;
1271 1272 1273 1274

	icd->vdev = vdev;

	return 0;
1275
}
1276

1277
/*
1278
 * Called from soc_camera_probe() above (with .video_lock held???)
1279
 */
1280
static int soc_camera_video_start(struct soc_camera_device *icd)
1281 1282
{
	const struct v4l2_queryctrl *qctrl;
1283
	int ret;
1284 1285 1286 1287 1288 1289 1290 1291 1292

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

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

1293 1294 1295 1296 1297 1298
	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;
	}
1299 1300 1301 1302 1303 1304

	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;

1305
	return 0;
1306 1307
}

1308
static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1309
{
1310 1311
	struct soc_camera_link *icl = pdev->dev.platform_data;
	struct soc_camera_device *icd;
1312
	int ret;
1313

1314 1315
	if (!icl)
		return -EINVAL;
1316

1317 1318 1319
	icd = kzalloc(sizeof(*icd), GFP_KERNEL);
	if (!icd)
		return -ENOMEM;
1320

1321
	icd->iface = icl->bus_id;
1322
	icd->pdev = &pdev->dev;
1323 1324
	platform_set_drvdata(pdev, icd);
	icd->dev.platform_data = icl;
1325

1326 1327 1328
	ret = soc_camera_device_register(icd);
	if (ret < 0)
		goto escdevreg;
1329

1330 1331 1332
	icd->user_width		= DEFAULT_WIDTH;
	icd->user_height	= DEFAULT_HEIGHT;

1333
	return 0;
1334

1335 1336
escdevreg:
	kfree(icd);
1337

1338
	return ret;
1339
}
1340

1341 1342 1343 1344
/* 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)
1345
{
1346
	struct soc_camera_device *icd = platform_get_drvdata(pdev);
1347

1348
	if (!icd)
1349 1350
		return -EINVAL;

1351
	soc_camera_device_unregister(icd);
1352

1353
	kfree(icd);
1354

1355 1356 1357 1358
	return 0;
}

static struct platform_driver __refdata soc_camera_pdrv = {
1359 1360 1361 1362
	.remove  = __devexit_p(soc_camera_pdrv_remove),
	.driver  = {
		.name	= "soc-camera-pdrv",
		.owner	= THIS_MODULE,
1363 1364 1365
	},
};

1366 1367 1368 1369 1370 1371 1372 1373 1374
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;

1375
	ret = platform_driver_probe(&soc_camera_pdrv, soc_camera_pdrv_probe);
1376 1377 1378
	if (ret)
		goto epdr;

1379 1380
	return 0;

1381 1382
epdr:
	driver_unregister(&ic_drv);
1383 1384 1385 1386 1387 1388 1389
edrvr:
	bus_unregister(&soc_camera_bus_type);
	return ret;
}

static void __exit soc_camera_exit(void)
{
1390
	platform_driver_unregister(&soc_camera_pdrv);
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
	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");
1401
MODULE_ALIAS("platform:soc-camera-pdrv");