linux/drivers/media/i2c/mt9p031.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Driver for MT9P031 CMOS Image Sensor from Aptina
   4 *
   5 * Copyright (C) 2011, Laurent Pinchart <laurent.pinchart@ideasonboard.com>
   6 * Copyright (C) 2011, Javier Martin <javier.martin@vista-silicon.com>
   7 * Copyright (C) 2011, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
   8 *
   9 * Based on the MT9V032 driver and Bastian Hecht's code.
  10 */
  11
  12#include <linux/clk.h>
  13#include <linux/delay.h>
  14#include <linux/device.h>
  15#include <linux/gpio/consumer.h>
  16#include <linux/i2c.h>
  17#include <linux/log2.h>
  18#include <linux/module.h>
  19#include <linux/of.h>
  20#include <linux/of_graph.h>
  21#include <linux/pm.h>
  22#include <linux/regulator/consumer.h>
  23#include <linux/slab.h>
  24#include <linux/videodev2.h>
  25
  26#include <media/i2c/mt9p031.h>
  27#include <media/v4l2-async.h>
  28#include <media/v4l2-ctrls.h>
  29#include <media/v4l2-device.h>
  30#include <media/v4l2-subdev.h>
  31
  32#include "aptina-pll.h"
  33
  34#define MT9P031_PIXEL_ARRAY_WIDTH                       2752
  35#define MT9P031_PIXEL_ARRAY_HEIGHT                      2004
  36
  37#define MT9P031_CHIP_VERSION                            0x00
  38#define         MT9P031_CHIP_VERSION_VALUE              0x1801
  39#define MT9P031_ROW_START                               0x01
  40#define         MT9P031_ROW_START_MIN                   0
  41#define         MT9P031_ROW_START_MAX                   2004
  42#define         MT9P031_ROW_START_DEF                   54
  43#define MT9P031_COLUMN_START                            0x02
  44#define         MT9P031_COLUMN_START_MIN                0
  45#define         MT9P031_COLUMN_START_MAX                2750
  46#define         MT9P031_COLUMN_START_DEF                16
  47#define MT9P031_WINDOW_HEIGHT                           0x03
  48#define         MT9P031_WINDOW_HEIGHT_MIN               2
  49#define         MT9P031_WINDOW_HEIGHT_MAX               2006
  50#define         MT9P031_WINDOW_HEIGHT_DEF               1944
  51#define MT9P031_WINDOW_WIDTH                            0x04
  52#define         MT9P031_WINDOW_WIDTH_MIN                2
  53#define         MT9P031_WINDOW_WIDTH_MAX                2752
  54#define         MT9P031_WINDOW_WIDTH_DEF                2592
  55#define MT9P031_HORIZONTAL_BLANK                        0x05
  56#define         MT9P031_HORIZONTAL_BLANK_MIN            0
  57#define         MT9P031_HORIZONTAL_BLANK_MAX            4095
  58#define MT9P031_VERTICAL_BLANK                          0x06
  59#define         MT9P031_VERTICAL_BLANK_MIN              1
  60#define         MT9P031_VERTICAL_BLANK_MAX              4096
  61#define         MT9P031_VERTICAL_BLANK_DEF              26
  62#define MT9P031_OUTPUT_CONTROL                          0x07
  63#define         MT9P031_OUTPUT_CONTROL_CEN              2
  64#define         MT9P031_OUTPUT_CONTROL_SYN              1
  65#define         MT9P031_OUTPUT_CONTROL_DEF              0x1f82
  66#define MT9P031_SHUTTER_WIDTH_UPPER                     0x08
  67#define MT9P031_SHUTTER_WIDTH_LOWER                     0x09
  68#define         MT9P031_SHUTTER_WIDTH_MIN               1
  69#define         MT9P031_SHUTTER_WIDTH_MAX               1048575
  70#define         MT9P031_SHUTTER_WIDTH_DEF               1943
  71#define MT9P031_PLL_CONTROL                             0x10
  72#define         MT9P031_PLL_CONTROL_PWROFF              0x0050
  73#define         MT9P031_PLL_CONTROL_PWRON               0x0051
  74#define         MT9P031_PLL_CONTROL_USEPLL              0x0052
  75#define MT9P031_PLL_CONFIG_1                            0x11
  76#define MT9P031_PLL_CONFIG_2                            0x12
  77#define MT9P031_PIXEL_CLOCK_CONTROL                     0x0a
  78#define         MT9P031_PIXEL_CLOCK_INVERT              (1 << 15)
  79#define         MT9P031_PIXEL_CLOCK_SHIFT(n)            ((n) << 8)
  80#define         MT9P031_PIXEL_CLOCK_DIVIDE(n)           ((n) << 0)
  81#define MT9P031_FRAME_RESTART                           0x0b
  82#define MT9P031_SHUTTER_DELAY                           0x0c
  83#define MT9P031_RST                                     0x0d
  84#define         MT9P031_RST_ENABLE                      1
  85#define         MT9P031_RST_DISABLE                     0
  86#define MT9P031_READ_MODE_1                             0x1e
  87#define MT9P031_READ_MODE_2                             0x20
  88#define         MT9P031_READ_MODE_2_ROW_MIR             (1 << 15)
  89#define         MT9P031_READ_MODE_2_COL_MIR             (1 << 14)
  90#define         MT9P031_READ_MODE_2_ROW_BLC             (1 << 6)
  91#define MT9P031_ROW_ADDRESS_MODE                        0x22
  92#define MT9P031_COLUMN_ADDRESS_MODE                     0x23
  93#define MT9P031_GLOBAL_GAIN                             0x35
  94#define         MT9P031_GLOBAL_GAIN_MIN                 8
  95#define         MT9P031_GLOBAL_GAIN_MAX                 1024
  96#define         MT9P031_GLOBAL_GAIN_DEF                 8
  97#define         MT9P031_GLOBAL_GAIN_MULT                (1 << 6)
  98#define MT9P031_ROW_BLACK_TARGET                        0x49
  99#define MT9P031_ROW_BLACK_DEF_OFFSET                    0x4b
 100#define MT9P031_GREEN1_OFFSET                           0x60
 101#define MT9P031_GREEN2_OFFSET                           0x61
 102#define MT9P031_BLACK_LEVEL_CALIBRATION                 0x62
 103#define         MT9P031_BLC_MANUAL_BLC                  (1 << 0)
 104#define MT9P031_RED_OFFSET                              0x63
 105#define MT9P031_BLUE_OFFSET                             0x64
 106#define MT9P031_TEST_PATTERN                            0xa0
 107#define         MT9P031_TEST_PATTERN_SHIFT              3
 108#define         MT9P031_TEST_PATTERN_ENABLE             (1 << 0)
 109#define         MT9P031_TEST_PATTERN_DISABLE            (0 << 0)
 110#define MT9P031_TEST_PATTERN_GREEN                      0xa1
 111#define MT9P031_TEST_PATTERN_RED                        0xa2
 112#define MT9P031_TEST_PATTERN_BLUE                       0xa3
 113
 114enum mt9p031_model {
 115        MT9P031_MODEL_COLOR,
 116        MT9P031_MODEL_MONOCHROME,
 117};
 118
 119struct mt9p031 {
 120        struct v4l2_subdev subdev;
 121        struct media_pad pad;
 122        struct v4l2_rect crop;  /* Sensor window */
 123        struct v4l2_mbus_framefmt format;
 124        struct mt9p031_platform_data *pdata;
 125        struct mutex power_lock; /* lock to protect power_count */
 126        int power_count;
 127
 128        struct clk *clk;
 129        struct regulator_bulk_data regulators[3];
 130
 131        enum mt9p031_model model;
 132        struct aptina_pll pll;
 133        unsigned int clk_div;
 134        bool use_pll;
 135        struct gpio_desc *reset;
 136
 137        struct v4l2_ctrl_handler ctrls;
 138        struct v4l2_ctrl *blc_auto;
 139        struct v4l2_ctrl *blc_offset;
 140
 141        /* Registers cache */
 142        u16 output_control;
 143        u16 mode2;
 144};
 145
 146static struct mt9p031 *to_mt9p031(struct v4l2_subdev *sd)
 147{
 148        return container_of(sd, struct mt9p031, subdev);
 149}
 150
 151static int mt9p031_read(struct i2c_client *client, u8 reg)
 152{
 153        return i2c_smbus_read_word_swapped(client, reg);
 154}
 155
 156static int mt9p031_write(struct i2c_client *client, u8 reg, u16 data)
 157{
 158        return i2c_smbus_write_word_swapped(client, reg, data);
 159}
 160
 161static int mt9p031_set_output_control(struct mt9p031 *mt9p031, u16 clear,
 162                                      u16 set)
 163{
 164        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 165        u16 value = (mt9p031->output_control & ~clear) | set;
 166        int ret;
 167
 168        ret = mt9p031_write(client, MT9P031_OUTPUT_CONTROL, value);
 169        if (ret < 0)
 170                return ret;
 171
 172        mt9p031->output_control = value;
 173        return 0;
 174}
 175
 176static int mt9p031_set_mode2(struct mt9p031 *mt9p031, u16 clear, u16 set)
 177{
 178        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 179        u16 value = (mt9p031->mode2 & ~clear) | set;
 180        int ret;
 181
 182        ret = mt9p031_write(client, MT9P031_READ_MODE_2, value);
 183        if (ret < 0)
 184                return ret;
 185
 186        mt9p031->mode2 = value;
 187        return 0;
 188}
 189
 190static int mt9p031_reset(struct mt9p031 *mt9p031)
 191{
 192        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 193        int ret;
 194
 195        /* Disable chip output, synchronous option update */
 196        ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_ENABLE);
 197        if (ret < 0)
 198                return ret;
 199        ret = mt9p031_write(client, MT9P031_RST, MT9P031_RST_DISABLE);
 200        if (ret < 0)
 201                return ret;
 202
 203        ret = mt9p031_write(client, MT9P031_PIXEL_CLOCK_CONTROL,
 204                            MT9P031_PIXEL_CLOCK_DIVIDE(mt9p031->clk_div));
 205        if (ret < 0)
 206                return ret;
 207
 208        return mt9p031_set_output_control(mt9p031, MT9P031_OUTPUT_CONTROL_CEN,
 209                                          0);
 210}
 211
 212static int mt9p031_clk_setup(struct mt9p031 *mt9p031)
 213{
 214        static const struct aptina_pll_limits limits = {
 215                .ext_clock_min = 6000000,
 216                .ext_clock_max = 27000000,
 217                .int_clock_min = 2000000,
 218                .int_clock_max = 13500000,
 219                .out_clock_min = 180000000,
 220                .out_clock_max = 360000000,
 221                .pix_clock_max = 96000000,
 222                .n_min = 1,
 223                .n_max = 64,
 224                .m_min = 16,
 225                .m_max = 255,
 226                .p1_min = 1,
 227                .p1_max = 128,
 228        };
 229
 230        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 231        struct mt9p031_platform_data *pdata = mt9p031->pdata;
 232        int ret;
 233
 234        mt9p031->clk = devm_clk_get(&client->dev, NULL);
 235        if (IS_ERR(mt9p031->clk))
 236                return PTR_ERR(mt9p031->clk);
 237
 238        ret = clk_set_rate(mt9p031->clk, pdata->ext_freq);
 239        if (ret < 0)
 240                return ret;
 241
 242        /* If the external clock frequency is out of bounds for the PLL use the
 243         * pixel clock divider only and disable the PLL.
 244         */
 245        if (pdata->ext_freq > limits.ext_clock_max) {
 246                unsigned int div;
 247
 248                div = DIV_ROUND_UP(pdata->ext_freq, pdata->target_freq);
 249                div = roundup_pow_of_two(div) / 2;
 250
 251                mt9p031->clk_div = min_t(unsigned int, div, 64);
 252                mt9p031->use_pll = false;
 253
 254                return 0;
 255        }
 256
 257        mt9p031->pll.ext_clock = pdata->ext_freq;
 258        mt9p031->pll.pix_clock = pdata->target_freq;
 259        mt9p031->use_pll = true;
 260
 261        return aptina_pll_calculate(&client->dev, &limits, &mt9p031->pll);
 262}
 263
 264static int mt9p031_pll_enable(struct mt9p031 *mt9p031)
 265{
 266        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 267        int ret;
 268
 269        if (!mt9p031->use_pll)
 270                return 0;
 271
 272        ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
 273                            MT9P031_PLL_CONTROL_PWRON);
 274        if (ret < 0)
 275                return ret;
 276
 277        ret = mt9p031_write(client, MT9P031_PLL_CONFIG_1,
 278                            (mt9p031->pll.m << 8) | (mt9p031->pll.n - 1));
 279        if (ret < 0)
 280                return ret;
 281
 282        ret = mt9p031_write(client, MT9P031_PLL_CONFIG_2, mt9p031->pll.p1 - 1);
 283        if (ret < 0)
 284                return ret;
 285
 286        usleep_range(1000, 2000);
 287        ret = mt9p031_write(client, MT9P031_PLL_CONTROL,
 288                            MT9P031_PLL_CONTROL_PWRON |
 289                            MT9P031_PLL_CONTROL_USEPLL);
 290        return ret;
 291}
 292
 293static inline int mt9p031_pll_disable(struct mt9p031 *mt9p031)
 294{
 295        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 296
 297        if (!mt9p031->use_pll)
 298                return 0;
 299
 300        return mt9p031_write(client, MT9P031_PLL_CONTROL,
 301                             MT9P031_PLL_CONTROL_PWROFF);
 302}
 303
 304static int mt9p031_power_on(struct mt9p031 *mt9p031)
 305{
 306        int ret;
 307
 308        /* Ensure RESET_BAR is active */
 309        if (mt9p031->reset) {
 310                gpiod_set_value(mt9p031->reset, 1);
 311                usleep_range(1000, 2000);
 312        }
 313
 314        /* Bring up the supplies */
 315        ret = regulator_bulk_enable(ARRAY_SIZE(mt9p031->regulators),
 316                                   mt9p031->regulators);
 317        if (ret < 0)
 318                return ret;
 319
 320        /* Enable clock */
 321        if (mt9p031->clk) {
 322                ret = clk_prepare_enable(mt9p031->clk);
 323                if (ret) {
 324                        regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
 325                                               mt9p031->regulators);
 326                        return ret;
 327                }
 328        }
 329
 330        /* Now RESET_BAR must be high */
 331        if (mt9p031->reset) {
 332                gpiod_set_value(mt9p031->reset, 0);
 333                usleep_range(1000, 2000);
 334        }
 335
 336        return 0;
 337}
 338
 339static void mt9p031_power_off(struct mt9p031 *mt9p031)
 340{
 341        if (mt9p031->reset) {
 342                gpiod_set_value(mt9p031->reset, 1);
 343                usleep_range(1000, 2000);
 344        }
 345
 346        regulator_bulk_disable(ARRAY_SIZE(mt9p031->regulators),
 347                               mt9p031->regulators);
 348
 349        if (mt9p031->clk)
 350                clk_disable_unprepare(mt9p031->clk);
 351}
 352
 353static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
 354{
 355        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 356        int ret;
 357
 358        if (!on) {
 359                mt9p031_power_off(mt9p031);
 360                return 0;
 361        }
 362
 363        ret = mt9p031_power_on(mt9p031);
 364        if (ret < 0)
 365                return ret;
 366
 367        ret = mt9p031_reset(mt9p031);
 368        if (ret < 0) {
 369                dev_err(&client->dev, "Failed to reset the camera\n");
 370                return ret;
 371        }
 372
 373        return v4l2_ctrl_handler_setup(&mt9p031->ctrls);
 374}
 375
 376/* -----------------------------------------------------------------------------
 377 * V4L2 subdev video operations
 378 */
 379
 380static int mt9p031_set_params(struct mt9p031 *mt9p031)
 381{
 382        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 383        struct v4l2_mbus_framefmt *format = &mt9p031->format;
 384        const struct v4l2_rect *crop = &mt9p031->crop;
 385        unsigned int hblank;
 386        unsigned int vblank;
 387        unsigned int xskip;
 388        unsigned int yskip;
 389        unsigned int xbin;
 390        unsigned int ybin;
 391        int ret;
 392
 393        /* Windows position and size.
 394         *
 395         * TODO: Make sure the start coordinates and window size match the
 396         * skipping, binning and mirroring (see description of registers 2 and 4
 397         * in table 13, and Binning section on page 41).
 398         */
 399        ret = mt9p031_write(client, MT9P031_COLUMN_START, crop->left);
 400        if (ret < 0)
 401                return ret;
 402        ret = mt9p031_write(client, MT9P031_ROW_START, crop->top);
 403        if (ret < 0)
 404                return ret;
 405        ret = mt9p031_write(client, MT9P031_WINDOW_WIDTH, crop->width - 1);
 406        if (ret < 0)
 407                return ret;
 408        ret = mt9p031_write(client, MT9P031_WINDOW_HEIGHT, crop->height - 1);
 409        if (ret < 0)
 410                return ret;
 411
 412        /* Row and column binning and skipping. Use the maximum binning value
 413         * compatible with the skipping settings.
 414         */
 415        xskip = DIV_ROUND_CLOSEST(crop->width, format->width);
 416        yskip = DIV_ROUND_CLOSEST(crop->height, format->height);
 417        xbin = 1 << (ffs(xskip) - 1);
 418        ybin = 1 << (ffs(yskip) - 1);
 419
 420        ret = mt9p031_write(client, MT9P031_COLUMN_ADDRESS_MODE,
 421                            ((xbin - 1) << 4) | (xskip - 1));
 422        if (ret < 0)
 423                return ret;
 424        ret = mt9p031_write(client, MT9P031_ROW_ADDRESS_MODE,
 425                            ((ybin - 1) << 4) | (yskip - 1));
 426        if (ret < 0)
 427                return ret;
 428
 429        /* Blanking - use minimum value for horizontal blanking and default
 430         * value for vertical blanking.
 431         */
 432        hblank = 346 * ybin + 64 + (80 >> min_t(unsigned int, xbin, 3));
 433        vblank = MT9P031_VERTICAL_BLANK_DEF;
 434
 435        ret = mt9p031_write(client, MT9P031_HORIZONTAL_BLANK, hblank - 1);
 436        if (ret < 0)
 437                return ret;
 438        ret = mt9p031_write(client, MT9P031_VERTICAL_BLANK, vblank - 1);
 439        if (ret < 0)
 440                return ret;
 441
 442        return ret;
 443}
 444
 445static int mt9p031_s_stream(struct v4l2_subdev *subdev, int enable)
 446{
 447        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 448        int ret;
 449
 450        if (!enable) {
 451                /* Stop sensor readout */
 452                ret = mt9p031_set_output_control(mt9p031,
 453                                                 MT9P031_OUTPUT_CONTROL_CEN, 0);
 454                if (ret < 0)
 455                        return ret;
 456
 457                return mt9p031_pll_disable(mt9p031);
 458        }
 459
 460        ret = mt9p031_set_params(mt9p031);
 461        if (ret < 0)
 462                return ret;
 463
 464        /* Switch to master "normal" mode */
 465        ret = mt9p031_set_output_control(mt9p031, 0,
 466                                         MT9P031_OUTPUT_CONTROL_CEN);
 467        if (ret < 0)
 468                return ret;
 469
 470        return mt9p031_pll_enable(mt9p031);
 471}
 472
 473static int mt9p031_enum_mbus_code(struct v4l2_subdev *subdev,
 474                                  struct v4l2_subdev_pad_config *cfg,
 475                                  struct v4l2_subdev_mbus_code_enum *code)
 476{
 477        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 478
 479        if (code->pad || code->index)
 480                return -EINVAL;
 481
 482        code->code = mt9p031->format.code;
 483        return 0;
 484}
 485
 486static int mt9p031_enum_frame_size(struct v4l2_subdev *subdev,
 487                                   struct v4l2_subdev_pad_config *cfg,
 488                                   struct v4l2_subdev_frame_size_enum *fse)
 489{
 490        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 491
 492        if (fse->index >= 8 || fse->code != mt9p031->format.code)
 493                return -EINVAL;
 494
 495        fse->min_width = MT9P031_WINDOW_WIDTH_DEF
 496                       / min_t(unsigned int, 7, fse->index + 1);
 497        fse->max_width = fse->min_width;
 498        fse->min_height = MT9P031_WINDOW_HEIGHT_DEF / (fse->index + 1);
 499        fse->max_height = fse->min_height;
 500
 501        return 0;
 502}
 503
 504static struct v4l2_mbus_framefmt *
 505__mt9p031_get_pad_format(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg,
 506                         unsigned int pad, u32 which)
 507{
 508        switch (which) {
 509        case V4L2_SUBDEV_FORMAT_TRY:
 510                return v4l2_subdev_get_try_format(&mt9p031->subdev, cfg, pad);
 511        case V4L2_SUBDEV_FORMAT_ACTIVE:
 512                return &mt9p031->format;
 513        default:
 514                return NULL;
 515        }
 516}
 517
 518static struct v4l2_rect *
 519__mt9p031_get_pad_crop(struct mt9p031 *mt9p031, struct v4l2_subdev_pad_config *cfg,
 520                     unsigned int pad, u32 which)
 521{
 522        switch (which) {
 523        case V4L2_SUBDEV_FORMAT_TRY:
 524                return v4l2_subdev_get_try_crop(&mt9p031->subdev, cfg, pad);
 525        case V4L2_SUBDEV_FORMAT_ACTIVE:
 526                return &mt9p031->crop;
 527        default:
 528                return NULL;
 529        }
 530}
 531
 532static int mt9p031_get_format(struct v4l2_subdev *subdev,
 533                              struct v4l2_subdev_pad_config *cfg,
 534                              struct v4l2_subdev_format *fmt)
 535{
 536        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 537
 538        fmt->format = *__mt9p031_get_pad_format(mt9p031, cfg, fmt->pad,
 539                                                fmt->which);
 540        return 0;
 541}
 542
 543static int mt9p031_set_format(struct v4l2_subdev *subdev,
 544                              struct v4l2_subdev_pad_config *cfg,
 545                              struct v4l2_subdev_format *format)
 546{
 547        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 548        struct v4l2_mbus_framefmt *__format;
 549        struct v4l2_rect *__crop;
 550        unsigned int width;
 551        unsigned int height;
 552        unsigned int hratio;
 553        unsigned int vratio;
 554
 555        __crop = __mt9p031_get_pad_crop(mt9p031, cfg, format->pad,
 556                                        format->which);
 557
 558        /* Clamp the width and height to avoid dividing by zero. */
 559        width = clamp_t(unsigned int, ALIGN(format->format.width, 2),
 560                        max_t(unsigned int, __crop->width / 7,
 561                              MT9P031_WINDOW_WIDTH_MIN),
 562                        __crop->width);
 563        height = clamp_t(unsigned int, ALIGN(format->format.height, 2),
 564                         max_t(unsigned int, __crop->height / 8,
 565                               MT9P031_WINDOW_HEIGHT_MIN),
 566                         __crop->height);
 567
 568        hratio = DIV_ROUND_CLOSEST(__crop->width, width);
 569        vratio = DIV_ROUND_CLOSEST(__crop->height, height);
 570
 571        __format = __mt9p031_get_pad_format(mt9p031, cfg, format->pad,
 572                                            format->which);
 573        __format->width = __crop->width / hratio;
 574        __format->height = __crop->height / vratio;
 575
 576        format->format = *__format;
 577
 578        return 0;
 579}
 580
 581static int mt9p031_get_selection(struct v4l2_subdev *subdev,
 582                                 struct v4l2_subdev_pad_config *cfg,
 583                                 struct v4l2_subdev_selection *sel)
 584{
 585        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 586
 587        if (sel->target != V4L2_SEL_TGT_CROP)
 588                return -EINVAL;
 589
 590        sel->r = *__mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which);
 591        return 0;
 592}
 593
 594static int mt9p031_set_selection(struct v4l2_subdev *subdev,
 595                                 struct v4l2_subdev_pad_config *cfg,
 596                                 struct v4l2_subdev_selection *sel)
 597{
 598        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 599        struct v4l2_mbus_framefmt *__format;
 600        struct v4l2_rect *__crop;
 601        struct v4l2_rect rect;
 602
 603        if (sel->target != V4L2_SEL_TGT_CROP)
 604                return -EINVAL;
 605
 606        /* Clamp the crop rectangle boundaries and align them to a multiple of 2
 607         * pixels to ensure a GRBG Bayer pattern.
 608         */
 609        rect.left = clamp(ALIGN(sel->r.left, 2), MT9P031_COLUMN_START_MIN,
 610                          MT9P031_COLUMN_START_MAX);
 611        rect.top = clamp(ALIGN(sel->r.top, 2), MT9P031_ROW_START_MIN,
 612                         MT9P031_ROW_START_MAX);
 613        rect.width = clamp_t(unsigned int, ALIGN(sel->r.width, 2),
 614                             MT9P031_WINDOW_WIDTH_MIN,
 615                             MT9P031_WINDOW_WIDTH_MAX);
 616        rect.height = clamp_t(unsigned int, ALIGN(sel->r.height, 2),
 617                              MT9P031_WINDOW_HEIGHT_MIN,
 618                              MT9P031_WINDOW_HEIGHT_MAX);
 619
 620        rect.width = min_t(unsigned int, rect.width,
 621                           MT9P031_PIXEL_ARRAY_WIDTH - rect.left);
 622        rect.height = min_t(unsigned int, rect.height,
 623                            MT9P031_PIXEL_ARRAY_HEIGHT - rect.top);
 624
 625        __crop = __mt9p031_get_pad_crop(mt9p031, cfg, sel->pad, sel->which);
 626
 627        if (rect.width != __crop->width || rect.height != __crop->height) {
 628                /* Reset the output image size if the crop rectangle size has
 629                 * been modified.
 630                 */
 631                __format = __mt9p031_get_pad_format(mt9p031, cfg, sel->pad,
 632                                                    sel->which);
 633                __format->width = rect.width;
 634                __format->height = rect.height;
 635        }
 636
 637        *__crop = rect;
 638        sel->r = rect;
 639
 640        return 0;
 641}
 642
 643/* -----------------------------------------------------------------------------
 644 * V4L2 subdev control operations
 645 */
 646
 647#define V4L2_CID_BLC_AUTO               (V4L2_CID_USER_BASE | 0x1002)
 648#define V4L2_CID_BLC_TARGET_LEVEL       (V4L2_CID_USER_BASE | 0x1003)
 649#define V4L2_CID_BLC_ANALOG_OFFSET      (V4L2_CID_USER_BASE | 0x1004)
 650#define V4L2_CID_BLC_DIGITAL_OFFSET     (V4L2_CID_USER_BASE | 0x1005)
 651
 652static int mt9p031_restore_blc(struct mt9p031 *mt9p031)
 653{
 654        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 655        int ret;
 656
 657        if (mt9p031->blc_auto->cur.val != 0) {
 658                ret = mt9p031_set_mode2(mt9p031, 0,
 659                                        MT9P031_READ_MODE_2_ROW_BLC);
 660                if (ret < 0)
 661                        return ret;
 662        }
 663
 664        if (mt9p031->blc_offset->cur.val != 0) {
 665                ret = mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
 666                                    mt9p031->blc_offset->cur.val);
 667                if (ret < 0)
 668                        return ret;
 669        }
 670
 671        return 0;
 672}
 673
 674static int mt9p031_s_ctrl(struct v4l2_ctrl *ctrl)
 675{
 676        struct mt9p031 *mt9p031 =
 677                        container_of(ctrl->handler, struct mt9p031, ctrls);
 678        struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
 679        u16 data;
 680        int ret;
 681
 682        if (ctrl->flags & V4L2_CTRL_FLAG_INACTIVE)
 683                return 0;
 684
 685        switch (ctrl->id) {
 686        case V4L2_CID_EXPOSURE:
 687                ret = mt9p031_write(client, MT9P031_SHUTTER_WIDTH_UPPER,
 688                                    (ctrl->val >> 16) & 0xffff);
 689                if (ret < 0)
 690                        return ret;
 691
 692                return mt9p031_write(client, MT9P031_SHUTTER_WIDTH_LOWER,
 693                                     ctrl->val & 0xffff);
 694
 695        case V4L2_CID_GAIN:
 696                /* Gain is controlled by 2 analog stages and a digital stage.
 697                 * Valid values for the 3 stages are
 698                 *
 699                 * Stage                Min     Max     Step
 700                 * ------------------------------------------
 701                 * First analog stage   x1      x2      1
 702                 * Second analog stage  x1      x4      0.125
 703                 * Digital stage        x1      x16     0.125
 704                 *
 705                 * To minimize noise, the gain stages should be used in the
 706                 * second analog stage, first analog stage, digital stage order.
 707                 * Gain from a previous stage should be pushed to its maximum
 708                 * value before the next stage is used.
 709                 */
 710                if (ctrl->val <= 32) {
 711                        data = ctrl->val;
 712                } else if (ctrl->val <= 64) {
 713                        ctrl->val &= ~1;
 714                        data = (1 << 6) | (ctrl->val >> 1);
 715                } else {
 716                        ctrl->val &= ~7;
 717                        data = ((ctrl->val - 64) << 5) | (1 << 6) | 32;
 718                }
 719
 720                return mt9p031_write(client, MT9P031_GLOBAL_GAIN, data);
 721
 722        case V4L2_CID_HFLIP:
 723                if (ctrl->val)
 724                        return mt9p031_set_mode2(mt9p031,
 725                                        0, MT9P031_READ_MODE_2_COL_MIR);
 726                else
 727                        return mt9p031_set_mode2(mt9p031,
 728                                        MT9P031_READ_MODE_2_COL_MIR, 0);
 729
 730        case V4L2_CID_VFLIP:
 731                if (ctrl->val)
 732                        return mt9p031_set_mode2(mt9p031,
 733                                        0, MT9P031_READ_MODE_2_ROW_MIR);
 734                else
 735                        return mt9p031_set_mode2(mt9p031,
 736                                        MT9P031_READ_MODE_2_ROW_MIR, 0);
 737
 738        case V4L2_CID_TEST_PATTERN:
 739                /* The digital side of the Black Level Calibration function must
 740                 * be disabled when generating a test pattern to avoid artifacts
 741                 * in the image. Activate (deactivate) the BLC-related controls
 742                 * when the test pattern is enabled (disabled).
 743                 */
 744                v4l2_ctrl_activate(mt9p031->blc_auto, ctrl->val == 0);
 745                v4l2_ctrl_activate(mt9p031->blc_offset, ctrl->val == 0);
 746
 747                if (!ctrl->val) {
 748                        /* Restore the BLC settings. */
 749                        ret = mt9p031_restore_blc(mt9p031);
 750                        if (ret < 0)
 751                                return ret;
 752
 753                        return mt9p031_write(client, MT9P031_TEST_PATTERN,
 754                                             MT9P031_TEST_PATTERN_DISABLE);
 755                }
 756
 757                ret = mt9p031_write(client, MT9P031_TEST_PATTERN_GREEN, 0x05a0);
 758                if (ret < 0)
 759                        return ret;
 760                ret = mt9p031_write(client, MT9P031_TEST_PATTERN_RED, 0x0a50);
 761                if (ret < 0)
 762                        return ret;
 763                ret = mt9p031_write(client, MT9P031_TEST_PATTERN_BLUE, 0x0aa0);
 764                if (ret < 0)
 765                        return ret;
 766
 767                /* Disable digital BLC when generating a test pattern. */
 768                ret = mt9p031_set_mode2(mt9p031, MT9P031_READ_MODE_2_ROW_BLC,
 769                                        0);
 770                if (ret < 0)
 771                        return ret;
 772
 773                ret = mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET, 0);
 774                if (ret < 0)
 775                        return ret;
 776
 777                return mt9p031_write(client, MT9P031_TEST_PATTERN,
 778                                ((ctrl->val - 1) << MT9P031_TEST_PATTERN_SHIFT)
 779                                | MT9P031_TEST_PATTERN_ENABLE);
 780
 781        case V4L2_CID_BLC_AUTO:
 782                ret = mt9p031_set_mode2(mt9p031,
 783                                ctrl->val ? 0 : MT9P031_READ_MODE_2_ROW_BLC,
 784                                ctrl->val ? MT9P031_READ_MODE_2_ROW_BLC : 0);
 785                if (ret < 0)
 786                        return ret;
 787
 788                return mt9p031_write(client, MT9P031_BLACK_LEVEL_CALIBRATION,
 789                                     ctrl->val ? 0 : MT9P031_BLC_MANUAL_BLC);
 790
 791        case V4L2_CID_BLC_TARGET_LEVEL:
 792                return mt9p031_write(client, MT9P031_ROW_BLACK_TARGET,
 793                                     ctrl->val);
 794
 795        case V4L2_CID_BLC_ANALOG_OFFSET:
 796                data = ctrl->val & ((1 << 9) - 1);
 797
 798                ret = mt9p031_write(client, MT9P031_GREEN1_OFFSET, data);
 799                if (ret < 0)
 800                        return ret;
 801                ret = mt9p031_write(client, MT9P031_GREEN2_OFFSET, data);
 802                if (ret < 0)
 803                        return ret;
 804                ret = mt9p031_write(client, MT9P031_RED_OFFSET, data);
 805                if (ret < 0)
 806                        return ret;
 807                return mt9p031_write(client, MT9P031_BLUE_OFFSET, data);
 808
 809        case V4L2_CID_BLC_DIGITAL_OFFSET:
 810                return mt9p031_write(client, MT9P031_ROW_BLACK_DEF_OFFSET,
 811                                     ctrl->val & ((1 << 12) - 1));
 812        }
 813
 814        return 0;
 815}
 816
 817static const struct v4l2_ctrl_ops mt9p031_ctrl_ops = {
 818        .s_ctrl = mt9p031_s_ctrl,
 819};
 820
 821static const char * const mt9p031_test_pattern_menu[] = {
 822        "Disabled",
 823        "Color Field",
 824        "Horizontal Gradient",
 825        "Vertical Gradient",
 826        "Diagonal Gradient",
 827        "Classic Test Pattern",
 828        "Walking 1s",
 829        "Monochrome Horizontal Bars",
 830        "Monochrome Vertical Bars",
 831        "Vertical Color Bars",
 832};
 833
 834static const struct v4l2_ctrl_config mt9p031_ctrls[] = {
 835        {
 836                .ops            = &mt9p031_ctrl_ops,
 837                .id             = V4L2_CID_BLC_AUTO,
 838                .type           = V4L2_CTRL_TYPE_BOOLEAN,
 839                .name           = "BLC, Auto",
 840                .min            = 0,
 841                .max            = 1,
 842                .step           = 1,
 843                .def            = 1,
 844                .flags          = 0,
 845        }, {
 846                .ops            = &mt9p031_ctrl_ops,
 847                .id             = V4L2_CID_BLC_TARGET_LEVEL,
 848                .type           = V4L2_CTRL_TYPE_INTEGER,
 849                .name           = "BLC Target Level",
 850                .min            = 0,
 851                .max            = 4095,
 852                .step           = 1,
 853                .def            = 168,
 854                .flags          = 0,
 855        }, {
 856                .ops            = &mt9p031_ctrl_ops,
 857                .id             = V4L2_CID_BLC_ANALOG_OFFSET,
 858                .type           = V4L2_CTRL_TYPE_INTEGER,
 859                .name           = "BLC Analog Offset",
 860                .min            = -255,
 861                .max            = 255,
 862                .step           = 1,
 863                .def            = 32,
 864                .flags          = 0,
 865        }, {
 866                .ops            = &mt9p031_ctrl_ops,
 867                .id             = V4L2_CID_BLC_DIGITAL_OFFSET,
 868                .type           = V4L2_CTRL_TYPE_INTEGER,
 869                .name           = "BLC Digital Offset",
 870                .min            = -2048,
 871                .max            = 2047,
 872                .step           = 1,
 873                .def            = 40,
 874                .flags          = 0,
 875        }
 876};
 877
 878/* -----------------------------------------------------------------------------
 879 * V4L2 subdev core operations
 880 */
 881
 882static int mt9p031_set_power(struct v4l2_subdev *subdev, int on)
 883{
 884        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 885        int ret = 0;
 886
 887        mutex_lock(&mt9p031->power_lock);
 888
 889        /* If the power count is modified from 0 to != 0 or from != 0 to 0,
 890         * update the power state.
 891         */
 892        if (mt9p031->power_count == !on) {
 893                ret = __mt9p031_set_power(mt9p031, !!on);
 894                if (ret < 0)
 895                        goto out;
 896        }
 897
 898        /* Update the power count. */
 899        mt9p031->power_count += on ? 1 : -1;
 900        WARN_ON(mt9p031->power_count < 0);
 901
 902out:
 903        mutex_unlock(&mt9p031->power_lock);
 904        return ret;
 905}
 906
 907/* -----------------------------------------------------------------------------
 908 * V4L2 subdev internal operations
 909 */
 910
 911static int mt9p031_registered(struct v4l2_subdev *subdev)
 912{
 913        struct i2c_client *client = v4l2_get_subdevdata(subdev);
 914        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 915        s32 data;
 916        int ret;
 917
 918        ret = mt9p031_power_on(mt9p031);
 919        if (ret < 0) {
 920                dev_err(&client->dev, "MT9P031 power up failed\n");
 921                return ret;
 922        }
 923
 924        /* Read out the chip version register */
 925        data = mt9p031_read(client, MT9P031_CHIP_VERSION);
 926        mt9p031_power_off(mt9p031);
 927
 928        if (data != MT9P031_CHIP_VERSION_VALUE) {
 929                dev_err(&client->dev, "MT9P031 not detected, wrong version "
 930                        "0x%04x\n", data);
 931                return -ENODEV;
 932        }
 933
 934        dev_info(&client->dev, "MT9P031 detected at address 0x%02x\n",
 935                 client->addr);
 936
 937        return 0;
 938}
 939
 940static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
 941{
 942        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
 943        struct v4l2_mbus_framefmt *format;
 944        struct v4l2_rect *crop;
 945
 946        crop = v4l2_subdev_get_try_crop(subdev, fh->pad, 0);
 947        crop->left = MT9P031_COLUMN_START_DEF;
 948        crop->top = MT9P031_ROW_START_DEF;
 949        crop->width = MT9P031_WINDOW_WIDTH_DEF;
 950        crop->height = MT9P031_WINDOW_HEIGHT_DEF;
 951
 952        format = v4l2_subdev_get_try_format(subdev, fh->pad, 0);
 953
 954        if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
 955                format->code = MEDIA_BUS_FMT_Y12_1X12;
 956        else
 957                format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
 958
 959        format->width = MT9P031_WINDOW_WIDTH_DEF;
 960        format->height = MT9P031_WINDOW_HEIGHT_DEF;
 961        format->field = V4L2_FIELD_NONE;
 962        format->colorspace = V4L2_COLORSPACE_SRGB;
 963
 964        return mt9p031_set_power(subdev, 1);
 965}
 966
 967static int mt9p031_close(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
 968{
 969        return mt9p031_set_power(subdev, 0);
 970}
 971
 972static const struct v4l2_subdev_core_ops mt9p031_subdev_core_ops = {
 973        .s_power        = mt9p031_set_power,
 974};
 975
 976static const struct v4l2_subdev_video_ops mt9p031_subdev_video_ops = {
 977        .s_stream       = mt9p031_s_stream,
 978};
 979
 980static const struct v4l2_subdev_pad_ops mt9p031_subdev_pad_ops = {
 981        .enum_mbus_code = mt9p031_enum_mbus_code,
 982        .enum_frame_size = mt9p031_enum_frame_size,
 983        .get_fmt = mt9p031_get_format,
 984        .set_fmt = mt9p031_set_format,
 985        .get_selection = mt9p031_get_selection,
 986        .set_selection = mt9p031_set_selection,
 987};
 988
 989static const struct v4l2_subdev_ops mt9p031_subdev_ops = {
 990        .core   = &mt9p031_subdev_core_ops,
 991        .video  = &mt9p031_subdev_video_ops,
 992        .pad    = &mt9p031_subdev_pad_ops,
 993};
 994
 995static const struct v4l2_subdev_internal_ops mt9p031_subdev_internal_ops = {
 996        .registered = mt9p031_registered,
 997        .open = mt9p031_open,
 998        .close = mt9p031_close,
 999};
1000
1001/* -----------------------------------------------------------------------------
1002 * Driver initialization and probing
1003 */
1004
1005static struct mt9p031_platform_data *
1006mt9p031_get_pdata(struct i2c_client *client)
1007{
1008        struct mt9p031_platform_data *pdata;
1009        struct device_node *np;
1010
1011        if (!IS_ENABLED(CONFIG_OF) || !client->dev.of_node)
1012                return client->dev.platform_data;
1013
1014        np = of_graph_get_next_endpoint(client->dev.of_node, NULL);
1015        if (!np)
1016                return NULL;
1017
1018        pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
1019        if (!pdata)
1020                goto done;
1021
1022        of_property_read_u32(np, "input-clock-frequency", &pdata->ext_freq);
1023        of_property_read_u32(np, "pixel-clock-frequency", &pdata->target_freq);
1024
1025done:
1026        of_node_put(np);
1027        return pdata;
1028}
1029
1030static int mt9p031_probe(struct i2c_client *client,
1031                         const struct i2c_device_id *did)
1032{
1033        struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client);
1034        struct i2c_adapter *adapter = client->adapter;
1035        struct mt9p031 *mt9p031;
1036        unsigned int i;
1037        int ret;
1038
1039        if (pdata == NULL) {
1040                dev_err(&client->dev, "No platform data\n");
1041                return -EINVAL;
1042        }
1043
1044        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
1045                dev_warn(&client->dev,
1046                        "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n");
1047                return -EIO;
1048        }
1049
1050        mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
1051        if (mt9p031 == NULL)
1052                return -ENOMEM;
1053
1054        mt9p031->pdata = pdata;
1055        mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF;
1056        mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
1057        mt9p031->model = did->driver_data;
1058
1059        mt9p031->regulators[0].supply = "vdd";
1060        mt9p031->regulators[1].supply = "vdd_io";
1061        mt9p031->regulators[2].supply = "vaa";
1062
1063        ret = devm_regulator_bulk_get(&client->dev, 3, mt9p031->regulators);
1064        if (ret < 0) {
1065                dev_err(&client->dev, "Unable to get regulators\n");
1066                return ret;
1067        }
1068
1069        mutex_init(&mt9p031->power_lock);
1070
1071        v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
1072
1073        v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1074                          V4L2_CID_EXPOSURE, MT9P031_SHUTTER_WIDTH_MIN,
1075                          MT9P031_SHUTTER_WIDTH_MAX, 1,
1076                          MT9P031_SHUTTER_WIDTH_DEF);
1077        v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1078                          V4L2_CID_GAIN, MT9P031_GLOBAL_GAIN_MIN,
1079                          MT9P031_GLOBAL_GAIN_MAX, 1, MT9P031_GLOBAL_GAIN_DEF);
1080        v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1081                          V4L2_CID_HFLIP, 0, 1, 1, 0);
1082        v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1083                          V4L2_CID_VFLIP, 0, 1, 1, 0);
1084        v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1085                          V4L2_CID_PIXEL_RATE, pdata->target_freq,
1086                          pdata->target_freq, 1, pdata->target_freq);
1087        v4l2_ctrl_new_std_menu_items(&mt9p031->ctrls, &mt9p031_ctrl_ops,
1088                          V4L2_CID_TEST_PATTERN,
1089                          ARRAY_SIZE(mt9p031_test_pattern_menu) - 1, 0,
1090                          0, mt9p031_test_pattern_menu);
1091
1092        for (i = 0; i < ARRAY_SIZE(mt9p031_ctrls); ++i)
1093                v4l2_ctrl_new_custom(&mt9p031->ctrls, &mt9p031_ctrls[i], NULL);
1094
1095        mt9p031->subdev.ctrl_handler = &mt9p031->ctrls;
1096
1097        if (mt9p031->ctrls.error) {
1098                printk(KERN_INFO "%s: control initialization error %d\n",
1099                       __func__, mt9p031->ctrls.error);
1100                ret = mt9p031->ctrls.error;
1101                goto done;
1102        }
1103
1104        mt9p031->blc_auto = v4l2_ctrl_find(&mt9p031->ctrls, V4L2_CID_BLC_AUTO);
1105        mt9p031->blc_offset = v4l2_ctrl_find(&mt9p031->ctrls,
1106                                             V4L2_CID_BLC_DIGITAL_OFFSET);
1107
1108        v4l2_i2c_subdev_init(&mt9p031->subdev, client, &mt9p031_subdev_ops);
1109        mt9p031->subdev.internal_ops = &mt9p031_subdev_internal_ops;
1110
1111        mt9p031->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1112        mt9p031->pad.flags = MEDIA_PAD_FL_SOURCE;
1113        ret = media_entity_pads_init(&mt9p031->subdev.entity, 1, &mt9p031->pad);
1114        if (ret < 0)
1115                goto done;
1116
1117        mt9p031->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1118
1119        mt9p031->crop.width = MT9P031_WINDOW_WIDTH_DEF;
1120        mt9p031->crop.height = MT9P031_WINDOW_HEIGHT_DEF;
1121        mt9p031->crop.left = MT9P031_COLUMN_START_DEF;
1122        mt9p031->crop.top = MT9P031_ROW_START_DEF;
1123
1124        if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
1125                mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
1126        else
1127                mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
1128
1129        mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
1130        mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
1131        mt9p031->format.field = V4L2_FIELD_NONE;
1132        mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
1133
1134        mt9p031->reset = devm_gpiod_get_optional(&client->dev, "reset",
1135                                                 GPIOD_OUT_HIGH);
1136
1137        ret = mt9p031_clk_setup(mt9p031);
1138        if (ret)
1139                goto done;
1140
1141        ret = v4l2_async_register_subdev(&mt9p031->subdev);
1142
1143done:
1144        if (ret < 0) {
1145                v4l2_ctrl_handler_free(&mt9p031->ctrls);
1146                media_entity_cleanup(&mt9p031->subdev.entity);
1147                mutex_destroy(&mt9p031->power_lock);
1148        }
1149
1150        return ret;
1151}
1152
1153static int mt9p031_remove(struct i2c_client *client)
1154{
1155        struct v4l2_subdev *subdev = i2c_get_clientdata(client);
1156        struct mt9p031 *mt9p031 = to_mt9p031(subdev);
1157
1158        v4l2_ctrl_handler_free(&mt9p031->ctrls);
1159        v4l2_async_unregister_subdev(subdev);
1160        media_entity_cleanup(&subdev->entity);
1161        mutex_destroy(&mt9p031->power_lock);
1162
1163        return 0;
1164}
1165
1166static const struct i2c_device_id mt9p031_id[] = {
1167        { "mt9p031", MT9P031_MODEL_COLOR },
1168        { "mt9p031m", MT9P031_MODEL_MONOCHROME },
1169        { }
1170};
1171MODULE_DEVICE_TABLE(i2c, mt9p031_id);
1172
1173#if IS_ENABLED(CONFIG_OF)
1174static const struct of_device_id mt9p031_of_match[] = {
1175        { .compatible = "aptina,mt9p031", },
1176        { .compatible = "aptina,mt9p031m", },
1177        { /* sentinel */ },
1178};
1179MODULE_DEVICE_TABLE(of, mt9p031_of_match);
1180#endif
1181
1182static struct i2c_driver mt9p031_i2c_driver = {
1183        .driver = {
1184                .of_match_table = of_match_ptr(mt9p031_of_match),
1185                .name = "mt9p031",
1186        },
1187        .probe          = mt9p031_probe,
1188        .remove         = mt9p031_remove,
1189        .id_table       = mt9p031_id,
1190};
1191
1192module_i2c_driver(mt9p031_i2c_driver);
1193
1194MODULE_DESCRIPTION("Aptina MT9P031 Camera driver");
1195MODULE_AUTHOR("Bastian Hecht <hechtb@gmail.com>");
1196MODULE_LICENSE("GPL v2");
1197