linux/drivers/media/i2c/mt9m001.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Driver for MT9M001 CMOS Image Sensor from Micron
   4 *
   5 * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
   6 */
   7
   8#include <linux/clk.h>
   9#include <linux/delay.h>
  10#include <linux/gpio/consumer.h>
  11#include <linux/i2c.h>
  12#include <linux/log2.h>
  13#include <linux/module.h>
  14#include <linux/pm_runtime.h>
  15#include <linux/slab.h>
  16#include <linux/videodev2.h>
  17
  18#include <media/v4l2-ctrls.h>
  19#include <media/v4l2-device.h>
  20#include <media/v4l2-event.h>
  21#include <media/v4l2-subdev.h>
  22
  23/*
  24 * mt9m001 i2c address 0x5d
  25 */
  26
  27/* mt9m001 selected register addresses */
  28#define MT9M001_CHIP_VERSION            0x00
  29#define MT9M001_ROW_START               0x01
  30#define MT9M001_COLUMN_START            0x02
  31#define MT9M001_WINDOW_HEIGHT           0x03
  32#define MT9M001_WINDOW_WIDTH            0x04
  33#define MT9M001_HORIZONTAL_BLANKING     0x05
  34#define MT9M001_VERTICAL_BLANKING       0x06
  35#define MT9M001_OUTPUT_CONTROL          0x07
  36#define MT9M001_SHUTTER_WIDTH           0x09
  37#define MT9M001_FRAME_RESTART           0x0b
  38#define MT9M001_SHUTTER_DELAY           0x0c
  39#define MT9M001_RESET                   0x0d
  40#define MT9M001_READ_OPTIONS1           0x1e
  41#define MT9M001_READ_OPTIONS2           0x20
  42#define MT9M001_GLOBAL_GAIN             0x35
  43#define MT9M001_CHIP_ENABLE             0xF1
  44
  45#define MT9M001_MAX_WIDTH               1280
  46#define MT9M001_MAX_HEIGHT              1024
  47#define MT9M001_MIN_WIDTH               48
  48#define MT9M001_MIN_HEIGHT              32
  49#define MT9M001_COLUMN_SKIP             20
  50#define MT9M001_ROW_SKIP                12
  51#define MT9M001_DEFAULT_HBLANK          9
  52#define MT9M001_DEFAULT_VBLANK          25
  53
  54/* MT9M001 has only one fixed colorspace per pixelcode */
  55struct mt9m001_datafmt {
  56        u32     code;
  57        enum v4l2_colorspace            colorspace;
  58};
  59
  60/* Find a data format by a pixel code in an array */
  61static const struct mt9m001_datafmt *mt9m001_find_datafmt(
  62        u32 code, const struct mt9m001_datafmt *fmt,
  63        int n)
  64{
  65        int i;
  66        for (i = 0; i < n; i++)
  67                if (fmt[i].code == code)
  68                        return fmt + i;
  69
  70        return NULL;
  71}
  72
  73static const struct mt9m001_datafmt mt9m001_colour_fmts[] = {
  74        /*
  75         * Order important: first natively supported,
  76         * second supported with a GPIO extender
  77         */
  78        {MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
  79        {MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
  80};
  81
  82static const struct mt9m001_datafmt mt9m001_monochrome_fmts[] = {
  83        /* Order important - see above */
  84        {MEDIA_BUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
  85        {MEDIA_BUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
  86};
  87
  88struct mt9m001 {
  89        struct v4l2_subdev subdev;
  90        struct v4l2_ctrl_handler hdl;
  91        struct {
  92                /* exposure/auto-exposure cluster */
  93                struct v4l2_ctrl *autoexposure;
  94                struct v4l2_ctrl *exposure;
  95        };
  96        bool streaming;
  97        struct mutex mutex;
  98        struct v4l2_rect rect;  /* Sensor window */
  99        struct clk *clk;
 100        struct gpio_desc *standby_gpio;
 101        struct gpio_desc *reset_gpio;
 102        const struct mt9m001_datafmt *fmt;
 103        const struct mt9m001_datafmt *fmts;
 104        int num_fmts;
 105        unsigned int total_h;
 106        unsigned short y_skip_top;      /* Lines to skip at the top */
 107        struct media_pad pad;
 108};
 109
 110static struct mt9m001 *to_mt9m001(const struct i2c_client *client)
 111{
 112        return container_of(i2c_get_clientdata(client), struct mt9m001, subdev);
 113}
 114
 115static int reg_read(struct i2c_client *client, const u8 reg)
 116{
 117        return i2c_smbus_read_word_swapped(client, reg);
 118}
 119
 120static int reg_write(struct i2c_client *client, const u8 reg,
 121                     const u16 data)
 122{
 123        return i2c_smbus_write_word_swapped(client, reg, data);
 124}
 125
 126static int reg_set(struct i2c_client *client, const u8 reg,
 127                   const u16 data)
 128{
 129        int ret;
 130
 131        ret = reg_read(client, reg);
 132        if (ret < 0)
 133                return ret;
 134        return reg_write(client, reg, ret | data);
 135}
 136
 137static int reg_clear(struct i2c_client *client, const u8 reg,
 138                     const u16 data)
 139{
 140        int ret;
 141
 142        ret = reg_read(client, reg);
 143        if (ret < 0)
 144                return ret;
 145        return reg_write(client, reg, ret & ~data);
 146}
 147
 148struct mt9m001_reg {
 149        u8 reg;
 150        u16 data;
 151};
 152
 153static int multi_reg_write(struct i2c_client *client,
 154                           const struct mt9m001_reg *regs, int num)
 155{
 156        int i;
 157
 158        for (i = 0; i < num; i++) {
 159                int ret = reg_write(client, regs[i].reg, regs[i].data);
 160
 161                if (ret)
 162                        return ret;
 163        }
 164
 165        return 0;
 166}
 167
 168static int mt9m001_init(struct i2c_client *client)
 169{
 170        const struct mt9m001_reg init_regs[] = {
 171                /*
 172                 * Issue a soft reset. This returns all registers to their
 173                 * default values.
 174                 */
 175                { MT9M001_RESET, 1 },
 176                { MT9M001_RESET, 0 },
 177                /* Disable chip, synchronous option update */
 178                { MT9M001_OUTPUT_CONTROL, 0 }
 179        };
 180
 181        dev_dbg(&client->dev, "%s\n", __func__);
 182
 183        return multi_reg_write(client, init_regs, ARRAY_SIZE(init_regs));
 184}
 185
 186static int mt9m001_apply_selection(struct v4l2_subdev *sd)
 187{
 188        struct i2c_client *client = v4l2_get_subdevdata(sd);
 189        struct mt9m001 *mt9m001 = to_mt9m001(client);
 190        const struct mt9m001_reg regs[] = {
 191                /* Blanking and start values - default... */
 192                { MT9M001_HORIZONTAL_BLANKING, MT9M001_DEFAULT_HBLANK },
 193                { MT9M001_VERTICAL_BLANKING, MT9M001_DEFAULT_VBLANK },
 194                /*
 195                 * The caller provides a supported format, as verified per
 196                 * call to .set_fmt(FORMAT_TRY).
 197                 */
 198                { MT9M001_COLUMN_START, mt9m001->rect.left },
 199                { MT9M001_ROW_START, mt9m001->rect.top },
 200                { MT9M001_WINDOW_WIDTH, mt9m001->rect.width - 1 },
 201                { MT9M001_WINDOW_HEIGHT,
 202                        mt9m001->rect.height + mt9m001->y_skip_top - 1 },
 203        };
 204
 205        return multi_reg_write(client, regs, ARRAY_SIZE(regs));
 206}
 207
 208static int mt9m001_s_stream(struct v4l2_subdev *sd, int enable)
 209{
 210        struct i2c_client *client = v4l2_get_subdevdata(sd);
 211        struct mt9m001 *mt9m001 = to_mt9m001(client);
 212        int ret = 0;
 213
 214        mutex_lock(&mt9m001->mutex);
 215
 216        if (mt9m001->streaming == enable)
 217                goto done;
 218
 219        if (enable) {
 220                ret = pm_runtime_get_sync(&client->dev);
 221                if (ret < 0)
 222                        goto put_unlock;
 223
 224                ret = mt9m001_apply_selection(sd);
 225                if (ret)
 226                        goto put_unlock;
 227
 228                ret = __v4l2_ctrl_handler_setup(&mt9m001->hdl);
 229                if (ret)
 230                        goto put_unlock;
 231
 232                /* Switch to master "normal" mode */
 233                ret = reg_write(client, MT9M001_OUTPUT_CONTROL, 2);
 234                if (ret < 0)
 235                        goto put_unlock;
 236        } else {
 237                /* Switch to master stop sensor readout */
 238                reg_write(client, MT9M001_OUTPUT_CONTROL, 0);
 239                pm_runtime_put(&client->dev);
 240        }
 241
 242        mt9m001->streaming = enable;
 243done:
 244        mutex_unlock(&mt9m001->mutex);
 245
 246        return 0;
 247
 248put_unlock:
 249        pm_runtime_put(&client->dev);
 250        mutex_unlock(&mt9m001->mutex);
 251
 252        return ret;
 253}
 254
 255static int mt9m001_set_selection(struct v4l2_subdev *sd,
 256                struct v4l2_subdev_pad_config *cfg,
 257                struct v4l2_subdev_selection *sel)
 258{
 259        struct i2c_client *client = v4l2_get_subdevdata(sd);
 260        struct mt9m001 *mt9m001 = to_mt9m001(client);
 261        struct v4l2_rect rect = sel->r;
 262
 263        if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
 264            sel->target != V4L2_SEL_TGT_CROP)
 265                return -EINVAL;
 266
 267        if (mt9m001->fmts == mt9m001_colour_fmts)
 268                /*
 269                 * Bayer format - even number of rows for simplicity,
 270                 * but let the user play with the top row.
 271                 */
 272                rect.height = ALIGN(rect.height, 2);
 273
 274        /* Datasheet requirement: see register description */
 275        rect.width = ALIGN(rect.width, 2);
 276        rect.left = ALIGN(rect.left, 2);
 277
 278        rect.width = clamp_t(u32, rect.width, MT9M001_MIN_WIDTH,
 279                        MT9M001_MAX_WIDTH);
 280        rect.left = clamp_t(u32, rect.left, MT9M001_COLUMN_SKIP,
 281                        MT9M001_COLUMN_SKIP + MT9M001_MAX_WIDTH - rect.width);
 282
 283        rect.height = clamp_t(u32, rect.height, MT9M001_MIN_HEIGHT,
 284                        MT9M001_MAX_HEIGHT);
 285        rect.top = clamp_t(u32, rect.top, MT9M001_ROW_SKIP,
 286                        MT9M001_ROW_SKIP + MT9M001_MAX_HEIGHT - rect.height);
 287
 288        mt9m001->total_h = rect.height + mt9m001->y_skip_top +
 289                           MT9M001_DEFAULT_VBLANK;
 290
 291        mt9m001->rect = rect;
 292
 293        return 0;
 294}
 295
 296static int mt9m001_get_selection(struct v4l2_subdev *sd,
 297                struct v4l2_subdev_pad_config *cfg,
 298                struct v4l2_subdev_selection *sel)
 299{
 300        struct i2c_client *client = v4l2_get_subdevdata(sd);
 301        struct mt9m001 *mt9m001 = to_mt9m001(client);
 302
 303        if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE)
 304                return -EINVAL;
 305
 306        switch (sel->target) {
 307        case V4L2_SEL_TGT_CROP_BOUNDS:
 308                sel->r.left = MT9M001_COLUMN_SKIP;
 309                sel->r.top = MT9M001_ROW_SKIP;
 310                sel->r.width = MT9M001_MAX_WIDTH;
 311                sel->r.height = MT9M001_MAX_HEIGHT;
 312                return 0;
 313        case V4L2_SEL_TGT_CROP:
 314                sel->r = mt9m001->rect;
 315                return 0;
 316        default:
 317                return -EINVAL;
 318        }
 319}
 320
 321static int mt9m001_get_fmt(struct v4l2_subdev *sd,
 322                struct v4l2_subdev_pad_config *cfg,
 323                struct v4l2_subdev_format *format)
 324{
 325        struct i2c_client *client = v4l2_get_subdevdata(sd);
 326        struct mt9m001 *mt9m001 = to_mt9m001(client);
 327        struct v4l2_mbus_framefmt *mf = &format->format;
 328
 329        if (format->pad)
 330                return -EINVAL;
 331
 332        if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
 333                mf = v4l2_subdev_get_try_format(sd, cfg, 0);
 334                format->format = *mf;
 335                return 0;
 336        }
 337
 338        mf->width       = mt9m001->rect.width;
 339        mf->height      = mt9m001->rect.height;
 340        mf->code        = mt9m001->fmt->code;
 341        mf->colorspace  = mt9m001->fmt->colorspace;
 342        mf->field       = V4L2_FIELD_NONE;
 343        mf->ycbcr_enc   = V4L2_YCBCR_ENC_DEFAULT;
 344        mf->quantization = V4L2_QUANTIZATION_DEFAULT;
 345        mf->xfer_func   = V4L2_XFER_FUNC_DEFAULT;
 346
 347        return 0;
 348}
 349
 350static int mt9m001_s_fmt(struct v4l2_subdev *sd,
 351                         const struct mt9m001_datafmt *fmt,
 352                         struct v4l2_mbus_framefmt *mf)
 353{
 354        struct i2c_client *client = v4l2_get_subdevdata(sd);
 355        struct mt9m001 *mt9m001 = to_mt9m001(client);
 356        struct v4l2_subdev_selection sel = {
 357                .which = V4L2_SUBDEV_FORMAT_ACTIVE,
 358                .target = V4L2_SEL_TGT_CROP,
 359                .r.left = mt9m001->rect.left,
 360                .r.top = mt9m001->rect.top,
 361                .r.width = mf->width,
 362                .r.height = mf->height,
 363        };
 364        int ret;
 365
 366        /* No support for scaling so far, just crop. TODO: use skipping */
 367        ret = mt9m001_set_selection(sd, NULL, &sel);
 368        if (!ret) {
 369                mf->width       = mt9m001->rect.width;
 370                mf->height      = mt9m001->rect.height;
 371                mt9m001->fmt    = fmt;
 372                mf->colorspace  = fmt->colorspace;
 373        }
 374
 375        return ret;
 376}
 377
 378static int mt9m001_set_fmt(struct v4l2_subdev *sd,
 379                struct v4l2_subdev_pad_config *cfg,
 380                struct v4l2_subdev_format *format)
 381{
 382        struct v4l2_mbus_framefmt *mf = &format->format;
 383        struct i2c_client *client = v4l2_get_subdevdata(sd);
 384        struct mt9m001 *mt9m001 = to_mt9m001(client);
 385        const struct mt9m001_datafmt *fmt;
 386
 387        if (format->pad)
 388                return -EINVAL;
 389
 390        v4l_bound_align_image(&mf->width, MT9M001_MIN_WIDTH,
 391                MT9M001_MAX_WIDTH, 1,
 392                &mf->height, MT9M001_MIN_HEIGHT + mt9m001->y_skip_top,
 393                MT9M001_MAX_HEIGHT + mt9m001->y_skip_top, 0, 0);
 394
 395        if (mt9m001->fmts == mt9m001_colour_fmts)
 396                mf->height = ALIGN(mf->height - 1, 2);
 397
 398        fmt = mt9m001_find_datafmt(mf->code, mt9m001->fmts,
 399                                   mt9m001->num_fmts);
 400        if (!fmt) {
 401                fmt = mt9m001->fmt;
 402                mf->code = fmt->code;
 403        }
 404
 405        mf->colorspace  = fmt->colorspace;
 406        mf->field       = V4L2_FIELD_NONE;
 407        mf->ycbcr_enc   = V4L2_YCBCR_ENC_DEFAULT;
 408        mf->quantization = V4L2_QUANTIZATION_DEFAULT;
 409        mf->xfer_func   = V4L2_XFER_FUNC_DEFAULT;
 410
 411        if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE)
 412                return mt9m001_s_fmt(sd, fmt, mf);
 413        cfg->try_fmt = *mf;
 414        return 0;
 415}
 416
 417#ifdef CONFIG_VIDEO_ADV_DEBUG
 418static int mt9m001_g_register(struct v4l2_subdev *sd,
 419                              struct v4l2_dbg_register *reg)
 420{
 421        struct i2c_client *client = v4l2_get_subdevdata(sd);
 422
 423        if (reg->reg > 0xff)
 424                return -EINVAL;
 425
 426        reg->size = 2;
 427        reg->val = reg_read(client, reg->reg);
 428
 429        if (reg->val > 0xffff)
 430                return -EIO;
 431
 432        return 0;
 433}
 434
 435static int mt9m001_s_register(struct v4l2_subdev *sd,
 436                              const struct v4l2_dbg_register *reg)
 437{
 438        struct i2c_client *client = v4l2_get_subdevdata(sd);
 439
 440        if (reg->reg > 0xff)
 441                return -EINVAL;
 442
 443        if (reg_write(client, reg->reg, reg->val) < 0)
 444                return -EIO;
 445
 446        return 0;
 447}
 448#endif
 449
 450static int mt9m001_power_on(struct device *dev)
 451{
 452        struct i2c_client *client = to_i2c_client(dev);
 453        struct mt9m001 *mt9m001 = to_mt9m001(client);
 454        int ret;
 455
 456        ret = clk_prepare_enable(mt9m001->clk);
 457        if (ret)
 458                return ret;
 459
 460        if (mt9m001->standby_gpio) {
 461                gpiod_set_value_cansleep(mt9m001->standby_gpio, 0);
 462                usleep_range(1000, 2000);
 463        }
 464
 465        if (mt9m001->reset_gpio) {
 466                gpiod_set_value_cansleep(mt9m001->reset_gpio, 1);
 467                usleep_range(1000, 2000);
 468                gpiod_set_value_cansleep(mt9m001->reset_gpio, 0);
 469                usleep_range(1000, 2000);
 470        }
 471
 472        return 0;
 473}
 474
 475static int mt9m001_power_off(struct device *dev)
 476{
 477        struct i2c_client *client = to_i2c_client(dev);
 478        struct mt9m001 *mt9m001 = to_mt9m001(client);
 479
 480        gpiod_set_value_cansleep(mt9m001->standby_gpio, 1);
 481        clk_disable_unprepare(mt9m001->clk);
 482
 483        return 0;
 484}
 485
 486static int mt9m001_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
 487{
 488        struct mt9m001 *mt9m001 = container_of(ctrl->handler,
 489                                               struct mt9m001, hdl);
 490        s32 min, max;
 491
 492        switch (ctrl->id) {
 493        case V4L2_CID_EXPOSURE_AUTO:
 494                min = mt9m001->exposure->minimum;
 495                max = mt9m001->exposure->maximum;
 496                mt9m001->exposure->val =
 497                        (524 + (mt9m001->total_h - 1) * (max - min)) / 1048 + min;
 498                break;
 499        }
 500        return 0;
 501}
 502
 503static int mt9m001_s_ctrl(struct v4l2_ctrl *ctrl)
 504{
 505        struct mt9m001 *mt9m001 = container_of(ctrl->handler,
 506                                               struct mt9m001, hdl);
 507        struct v4l2_subdev *sd = &mt9m001->subdev;
 508        struct i2c_client *client = v4l2_get_subdevdata(sd);
 509        struct v4l2_ctrl *exp = mt9m001->exposure;
 510        int data;
 511        int ret;
 512
 513        if (!pm_runtime_get_if_in_use(&client->dev))
 514                return 0;
 515
 516        switch (ctrl->id) {
 517        case V4L2_CID_VFLIP:
 518                if (ctrl->val)
 519                        ret = reg_set(client, MT9M001_READ_OPTIONS2, 0x8000);
 520                else
 521                        ret = reg_clear(client, MT9M001_READ_OPTIONS2, 0x8000);
 522                break;
 523
 524        case V4L2_CID_GAIN:
 525                /* See Datasheet Table 7, Gain settings. */
 526                if (ctrl->val <= ctrl->default_value) {
 527                        /* Pack it into 0..1 step 0.125, register values 0..8 */
 528                        unsigned long range = ctrl->default_value - ctrl->minimum;
 529                        data = ((ctrl->val - (s32)ctrl->minimum) * 8 + range / 2) / range;
 530
 531                        dev_dbg(&client->dev, "Setting gain %d\n", data);
 532                        ret = reg_write(client, MT9M001_GLOBAL_GAIN, data);
 533                } else {
 534                        /* Pack it into 1.125..15 variable step, register values 9..67 */
 535                        /* We assume qctrl->maximum - qctrl->default_value - 1 > 0 */
 536                        unsigned long range = ctrl->maximum - ctrl->default_value - 1;
 537                        unsigned long gain = ((ctrl->val - (s32)ctrl->default_value - 1) *
 538                                               111 + range / 2) / range + 9;
 539
 540                        if (gain <= 32)
 541                                data = gain;
 542                        else if (gain <= 64)
 543                                data = ((gain - 32) * 16 + 16) / 32 + 80;
 544                        else
 545                                data = ((gain - 64) * 7 + 28) / 56 + 96;
 546
 547                        dev_dbg(&client->dev, "Setting gain from %d to %d\n",
 548                                 reg_read(client, MT9M001_GLOBAL_GAIN), data);
 549                        ret = reg_write(client, MT9M001_GLOBAL_GAIN, data);
 550                }
 551                break;
 552
 553        case V4L2_CID_EXPOSURE_AUTO:
 554                if (ctrl->val == V4L2_EXPOSURE_MANUAL) {
 555                        unsigned long range = exp->maximum - exp->minimum;
 556                        unsigned long shutter = ((exp->val - (s32)exp->minimum) * 1048 +
 557                                                 range / 2) / range + 1;
 558
 559                        dev_dbg(&client->dev,
 560                                "Setting shutter width from %d to %lu\n",
 561                                reg_read(client, MT9M001_SHUTTER_WIDTH), shutter);
 562                        ret = reg_write(client, MT9M001_SHUTTER_WIDTH, shutter);
 563                } else {
 564                        mt9m001->total_h = mt9m001->rect.height +
 565                                mt9m001->y_skip_top + MT9M001_DEFAULT_VBLANK;
 566                        ret = reg_write(client, MT9M001_SHUTTER_WIDTH,
 567                                        mt9m001->total_h);
 568                }
 569                break;
 570        default:
 571                ret = -EINVAL;
 572                break;
 573        }
 574
 575        pm_runtime_put(&client->dev);
 576
 577        return ret;
 578}
 579
 580/*
 581 * Interface active, can use i2c. If it fails, it can indeed mean, that
 582 * this wasn't our capture interface, so, we wait for the right one
 583 */
 584static int mt9m001_video_probe(struct i2c_client *client)
 585{
 586        struct mt9m001 *mt9m001 = to_mt9m001(client);
 587        s32 data;
 588        int ret;
 589
 590        /* Enable the chip */
 591        data = reg_write(client, MT9M001_CHIP_ENABLE, 1);
 592        dev_dbg(&client->dev, "write: %d\n", data);
 593
 594        /* Read out the chip version register */
 595        data = reg_read(client, MT9M001_CHIP_VERSION);
 596
 597        /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */
 598        switch (data) {
 599        case 0x8411:
 600        case 0x8421:
 601                mt9m001->fmts = mt9m001_colour_fmts;
 602                mt9m001->num_fmts = ARRAY_SIZE(mt9m001_colour_fmts);
 603                break;
 604        case 0x8431:
 605                mt9m001->fmts = mt9m001_monochrome_fmts;
 606                mt9m001->num_fmts = ARRAY_SIZE(mt9m001_monochrome_fmts);
 607                break;
 608        default:
 609                dev_err(&client->dev,
 610                        "No MT9M001 chip detected, register read %x\n", data);
 611                ret = -ENODEV;
 612                goto done;
 613        }
 614
 615        mt9m001->fmt = &mt9m001->fmts[0];
 616
 617        dev_info(&client->dev, "Detected a MT9M001 chip ID %x (%s)\n", data,
 618                 data == 0x8431 ? "C12STM" : "C12ST");
 619
 620        ret = mt9m001_init(client);
 621        if (ret < 0) {
 622                dev_err(&client->dev, "Failed to initialise the camera\n");
 623                goto done;
 624        }
 625
 626        /* mt9m001_init() has reset the chip, returning registers to defaults */
 627        ret = v4l2_ctrl_handler_setup(&mt9m001->hdl);
 628
 629done:
 630        return ret;
 631}
 632
 633static int mt9m001_g_skip_top_lines(struct v4l2_subdev *sd, u32 *lines)
 634{
 635        struct i2c_client *client = v4l2_get_subdevdata(sd);
 636        struct mt9m001 *mt9m001 = to_mt9m001(client);
 637
 638        *lines = mt9m001->y_skip_top;
 639
 640        return 0;
 641}
 642
 643static const struct v4l2_ctrl_ops mt9m001_ctrl_ops = {
 644        .g_volatile_ctrl = mt9m001_g_volatile_ctrl,
 645        .s_ctrl = mt9m001_s_ctrl,
 646};
 647
 648static const struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
 649        .log_status = v4l2_ctrl_subdev_log_status,
 650        .subscribe_event = v4l2_ctrl_subdev_subscribe_event,
 651        .unsubscribe_event = v4l2_event_subdev_unsubscribe,
 652#ifdef CONFIG_VIDEO_ADV_DEBUG
 653        .g_register     = mt9m001_g_register,
 654        .s_register     = mt9m001_s_register,
 655#endif
 656};
 657
 658static int mt9m001_init_cfg(struct v4l2_subdev *sd,
 659                            struct v4l2_subdev_pad_config *cfg)
 660{
 661        struct i2c_client *client = v4l2_get_subdevdata(sd);
 662        struct mt9m001 *mt9m001 = to_mt9m001(client);
 663        struct v4l2_mbus_framefmt *try_fmt =
 664                v4l2_subdev_get_try_format(sd, cfg, 0);
 665
 666        try_fmt->width          = MT9M001_MAX_WIDTH;
 667        try_fmt->height         = MT9M001_MAX_HEIGHT;
 668        try_fmt->code           = mt9m001->fmts[0].code;
 669        try_fmt->colorspace     = mt9m001->fmts[0].colorspace;
 670        try_fmt->field          = V4L2_FIELD_NONE;
 671        try_fmt->ycbcr_enc      = V4L2_YCBCR_ENC_DEFAULT;
 672        try_fmt->quantization   = V4L2_QUANTIZATION_DEFAULT;
 673        try_fmt->xfer_func      = V4L2_XFER_FUNC_DEFAULT;
 674
 675        return 0;
 676}
 677
 678static int mt9m001_enum_mbus_code(struct v4l2_subdev *sd,
 679                struct v4l2_subdev_pad_config *cfg,
 680                struct v4l2_subdev_mbus_code_enum *code)
 681{
 682        struct i2c_client *client = v4l2_get_subdevdata(sd);
 683        struct mt9m001 *mt9m001 = to_mt9m001(client);
 684
 685        if (code->pad || code->index >= mt9m001->num_fmts)
 686                return -EINVAL;
 687
 688        code->code = mt9m001->fmts[code->index].code;
 689        return 0;
 690}
 691
 692static int mt9m001_g_mbus_config(struct v4l2_subdev *sd,
 693                                struct v4l2_mbus_config *cfg)
 694{
 695        /* MT9M001 has all capture_format parameters fixed */
 696        cfg->flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
 697                V4L2_MBUS_HSYNC_ACTIVE_HIGH | V4L2_MBUS_VSYNC_ACTIVE_HIGH |
 698                V4L2_MBUS_DATA_ACTIVE_HIGH | V4L2_MBUS_MASTER;
 699        cfg->type = V4L2_MBUS_PARALLEL;
 700
 701        return 0;
 702}
 703
 704static const struct v4l2_subdev_video_ops mt9m001_subdev_video_ops = {
 705        .s_stream       = mt9m001_s_stream,
 706        .g_mbus_config  = mt9m001_g_mbus_config,
 707};
 708
 709static const struct v4l2_subdev_sensor_ops mt9m001_subdev_sensor_ops = {
 710        .g_skip_top_lines       = mt9m001_g_skip_top_lines,
 711};
 712
 713static const struct v4l2_subdev_pad_ops mt9m001_subdev_pad_ops = {
 714        .init_cfg       = mt9m001_init_cfg,
 715        .enum_mbus_code = mt9m001_enum_mbus_code,
 716        .get_selection  = mt9m001_get_selection,
 717        .set_selection  = mt9m001_set_selection,
 718        .get_fmt        = mt9m001_get_fmt,
 719        .set_fmt        = mt9m001_set_fmt,
 720};
 721
 722static const struct v4l2_subdev_ops mt9m001_subdev_ops = {
 723        .core   = &mt9m001_subdev_core_ops,
 724        .video  = &mt9m001_subdev_video_ops,
 725        .sensor = &mt9m001_subdev_sensor_ops,
 726        .pad    = &mt9m001_subdev_pad_ops,
 727};
 728
 729static int mt9m001_probe(struct i2c_client *client,
 730                         const struct i2c_device_id *did)
 731{
 732        struct mt9m001 *mt9m001;
 733        struct i2c_adapter *adapter = client->adapter;
 734        int ret;
 735
 736        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
 737                dev_warn(&adapter->dev,
 738                         "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
 739                return -EIO;
 740        }
 741
 742        mt9m001 = devm_kzalloc(&client->dev, sizeof(*mt9m001), GFP_KERNEL);
 743        if (!mt9m001)
 744                return -ENOMEM;
 745
 746        mt9m001->clk = devm_clk_get(&client->dev, NULL);
 747        if (IS_ERR(mt9m001->clk))
 748                return PTR_ERR(mt9m001->clk);
 749
 750        mt9m001->standby_gpio = devm_gpiod_get_optional(&client->dev, "standby",
 751                                                        GPIOD_OUT_LOW);
 752        if (IS_ERR(mt9m001->standby_gpio))
 753                return PTR_ERR(mt9m001->standby_gpio);
 754
 755        mt9m001->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
 756                                                      GPIOD_OUT_LOW);
 757        if (IS_ERR(mt9m001->reset_gpio))
 758                return PTR_ERR(mt9m001->reset_gpio);
 759
 760        v4l2_i2c_subdev_init(&mt9m001->subdev, client, &mt9m001_subdev_ops);
 761        mt9m001->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
 762                                 V4L2_SUBDEV_FL_HAS_EVENTS;
 763        v4l2_ctrl_handler_init(&mt9m001->hdl, 4);
 764        v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
 765                        V4L2_CID_VFLIP, 0, 1, 1, 0);
 766        v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
 767                        V4L2_CID_GAIN, 0, 127, 1, 64);
 768        mt9m001->exposure = v4l2_ctrl_new_std(&mt9m001->hdl, &mt9m001_ctrl_ops,
 769                        V4L2_CID_EXPOSURE, 1, 255, 1, 255);
 770        /*
 771         * Simulated autoexposure. If enabled, we calculate shutter width
 772         * ourselves in the driver based on vertical blanking and frame width
 773         */
 774        mt9m001->autoexposure = v4l2_ctrl_new_std_menu(&mt9m001->hdl,
 775                        &mt9m001_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 1, 0,
 776                        V4L2_EXPOSURE_AUTO);
 777        mt9m001->subdev.ctrl_handler = &mt9m001->hdl;
 778        if (mt9m001->hdl.error)
 779                return mt9m001->hdl.error;
 780
 781        v4l2_ctrl_auto_cluster(2, &mt9m001->autoexposure,
 782                                        V4L2_EXPOSURE_MANUAL, true);
 783
 784        mutex_init(&mt9m001->mutex);
 785        mt9m001->hdl.lock = &mt9m001->mutex;
 786
 787        /* Second stage probe - when a capture adapter is there */
 788        mt9m001->y_skip_top     = 0;
 789        mt9m001->rect.left      = MT9M001_COLUMN_SKIP;
 790        mt9m001->rect.top       = MT9M001_ROW_SKIP;
 791        mt9m001->rect.width     = MT9M001_MAX_WIDTH;
 792        mt9m001->rect.height    = MT9M001_MAX_HEIGHT;
 793
 794        ret = mt9m001_power_on(&client->dev);
 795        if (ret)
 796                goto error_hdl_free;
 797
 798        pm_runtime_set_active(&client->dev);
 799        pm_runtime_enable(&client->dev);
 800
 801        ret = mt9m001_video_probe(client);
 802        if (ret)
 803                goto error_power_off;
 804
 805        mt9m001->pad.flags = MEDIA_PAD_FL_SOURCE;
 806        mt9m001->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
 807        ret = media_entity_pads_init(&mt9m001->subdev.entity, 1, &mt9m001->pad);
 808        if (ret)
 809                goto error_power_off;
 810
 811        ret = v4l2_async_register_subdev(&mt9m001->subdev);
 812        if (ret)
 813                goto error_entity_cleanup;
 814
 815        pm_runtime_idle(&client->dev);
 816
 817        return 0;
 818
 819error_entity_cleanup:
 820        media_entity_cleanup(&mt9m001->subdev.entity);
 821error_power_off:
 822        pm_runtime_disable(&client->dev);
 823        pm_runtime_set_suspended(&client->dev);
 824        mt9m001_power_off(&client->dev);
 825
 826error_hdl_free:
 827        v4l2_ctrl_handler_free(&mt9m001->hdl);
 828        mutex_destroy(&mt9m001->mutex);
 829
 830        return ret;
 831}
 832
 833static int mt9m001_remove(struct i2c_client *client)
 834{
 835        struct mt9m001 *mt9m001 = to_mt9m001(client);
 836
 837        pm_runtime_get_sync(&client->dev);
 838
 839        v4l2_async_unregister_subdev(&mt9m001->subdev);
 840        media_entity_cleanup(&mt9m001->subdev.entity);
 841
 842        pm_runtime_disable(&client->dev);
 843        pm_runtime_set_suspended(&client->dev);
 844        pm_runtime_put_noidle(&client->dev);
 845        mt9m001_power_off(&client->dev);
 846
 847        v4l2_ctrl_handler_free(&mt9m001->hdl);
 848        mutex_destroy(&mt9m001->mutex);
 849
 850        return 0;
 851}
 852
 853static const struct i2c_device_id mt9m001_id[] = {
 854        { "mt9m001", 0 },
 855        { }
 856};
 857MODULE_DEVICE_TABLE(i2c, mt9m001_id);
 858
 859static const struct dev_pm_ops mt9m001_pm_ops = {
 860        SET_RUNTIME_PM_OPS(mt9m001_power_off, mt9m001_power_on, NULL)
 861};
 862
 863static const struct of_device_id mt9m001_of_match[] = {
 864        { .compatible = "onnn,mt9m001", },
 865        { /* sentinel */ },
 866};
 867MODULE_DEVICE_TABLE(of, mt9m001_of_match);
 868
 869static struct i2c_driver mt9m001_i2c_driver = {
 870        .driver = {
 871                .name = "mt9m001",
 872                .pm = &mt9m001_pm_ops,
 873                .of_match_table = mt9m001_of_match,
 874        },
 875        .probe          = mt9m001_probe,
 876        .remove         = mt9m001_remove,
 877        .id_table       = mt9m001_id,
 878};
 879
 880module_i2c_driver(mt9m001_i2c_driver);
 881
 882MODULE_DESCRIPTION("Micron MT9M001 Camera driver");
 883MODULE_AUTHOR("Guennadi Liakhovetski <kernel@pengutronix.de>");
 884MODULE_LICENSE("GPL v2");
 885