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