linux/drivers/media/video/mt9m111.c
<<
>>
Prefs
   1/*
   2 * Driver for MT9M111/MT9M112/MT9M131 CMOS Image Sensor from Micron/Aptina
   3 *
   4 * Copyright (C) 2008, Robert Jarzmik <robert.jarzmik@free.fr>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <linux/videodev2.h>
  11#include <linux/slab.h>
  12#include <linux/i2c.h>
  13#include <linux/log2.h>
  14#include <linux/gpio.h>
  15#include <linux/delay.h>
  16
  17#include <media/v4l2-common.h>
  18#include <media/v4l2-chip-ident.h>
  19#include <media/soc_camera.h>
  20
  21/*
  22 * MT9M111, MT9M112 and MT9M131:
  23 * i2c address is 0x48 or 0x5d (depending on SADDR pin)
  24 * The platform has to define i2c_board_info and call i2c_register_board_info()
  25 */
  26
  27/*
  28 * Sensor core register addresses (0x000..0x0ff)
  29 */
  30#define MT9M111_CHIP_VERSION            0x000
  31#define MT9M111_ROW_START               0x001
  32#define MT9M111_COLUMN_START            0x002
  33#define MT9M111_WINDOW_HEIGHT           0x003
  34#define MT9M111_WINDOW_WIDTH            0x004
  35#define MT9M111_HORIZONTAL_BLANKING_B   0x005
  36#define MT9M111_VERTICAL_BLANKING_B     0x006
  37#define MT9M111_HORIZONTAL_BLANKING_A   0x007
  38#define MT9M111_VERTICAL_BLANKING_A     0x008
  39#define MT9M111_SHUTTER_WIDTH           0x009
  40#define MT9M111_ROW_SPEED               0x00a
  41#define MT9M111_EXTRA_DELAY             0x00b
  42#define MT9M111_SHUTTER_DELAY           0x00c
  43#define MT9M111_RESET                   0x00d
  44#define MT9M111_READ_MODE_B             0x020
  45#define MT9M111_READ_MODE_A             0x021
  46#define MT9M111_FLASH_CONTROL           0x023
  47#define MT9M111_GREEN1_GAIN             0x02b
  48#define MT9M111_BLUE_GAIN               0x02c
  49#define MT9M111_RED_GAIN                0x02d
  50#define MT9M111_GREEN2_GAIN             0x02e
  51#define MT9M111_GLOBAL_GAIN             0x02f
  52#define MT9M111_CONTEXT_CONTROL         0x0c8
  53#define MT9M111_PAGE_MAP                0x0f0
  54#define MT9M111_BYTE_WISE_ADDR          0x0f1
  55
  56#define MT9M111_RESET_SYNC_CHANGES      (1 << 15)
  57#define MT9M111_RESET_RESTART_BAD_FRAME (1 << 9)
  58#define MT9M111_RESET_SHOW_BAD_FRAMES   (1 << 8)
  59#define MT9M111_RESET_RESET_SOC         (1 << 5)
  60#define MT9M111_RESET_OUTPUT_DISABLE    (1 << 4)
  61#define MT9M111_RESET_CHIP_ENABLE       (1 << 3)
  62#define MT9M111_RESET_ANALOG_STANDBY    (1 << 2)
  63#define MT9M111_RESET_RESTART_FRAME     (1 << 1)
  64#define MT9M111_RESET_RESET_MODE        (1 << 0)
  65
  66#define MT9M111_RMB_MIRROR_COLS         (1 << 1)
  67#define MT9M111_RMB_MIRROR_ROWS         (1 << 0)
  68#define MT9M111_CTXT_CTRL_RESTART       (1 << 15)
  69#define MT9M111_CTXT_CTRL_DEFECTCOR_B   (1 << 12)
  70#define MT9M111_CTXT_CTRL_RESIZE_B      (1 << 10)
  71#define MT9M111_CTXT_CTRL_CTRL2_B       (1 << 9)
  72#define MT9M111_CTXT_CTRL_GAMMA_B       (1 << 8)
  73#define MT9M111_CTXT_CTRL_XENON_EN      (1 << 7)
  74#define MT9M111_CTXT_CTRL_READ_MODE_B   (1 << 3)
  75#define MT9M111_CTXT_CTRL_LED_FLASH_EN  (1 << 2)
  76#define MT9M111_CTXT_CTRL_VBLANK_SEL_B  (1 << 1)
  77#define MT9M111_CTXT_CTRL_HBLANK_SEL_B  (1 << 0)
  78
  79/*
  80 * Colorpipe register addresses (0x100..0x1ff)
  81 */
  82#define MT9M111_OPER_MODE_CTRL          0x106
  83#define MT9M111_OUTPUT_FORMAT_CTRL      0x108
  84#define MT9M111_REDUCER_XZOOM_B         0x1a0
  85#define MT9M111_REDUCER_XSIZE_B         0x1a1
  86#define MT9M111_REDUCER_YZOOM_B         0x1a3
  87#define MT9M111_REDUCER_YSIZE_B         0x1a4
  88#define MT9M111_REDUCER_XZOOM_A         0x1a6
  89#define MT9M111_REDUCER_XSIZE_A         0x1a7
  90#define MT9M111_REDUCER_YZOOM_A         0x1a9
  91#define MT9M111_REDUCER_YSIZE_A         0x1aa
  92
  93#define MT9M111_OUTPUT_FORMAT_CTRL2_A   0x13a
  94#define MT9M111_OUTPUT_FORMAT_CTRL2_B   0x19b
  95
  96#define MT9M111_OPMODE_AUTOEXPO_EN      (1 << 14)
  97#define MT9M111_OPMODE_AUTOWHITEBAL_EN  (1 << 1)
  98
  99#define MT9M111_OUTFMT_PROCESSED_BAYER  (1 << 14)
 100#define MT9M111_OUTFMT_BYPASS_IFP       (1 << 10)
 101#define MT9M111_OUTFMT_INV_PIX_CLOCK    (1 << 9)
 102#define MT9M111_OUTFMT_RGB              (1 << 8)
 103#define MT9M111_OUTFMT_RGB565           (0 << 6)
 104#define MT9M111_OUTFMT_RGB555           (1 << 6)
 105#define MT9M111_OUTFMT_RGB444x          (2 << 6)
 106#define MT9M111_OUTFMT_RGBx444          (3 << 6)
 107#define MT9M111_OUTFMT_TST_RAMP_OFF     (0 << 4)
 108#define MT9M111_OUTFMT_TST_RAMP_COL     (1 << 4)
 109#define MT9M111_OUTFMT_TST_RAMP_ROW     (2 << 4)
 110#define MT9M111_OUTFMT_TST_RAMP_FRAME   (3 << 4)
 111#define MT9M111_OUTFMT_SHIFT_3_UP       (1 << 3)
 112#define MT9M111_OUTFMT_AVG_CHROMA       (1 << 2)
 113#define MT9M111_OUTFMT_SWAP_YCbCr_C_Y   (1 << 1)
 114#define MT9M111_OUTFMT_SWAP_RGB_EVEN    (1 << 1)
 115#define MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr (1 << 0)
 116
 117/*
 118 * Camera control register addresses (0x200..0x2ff not implemented)
 119 */
 120
 121#define reg_read(reg) mt9m111_reg_read(client, MT9M111_##reg)
 122#define reg_write(reg, val) mt9m111_reg_write(client, MT9M111_##reg, (val))
 123#define reg_set(reg, val) mt9m111_reg_set(client, MT9M111_##reg, (val))
 124#define reg_clear(reg, val) mt9m111_reg_clear(client, MT9M111_##reg, (val))
 125
 126#define MT9M111_MIN_DARK_ROWS   8
 127#define MT9M111_MIN_DARK_COLS   26
 128#define MT9M111_MAX_HEIGHT      1024
 129#define MT9M111_MAX_WIDTH       1280
 130
 131/* MT9M111 has only one fixed colorspace per pixelcode */
 132struct mt9m111_datafmt {
 133        enum v4l2_mbus_pixelcode        code;
 134        enum v4l2_colorspace            colorspace;
 135};
 136
 137/* Find a data format by a pixel code in an array */
 138static const struct mt9m111_datafmt *mt9m111_find_datafmt(
 139        enum v4l2_mbus_pixelcode code, const struct mt9m111_datafmt *fmt,
 140        int n)
 141{
 142        int i;
 143        for (i = 0; i < n; i++)
 144                if (fmt[i].code == code)
 145                        return fmt + i;
 146
 147        return NULL;
 148}
 149
 150static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
 151        {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
 152        {V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
 153        {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
 154        {V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
 155        {V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
 156        {V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
 157        {V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
 158        {V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
 159};
 160
 161enum mt9m111_context {
 162        HIGHPOWER = 0,
 163        LOWPOWER,
 164};
 165
 166struct mt9m111 {
 167        struct v4l2_subdev subdev;
 168        int model;      /* V4L2_IDENT_MT9M111 or V4L2_IDENT_MT9M112 code
 169                         * from v4l2-chip-ident.h */
 170        enum mt9m111_context context;
 171        struct v4l2_rect rect;
 172        const struct mt9m111_datafmt *fmt;
 173        unsigned int gain;
 174        unsigned char autoexposure;
 175        unsigned char datawidth;
 176        unsigned int powered:1;
 177        unsigned int hflip:1;
 178        unsigned int vflip:1;
 179        unsigned int swap_rgb_even_odd:1;
 180        unsigned int swap_rgb_red_blue:1;
 181        unsigned int swap_yuv_y_chromas:1;
 182        unsigned int swap_yuv_cb_cr:1;
 183        unsigned int autowhitebalance:1;
 184};
 185
 186static struct mt9m111 *to_mt9m111(const struct i2c_client *client)
 187{
 188        return container_of(i2c_get_clientdata(client), struct mt9m111, subdev);
 189}
 190
 191static int reg_page_map_set(struct i2c_client *client, const u16 reg)
 192{
 193        int ret;
 194        u16 page;
 195        static int lastpage = -1;       /* PageMap cache value */
 196
 197        page = (reg >> 8);
 198        if (page == lastpage)
 199                return 0;
 200        if (page > 2)
 201                return -EINVAL;
 202
 203        ret = i2c_smbus_write_word_data(client, MT9M111_PAGE_MAP, swab16(page));
 204        if (!ret)
 205                lastpage = page;
 206        return ret;
 207}
 208
 209static int mt9m111_reg_read(struct i2c_client *client, const u16 reg)
 210{
 211        int ret;
 212
 213        ret = reg_page_map_set(client, reg);
 214        if (!ret)
 215                ret = swab16(i2c_smbus_read_word_data(client, reg & 0xff));
 216
 217        dev_dbg(&client->dev, "read  reg.%03x -> %04x\n", reg, ret);
 218        return ret;
 219}
 220
 221static int mt9m111_reg_write(struct i2c_client *client, const u16 reg,
 222                             const u16 data)
 223{
 224        int ret;
 225
 226        ret = reg_page_map_set(client, reg);
 227        if (!ret)
 228                ret = i2c_smbus_write_word_data(client, reg & 0xff,
 229                                                swab16(data));
 230        dev_dbg(&client->dev, "write reg.%03x = %04x -> %d\n", reg, data, ret);
 231        return ret;
 232}
 233
 234static int mt9m111_reg_set(struct i2c_client *client, const u16 reg,
 235                           const u16 data)
 236{
 237        int ret;
 238
 239        ret = mt9m111_reg_read(client, reg);
 240        if (ret >= 0)
 241                ret = mt9m111_reg_write(client, reg, ret | data);
 242        return ret;
 243}
 244
 245static int mt9m111_reg_clear(struct i2c_client *client, const u16 reg,
 246                             const u16 data)
 247{
 248        int ret;
 249
 250        ret = mt9m111_reg_read(client, reg);
 251        return mt9m111_reg_write(client, reg, ret & ~data);
 252}
 253
 254static int mt9m111_set_context(struct i2c_client *client,
 255                               enum mt9m111_context ctxt)
 256{
 257        int valB = MT9M111_CTXT_CTRL_RESTART | MT9M111_CTXT_CTRL_DEFECTCOR_B
 258                | MT9M111_CTXT_CTRL_RESIZE_B | MT9M111_CTXT_CTRL_CTRL2_B
 259                | MT9M111_CTXT_CTRL_GAMMA_B | MT9M111_CTXT_CTRL_READ_MODE_B
 260                | MT9M111_CTXT_CTRL_VBLANK_SEL_B
 261                | MT9M111_CTXT_CTRL_HBLANK_SEL_B;
 262        int valA = MT9M111_CTXT_CTRL_RESTART;
 263
 264        if (ctxt == HIGHPOWER)
 265                return reg_write(CONTEXT_CONTROL, valB);
 266        else
 267                return reg_write(CONTEXT_CONTROL, valA);
 268}
 269
 270static int mt9m111_setup_rect(struct i2c_client *client,
 271                              struct v4l2_rect *rect)
 272{
 273        struct mt9m111 *mt9m111 = to_mt9m111(client);
 274        int ret, is_raw_format;
 275        int width = rect->width;
 276        int height = rect->height;
 277
 278        if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
 279            mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE)
 280                is_raw_format = 1;
 281        else
 282                is_raw_format = 0;
 283
 284        ret = reg_write(COLUMN_START, rect->left);
 285        if (!ret)
 286                ret = reg_write(ROW_START, rect->top);
 287
 288        if (is_raw_format) {
 289                if (!ret)
 290                        ret = reg_write(WINDOW_WIDTH, width);
 291                if (!ret)
 292                        ret = reg_write(WINDOW_HEIGHT, height);
 293        } else {
 294                if (!ret)
 295                        ret = reg_write(REDUCER_XZOOM_B, MT9M111_MAX_WIDTH);
 296                if (!ret)
 297                        ret = reg_write(REDUCER_YZOOM_B, MT9M111_MAX_HEIGHT);
 298                if (!ret)
 299                        ret = reg_write(REDUCER_XSIZE_B, width);
 300                if (!ret)
 301                        ret = reg_write(REDUCER_YSIZE_B, height);
 302                if (!ret)
 303                        ret = reg_write(REDUCER_XZOOM_A, MT9M111_MAX_WIDTH);
 304                if (!ret)
 305                        ret = reg_write(REDUCER_YZOOM_A, MT9M111_MAX_HEIGHT);
 306                if (!ret)
 307                        ret = reg_write(REDUCER_XSIZE_A, width);
 308                if (!ret)
 309                        ret = reg_write(REDUCER_YSIZE_A, height);
 310        }
 311
 312        return ret;
 313}
 314
 315static int mt9m111_setup_pixfmt(struct i2c_client *client, u16 outfmt)
 316{
 317        int ret;
 318
 319        ret = reg_write(OUTPUT_FORMAT_CTRL2_A, outfmt);
 320        if (!ret)
 321                ret = reg_write(OUTPUT_FORMAT_CTRL2_B, outfmt);
 322        return ret;
 323}
 324
 325static int mt9m111_setfmt_bayer8(struct i2c_client *client)
 326{
 327        return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_PROCESSED_BAYER |
 328                                    MT9M111_OUTFMT_RGB);
 329}
 330
 331static int mt9m111_setfmt_bayer10(struct i2c_client *client)
 332{
 333        return mt9m111_setup_pixfmt(client, MT9M111_OUTFMT_BYPASS_IFP);
 334}
 335
 336static int mt9m111_setfmt_rgb565(struct i2c_client *client)
 337{
 338        struct mt9m111 *mt9m111 = to_mt9m111(client);
 339        int val = 0;
 340
 341        if (mt9m111->swap_rgb_red_blue)
 342                val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
 343        if (mt9m111->swap_rgb_even_odd)
 344                val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
 345        val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
 346
 347        return mt9m111_setup_pixfmt(client, val);
 348}
 349
 350static int mt9m111_setfmt_rgb555(struct i2c_client *client)
 351{
 352        struct mt9m111 *mt9m111 = to_mt9m111(client);
 353        int val = 0;
 354
 355        if (mt9m111->swap_rgb_red_blue)
 356                val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
 357        if (mt9m111->swap_rgb_even_odd)
 358                val |= MT9M111_OUTFMT_SWAP_RGB_EVEN;
 359        val |= MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
 360
 361        return mt9m111_setup_pixfmt(client, val);
 362}
 363
 364static int mt9m111_setfmt_yuv(struct i2c_client *client)
 365{
 366        struct mt9m111 *mt9m111 = to_mt9m111(client);
 367        int val = 0;
 368
 369        if (mt9m111->swap_yuv_cb_cr)
 370                val |= MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr;
 371        if (mt9m111->swap_yuv_y_chromas)
 372                val |= MT9M111_OUTFMT_SWAP_YCbCr_C_Y;
 373
 374        return mt9m111_setup_pixfmt(client, val);
 375}
 376
 377static int mt9m111_enable(struct i2c_client *client)
 378{
 379        struct mt9m111 *mt9m111 = to_mt9m111(client);
 380        int ret;
 381
 382        ret = reg_set(RESET, MT9M111_RESET_CHIP_ENABLE);
 383        if (!ret)
 384                mt9m111->powered = 1;
 385        return ret;
 386}
 387
 388static int mt9m111_reset(struct i2c_client *client)
 389{
 390        int ret;
 391
 392        ret = reg_set(RESET, MT9M111_RESET_RESET_MODE);
 393        if (!ret)
 394                ret = reg_set(RESET, MT9M111_RESET_RESET_SOC);
 395        if (!ret)
 396                ret = reg_clear(RESET, MT9M111_RESET_RESET_MODE
 397                                | MT9M111_RESET_RESET_SOC);
 398
 399        return ret;
 400}
 401
 402static unsigned long mt9m111_query_bus_param(struct soc_camera_device *icd)
 403{
 404        struct soc_camera_link *icl = to_soc_camera_link(icd);
 405        unsigned long flags = SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |
 406                SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_HIGH |
 407                SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8;
 408
 409        return soc_camera_apply_sensor_flags(icl, flags);
 410}
 411
 412static int mt9m111_set_bus_param(struct soc_camera_device *icd, unsigned long f)
 413{
 414        return 0;
 415}
 416
 417static int mt9m111_make_rect(struct i2c_client *client,
 418                             struct v4l2_rect *rect)
 419{
 420        struct mt9m111 *mt9m111 = to_mt9m111(client);
 421
 422        if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
 423            mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
 424                /* Bayer format - even size lengths */
 425                rect->width     = ALIGN(rect->width, 2);
 426                rect->height    = ALIGN(rect->height, 2);
 427                /* Let the user play with the starting pixel */
 428        }
 429
 430        /* FIXME: the datasheet doesn't specify minimum sizes */
 431        soc_camera_limit_side(&rect->left, &rect->width,
 432                     MT9M111_MIN_DARK_COLS, 2, MT9M111_MAX_WIDTH);
 433
 434        soc_camera_limit_side(&rect->top, &rect->height,
 435                     MT9M111_MIN_DARK_ROWS, 2, MT9M111_MAX_HEIGHT);
 436
 437        return mt9m111_setup_rect(client, rect);
 438}
 439
 440static int mt9m111_s_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
 441{
 442        struct v4l2_rect rect = a->c;
 443        struct i2c_client *client = v4l2_get_subdevdata(sd);
 444        struct mt9m111 *mt9m111 = to_mt9m111(client);
 445        int ret;
 446
 447        dev_dbg(&client->dev, "%s left=%d, top=%d, width=%d, height=%d\n",
 448                __func__, rect.left, rect.top, rect.width, rect.height);
 449
 450        if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 451                return -EINVAL;
 452
 453        ret = mt9m111_make_rect(client, &rect);
 454        if (!ret)
 455                mt9m111->rect = rect;
 456        return ret;
 457}
 458
 459static int mt9m111_g_crop(struct v4l2_subdev *sd, struct v4l2_crop *a)
 460{
 461        struct i2c_client *client = v4l2_get_subdevdata(sd);
 462        struct mt9m111 *mt9m111 = to_mt9m111(client);
 463
 464        a->c    = mt9m111->rect;
 465        a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 466
 467        return 0;
 468}
 469
 470static int mt9m111_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
 471{
 472        if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 473                return -EINVAL;
 474
 475        a->bounds.left                  = MT9M111_MIN_DARK_COLS;
 476        a->bounds.top                   = MT9M111_MIN_DARK_ROWS;
 477        a->bounds.width                 = MT9M111_MAX_WIDTH;
 478        a->bounds.height                = MT9M111_MAX_HEIGHT;
 479        a->defrect                      = a->bounds;
 480        a->pixelaspect.numerator        = 1;
 481        a->pixelaspect.denominator      = 1;
 482
 483        return 0;
 484}
 485
 486static int mt9m111_g_fmt(struct v4l2_subdev *sd,
 487                         struct v4l2_mbus_framefmt *mf)
 488{
 489        struct i2c_client *client = v4l2_get_subdevdata(sd);
 490        struct mt9m111 *mt9m111 = to_mt9m111(client);
 491
 492        mf->width       = mt9m111->rect.width;
 493        mf->height      = mt9m111->rect.height;
 494        mf->code        = mt9m111->fmt->code;
 495        mf->colorspace  = mt9m111->fmt->colorspace;
 496        mf->field       = V4L2_FIELD_NONE;
 497
 498        return 0;
 499}
 500
 501static int mt9m111_set_pixfmt(struct i2c_client *client,
 502                              enum v4l2_mbus_pixelcode code)
 503{
 504        struct mt9m111 *mt9m111 = to_mt9m111(client);
 505        int ret;
 506
 507        switch (code) {
 508        case V4L2_MBUS_FMT_SBGGR8_1X8:
 509                ret = mt9m111_setfmt_bayer8(client);
 510                break;
 511        case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
 512                ret = mt9m111_setfmt_bayer10(client);
 513                break;
 514        case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
 515                ret = mt9m111_setfmt_rgb555(client);
 516                break;
 517        case V4L2_MBUS_FMT_RGB565_2X8_LE:
 518                ret = mt9m111_setfmt_rgb565(client);
 519                break;
 520        case V4L2_MBUS_FMT_UYVY8_2X8:
 521                mt9m111->swap_yuv_y_chromas = 0;
 522                mt9m111->swap_yuv_cb_cr = 0;
 523                ret = mt9m111_setfmt_yuv(client);
 524                break;
 525        case V4L2_MBUS_FMT_VYUY8_2X8:
 526                mt9m111->swap_yuv_y_chromas = 0;
 527                mt9m111->swap_yuv_cb_cr = 1;
 528                ret = mt9m111_setfmt_yuv(client);
 529                break;
 530        case V4L2_MBUS_FMT_YUYV8_2X8:
 531                mt9m111->swap_yuv_y_chromas = 1;
 532                mt9m111->swap_yuv_cb_cr = 0;
 533                ret = mt9m111_setfmt_yuv(client);
 534                break;
 535        case V4L2_MBUS_FMT_YVYU8_2X8:
 536                mt9m111->swap_yuv_y_chromas = 1;
 537                mt9m111->swap_yuv_cb_cr = 1;
 538                ret = mt9m111_setfmt_yuv(client);
 539                break;
 540        default:
 541                dev_err(&client->dev, "Pixel format not handled : %x\n",
 542                        code);
 543                ret = -EINVAL;
 544        }
 545
 546        return ret;
 547}
 548
 549static int mt9m111_s_fmt(struct v4l2_subdev *sd,
 550                         struct v4l2_mbus_framefmt *mf)
 551{
 552        struct i2c_client *client = v4l2_get_subdevdata(sd);
 553        const struct mt9m111_datafmt *fmt;
 554        struct mt9m111 *mt9m111 = to_mt9m111(client);
 555        struct v4l2_rect rect = {
 556                .left   = mt9m111->rect.left,
 557                .top    = mt9m111->rect.top,
 558                .width  = mf->width,
 559                .height = mf->height,
 560        };
 561        int ret;
 562
 563        fmt = mt9m111_find_datafmt(mf->code, mt9m111_colour_fmts,
 564                                   ARRAY_SIZE(mt9m111_colour_fmts));
 565        if (!fmt)
 566                return -EINVAL;
 567
 568        dev_dbg(&client->dev,
 569                "%s code=%x left=%d, top=%d, width=%d, height=%d\n", __func__,
 570                mf->code, rect.left, rect.top, rect.width, rect.height);
 571
 572        ret = mt9m111_make_rect(client, &rect);
 573        if (!ret)
 574                ret = mt9m111_set_pixfmt(client, mf->code);
 575        if (!ret) {
 576                mt9m111->rect   = rect;
 577                mt9m111->fmt    = fmt;
 578                mf->colorspace  = fmt->colorspace;
 579        }
 580
 581        return ret;
 582}
 583
 584static int mt9m111_try_fmt(struct v4l2_subdev *sd,
 585                           struct v4l2_mbus_framefmt *mf)
 586{
 587        struct i2c_client *client = v4l2_get_subdevdata(sd);
 588        struct mt9m111 *mt9m111 = to_mt9m111(client);
 589        const struct mt9m111_datafmt *fmt;
 590        bool bayer = mf->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
 591                mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE;
 592
 593        fmt = mt9m111_find_datafmt(mf->code, mt9m111_colour_fmts,
 594                                   ARRAY_SIZE(mt9m111_colour_fmts));
 595        if (!fmt) {
 596                fmt = mt9m111->fmt;
 597                mf->code = fmt->code;
 598        }
 599
 600        /*
 601         * With Bayer format enforce even side lengths, but let the user play
 602         * with the starting pixel
 603         */
 604
 605        if (mf->height > MT9M111_MAX_HEIGHT)
 606                mf->height = MT9M111_MAX_HEIGHT;
 607        else if (mf->height < 2)
 608                mf->height = 2;
 609        else if (bayer)
 610                mf->height = ALIGN(mf->height, 2);
 611
 612        if (mf->width > MT9M111_MAX_WIDTH)
 613                mf->width = MT9M111_MAX_WIDTH;
 614        else if (mf->width < 2)
 615                mf->width = 2;
 616        else if (bayer)
 617                mf->width = ALIGN(mf->width, 2);
 618
 619        mf->colorspace = fmt->colorspace;
 620
 621        return 0;
 622}
 623
 624static int mt9m111_g_chip_ident(struct v4l2_subdev *sd,
 625                                struct v4l2_dbg_chip_ident *id)
 626{
 627        struct i2c_client *client = v4l2_get_subdevdata(sd);
 628        struct mt9m111 *mt9m111 = to_mt9m111(client);
 629
 630        if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)
 631                return -EINVAL;
 632
 633        if (id->match.addr != client->addr)
 634                return -ENODEV;
 635
 636        id->ident       = mt9m111->model;
 637        id->revision    = 0;
 638
 639        return 0;
 640}
 641
 642#ifdef CONFIG_VIDEO_ADV_DEBUG
 643static int mt9m111_g_register(struct v4l2_subdev *sd,
 644                              struct v4l2_dbg_register *reg)
 645{
 646        struct i2c_client *client = v4l2_get_subdevdata(sd);
 647        int val;
 648
 649        if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
 650                return -EINVAL;
 651        if (reg->match.addr != client->addr)
 652                return -ENODEV;
 653
 654        val = mt9m111_reg_read(client, reg->reg);
 655        reg->size = 2;
 656        reg->val = (u64)val;
 657
 658        if (reg->val > 0xffff)
 659                return -EIO;
 660
 661        return 0;
 662}
 663
 664static int mt9m111_s_register(struct v4l2_subdev *sd,
 665                              struct v4l2_dbg_register *reg)
 666{
 667        struct i2c_client *client = v4l2_get_subdevdata(sd);
 668
 669        if (reg->match.type != V4L2_CHIP_MATCH_I2C_ADDR || reg->reg > 0x2ff)
 670                return -EINVAL;
 671
 672        if (reg->match.addr != client->addr)
 673                return -ENODEV;
 674
 675        if (mt9m111_reg_write(client, reg->reg, reg->val) < 0)
 676                return -EIO;
 677
 678        return 0;
 679}
 680#endif
 681
 682static const struct v4l2_queryctrl mt9m111_controls[] = {
 683        {
 684                .id             = V4L2_CID_VFLIP,
 685                .type           = V4L2_CTRL_TYPE_BOOLEAN,
 686                .name           = "Flip Verticaly",
 687                .minimum        = 0,
 688                .maximum        = 1,
 689                .step           = 1,
 690                .default_value  = 0,
 691        }, {
 692                .id             = V4L2_CID_HFLIP,
 693                .type           = V4L2_CTRL_TYPE_BOOLEAN,
 694                .name           = "Flip Horizontaly",
 695                .minimum        = 0,
 696                .maximum        = 1,
 697                .step           = 1,
 698                .default_value  = 0,
 699        }, {    /* gain = 1/32*val (=>gain=1 if val==32) */
 700                .id             = V4L2_CID_GAIN,
 701                .type           = V4L2_CTRL_TYPE_INTEGER,
 702                .name           = "Gain",
 703                .minimum        = 0,
 704                .maximum        = 63 * 2 * 2,
 705                .step           = 1,
 706                .default_value  = 32,
 707                .flags          = V4L2_CTRL_FLAG_SLIDER,
 708        }, {
 709                .id             = V4L2_CID_EXPOSURE_AUTO,
 710                .type           = V4L2_CTRL_TYPE_BOOLEAN,
 711                .name           = "Auto Exposure",
 712                .minimum        = 0,
 713                .maximum        = 1,
 714                .step           = 1,
 715                .default_value  = 1,
 716        }
 717};
 718
 719static int mt9m111_resume(struct soc_camera_device *icd);
 720static int mt9m111_suspend(struct soc_camera_device *icd, pm_message_t state);
 721
 722static struct soc_camera_ops mt9m111_ops = {
 723        .suspend                = mt9m111_suspend,
 724        .resume                 = mt9m111_resume,
 725        .query_bus_param        = mt9m111_query_bus_param,
 726        .set_bus_param          = mt9m111_set_bus_param,
 727        .controls               = mt9m111_controls,
 728        .num_controls           = ARRAY_SIZE(mt9m111_controls),
 729};
 730
 731static int mt9m111_set_flip(struct i2c_client *client, int flip, int mask)
 732{
 733        struct mt9m111 *mt9m111 = to_mt9m111(client);
 734        int ret;
 735
 736        if (mt9m111->context == HIGHPOWER) {
 737                if (flip)
 738                        ret = reg_set(READ_MODE_B, mask);
 739                else
 740                        ret = reg_clear(READ_MODE_B, mask);
 741        } else {
 742                if (flip)
 743                        ret = reg_set(READ_MODE_A, mask);
 744                else
 745                        ret = reg_clear(READ_MODE_A, mask);
 746        }
 747
 748        return ret;
 749}
 750
 751static int mt9m111_get_global_gain(struct i2c_client *client)
 752{
 753        int data;
 754
 755        data = reg_read(GLOBAL_GAIN);
 756        if (data >= 0)
 757                return (data & 0x2f) * (1 << ((data >> 10) & 1)) *
 758                        (1 << ((data >> 9) & 1));
 759        return data;
 760}
 761
 762static int mt9m111_set_global_gain(struct i2c_client *client, int gain)
 763{
 764        struct mt9m111 *mt9m111 = to_mt9m111(client);
 765        u16 val;
 766
 767        if (gain > 63 * 2 * 2)
 768                return -EINVAL;
 769
 770        mt9m111->gain = gain;
 771        if ((gain >= 64 * 2) && (gain < 63 * 2 * 2))
 772                val = (1 << 10) | (1 << 9) | (gain / 4);
 773        else if ((gain >= 64) && (gain < 64 * 2))
 774                val = (1 << 9) | (gain / 2);
 775        else
 776                val = gain;
 777
 778        return reg_write(GLOBAL_GAIN, val);
 779}
 780
 781static int mt9m111_set_autoexposure(struct i2c_client *client, int on)
 782{
 783        struct mt9m111 *mt9m111 = to_mt9m111(client);
 784        int ret;
 785
 786        if (on)
 787                ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
 788        else
 789                ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOEXPO_EN);
 790
 791        if (!ret)
 792                mt9m111->autoexposure = on;
 793
 794        return ret;
 795}
 796
 797static int mt9m111_set_autowhitebalance(struct i2c_client *client, int on)
 798{
 799        struct mt9m111 *mt9m111 = to_mt9m111(client);
 800        int ret;
 801
 802        if (on)
 803                ret = reg_set(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
 804        else
 805                ret = reg_clear(OPER_MODE_CTRL, MT9M111_OPMODE_AUTOWHITEBAL_EN);
 806
 807        if (!ret)
 808                mt9m111->autowhitebalance = on;
 809
 810        return ret;
 811}
 812
 813static int mt9m111_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
 814{
 815        struct i2c_client *client = v4l2_get_subdevdata(sd);
 816        struct mt9m111 *mt9m111 = to_mt9m111(client);
 817        int data;
 818
 819        switch (ctrl->id) {
 820        case V4L2_CID_VFLIP:
 821                if (mt9m111->context == HIGHPOWER)
 822                        data = reg_read(READ_MODE_B);
 823                else
 824                        data = reg_read(READ_MODE_A);
 825
 826                if (data < 0)
 827                        return -EIO;
 828                ctrl->value = !!(data & MT9M111_RMB_MIRROR_ROWS);
 829                break;
 830        case V4L2_CID_HFLIP:
 831                if (mt9m111->context == HIGHPOWER)
 832                        data = reg_read(READ_MODE_B);
 833                else
 834                        data = reg_read(READ_MODE_A);
 835
 836                if (data < 0)
 837                        return -EIO;
 838                ctrl->value = !!(data & MT9M111_RMB_MIRROR_COLS);
 839                break;
 840        case V4L2_CID_GAIN:
 841                data = mt9m111_get_global_gain(client);
 842                if (data < 0)
 843                        return data;
 844                ctrl->value = data;
 845                break;
 846        case V4L2_CID_EXPOSURE_AUTO:
 847                ctrl->value = mt9m111->autoexposure;
 848                break;
 849        case V4L2_CID_AUTO_WHITE_BALANCE:
 850                ctrl->value = mt9m111->autowhitebalance;
 851                break;
 852        }
 853        return 0;
 854}
 855
 856static int mt9m111_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
 857{
 858        struct i2c_client *client = v4l2_get_subdevdata(sd);
 859        struct mt9m111 *mt9m111 = to_mt9m111(client);
 860        const struct v4l2_queryctrl *qctrl;
 861        int ret;
 862
 863        qctrl = soc_camera_find_qctrl(&mt9m111_ops, ctrl->id);
 864        if (!qctrl)
 865                return -EINVAL;
 866
 867        switch (ctrl->id) {
 868        case V4L2_CID_VFLIP:
 869                mt9m111->vflip = ctrl->value;
 870                ret = mt9m111_set_flip(client, ctrl->value,
 871                                        MT9M111_RMB_MIRROR_ROWS);
 872                break;
 873        case V4L2_CID_HFLIP:
 874                mt9m111->hflip = ctrl->value;
 875                ret = mt9m111_set_flip(client, ctrl->value,
 876                                        MT9M111_RMB_MIRROR_COLS);
 877                break;
 878        case V4L2_CID_GAIN:
 879                ret = mt9m111_set_global_gain(client, ctrl->value);
 880                break;
 881        case V4L2_CID_EXPOSURE_AUTO:
 882                ret =  mt9m111_set_autoexposure(client, ctrl->value);
 883                break;
 884        case V4L2_CID_AUTO_WHITE_BALANCE:
 885                ret =  mt9m111_set_autowhitebalance(client, ctrl->value);
 886                break;
 887        default:
 888                ret = -EINVAL;
 889        }
 890
 891        return ret;
 892}
 893
 894static int mt9m111_suspend(struct soc_camera_device *icd, pm_message_t state)
 895{
 896        struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
 897        struct mt9m111 *mt9m111 = to_mt9m111(client);
 898
 899        mt9m111->gain = mt9m111_get_global_gain(client);
 900
 901        return 0;
 902}
 903
 904static int mt9m111_restore_state(struct i2c_client *client)
 905{
 906        struct mt9m111 *mt9m111 = to_mt9m111(client);
 907
 908        mt9m111_set_context(client, mt9m111->context);
 909        mt9m111_set_pixfmt(client, mt9m111->fmt->code);
 910        mt9m111_setup_rect(client, &mt9m111->rect);
 911        mt9m111_set_flip(client, mt9m111->hflip, MT9M111_RMB_MIRROR_COLS);
 912        mt9m111_set_flip(client, mt9m111->vflip, MT9M111_RMB_MIRROR_ROWS);
 913        mt9m111_set_global_gain(client, mt9m111->gain);
 914        mt9m111_set_autoexposure(client, mt9m111->autoexposure);
 915        mt9m111_set_autowhitebalance(client, mt9m111->autowhitebalance);
 916        return 0;
 917}
 918
 919static int mt9m111_resume(struct soc_camera_device *icd)
 920{
 921        struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));
 922        struct mt9m111 *mt9m111 = to_mt9m111(client);
 923        int ret = 0;
 924
 925        if (mt9m111->powered) {
 926                ret = mt9m111_enable(client);
 927                if (!ret)
 928                        ret = mt9m111_reset(client);
 929                if (!ret)
 930                        ret = mt9m111_restore_state(client);
 931        }
 932        return ret;
 933}
 934
 935static int mt9m111_init(struct i2c_client *client)
 936{
 937        struct mt9m111 *mt9m111 = to_mt9m111(client);
 938        int ret;
 939
 940        mt9m111->context = HIGHPOWER;
 941        ret = mt9m111_enable(client);
 942        if (!ret)
 943                ret = mt9m111_reset(client);
 944        if (!ret)
 945                ret = mt9m111_set_context(client, mt9m111->context);
 946        if (!ret)
 947                ret = mt9m111_set_autoexposure(client, mt9m111->autoexposure);
 948        if (ret)
 949                dev_err(&client->dev, "mt9m111 init failed: %d\n", ret);
 950        return ret;
 951}
 952
 953/*
 954 * Interface active, can use i2c. If it fails, it can indeed mean, that
 955 * this wasn't our capture interface, so, we wait for the right one
 956 */
 957static int mt9m111_video_probe(struct soc_camera_device *icd,
 958                               struct i2c_client *client)
 959{
 960        struct mt9m111 *mt9m111 = to_mt9m111(client);
 961        s32 data;
 962        int ret;
 963
 964        /*
 965         * We must have a parent by now. And it cannot be a wrong one.
 966         * So this entire test is completely redundant.
 967         */
 968        if (!icd->dev.parent ||
 969            to_soc_camera_host(icd->dev.parent)->nr != icd->iface)
 970                return -ENODEV;
 971
 972        mt9m111->autoexposure = 1;
 973        mt9m111->autowhitebalance = 1;
 974
 975        mt9m111->swap_rgb_even_odd = 1;
 976        mt9m111->swap_rgb_red_blue = 1;
 977
 978        data = reg_read(CHIP_VERSION);
 979
 980        switch (data) {
 981        case 0x143a: /* MT9M111 or MT9M131 */
 982                mt9m111->model = V4L2_IDENT_MT9M111;
 983                dev_info(&client->dev,
 984                        "Detected a MT9M111/MT9M131 chip ID %x\n", data);
 985                break;
 986        case 0x148c: /* MT9M112 */
 987                mt9m111->model = V4L2_IDENT_MT9M112;
 988                dev_info(&client->dev, "Detected a MT9M112 chip ID %x\n", data);
 989                break;
 990        default:
 991                ret = -ENODEV;
 992                dev_err(&client->dev,
 993                        "No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
 994                        data);
 995                goto ei2c;
 996        }
 997
 998        ret = mt9m111_init(client);
 999
1000ei2c:
1001        return ret;
1002}
1003
1004static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
1005        .g_ctrl         = mt9m111_g_ctrl,
1006        .s_ctrl         = mt9m111_s_ctrl,
1007        .g_chip_ident   = mt9m111_g_chip_ident,
1008#ifdef CONFIG_VIDEO_ADV_DEBUG
1009        .g_register     = mt9m111_g_register,
1010        .s_register     = mt9m111_s_register,
1011#endif
1012};
1013
1014static int mt9m111_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
1015                            enum v4l2_mbus_pixelcode *code)
1016{
1017        if (index >= ARRAY_SIZE(mt9m111_colour_fmts))
1018                return -EINVAL;
1019
1020        *code = mt9m111_colour_fmts[index].code;
1021        return 0;
1022}
1023
1024static struct v4l2_subdev_video_ops mt9m111_subdev_video_ops = {
1025        .s_mbus_fmt     = mt9m111_s_fmt,
1026        .g_mbus_fmt     = mt9m111_g_fmt,
1027        .try_mbus_fmt   = mt9m111_try_fmt,
1028        .s_crop         = mt9m111_s_crop,
1029        .g_crop         = mt9m111_g_crop,
1030        .cropcap        = mt9m111_cropcap,
1031        .enum_mbus_fmt  = mt9m111_enum_fmt,
1032};
1033
1034static struct v4l2_subdev_ops mt9m111_subdev_ops = {
1035        .core   = &mt9m111_subdev_core_ops,
1036        .video  = &mt9m111_subdev_video_ops,
1037};
1038
1039static int mt9m111_probe(struct i2c_client *client,
1040                         const struct i2c_device_id *did)
1041{
1042        struct mt9m111 *mt9m111;
1043        struct soc_camera_device *icd = client->dev.platform_data;
1044        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
1045        struct soc_camera_link *icl;
1046        int ret;
1047
1048        if (!icd) {
1049                dev_err(&client->dev, "mt9m111: soc-camera data missing!\n");
1050                return -EINVAL;
1051        }
1052
1053        icl = to_soc_camera_link(icd);
1054        if (!icl) {
1055                dev_err(&client->dev, "mt9m111: driver needs platform data\n");
1056                return -EINVAL;
1057        }
1058
1059        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
1060                dev_warn(&adapter->dev,
1061                         "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
1062                return -EIO;
1063        }
1064
1065        mt9m111 = kzalloc(sizeof(struct mt9m111), GFP_KERNEL);
1066        if (!mt9m111)
1067                return -ENOMEM;
1068
1069        v4l2_i2c_subdev_init(&mt9m111->subdev, client, &mt9m111_subdev_ops);
1070
1071        /* Second stage probe - when a capture adapter is there */
1072        icd->ops                = &mt9m111_ops;
1073
1074        mt9m111->rect.left      = MT9M111_MIN_DARK_COLS;
1075        mt9m111->rect.top       = MT9M111_MIN_DARK_ROWS;
1076        mt9m111->rect.width     = MT9M111_MAX_WIDTH;
1077        mt9m111->rect.height    = MT9M111_MAX_HEIGHT;
1078        mt9m111->fmt            = &mt9m111_colour_fmts[0];
1079
1080        ret = mt9m111_video_probe(icd, client);
1081        if (ret) {
1082                icd->ops = NULL;
1083                kfree(mt9m111);
1084        }
1085
1086        return ret;
1087}
1088
1089static int mt9m111_remove(struct i2c_client *client)
1090{
1091        struct mt9m111 *mt9m111 = to_mt9m111(client);
1092        struct soc_camera_device *icd = client->dev.platform_data;
1093
1094        icd->ops = NULL;
1095        kfree(mt9m111);
1096
1097        return 0;
1098}
1099
1100static const struct i2c_device_id mt9m111_id[] = {
1101        { "mt9m111", 0 },
1102        { }
1103};
1104MODULE_DEVICE_TABLE(i2c, mt9m111_id);
1105
1106static struct i2c_driver mt9m111_i2c_driver = {
1107        .driver = {
1108                .name = "mt9m111",
1109        },
1110        .probe          = mt9m111_probe,
1111        .remove         = mt9m111_remove,
1112        .id_table       = mt9m111_id,
1113};
1114
1115static int __init mt9m111_mod_init(void)
1116{
1117        return i2c_add_driver(&mt9m111_i2c_driver);
1118}
1119
1120static void __exit mt9m111_mod_exit(void)
1121{
1122        i2c_del_driver(&mt9m111_i2c_driver);
1123}
1124
1125module_init(mt9m111_mod_init);
1126module_exit(mt9m111_mod_exit);
1127
1128MODULE_DESCRIPTION("Micron/Aptina MT9M111/MT9M112/MT9M131 Camera driver");
1129MODULE_AUTHOR("Robert Jarzmik");
1130MODULE_LICENSE("GPL");
1131