Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
soc_camera.c
Go to the documentation of this file.
1 /*
2  * camera image capture (abstract) bus driver
3  *
4  * Copyright (C) 2008, Guennadi Liakhovetski <[email protected]>
5  *
6  * This driver provides an interface between platform-specific camera
7  * busses and camera devices. It should be used if the camera is
8  * connected not over a "proper" bus like PCI or USB, but over a
9  * special bus, like, for example, the Quick Capture interface on PXA270
10  * SoCs. Later it should also be used for i.MX31 SoCs from Freescale.
11  * It can handle multiple cameras and / or multiple busses, which can
12  * be used, e.g., in stereo-vision applications.
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License version 2 as
16  * published by the Free Software Foundation.
17  */
18 
19 #include <linux/device.h>
20 #include <linux/err.h>
21 #include <linux/i2c.h>
22 #include <linux/init.h>
23 #include <linux/list.h>
24 #include <linux/mutex.h>
25 #include <linux/module.h>
26 #include <linux/platform_device.h>
28 #include <linux/slab.h>
29 #include <linux/pm_runtime.h>
30 #include <linux/vmalloc.h>
31 
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 /* Default to VGA resolution */
41 #define DEFAULT_WIDTH 640
42 #define DEFAULT_HEIGHT 480
43 
44 #define is_streaming(ici, icd) \
45  (((ici)->ops->init_videobuf) ? \
46  (icd)->vb_vidq.streaming : \
47  vb2_is_streaming(&(icd)->vb2_vidq))
48 
49 static LIST_HEAD(hosts);
50 static LIST_HEAD(devices);
51 static DEFINE_MUTEX(list_lock); /* Protects the list of hosts */
52 
53 int soc_camera_power_on(struct device *dev, struct soc_camera_link *icl)
54 {
56  icl->regulators);
57  if (ret < 0) {
58  dev_err(dev, "Cannot enable regulators\n");
59  return ret;
60  }
61 
62  if (icl->power) {
63  ret = icl->power(dev, 1);
64  if (ret < 0) {
65  dev_err(dev,
66  "Platform failed to power-on the camera.\n");
68  icl->regulators);
69  }
70  }
71 
72  return ret;
73 }
75 
77 {
78  int ret = 0;
79  int err;
80 
81  if (icl->power) {
82  err = icl->power(dev, 0);
83  if (err < 0) {
84  dev_err(dev,
85  "Platform failed to power-off the camera.\n");
86  ret = err;
87  }
88  }
89 
91  icl->regulators);
92  if (err < 0) {
93  dev_err(dev, "Cannot disable regulators\n");
94  ret = ret ? : err;
95  }
96 
97  return ret;
98 }
100 
101 static int __soc_camera_power_on(struct soc_camera_device *icd)
102 {
103  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
104  int ret;
105 
106  ret = v4l2_subdev_call(sd, core, s_power, 1);
107  if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
108  return ret;
109 
110  return 0;
111 }
112 
113 static int __soc_camera_power_off(struct soc_camera_device *icd)
114 {
115  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
116  int ret;
117 
118  ret = v4l2_subdev_call(sd, core, s_power, 0);
119  if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
120  return ret;
121 
122  return 0;
123 }
124 
125 const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc(
126  struct soc_camera_device *icd, unsigned int fourcc)
127 {
128  unsigned int i;
129 
130  for (i = 0; i < icd->num_user_formats; i++)
131  if (icd->user_formats[i].host_fmt->fourcc == fourcc)
132  return icd->user_formats + i;
133  return NULL;
134 }
136 
144  const struct v4l2_mbus_config *cfg)
145 {
146  unsigned long f, flags = cfg->flags;
147 
148  /* If only one of the two polarities is supported, switch to the opposite */
149  if (icl->flags & SOCAM_SENSOR_INVERT_HSYNC) {
153  }
154 
155  if (icl->flags & SOCAM_SENSOR_INVERT_VSYNC) {
159  }
160 
161  if (icl->flags & SOCAM_SENSOR_INVERT_PCLK) {
165  }
166 
167  return flags;
168 }
170 
171 #define pixfmtstr(x) (x) & 0xff, ((x) >> 8) & 0xff, ((x) >> 16) & 0xff, \
172  ((x) >> 24) & 0xff
173 
174 static int soc_camera_try_fmt(struct soc_camera_device *icd,
175  struct v4l2_format *f)
176 {
177  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
178  const struct soc_camera_format_xlate *xlate;
179  struct v4l2_pix_format *pix = &f->fmt.pix;
180  int ret;
181 
182  dev_dbg(icd->pdev, "TRY_FMT(%c%c%c%c, %ux%u)\n",
183  pixfmtstr(pix->pixelformat), pix->width, pix->height);
184 
185  if (pix->pixelformat != V4L2_PIX_FMT_JPEG &&
187  pix->bytesperline = 0;
188  pix->sizeimage = 0;
189  }
190 
191  ret = ici->ops->try_fmt(icd, f);
192  if (ret < 0)
193  return ret;
194 
195  xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat);
196  if (!xlate)
197  return -EINVAL;
198 
199  ret = soc_mbus_bytes_per_line(pix->width, xlate->host_fmt);
200  if (ret < 0)
201  return ret;
202 
203  pix->bytesperline = max_t(u32, pix->bytesperline, ret);
204 
205  ret = soc_mbus_image_size(xlate->host_fmt, pix->bytesperline,
206  pix->height);
207  if (ret < 0)
208  return ret;
209 
210  pix->sizeimage = max_t(u32, pix->sizeimage, ret);
211 
212  return 0;
213 }
214 
215 static int soc_camera_try_fmt_vid_cap(struct file *file, void *priv,
216  struct v4l2_format *f)
217 {
218  struct soc_camera_device *icd = file->private_data;
219 
220  WARN_ON(priv != file->private_data);
221 
222  /* Only single-plane capture is supported so far */
224  return -EINVAL;
225 
226  /* limit format to hardware capabilities */
227  return soc_camera_try_fmt(icd, f);
228 }
229 
230 static int soc_camera_enum_input(struct file *file, void *priv,
231  struct v4l2_input *inp)
232 {
233  if (inp->index != 0)
234  return -EINVAL;
235 
236  /* default is camera */
238  inp->std = V4L2_STD_UNKNOWN;
239  strcpy(inp->name, "Camera");
240 
241  return 0;
242 }
243 
244 static int soc_camera_g_input(struct file *file, void *priv, unsigned int *i)
245 {
246  *i = 0;
247 
248  return 0;
249 }
250 
251 static int soc_camera_s_input(struct file *file, void *priv, unsigned int i)
252 {
253  if (i > 0)
254  return -EINVAL;
255 
256  return 0;
257 }
258 
259 static int soc_camera_s_std(struct file *file, void *priv, v4l2_std_id *a)
260 {
261  struct soc_camera_device *icd = file->private_data;
262  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
263 
264  return v4l2_subdev_call(sd, core, s_std, *a);
265 }
266 
267 static int soc_camera_g_std(struct file *file, void *priv, v4l2_std_id *a)
268 {
269  struct soc_camera_device *icd = file->private_data;
270  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
271 
272  return v4l2_subdev_call(sd, core, g_std, a);
273 }
274 
275 static int soc_camera_enum_framesizes(struct file *file, void *fh,
276  struct v4l2_frmsizeenum *fsize)
277 {
278  struct soc_camera_device *icd = file->private_data;
279  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
280 
281  return ici->ops->enum_framesizes(icd, fsize);
282 }
283 
284 static int soc_camera_reqbufs(struct file *file, void *priv,
285  struct v4l2_requestbuffers *p)
286 {
287  int ret;
288  struct soc_camera_device *icd = file->private_data;
289  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
290 
291  WARN_ON(priv != file->private_data);
292 
293  if (icd->streamer && icd->streamer != file)
294  return -EBUSY;
295 
296  if (ici->ops->init_videobuf) {
297  ret = videobuf_reqbufs(&icd->vb_vidq, p);
298  if (ret < 0)
299  return ret;
300 
301  ret = ici->ops->reqbufs(icd, p);
302  } else {
303  ret = vb2_reqbufs(&icd->vb2_vidq, p);
304  }
305 
306  if (!ret && !icd->streamer)
307  icd->streamer = file;
308 
309  return ret;
310 }
311 
312 static int soc_camera_querybuf(struct file *file, void *priv,
313  struct v4l2_buffer *p)
314 {
315  struct soc_camera_device *icd = file->private_data;
316  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
317 
318  WARN_ON(priv != file->private_data);
319 
320  if (ici->ops->init_videobuf)
321  return videobuf_querybuf(&icd->vb_vidq, p);
322  else
323  return vb2_querybuf(&icd->vb2_vidq, p);
324 }
325 
326 static int soc_camera_qbuf(struct file *file, void *priv,
327  struct v4l2_buffer *p)
328 {
329  struct soc_camera_device *icd = file->private_data;
330  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
331 
332  WARN_ON(priv != file->private_data);
333 
334  if (icd->streamer != file)
335  return -EBUSY;
336 
337  if (ici->ops->init_videobuf)
338  return videobuf_qbuf(&icd->vb_vidq, p);
339  else
340  return vb2_qbuf(&icd->vb2_vidq, p);
341 }
342 
343 static int soc_camera_dqbuf(struct file *file, void *priv,
344  struct v4l2_buffer *p)
345 {
346  struct soc_camera_device *icd = file->private_data;
347  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
348 
349  WARN_ON(priv != file->private_data);
350 
351  if (icd->streamer != file)
352  return -EBUSY;
353 
354  if (ici->ops->init_videobuf)
355  return videobuf_dqbuf(&icd->vb_vidq, p, file->f_flags & O_NONBLOCK);
356  else
357  return vb2_dqbuf(&icd->vb2_vidq, p, file->f_flags & O_NONBLOCK);
358 }
359 
360 static int soc_camera_create_bufs(struct file *file, void *priv,
361  struct v4l2_create_buffers *create)
362 {
363  struct soc_camera_device *icd = file->private_data;
364  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
365 
366  /* videobuf2 only */
367  if (ici->ops->init_videobuf)
368  return -EINVAL;
369  else
370  return vb2_create_bufs(&icd->vb2_vidq, create);
371 }
372 
373 static int soc_camera_prepare_buf(struct file *file, void *priv,
374  struct v4l2_buffer *b)
375 {
376  struct soc_camera_device *icd = file->private_data;
377  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
378 
379  /* videobuf2 only */
380  if (ici->ops->init_videobuf)
381  return -EINVAL;
382  else
383  return vb2_prepare_buf(&icd->vb2_vidq, b);
384 }
385 
386 /* Always entered with .video_lock held */
387 static int soc_camera_init_user_formats(struct soc_camera_device *icd)
388 {
389  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
390  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
391  unsigned int i, fmts = 0, raw_fmts = 0;
392  int ret;
394 
395  while (!v4l2_subdev_call(sd, video, enum_mbus_fmt, raw_fmts, &code))
396  raw_fmts++;
397 
398  if (!ici->ops->get_formats)
399  /*
400  * Fallback mode - the host will have to serve all
401  * sensor-provided formats one-to-one to the user
402  */
403  fmts = raw_fmts;
404  else
405  /*
406  * First pass - only count formats this host-sensor
407  * configuration can provide
408  */
409  for (i = 0; i < raw_fmts; i++) {
410  ret = ici->ops->get_formats(icd, i, NULL);
411  if (ret < 0)
412  return ret;
413  fmts += ret;
414  }
415 
416  if (!fmts)
417  return -ENXIO;
418 
419  icd->user_formats =
420  vmalloc(fmts * sizeof(struct soc_camera_format_xlate));
421  if (!icd->user_formats)
422  return -ENOMEM;
423 
424  dev_dbg(icd->pdev, "Found %d supported formats.\n", fmts);
425 
426  /* Second pass - actually fill data formats */
427  fmts = 0;
428  for (i = 0; i < raw_fmts; i++)
429  if (!ici->ops->get_formats) {
430  v4l2_subdev_call(sd, video, enum_mbus_fmt, i, &code);
431  icd->user_formats[fmts].host_fmt =
432  soc_mbus_get_fmtdesc(code);
433  if (icd->user_formats[fmts].host_fmt)
434  icd->user_formats[fmts++].code = code;
435  } else {
436  ret = ici->ops->get_formats(icd, i,
437  &icd->user_formats[fmts]);
438  if (ret < 0)
439  goto egfmt;
440  fmts += ret;
441  }
442 
443  icd->num_user_formats = fmts;
444  icd->current_fmt = &icd->user_formats[0];
445 
446  return 0;
447 
448 egfmt:
449  vfree(icd->user_formats);
450  return ret;
451 }
452 
453 /* Always entered with .video_lock held */
454 static void soc_camera_free_user_formats(struct soc_camera_device *icd)
455 {
456  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
457 
458  if (ici->ops->put_formats)
459  ici->ops->put_formats(icd);
460  icd->current_fmt = NULL;
461  icd->num_user_formats = 0;
462  vfree(icd->user_formats);
463  icd->user_formats = NULL;
464 }
465 
466 /* Called with .vb_lock held, or from the first open(2), see comment there */
467 static int soc_camera_set_fmt(struct soc_camera_device *icd,
468  struct v4l2_format *f)
469 {
470  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
471  struct v4l2_pix_format *pix = &f->fmt.pix;
472  int ret;
473 
474  dev_dbg(icd->pdev, "S_FMT(%c%c%c%c, %ux%u)\n",
475  pixfmtstr(pix->pixelformat), pix->width, pix->height);
476 
477  /* We always call try_fmt() before set_fmt() or set_crop() */
478  ret = soc_camera_try_fmt(icd, f);
479  if (ret < 0)
480  return ret;
481 
482  ret = ici->ops->set_fmt(icd, f);
483  if (ret < 0) {
484  return ret;
485  } else if (!icd->current_fmt ||
486  icd->current_fmt->host_fmt->fourcc != pix->pixelformat) {
487  dev_err(icd->pdev,
488  "Host driver hasn't set up current format correctly!\n");
489  return -EINVAL;
490  }
491 
492  icd->user_width = pix->width;
493  icd->user_height = pix->height;
494  icd->bytesperline = pix->bytesperline;
495  icd->sizeimage = pix->sizeimage;
496  icd->colorspace = pix->colorspace;
497  icd->field = pix->field;
498  if (ici->ops->init_videobuf)
499  icd->vb_vidq.field = pix->field;
500 
501  dev_dbg(icd->pdev, "set width: %d height: %d\n",
502  icd->user_width, icd->user_height);
503 
504  /* set physical bus parameters */
505  return ici->ops->set_bus_param(icd);
506 }
507 
508 static int soc_camera_open(struct file *file)
509 {
510  struct video_device *vdev = video_devdata(file);
511  struct soc_camera_device *icd = dev_get_drvdata(vdev->parent);
512  struct soc_camera_link *icl = to_soc_camera_link(icd);
513  struct soc_camera_host *ici;
514  int ret;
515 
516  if (!to_soc_camera_control(icd))
517  /* No device driver attached */
518  return -ENODEV;
519 
520  ici = to_soc_camera_host(icd->parent);
521 
523  return -ERESTARTSYS;
524  if (!try_module_get(ici->ops->owner)) {
525  dev_err(icd->pdev, "Couldn't lock capture bus driver.\n");
526  ret = -EINVAL;
527  goto emodule;
528  }
529 
530  icd->use_count++;
531 
532  /* Now we really have to activate the camera */
533  if (icd->use_count == 1) {
534  /* Restore parameters before the last close() per V4L2 API */
535  struct v4l2_format f = {
537  .fmt.pix = {
538  .width = icd->user_width,
539  .height = icd->user_height,
540  .field = icd->field,
541  .colorspace = icd->colorspace,
542  .pixelformat =
543  icd->current_fmt->host_fmt->fourcc,
544  },
545  };
546 
547  /* The camera could have been already on, try to reset */
548  if (icl->reset)
549  icl->reset(icd->pdev);
550 
551  /* Don't mess with the host during probe */
552  mutex_lock(&ici->host_lock);
553  ret = ici->ops->add(icd);
554  mutex_unlock(&ici->host_lock);
555  if (ret < 0) {
556  dev_err(icd->pdev, "Couldn't activate the camera: %d\n", ret);
557  goto eiciadd;
558  }
559 
560  ret = __soc_camera_power_on(icd);
561  if (ret < 0)
562  goto epower;
563 
564  pm_runtime_enable(&icd->vdev->dev);
565  ret = pm_runtime_resume(&icd->vdev->dev);
566  if (ret < 0 && ret != -ENOSYS)
567  goto eresume;
568 
569  /*
570  * Try to configure with default parameters. Notice: this is the
571  * very first open, so, we cannot race against other calls,
572  * apart from someone else calling open() simultaneously, but
573  * .video_lock is protecting us against it.
574  */
575  ret = soc_camera_set_fmt(icd, &f);
576  if (ret < 0)
577  goto esfmt;
578 
579  if (ici->ops->init_videobuf) {
580  ici->ops->init_videobuf(&icd->vb_vidq, icd);
581  } else {
582  ret = ici->ops->init_videobuf2(&icd->vb2_vidq, icd);
583  if (ret < 0)
584  goto einitvb;
585  }
587  }
588  mutex_unlock(&icd->video_lock);
589 
590  file->private_data = icd;
591  dev_dbg(icd->pdev, "camera device open\n");
592 
593  return 0;
594 
595  /*
596  * First four errors are entered with the .video_lock held
597  * and use_count == 1
598  */
599 einitvb:
600 esfmt:
601  pm_runtime_disable(&icd->vdev->dev);
602 eresume:
603  __soc_camera_power_off(icd);
604 epower:
605  ici->ops->remove(icd);
606 eiciadd:
607  icd->use_count--;
608  module_put(ici->ops->owner);
609 emodule:
610  mutex_unlock(&icd->video_lock);
611 
612  return ret;
613 }
614 
615 static int soc_camera_close(struct file *file)
616 {
617  struct soc_camera_device *icd = file->private_data;
618  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
619 
620  mutex_lock(&icd->video_lock);
621  icd->use_count--;
622  if (!icd->use_count) {
623  pm_runtime_suspend(&icd->vdev->dev);
624  pm_runtime_disable(&icd->vdev->dev);
625 
626  if (ici->ops->init_videobuf2)
628  ici->ops->remove(icd);
629 
630  __soc_camera_power_off(icd);
631  }
632 
633  if (icd->streamer == file)
634  icd->streamer = NULL;
635  mutex_unlock(&icd->video_lock);
636 
637  module_put(ici->ops->owner);
638 
639  dev_dbg(icd->pdev, "camera device close\n");
640 
641  return 0;
642 }
643 
644 static ssize_t soc_camera_read(struct file *file, char __user *buf,
645  size_t count, loff_t *ppos)
646 {
647  struct soc_camera_device *icd = file->private_data;
648  int err = -EINVAL;
649 
650  dev_err(icd->pdev, "camera device read not implemented\n");
651 
652  return err;
653 }
654 
655 static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
656 {
657  struct soc_camera_device *icd = file->private_data;
658  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
659  int err;
660 
661  dev_dbg(icd->pdev, "mmap called, vma=0x%08lx\n", (unsigned long)vma);
662 
663  if (icd->streamer != file)
664  return -EBUSY;
665 
667  return -ERESTARTSYS;
668  if (ici->ops->init_videobuf)
669  err = videobuf_mmap_mapper(&icd->vb_vidq, vma);
670  else
671  err = vb2_mmap(&icd->vb2_vidq, vma);
672  mutex_unlock(&icd->video_lock);
673 
674  dev_dbg(icd->pdev, "vma start=0x%08lx, size=%ld, ret=%d\n",
675  (unsigned long)vma->vm_start,
676  (unsigned long)vma->vm_end - (unsigned long)vma->vm_start,
677  err);
678 
679  return err;
680 }
681 
682 static unsigned int soc_camera_poll(struct file *file, poll_table *pt)
683 {
684  struct soc_camera_device *icd = file->private_data;
685  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
686  unsigned res = POLLERR;
687 
688  if (icd->streamer != file)
689  return POLLERR;
690 
691  mutex_lock(&icd->video_lock);
692  if (ici->ops->init_videobuf && list_empty(&icd->vb_vidq.stream))
693  dev_err(icd->pdev, "Trying to poll with no queued buffers!\n");
694  else
695  res = ici->ops->poll(file, pt);
696  mutex_unlock(&icd->video_lock);
697  return res;
698 }
699 
700 void soc_camera_lock(struct vb2_queue *vq)
701 {
702  struct soc_camera_device *icd = vb2_get_drv_priv(vq);
703  mutex_lock(&icd->video_lock);
704 }
706 
707 void soc_camera_unlock(struct vb2_queue *vq)
708 {
709  struct soc_camera_device *icd = vb2_get_drv_priv(vq);
710  mutex_unlock(&icd->video_lock);
711 }
713 
714 static struct v4l2_file_operations soc_camera_fops = {
715  .owner = THIS_MODULE,
716  .open = soc_camera_open,
717  .release = soc_camera_close,
718  .unlocked_ioctl = video_ioctl2,
719  .read = soc_camera_read,
720  .mmap = soc_camera_mmap,
721  .poll = soc_camera_poll,
722 };
723 
724 static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
725  struct v4l2_format *f)
726 {
727  struct soc_camera_device *icd = file->private_data;
728  int ret;
729 
730  WARN_ON(priv != file->private_data);
731 
732  if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
733  dev_warn(icd->pdev, "Wrong buf-type %d\n", f->type);
734  return -EINVAL;
735  }
736 
737  if (icd->streamer && icd->streamer != file)
738  return -EBUSY;
739 
740  if (is_streaming(to_soc_camera_host(icd->parent), icd)) {
741  dev_err(icd->pdev, "S_FMT denied: queue initialised\n");
742  return -EBUSY;
743  }
744 
745  ret = soc_camera_set_fmt(icd, f);
746 
747  if (!ret && !icd->streamer)
748  icd->streamer = file;
749 
750  return ret;
751 }
752 
753 static int soc_camera_enum_fmt_vid_cap(struct file *file, void *priv,
754  struct v4l2_fmtdesc *f)
755 {
756  struct soc_camera_device *icd = file->private_data;
757  const struct soc_mbus_pixelfmt *format;
758 
759  WARN_ON(priv != file->private_data);
760 
761  if (f->index >= icd->num_user_formats)
762  return -EINVAL;
763 
764  format = icd->user_formats[f->index].host_fmt;
765 
766  if (format->name)
767  strlcpy(f->description, format->name, sizeof(f->description));
768  f->pixelformat = format->fourcc;
769  return 0;
770 }
771 
772 static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
773  struct v4l2_format *f)
774 {
775  struct soc_camera_device *icd = file->private_data;
776  struct v4l2_pix_format *pix = &f->fmt.pix;
777 
778  WARN_ON(priv != file->private_data);
779 
781  return -EINVAL;
782 
783  pix->width = icd->user_width;
784  pix->height = icd->user_height;
785  pix->bytesperline = icd->bytesperline;
786  pix->sizeimage = icd->sizeimage;
787  pix->field = icd->field;
788  pix->pixelformat = icd->current_fmt->host_fmt->fourcc;
789  pix->colorspace = icd->colorspace;
790  dev_dbg(icd->pdev, "current_fmt->fourcc: 0x%08x\n",
791  icd->current_fmt->host_fmt->fourcc);
792  return 0;
793 }
794 
795 static int soc_camera_querycap(struct file *file, void *priv,
796  struct v4l2_capability *cap)
797 {
798  struct soc_camera_device *icd = file->private_data;
799  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
800 
801  WARN_ON(priv != file->private_data);
802 
803  strlcpy(cap->driver, ici->drv_name, sizeof(cap->driver));
804  return ici->ops->querycap(ici, cap);
805 }
806 
807 static int soc_camera_streamon(struct file *file, void *priv,
808  enum v4l2_buf_type i)
809 {
810  struct soc_camera_device *icd = file->private_data;
811  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
812  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
813  int ret;
814 
815  WARN_ON(priv != file->private_data);
816 
818  return -EINVAL;
819 
820  if (icd->streamer != file)
821  return -EBUSY;
822 
823  /* This calls buf_queue from host driver's videobuf_queue_ops */
824  if (ici->ops->init_videobuf)
825  ret = videobuf_streamon(&icd->vb_vidq);
826  else
827  ret = vb2_streamon(&icd->vb2_vidq, i);
828 
829  if (!ret)
830  v4l2_subdev_call(sd, video, s_stream, 1);
831 
832  return ret;
833 }
834 
835 static int soc_camera_streamoff(struct file *file, void *priv,
836  enum v4l2_buf_type i)
837 {
838  struct soc_camera_device *icd = file->private_data;
839  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
840  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
841 
842  WARN_ON(priv != file->private_data);
843 
845  return -EINVAL;
846 
847  if (icd->streamer != file)
848  return -EBUSY;
849 
850  /*
851  * This calls buf_release from host driver's videobuf_queue_ops for all
852  * remaining buffers. When the last buffer is freed, stop capture
853  */
854  if (ici->ops->init_videobuf)
856  else
857  vb2_streamoff(&icd->vb2_vidq, i);
858 
859  v4l2_subdev_call(sd, video, s_stream, 0);
860 
861  return 0;
862 }
863 
864 static int soc_camera_cropcap(struct file *file, void *fh,
865  struct v4l2_cropcap *a)
866 {
867  struct soc_camera_device *icd = file->private_data;
868  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
869 
870  return ici->ops->cropcap(icd, a);
871 }
872 
873 static int soc_camera_g_crop(struct file *file, void *fh,
874  struct v4l2_crop *a)
875 {
876  struct soc_camera_device *icd = file->private_data;
877  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
878  int ret;
879 
880  ret = ici->ops->get_crop(icd, a);
881 
882  return ret;
883 }
884 
885 /*
886  * According to the V4L2 API, drivers shall not update the struct v4l2_crop
887  * argument with the actual geometry, instead, the user shall use G_CROP to
888  * retrieve it.
889  */
890 static int soc_camera_s_crop(struct file *file, void *fh,
891  const struct v4l2_crop *a)
892 {
893  struct soc_camera_device *icd = file->private_data;
894  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
895  const struct v4l2_rect *rect = &a->c;
896  struct v4l2_crop current_crop;
897  int ret;
898 
900  return -EINVAL;
901 
902  dev_dbg(icd->pdev, "S_CROP(%ux%u@%u:%u)\n",
903  rect->width, rect->height, rect->left, rect->top);
904 
905  /* If get_crop fails, we'll let host and / or client drivers decide */
906  ret = ici->ops->get_crop(icd, &current_crop);
907 
908  /* Prohibit window size change with initialised buffers */
909  if (ret < 0) {
910  dev_err(icd->pdev,
911  "S_CROP denied: getting current crop failed\n");
912  } else if ((a->c.width == current_crop.c.width &&
913  a->c.height == current_crop.c.height) ||
914  !is_streaming(ici, icd)) {
915  /* same size or not streaming - use .set_crop() */
916  ret = ici->ops->set_crop(icd, a);
917  } else if (ici->ops->set_livecrop) {
918  ret = ici->ops->set_livecrop(icd, a);
919  } else {
920  dev_err(icd->pdev,
921  "S_CROP denied: queue initialised and sizes differ\n");
922  ret = -EBUSY;
923  }
924 
925  return ret;
926 }
927 
928 static int soc_camera_g_selection(struct file *file, void *fh,
929  struct v4l2_selection *s)
930 {
931  struct soc_camera_device *icd = file->private_data;
932  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
933 
934  /* With a wrong type no need to try to fall back to cropping */
936  return -EINVAL;
937 
938  if (!ici->ops->get_selection)
939  return -ENOTTY;
940 
941  return ici->ops->get_selection(icd, s);
942 }
943 
944 static int soc_camera_s_selection(struct file *file, void *fh,
945  struct v4l2_selection *s)
946 {
947  struct soc_camera_device *icd = file->private_data;
948  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
949  int ret;
950 
951  /* In all these cases cropping emulation will not help */
952  if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
953  (s->target != V4L2_SEL_TGT_COMPOSE &&
954  s->target != V4L2_SEL_TGT_CROP))
955  return -EINVAL;
956 
957  if (s->target == V4L2_SEL_TGT_COMPOSE) {
958  /* No output size change during a running capture! */
959  if (is_streaming(ici, icd) &&
960  (icd->user_width != s->r.width ||
961  icd->user_height != s->r.height))
962  return -EBUSY;
963 
964  /*
965  * Only one user is allowed to change the output format, touch
966  * buffers, start / stop streaming, poll for data
967  */
968  if (icd->streamer && icd->streamer != file)
969  return -EBUSY;
970  }
971 
972  if (!ici->ops->set_selection)
973  return -ENOTTY;
974 
975  ret = ici->ops->set_selection(icd, s);
976  if (!ret &&
978  icd->user_width = s->r.width;
979  icd->user_height = s->r.height;
980  if (!icd->streamer)
981  icd->streamer = file;
982  }
983 
984  return ret;
985 }
986 
987 static int soc_camera_g_parm(struct file *file, void *fh,
988  struct v4l2_streamparm *a)
989 {
990  struct soc_camera_device *icd = file->private_data;
991  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
992 
993  if (ici->ops->get_parm)
994  return ici->ops->get_parm(icd, a);
995 
996  return -ENOIOCTLCMD;
997 }
998 
999 static int soc_camera_s_parm(struct file *file, void *fh,
1000  struct v4l2_streamparm *a)
1001 {
1002  struct soc_camera_device *icd = file->private_data;
1003  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1004 
1005  if (ici->ops->set_parm)
1006  return ici->ops->set_parm(icd, a);
1007 
1008  return -ENOIOCTLCMD;
1009 }
1010 
1011 static int soc_camera_g_chip_ident(struct file *file, void *fh,
1012  struct v4l2_dbg_chip_ident *id)
1013 {
1014  struct soc_camera_device *icd = file->private_data;
1015  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1016 
1017  return v4l2_subdev_call(sd, core, g_chip_ident, id);
1018 }
1019 
1020 #ifdef CONFIG_VIDEO_ADV_DEBUG
1021 static int soc_camera_g_register(struct file *file, void *fh,
1022  struct v4l2_dbg_register *reg)
1023 {
1024  struct soc_camera_device *icd = file->private_data;
1025  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1026 
1027  return v4l2_subdev_call(sd, core, g_register, reg);
1028 }
1029 
1030 static int soc_camera_s_register(struct file *file, void *fh,
1031  struct v4l2_dbg_register *reg)
1032 {
1033  struct soc_camera_device *icd = file->private_data;
1034  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1035 
1036  return v4l2_subdev_call(sd, core, s_register, reg);
1037 }
1038 #endif
1039 
1040 static int soc_camera_probe(struct soc_camera_device *icd);
1041 
1042 /* So far this function cannot fail */
1043 static void scan_add_host(struct soc_camera_host *ici)
1044 {
1045  struct soc_camera_device *icd;
1046 
1047  mutex_lock(&ici->host_lock);
1048 
1049  list_for_each_entry(icd, &devices, list) {
1050  if (icd->iface == ici->nr) {
1051  int ret;
1052 
1053  icd->parent = ici->v4l2_dev.dev;
1054  ret = soc_camera_probe(icd);
1055  }
1056  }
1057 
1058  mutex_unlock(&ici->host_lock);
1059 }
1060 
1061 #ifdef CONFIG_I2C_BOARDINFO
1062 static int soc_camera_init_i2c(struct soc_camera_device *icd,
1063  struct soc_camera_link *icl)
1064 {
1065  struct i2c_client *client;
1066  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1067  struct i2c_adapter *adap = i2c_get_adapter(icl->i2c_adapter_id);
1068  struct v4l2_subdev *subdev;
1069 
1070  if (!adap) {
1071  dev_err(icd->pdev, "Cannot get I2C adapter #%d. No driver?\n",
1072  icl->i2c_adapter_id);
1073  goto ei2cga;
1074  }
1075 
1076  icl->board_info->platform_data = icl;
1077 
1078  subdev = v4l2_i2c_new_subdev_board(&ici->v4l2_dev, adap,
1079  icl->board_info, NULL);
1080  if (!subdev)
1081  goto ei2cnd;
1082 
1083  client = v4l2_get_subdevdata(subdev);
1084 
1085  /* Use to_i2c_client(dev) to recover the i2c client */
1086  icd->control = &client->dev;
1087 
1088  return 0;
1089 ei2cnd:
1090  i2c_put_adapter(adap);
1091 ei2cga:
1092  return -ENODEV;
1093 }
1094 
1095 static void soc_camera_free_i2c(struct soc_camera_device *icd)
1096 {
1097  struct i2c_client *client =
1098  to_i2c_client(to_soc_camera_control(icd));
1099  struct i2c_adapter *adap = client->adapter;
1100 
1101  icd->control = NULL;
1102  v4l2_device_unregister_subdev(i2c_get_clientdata(client));
1103  i2c_unregister_device(client);
1104  i2c_put_adapter(adap);
1105 }
1106 #else
1107 #define soc_camera_init_i2c(icd, icl) (-ENODEV)
1108 #define soc_camera_free_i2c(icd) do {} while (0)
1109 #endif
1110 
1111 static int soc_camera_video_start(struct soc_camera_device *icd);
1112 static int video_dev_create(struct soc_camera_device *icd);
1113 /* Called during host-driver probe */
1114 static int soc_camera_probe(struct soc_camera_device *icd)
1115 {
1116  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1117  struct soc_camera_link *icl = to_soc_camera_link(icd);
1118  struct device *control = NULL;
1119  struct v4l2_subdev *sd;
1120  struct v4l2_mbus_framefmt mf;
1121  int ret;
1122 
1123  dev_info(icd->pdev, "Probing %s\n", dev_name(icd->pdev));
1124 
1125  /*
1126  * Currently the subdev with the largest number of controls (13) is
1127  * ov6550. So let's pick 16 as a hint for the control handler. Note
1128  * that this is a hint only: too large and you waste some memory, too
1129  * small and there is a (very) small performance hit when looking up
1130  * controls in the internal hash.
1131  */
1132  ret = v4l2_ctrl_handler_init(&icd->ctrl_handler, 16);
1133  if (ret < 0)
1134  return ret;
1135 
1136  ret = regulator_bulk_get(icd->pdev, icl->num_regulators,
1137  icl->regulators);
1138  if (ret < 0)
1139  goto ereg;
1140 
1141  /* The camera could have been already on, try to reset */
1142  if (icl->reset)
1143  icl->reset(icd->pdev);
1144 
1145  ret = ici->ops->add(icd);
1146  if (ret < 0)
1147  goto eadd;
1148 
1149  /* Must have icd->vdev before registering the device */
1150  ret = video_dev_create(icd);
1151  if (ret < 0)
1152  goto evdc;
1153 
1154  /* Non-i2c cameras, e.g., soc_camera_platform, have no board_info */
1155  if (icl->board_info) {
1156  ret = soc_camera_init_i2c(icd, icl);
1157  if (ret < 0)
1158  goto eadddev;
1159  } else if (!icl->add_device || !icl->del_device) {
1160  ret = -EINVAL;
1161  goto eadddev;
1162  } else {
1163  if (icl->module_name)
1164  ret = request_module(icl->module_name);
1165 
1166  ret = icl->add_device(icd);
1167  if (ret < 0)
1168  goto eadddev;
1169 
1170  /*
1171  * FIXME: this is racy, have to use driver-binding notification,
1172  * when it is available
1173  */
1174  control = to_soc_camera_control(icd);
1175  if (!control || !control->driver || !dev_get_drvdata(control) ||
1176  !try_module_get(control->driver->owner)) {
1177  icl->del_device(icd);
1178  ret = -ENODEV;
1179  goto enodrv;
1180  }
1181  }
1182 
1183  sd = soc_camera_to_subdev(icd);
1184  sd->grp_id = soc_camera_grp_id(icd);
1185  v4l2_set_subdev_hostdata(sd, icd);
1186 
1188  if (ret < 0)
1189  goto ectrl;
1190 
1191  /* At this point client .probe() should have run already */
1192  ret = soc_camera_init_user_formats(icd);
1193  if (ret < 0)
1194  goto eiufmt;
1195 
1196  icd->field = V4L2_FIELD_ANY;
1197 
1198  /*
1199  * ..._video_start() will create a device node, video_register_device()
1200  * itself is protected against concurrent open() calls, but we also have
1201  * to protect our data.
1202  */
1203  mutex_lock(&icd->video_lock);
1204 
1205  ret = soc_camera_video_start(icd);
1206  if (ret < 0)
1207  goto evidstart;
1208 
1209  /* Try to improve our guess of a reasonable window format */
1210  if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) {
1211  icd->user_width = mf.width;
1212  icd->user_height = mf.height;
1213  icd->colorspace = mf.colorspace;
1214  icd->field = mf.field;
1215  }
1216 
1217  ici->ops->remove(icd);
1218 
1219  mutex_unlock(&icd->video_lock);
1220 
1221  return 0;
1222 
1223 evidstart:
1224  mutex_unlock(&icd->video_lock);
1225  soc_camera_free_user_formats(icd);
1226 eiufmt:
1227 ectrl:
1228  if (icl->board_info) {
1229  soc_camera_free_i2c(icd);
1230  } else {
1231  icl->del_device(icd);
1232  module_put(control->driver->owner);
1233  }
1234 enodrv:
1235 eadddev:
1236  video_device_release(icd->vdev);
1237  icd->vdev = NULL;
1238 evdc:
1239  ici->ops->remove(icd);
1240 eadd:
1242 ereg:
1244  return ret;
1245 }
1246 
1247 /*
1248  * This is called on device_unregister, which only means we have to disconnect
1249  * from the host, but not remove ourselves from the device list
1250  */
1251 static int soc_camera_remove(struct soc_camera_device *icd)
1252 {
1253  struct soc_camera_link *icl = to_soc_camera_link(icd);
1254  struct video_device *vdev = icd->vdev;
1255 
1256  BUG_ON(!icd->parent);
1257 
1259  if (vdev) {
1261  icd->vdev = NULL;
1262  }
1263 
1264  if (icl->board_info) {
1265  soc_camera_free_i2c(icd);
1266  } else {
1267  struct device_driver *drv = to_soc_camera_control(icd)->driver;
1268  if (drv) {
1269  icl->del_device(icd);
1270  module_put(drv->owner);
1271  }
1272  }
1273  soc_camera_free_user_formats(icd);
1274 
1276 
1277  return 0;
1278 }
1279 
1280 static int default_cropcap(struct soc_camera_device *icd,
1281  struct v4l2_cropcap *a)
1282 {
1283  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1284  return v4l2_subdev_call(sd, video, cropcap, a);
1285 }
1286 
1287 static int default_g_crop(struct soc_camera_device *icd, struct v4l2_crop *a)
1288 {
1289  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1290  return v4l2_subdev_call(sd, video, g_crop, a);
1291 }
1292 
1293 static int default_s_crop(struct soc_camera_device *icd, const struct v4l2_crop *a)
1294 {
1295  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1296  return v4l2_subdev_call(sd, video, s_crop, a);
1297 }
1298 
1299 static int default_g_parm(struct soc_camera_device *icd,
1300  struct v4l2_streamparm *parm)
1301 {
1302  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1303  return v4l2_subdev_call(sd, video, g_parm, parm);
1304 }
1305 
1306 static int default_s_parm(struct soc_camera_device *icd,
1307  struct v4l2_streamparm *parm)
1308 {
1309  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1310  return v4l2_subdev_call(sd, video, s_parm, parm);
1311 }
1312 
1313 static int default_enum_framesizes(struct soc_camera_device *icd,
1314  struct v4l2_frmsizeenum *fsize)
1315 {
1316  int ret;
1317  struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
1318  const struct soc_camera_format_xlate *xlate;
1319  __u32 pixfmt = fsize->pixel_format;
1320  struct v4l2_frmsizeenum fsize_mbus = *fsize;
1321 
1322  xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
1323  if (!xlate)
1324  return -EINVAL;
1325  /* map xlate-code to pixel_format, sensor only handle xlate-code*/
1326  fsize_mbus.pixel_format = xlate->code;
1327 
1328  ret = v4l2_subdev_call(sd, video, enum_framesizes, &fsize_mbus);
1329  if (ret < 0)
1330  return ret;
1331 
1332  *fsize = fsize_mbus;
1333  fsize->pixel_format = pixfmt;
1334 
1335  return 0;
1336 }
1337 
1339 {
1340  struct soc_camera_host *ix;
1341  int ret;
1342 
1343  if (!ici || !ici->ops ||
1344  !ici->ops->try_fmt ||
1345  !ici->ops->set_fmt ||
1346  !ici->ops->set_bus_param ||
1347  !ici->ops->querycap ||
1348  ((!ici->ops->init_videobuf ||
1349  !ici->ops->reqbufs) &&
1350  !ici->ops->init_videobuf2) ||
1351  !ici->ops->add ||
1352  !ici->ops->remove ||
1353  !ici->ops->poll ||
1354  !ici->v4l2_dev.dev)
1355  return -EINVAL;
1356 
1357  if (!ici->ops->set_crop)
1358  ici->ops->set_crop = default_s_crop;
1359  if (!ici->ops->get_crop)
1360  ici->ops->get_crop = default_g_crop;
1361  if (!ici->ops->cropcap)
1362  ici->ops->cropcap = default_cropcap;
1363  if (!ici->ops->set_parm)
1364  ici->ops->set_parm = default_s_parm;
1365  if (!ici->ops->get_parm)
1366  ici->ops->get_parm = default_g_parm;
1367  if (!ici->ops->enum_framesizes)
1368  ici->ops->enum_framesizes = default_enum_framesizes;
1369 
1371  list_for_each_entry(ix, &hosts, list) {
1372  if (ix->nr == ici->nr) {
1373  ret = -EBUSY;
1374  goto edevreg;
1375  }
1376  }
1377 
1378  ret = v4l2_device_register(ici->v4l2_dev.dev, &ici->v4l2_dev);
1379  if (ret < 0)
1380  goto edevreg;
1381 
1382  list_add_tail(&ici->list, &hosts);
1384 
1385  mutex_init(&ici->host_lock);
1386  scan_add_host(ici);
1387 
1388  return 0;
1389 
1390 edevreg:
1392  return ret;
1393 }
1395 
1396 /* Unregister all clients! */
1398 {
1399  struct soc_camera_device *icd;
1400 
1402 
1403  list_del(&ici->list);
1405  if (icd->iface == ici->nr && to_soc_camera_control(icd))
1406  soc_camera_remove(icd);
1407 
1409 
1411 }
1413 
1414 /* Image capture device */
1415 static int soc_camera_device_register(struct soc_camera_device *icd)
1416 {
1417  struct soc_camera_device *ix;
1418  int num = -1, i;
1419 
1420  for (i = 0; i < 256 && num < 0; i++) {
1421  num = i;
1422  /* Check if this index is available on this interface */
1423  list_for_each_entry(ix, &devices, list) {
1424  if (ix->iface == icd->iface && ix->devnum == i) {
1425  num = -1;
1426  break;
1427  }
1428  }
1429  }
1430 
1431  if (num < 0)
1432  /*
1433  * ok, we have 256 cameras on this host...
1434  * man, stay reasonable...
1435  */
1436  return -ENOMEM;
1437 
1438  icd->devnum = num;
1439  icd->use_count = 0;
1440  icd->host_priv = NULL;
1441  mutex_init(&icd->video_lock);
1442 
1443  list_add_tail(&icd->list, &devices);
1444 
1445  return 0;
1446 }
1447 
1448 static const struct v4l2_ioctl_ops soc_camera_ioctl_ops = {
1449  .vidioc_querycap = soc_camera_querycap,
1450  .vidioc_try_fmt_vid_cap = soc_camera_try_fmt_vid_cap,
1451  .vidioc_g_fmt_vid_cap = soc_camera_g_fmt_vid_cap,
1452  .vidioc_s_fmt_vid_cap = soc_camera_s_fmt_vid_cap,
1453  .vidioc_enum_fmt_vid_cap = soc_camera_enum_fmt_vid_cap,
1454  .vidioc_enum_input = soc_camera_enum_input,
1455  .vidioc_g_input = soc_camera_g_input,
1456  .vidioc_s_input = soc_camera_s_input,
1457  .vidioc_s_std = soc_camera_s_std,
1458  .vidioc_g_std = soc_camera_g_std,
1459  .vidioc_enum_framesizes = soc_camera_enum_framesizes,
1460  .vidioc_reqbufs = soc_camera_reqbufs,
1461  .vidioc_querybuf = soc_camera_querybuf,
1462  .vidioc_qbuf = soc_camera_qbuf,
1463  .vidioc_dqbuf = soc_camera_dqbuf,
1464  .vidioc_create_bufs = soc_camera_create_bufs,
1465  .vidioc_prepare_buf = soc_camera_prepare_buf,
1466  .vidioc_streamon = soc_camera_streamon,
1467  .vidioc_streamoff = soc_camera_streamoff,
1468  .vidioc_cropcap = soc_camera_cropcap,
1469  .vidioc_g_crop = soc_camera_g_crop,
1470  .vidioc_s_crop = soc_camera_s_crop,
1471  .vidioc_g_selection = soc_camera_g_selection,
1472  .vidioc_s_selection = soc_camera_s_selection,
1473  .vidioc_g_parm = soc_camera_g_parm,
1474  .vidioc_s_parm = soc_camera_s_parm,
1475  .vidioc_g_chip_ident = soc_camera_g_chip_ident,
1476 #ifdef CONFIG_VIDEO_ADV_DEBUG
1477  .vidioc_g_register = soc_camera_g_register,
1478  .vidioc_s_register = soc_camera_s_register,
1479 #endif
1480 };
1481 
1482 static int video_dev_create(struct soc_camera_device *icd)
1483 {
1484  struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
1485  struct video_device *vdev = video_device_alloc();
1486 
1487  if (!vdev)
1488  return -ENOMEM;
1489 
1490  strlcpy(vdev->name, ici->drv_name, sizeof(vdev->name));
1491 
1492  vdev->parent = icd->pdev;
1494  vdev->fops = &soc_camera_fops;
1495  vdev->ioctl_ops = &soc_camera_ioctl_ops;
1496  vdev->release = video_device_release;
1497  vdev->tvnorms = V4L2_STD_UNKNOWN;
1498  vdev->ctrl_handler = &icd->ctrl_handler;
1499  vdev->lock = &icd->video_lock;
1500 
1501  icd->vdev = vdev;
1502 
1503  return 0;
1504 }
1505 
1506 /*
1507  * Called from soc_camera_probe() above (with .video_lock held???)
1508  */
1509 static int soc_camera_video_start(struct soc_camera_device *icd)
1510 {
1511  const struct device_type *type = icd->vdev->dev.type;
1512  int ret;
1513 
1514  if (!icd->parent)
1515  return -ENODEV;
1516 
1517  ret = video_register_device(icd->vdev, VFL_TYPE_GRABBER, -1);
1518  if (ret < 0) {
1519  dev_err(icd->pdev, "video_register_device failed: %d\n", ret);
1520  return ret;
1521  }
1522 
1523  /* Restore device type, possibly set by the subdevice driver */
1524  icd->vdev->dev.type = type;
1525 
1526  return 0;
1527 }
1528 
1529 static int __devinit soc_camera_pdrv_probe(struct platform_device *pdev)
1530 {
1531  struct soc_camera_link *icl = pdev->dev.platform_data;
1532  struct soc_camera_device *icd;
1533 
1534  if (!icl)
1535  return -EINVAL;
1536 
1537  icd = devm_kzalloc(&pdev->dev, sizeof(*icd), GFP_KERNEL);
1538  if (!icd)
1539  return -ENOMEM;
1540 
1541  icd->iface = icl->bus_id;
1542  icd->link = icl;
1543  icd->pdev = &pdev->dev;
1544  platform_set_drvdata(pdev, icd);
1545 
1546  icd->user_width = DEFAULT_WIDTH;
1547  icd->user_height = DEFAULT_HEIGHT;
1548 
1549  return soc_camera_device_register(icd);
1550 }
1551 
1552 /*
1553  * Only called on rmmod for each platform device, since they are not
1554  * hot-pluggable. Now we know, that all our users - hosts and devices have
1555  * been unloaded already
1556  */
1557 static int __devexit soc_camera_pdrv_remove(struct platform_device *pdev)
1558 {
1559  struct soc_camera_device *icd = platform_get_drvdata(pdev);
1560 
1561  if (!icd)
1562  return -EINVAL;
1563 
1564  list_del(&icd->list);
1565 
1566  return 0;
1567 }
1568 
1569 static struct platform_driver __refdata soc_camera_pdrv = {
1570  .probe = soc_camera_pdrv_probe,
1571  .remove = __devexit_p(soc_camera_pdrv_remove),
1572  .driver = {
1573  .name = "soc-camera-pdrv",
1574  .owner = THIS_MODULE,
1575  },
1576 };
1577 
1578 module_platform_driver(soc_camera_pdrv);
1579 
1580 MODULE_DESCRIPTION("Image capture bus driver");
1581 MODULE_AUTHOR("Guennadi Liakhovetski <[email protected]>");
1582 MODULE_LICENSE("GPL");
1583 MODULE_ALIAS("platform:soc-camera-pdrv");